Docker代理进程正在IPv4和IPv6上侦听,但仅在IPv4上响应

Docker代理进程正在IPv4和IPv6上侦听,但仅在IPv4上响应,docker,docker-compose,ipv6,digital-ocean,forwarding,Docker,Docker Compose,Ipv6,Digital Ocean,Forwarding,我正在使用Docker Compose在容器中运行DNS服务器(PowerDNS)。以下是配置: version: "2.4" networks: dnsnet: driver: bridge driver_opts: com.docker.network.bridge.name: "dnsbr0" ipam: driver: default config: - subnet: 192.168

我正在使用Docker Compose在容器中运行DNS服务器(PowerDNS)。以下是配置:

version: "2.4"
networks:
  dnsnet:
    driver: bridge
    driver_opts: 
      com.docker.network.bridge.name: "dnsbr0"
    ipam:
      driver: default
      config:
        - 
          subnet: 192.168.193.0/24
          gateway: 192.168.193.1
  power-dns:
    image: "my_image"
    restart: on-failure
    networks:
      dnsnet:
        ipv4_address: 192.168.193.170
    ports:
      - "x.x.x.x:53:53/tcp"
      - "x.x.x.x:53:53/udp"
      - "aaaa::ffff:53:53/tcp"
      - "aaaa::ffff:53:53/udp"
从主机(在DigitalOcean上的Ubuntu18.04上运行),我可以
dig@x.x.x
dig@aaaa::ffff
,没有问题。从同一数据中心的另一台机器(
bbbbbb::ffff
)上,我仍然可以
dig@x.x.x
,但
dig@aaaa::ffff
超时。我可以
ping@aaaa::ffff
没问题,只需1.5毫秒的往返行程

我首先检查的是lsof

$ sudo lsof -i -n
docker-pr 7258      root    4u  IPv6  97854      0t0  TCP [aaaa::ffff]:domain (LISTEN)
docker-pr 7272      root    4u  IPv4  97877      0t0  TCP x.x.x.x:domain (LISTEN)
docker-pr 7285      root    4u  IPv4  97919      0t0  UDP x.x.x.x:domain 
docker-pr 7290      root    4u  IPv6  98382      0t0  UDP [aaaa::ffff]:domain
这一切看起来都是正确的。所以接下来我检查了一个
tcpdump
,第一个
ping

$ sudo tcpdump -n host "aaaa::ffff"
01:24:36.570272 IP6 bbbb::ffff > aaaa::ffff: ICMP6, echo request, seq 0, length 16
01:24:36.570322 IP6 aaaa::ffff > bbbb::ffff: ICMP6, echo reply, seq 0, length 16
01:24:37.574518 IP6 bbbb::ffff > aaaa::ffff: ICMP6, echo request, seq 1, length 16
01:24:37.574558 IP6 aaaa::ffff > bbbb::ffff: ICMP6, echo reply, seq 1, length 16
现在是一个
dig

$ sudo tcpdump -n host "aaaa::ffff"
00:42:03.291922 IP6 bbbb::ffff.51642 > aaaa::ffff.53: 60840+ [1au] A? example.net. (49)
00:42:08.297904 IP6 bbbb::ffff.51642 > aaaa::ffff.53: 60840+ [1au] A? example.net. (49)
00:42:13.301566 IP6 bbbb::ffff.51642 > aaaa::ffff.53: 60840+ [1au] A? example.net. (49)

$ sudo tcpdump -i dnsbr0 -n host "192.168.193.170"
<nothing>
我还尝试以不同的方式处理端口:

    ports:
      - "53:53/tcp"
      - "53:53/udp"
这导致了不同的(和预期的)
lsof
输出,但是相同的行为和
tcpdump
结果

$ sudo lsof -i -n
docker-pr 6982      root    4u  IPv6  95863      0t0  TCP *:domain (LISTEN)
docker-pr 6995      root    4u  IPv6  95894      0t0  UDP *:domain 

那么我在这里错过了什么?为什么这不起作用?我找到Docker bug了吗?

我确定这一定是Docker bug。我在这里提出了一个新的错误:


如果/当Docker的人同意我发现了一个bug,我会接受这个“答案”。

你在本地尝试过这个吗?不,这不是我可以在本地轻松测试的东西。如果你在网络上设置ipv4地址,你会不会暴露ipv6地址?不。我还尝试过设置一个完整的双堆栈(ipv4+ipv6)无论有无静态地址,docker网络和
端口仍然无法工作。我能够让DNS服务器响应IPv6查询的唯一方法是静态地为容器分配一个可公开访问的IPv6地址:-(
$ sudo lsof -i -n
docker-pr 6982      root    4u  IPv6  95863      0t0  TCP *:domain (LISTEN)
docker-pr 6995      root    4u  IPv6  95894      0t0  UDP *:domain