【问题标题】:Docker-proxy process is listening on IPv4 and IPv6 but only responding on IPv4Docker-proxy 进程正在侦听 IPv4 和 IPv6,但仅响应 IPv4
【发布时间】:2019-06-09 00:54:09
【问题描述】:

我正在使用 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 上的 Ubuntu 18.04 上运行),我可以 dig @x.x.x.xdig @aaaa::ffff 没有问题。在同一个数据中心的另一台机器(bbbb::ffff)上,我仍然可以dig @x.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>

所以似乎没有回复,重要的是,docker-proxy 进程永远不会将数据包转发到容器。请注意,转储中会按预期显示 IPv4 地址的 dig

$ sudo tcpdump -n host "x.x.x.x"
00:46:16.129744 IP y.y.y.y.55183 > x.x.x.x.53: 989+ [1au] A? example.net. (49)
00:46:16.131823 IP x.x.x.x.53 > y.y.y.y.55183: 989*- 1/0/1 A 1.2.3.4 (65)

$ sudo tcpdump -i dnsbr0 -n host "192.168.193.170"
00:46:16.129905 IP y.y.y.y.62620 > 192.168.193.170.53: 16666+ [1au] A? example.net. (49)
00:46:16.131569 IP 192.168.193.170.53 > y.y.y.y.62620: 16666*- 1/0/1 A 1.2.3.4 (65)

我也尝试过不同的端口:

    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 错误了吗?

【问题讨论】:

  • 你在本地试过吗?
  • 不,这不是我可以在本地轻松测试的东西。
  • 是不是如果你给网络设置了一个ipv4地址就不会暴露ipv6地址?
  • 没有。我还尝试设置一个完整的双栈(IPv4 + IPv6)docker 网络,ports 仍然无法正常工作,不管有没有静态地址。我能够让我的 DNS 服务器响应 IPv6 查询的唯一方法是为容器静态分配一个可公开访问的 IPv6 地址。 :-(

标签: docker docker-compose ipv6 digital-ocean forwarding


【解决方案1】:

我已经确定这一定是一个 Docker 错误。我在这里提交了一个新的错误:https://github.com/docker/for-linux/issues/566

如果/当 Docker 人员同意我发现了一个错误时,我会接受这个作为“答案”。

【讨论】:

    猜你喜欢
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2012-09-10
    • 2022-03-24
    • 1970-01-01
    • 2016-09-19
    相关资源
    最近更新 更多