Процесс прокси-сервера Docker прослушивает IPv4 и IPv6, но отвечает только на IPv4 - PullRequest
0 голосов
/ 15 января 2019

Я использую 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"

С хост-машины (работающей в Ubuntu 18.04 на DigitalOcean) я могу dig @x.x.x.x и dig @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 никогда не перенаправляет пакеты в контейнер. Обратите внимание, что dig для IPv4-адреса отображается как положено в дампе:

$ 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?

1 Ответ

0 голосов
/ 20 января 2019

Я определил, что это ошибка Docker. Я подал новую ошибку здесь: https://github.com/docker/for-linux/issues/566

Я приму это как "ответ", если / когда люди из Docker согласятся, что я нашел ошибку.

...