Запросы из контейнера Docker в DNSMasq, работающие на хосте, не работают долгое время... а потом они работают:)
На моем хосте (Ubuntu Server 16.04) я использую сервер DNSMasq, связанный со всеми сетевыми интерфейсами через порт 53. Он пересылает запросы, соответствующие consul
домен верхнего уровня на DNS-сервер, работающий на 127.0.0.1:8600
(то есть тот же хост, но на этот раз привязанный только к интерфейсу обратной связи):
$ cat /etc/dnsmasq.d/10-consul
server=/consul/127.0.0.1#8600
# Common netblocks found in RFC 1918, 5735, and 6598:
rev-server=0.0.0.0/8,127.0.0.1#8600
rev-server=10.0.0.0/8,127.0.0.1#8600
rev-server=100.64.0.0/10,127.0.0.1#8600
rev-server=127.0.0.1/8,127.0.0.1#8600
rev-server=169.254.0.0/16,127.0.0.1#8600
rev-server=172.16.0.0/12,127.0.0.1#8600
rev-server=192.168.0.0/16,127.0.0.1#8600
rev-server=224.0.0.0/4,127.0.0.1#8600
rev-server=240.0.0.0/4,127.0.0.1#8600
На хосте все работает как положено:
$ dig consul.service.consul
; <<>> DiG 9.10.3-P4-Ubuntu <<>> consul.service.consul
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4247
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;consul.service.consul. IN A
;; ANSWER SECTION:
consul.service.consul. 0 IN A 10.133.52.183
consul.service.consul. 0 IN A 10.133.53.73
consul.service.consul. 0 IN A 10.133.56.138
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Jun 05 16:55:10 UTC 2018
;; MSG SIZE rcvd: 98
$ # Explicitly on loopback interface
$ dig consul.service.consul @localhost
...Same as above
$ # On docker bridge interface
$ dig consul.service.consul @172.17.0.1
...Same as above except for SERVER
Однако, если я запускаю запрос из контейнера Docker, он завершается ошибкой:
$ docker run --rm --dns=172.17.0.1 tutum/dnsutils dig consul.service.consul
; <<>> DiG 9.9.5-3ubuntu0.2-Ubuntu <<>> consul.service.consul
;; global options: +cmd
;; connection timed out; no servers could be reached
Я попытался увеличить время ожидания, не оказав никакого влияния, кроме необходимости ждать одну минуту для сбоя:
$ docker run --rm --dns=172.17.0.1 tutum/dnsutils \
dig consul.service.consul +time=60
Интересно, что через долгое время (между 30 и 60 минутами я точно не измерял) он начинает работать без видимых причин:
$ docker run --rm --dns=172.17.0.1 tutum/dnsutils dig consul.service.consul
; <<>> DiG 9.9.5-3ubuntu0.2-Ubuntu <<>> consul.service.consul
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63531
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;consul.service.consul. IN A
;; ANSWER SECTION:
consul.service.consul. 0 IN A 10.133.52.183
consul.service.consul. 0 IN A 10.133.56.138
consul.service.consul. 0 IN A 10.133.53.73
;; Query time: 1 msec
;; SERVER: 172.17.0.1#53(172.17.0.1)
;; WHEN: Tue Jun 05 16:32:18 UTC 2018
;; MSG SIZE rcvd: 98
Кроме того, случайно я обнаружил, что он начинает работать, как и ожидалось, сразу после подключения к DNS-серверу с помощью netcat
:
$ docker run --rm tutum/dnsutils netcat -vvz 172.17.0.1 53
Connection to 172.17.0.1 53 port [tcp/domain] succeeded!
Как только он начинает работать, проблем больше нет. Я пробовал запускать разные образы Docker, разные DNS-запросы и т. Д.
Что может быть причиной для этого?
Обновить:
Похоже, это связано со стандартным способом настройки DNSMasq в Ubuntu 16.04. Если я остановлю службу Systemd и начну DNSMasq напрямую:
$ dnsmasq --conf-dir /etc/dnsmasq.d/ --no-daemon --log-queries
Все отлично работает
$ docker run --rm --dns=172.17.0.1 tutum/dnsutils dig consul.service.consul
; <<>> DiG 9.9.5-3ubuntu0.2-Ubuntu <<>> consul.service.consul
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49848
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;consul.service.consul. IN A
;; ANSWER SECTION:
consul.service.consul. 0 IN A 10.133.57.167
consul.service.consul. 0 IN A 10.133.57.162
consul.service.consul. 0 IN A 10.133.49.28
;; Query time: 0 msec
;; SERVER: 172.17.0.1#53(172.17.0.1)
;; WHEN: Sat Jun 16 09:32:30 UTC 2018
;; MSG SIZE rcvd: 98