docker와 IPv6를 사용하여 PiHole을 설정하는 방법에 대한 몇 가지 가이드를 읽은 후 네트워크에서 PiHole을 설정해 보았습니다. 먼저, 내 ISP는 접두사 위임을 제공합니다. 이 위임은 RA(라우터 할당)를 통해 네트워크의 나머지 부분에 주소를 제공하는 데 사용됩니다. 접두사는 고정되지 않고 며칠마다 순환됩니다.
ULA 설정
br0
저는 Ubiquity UDM-Pro를 사용하고 있으며 아래와 같이 인터페이스 에 ULA 접두사를 추가했습니다 .
ip address add fd79:71d8:a0b7::1/64 dev br0
그 직후에 내 모든 IPv6 지원 장치에는 해당 접두사가 포함된 ULA 주소가 할당되었습니다.
터미널 구성
Docker가 작동하려면 IPv6를 명시적으로 활성화하고 cidr 범위를 제공해야 했습니다. 이를 위해 daemon.json
다음 내용으로 파일을 만들었습니다./etc/docker
{
"ipv6": true,
"fixed-cidr-v6": "fd79:71d8:a0b7::/80"
}
ip6tables
그런 다음 다음 명령으로 NAT 테이블에 추가했습니다.
sudo ip6tables -t nat -A POSTROUTING -s fd79:71d8:a0b7::/80 ! -o docker0 -j MASQUERADE
이를 통해 docker0
인터페이스는 IPv6 트래픽을 수신할 수 있습니다. 물론 이러한 변경 사항은 재부팅 후에도 유지되지 않으므로 이러한 변경 사항이 재부팅 후에도 유지되도록 iptables-persistent
하는 패키지도 설치했습니다 netfilter-persistent
.
다음을 사용하여 IPv6 연결을 설정할 수 있는지 확인했습니다.
$ docker run --rm -t busybox ping6 -c 4 google.com
PING google.com (2a00:1450:4017:811::200e): 56 data bytes
64 bytes from 2a00:1450:4017:811::200e: seq=0 ttl=56 time=62.514 ms
64 bytes from 2a00:1450:4017:811::200e: seq=1 ttl=56 time=61.256 ms
64 bytes from 2a00:1450:4017:811::200e: seq=2 ttl=56 time=61.503 ms
64 bytes from 2a00:1450:4017:811::200e: seq=3 ttl=56 time=61.850 ms
--- google.com ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 61.256/61.780/62.514 ms
핀홀 구조
구성은 pihole
매우 간단합니다. 다음을 사용하여 콘텐츠를 yaml
저장합니다 .pihole.yaml
docker-compose
version: "3.8"
services:
pihole:
container_name: pihole
image: pihole/pihole:latest
ports:
# dns ports
- "53:53/tcp"
- "53:53/udp"
# ports for http interface
- "19080:80/tcp"
- "19443:443/tcp"
environment:
# redacted full address
FTLCONF_LOCAL_IPV4: 10.10.x.25
# redacted full address
FTLCONF_LOCAL_IPV6: fd79:71d8:a0b7:0:...:ae38
# IPs of your DNS entries
dns:
# this is for resolved conf, assuming you have ubuntu and disabled it
- 127.0.0.1
# proper DNS entries follow
- 1.1.1.1
- 1.0.0.1
- 2606:4700:4700::1111
- 2606:4700:4700::1001
# Recommended but not required (DHCP needs NET_ADMIN)
# https://github.com/pi-hole/docker-pi-hole#note-on-capabilities
cap_add:
- NET_ADMIN
restart: unless-stopped
나는 사용한다 docker-compose -f pihole.yaml up
.
문제: 답장이 다른 주소에서 왔거나 시간이 초과되었습니다.
문제는 다른 컴퓨터에서는 사용할 수 없다는 것입니다. 이미지가 실행되는 머신에서는 문제 없이 사용할 docker
수 있습니다 . dig
예를 들어 호스트에 명령을 입력하면 다음과 같은 결과가 나타납니다.
$ dig @fd79:71d8:a0b7:0:...:ae38 -p 53 google.com AAAA
; <<>> DiG 9.18.12-0ubuntu0.22.04.1-Ubuntu <<>> @fd79:71d8:a0b7:0:...:ae38 -p 53 google.com AAAA
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60684
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;google.com. IN AAAA
;; ANSWER SECTION:
google.com. 83 IN AAAA 2a00:1450:4017:805::200e
;; Query time: 8 msec
;; SERVER: fd79:71d8:a0b7:0:...:ae38#53(fd79:71d8:a0b7:0:...:ae38) (UDP)
;; WHEN: Mon May 15 01:44:42 EEST 2023
;; MSG SIZE rcvd: 67
그러나 다른 Linux 기반 컴퓨터에서 이 명령을 입력했습니다. 명령이 시간 초과되었습니다. 즉,
dig -6 @fd79:71d8:a0b7:0:...:ae38 -p 53 google.com
;; communications error to fd79:71d8:a0b7:0:...:ae38#53: timed out
;; communications error to fd79:71d8:a0b7:0:...:ae38#53: timed out
;; communications error to fd79:71d8:a0b7:0:...:ae38#53: timed out
; <<>> DiG 9.18.12-0ubuntu0.22.04.1-Ubuntu <<>> -6 @fd79:71d8:a0b7:0:...:ae38 -p 53 google.com
; (1 server found)
;; global options: +cmd
;; no servers could be reached
조사를 위해 주소가 차단된 것인지 확인해 보았는데, netcat
포트가 영업을 위해 열려 있는 것으로 나오더군요,
nc -z fd79:71d8:a0b7:0:...:ae38 53 -v
Connection to fd79:71d8:a0b7:0:...:ae38 53 port [tcp/domain] succeeded!
추가 조사 결과 MacOS에서 사용하면 더 많은 정보를 얻을 수 있는 것으로 보입니다 dig
. 연결 자체는 시간 초과가 되지 않는 것 같은데,다른주소.
MacOS의 출력은 dig
이전과 동일한 주소를 사용하여 다음과 같습니다.
$ dig -6 @fd79:71d8:a0b7:0:...:ae38 google.com
;; reply from unexpected source: fd79:71d8:a0b7::60b#53, expected fd79:71d8:a0b7:0:...:ae38#53
;; reply from unexpected source: fd79:71d8:a0b7::60b#53, expected fd79:71d8:a0b7:0:...:ae38#53
; <<>> DiG 9.10.6 <<>> -6 @fd79:71d8:a0b7:0:5043:6018:fb4f:ae38 google.com
; (1 server found)
;; global options: +cmd
;; connection timed out; no servers could be reached
답변을 제공한다고 하는 주소를 사용하면 예상대로 작동하고,
dig -6 @fd79:71d8:a0b7::60b google.com
; <<>> DiG 9.10.6 <<>> -6 @fd79:71d8:a0b7::60b google.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9440
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 156 IN A 172.217.17.142
;; Query time: 22 msec
;; SERVER: fd79:71d8:a0b7::60b#53(fd79:71d8:a0b7::60b)
;; WHEN: Mon May 15 01:51:58 EEST 2023
;; MSG SIZE rcvd: 55
뷰 인터페이스 IP를 사용하면 ip -6 addr show dev enp9s0f1
다음을 검색할 수 있습니다.
5: enp9s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether b4:xx:xx:xx:xx:a6 brd ff:ff:ff:ff:ff:ff
inet 10.10.x.25/24 brd 10.10.x.255 scope global dynamic noprefixroute enp9s0f1
valid_lft 83538sec preferred_lft 83538sec
inet6 2a02:587:<redacted>/128 scope global dynamic noprefixroute
valid_lft 83539sec preferred_lft 83539sec
inet6 fd79:71d8:a0b7::60b/128 scope global dynamic noprefixroute
valid_lft 83539sec preferred_lft 83539sec
inet6 2a02:587:<redacted>/64 scope global dynamic noprefixroute
valid_lft 73590sec preferred_lft 73590sec
inet6 fd79:71d8:a0b7:0:...:ae38/64 scope global dynamic noprefixroute
valid_lft 86138sec preferred_lft 86138sec
inet6 fe80::1ea:<redacted>:eb62/64 scope link noprefixroute
valid_lft forever preferred_lft forever
왜 다른 주소에서 답장이 왔나요? 여기에서 볼 수 있듯이 아웃바운드 주소에 다른 주소를 사용하는 RFC4941을 비활성화했습니다.
$ nmcli con show "Wired connection 4" | grep ipv6.ip
ipv6.ip6-privacy: 0 (disabled)
IPv6의 라우팅은 다음과 같습니다.
$ ip -6 route show
::1 dev lo proto kernel metric 256 pref medium
2a02:587:...::60b dev enp9s0f1 proto kernel metric 100 pref medium
2a02:587:...::/64 dev enp9s0f1 proto ra metric 100 pref medium
fd79:71d8:a0b7::60b dev enp9s0f1 proto kernel metric 100 pref medium
fd79:71d8:a0b7::/80 dev docker0 proto kernel metric 256 linkdown pref medium
fd79:71d8:a0b7::/80 dev docker0 metric 1024 linkdown pref medium
fd79:71d8:a0b7::/64 dev enp9s0f1 proto ra metric 100 pref medium
fe80::/64 dev docker0 proto kernel metric 256 linkdown pref medium
fe80::/64 dev br-5c9052b3a88b proto kernel metric 256 pref medium
fe80::/64 dev br-ba2b20fe7aa1 proto kernel metric 256 pref medium
fe80::/64 dev veth3fb9416 proto kernel metric 256 pref medium
fe80::/64 dev veth7a050e3 proto kernel metric 256 pref medium
fe80::/64 dev vethe299802 proto kernel metric 256 pref medium
fe80::/64 dev veth5110238 proto kernel metric 256 pref medium
fe80::/64 dev cali7ffb27b031d proto kernel metric 256 pref medium
fe80::/64 dev calib5cff4a4a14 proto kernel metric 256 pref medium
fe80::/64 dev cali6b881403436 proto kernel metric 256 pref medium
fe80::/64 dev calib1a2ba7ef9f proto kernel metric 256 pref medium
fe80::/64 dev cali20c73fad203 proto kernel metric 256 pref medium
fe80::/64 dev calib05d5a88d5c proto kernel metric 256 pref medium
fe80::/64 dev vxlan.calico proto kernel metric 256 pref medium
fe80::/64 dev enp9s0f1 proto kernel metric 1024 pref medium
default via fe80::...:62b3 dev enp9s0f1 proto ra metric 100 pref high
왜 이런 일이 발생하는지 이해하도록 도와줄 수 있는 사람이 있나요? 응답이 항상 다른 주소에서 오는 이유를 모르겠습니다... ISP에서 제공한 접두어는 시간이 지남에 따라 변경되므로 사용할 수 없기 때문에 DNS 서버에 안정적인 ULA 주소를 사용하고 싶습니다. t 개인 정보 보호 주소 사용 다시 말하지만, 이는 시간이 지남에 따라 변경됩니다.