首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >码头集装箱之间的“‘dig”返回内部IP而不是外部IP

码头集装箱之间的“‘dig”返回内部IP而不是外部IP
EN

Server Fault用户
提问于 2019-07-16 13:26:30
回答 1查看 990关注 0票数 0

首先,我对这篇文章很抱歉,但是我不知道怎么把它简化到这个程度。我已经削减了许多不必要的配置材料,以结束对基本信息的需要。

我正在设置一个dns递归对,ns1和ns2,每个在一个单独的服务器上。每个服务器都包含powerdns-对dnsdist前端和递归后端,它们运行在单独的容器中,每个容器由Docker -组合管理,基于Docker集线器的tcely/dnsdist。

代码语言:javascript
复制
ns1: 192.168.0.1
ns2: 192.168.0.2

我的目标是让dnsdist能够在它的负载平衡函数中查询两个递归,所以我有一个dnsdist.conf,它简化为基本元素,如下所示:

代码语言:javascript
复制
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开始,所以递归器在这一点上不会阻止任何人查询它。

最后,我们要说的是:

启动吊舱时,dnsdist会产生以下日志错误:

代码语言:javascript
复制
...
Marking downstream 192.168.0.1:5300 as 'down'
Marking downstream 192.168.0.2:5300 as 'up'
...

当我试图找出为什么它认为本地递归被关闭时,通过进入dnsdist容器并从那里运行“挖掘”,我得到如下信息:

代码语言:javascript
复制
/ # 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是容器的本地ip,每次重新启动时都会更改。

所以,问题是,我该如何解决这个问题?在Docker中是否有一种方法可以对所使用的内部IP地址进行硬编码,或者让容器/dnsdist忽略它从另一个IP地址得到的答复这一事实?

编辑-用于澄清: Docker自动分配网络名称,因此,例如,我可以'ping递归‘,它将解析到解析器-容器私有IP地址。我不能将它用于任何事情,因为dnsdist.conf只接受IP地址,正如我开始解释的那样,当容器启动时,这些IP地址是由docker随机设置的。

EN

回答 1

Server Fault用户

回答已采纳

发布于 2019-07-18 11:10:21

(或至少有一个)解决方案是为pod (容器对)创建一个本地网络:

代码语言:javascript
复制
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

代码语言:javascript
复制
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')

重新启动

重复并冲洗。

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/975435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档