docker 容器之间的‘dig’返回的是内部IP而不是外部IP

docker 容器之间的‘dig’返回的是内部IP而不是外部IP

首先,抱歉,这篇文章太长了,但我不知道如何将其精简到这个程度。我已经删除了很多不必要的配置内容,只留下了所需的基本信息。

我正在设置一个 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')

重新开始

重复并冲洗。

相关内容