首先,抱歉,这篇文章太长了,但我不知道如何将其精简到这个程度。我已经删除了很多不必要的配置内容,只留下了所需的基本信息。
我正在设置一个 dns 递归器对,ns1 和 ns2,每个都在单独的服务器上。每台服务器都包含 dnsdist 前端和递归器后端的 powerdns-pair,它们在单独的容器中运行,每个容器一个,由 docker-compose 管理,基于 Docker Hub 中的 tcely/dnsdist。
ns1: 192.168.0.1
ns2: 192.168.0.2
我的目标是让 dnsdist 能够在它的负载平衡功能中查询两个递归器,因此我有一个 dnsdist.conf,将其精简为如下所示的基本内容:
newServer{address='192.168.0.1:5300', order=1}
newServer{address='192.168.0.2:5300', order=2}
setServerPolicy(firstAvailable)
setLocal('0.0.0.0')
两个服务器大致相同,但顺序相反,因此主要递归器应该是“本地”递归器。
我不会将事物与 recursor.conf 混淆,只需说它允许从 0.0.0.0/0 开始,因此递归器不会阻止任何人在此时查询它。
最后我们来谈谈重点:
当我启动 pod 时,dnsdist 出现以下日志错误:
...
Marking downstream 192.168.0.1:5300 as 'down'
Marking downstream 192.168.0.2:5300 as 'up'
...
当我尝试找出它认为本地递归器已关闭的原因时,通过进入 dnsdist 容器并从那里运行“dig”,我得到了以下信息:
/ # dig @192.168.0.2 -p 5300 a.root-servers.net. +short
198.41.0.4
/ # dig @192.168.0.1 -p 5300 a.root-servers.net. +short
;; reply from unexpected source: 172.20.0.1#5300, expected 192.168.0.1#5300
因此,当我查询其他容器的外部 IP 时,它似乎会使用内部 IP 进行回复。如果我可以查询其他容器的内部 IP(即本例中的 172.20.0.1),我会这样做,但该 IP 是容器本地的,每次重新启动时都会更改。
那么,问题是,我该如何解决这个问题?Docker 中是否有办法对使用的内部 IP 地址进行硬编码,或者让容器/dnsdist 忽略它从预期以外的其他 IP 地址获得回复的事实?
编辑 - 澄清一下:Docker 会自动分配网络名称,例如,我可以“ping recursor”,它将解析为解析器容器的私有 IP 地址。我无法将其用于任何事情,因为 dnsdist.conf 仅接受 IP 地址,而且正如我开始解释的那样,IP 地址是在容器启动时由 docker 随机设置的。
答案1
该解决方案(或至少一个)是为 pod(容器对)创建一个本地网络:
version: '3'
services:
dnsdist:
image: 'tcely/dnsdist'
container_name: powerdns-dnsdist
restart: 'unless-stopped'
tty: true
stdin_open: true
command: ["--disable-syslog", "--uid", "dnsdist", "--gid", "dnsdist", "--verbose"]
volumes:
- /data/docker/volumes/dnsdist-recursor/dnsdist:/etc/dnsdist
expose:
- '53'
- '53/udp'
ports:
- '53:53'
- '53:53/udp'
networks:
dnsnet:
ipv4_address: 172.28.1.10
recursor:
image: 'tcely/powerdns-recursor'
container_name: powerdns-recursor
restart: 'unless-stopped'
command: ["--disable-syslog=yes", "--log-timestamp=no", "--local-address=0.0.0.0", "--setuid=pdns-recursor", "--setgid=pdns-recursor"]
volumes:
- /data/docker/volumes/dnsdist-recursor/pdns-recursor:/etc/pdns-recursor
ports:
- '5300:53'
- '5300:53/udp'
networks:
dnsnet:
ipv4_address: 172.28.1.11
networks:
dnsnet:
ipam:
driver: default
config:
- subnet: '172.28.1.0/24'
现在你可以按如下方式设置 dnsdist.conf
newServer{address='172.28.1.11:53', order=1}
newServer{address='192.168.0.2:5300', order=2}
setServerPolicy(firstAvailable)
setLocal('0.0.0.0')
重新开始
重复并冲洗。