Большой AXFR через dnsmasq приводит к зависанию dig с частичным результатом
Я пытаюсь настроить dnsmasq в качестве локального кэша для консула. Хотя это нормально работает для обычных копаний, dnsmasq разрешает только частичную передачу зоны.
Мой resolv.conf:
search x.domain.com y.domain.com z.domain.com domain.com
nameserver 127.0.0.1
nameserver 10.0.0.1
nameserver 10.0.0.2
nameserver 10.0.0.3
options timeout: 2 attempts: 3
Мои настройки dnsmasq просто настроены на пересылку запросов .consul
на порт 3000 на той же коробке, которая является моим консулом днс порт. В противном случае, я использую значения по умолчанию dnsmasq (который перенаправляет запросы к другому dns в resolv.conf).
server=/consul/127.0.0.1#3000
Это нормально работает для обычных копаний и возвращает результат с сервера localhost, например. dig consul.service.consul +short
вернусь:
10.22.1.15
10.22.1.16
10.22.1.17
как и ожидалось. Обычный DNS (пересылка на DNS-серверы BIND) также работает нормально, например. dig host.hosts.domain.com +short
вернусь 10.22.1.23
Однако при выполнении зонной передачи dig axfr us1.domain.com
тогда dig вернет около 700 строк, а затем зависнет, всегда в том же месте. Если я включу +retry=0
копать кладет ;; connection timed out; no servers could be reached
внизу после 700 строк.
При выполнении передачи зоны с вышестоящего (связывающего) DNS-сервера он возвращает все 22 000 результатов, как и ожидалось.
С включенной отладкой памяти для копания (-m
флаг) кажется висит на
del 0x7f5c8131e010 size 152 file timer.c line 390 mctx 0x17572d0
когда нажаты ctrl+c, он выдает обратную трассировку, которую мне удалось отследить, чтобы выкопать, думая, что запрос не завершен, что, я полагаю, верно:
dighost.c:3831: REQUIRE(sockcount == 0) failed, back trace
#0 0x7f5c802c4227 in ??
#1 0x7f5c802c417a in ??
#2 0x41212d in ??
#3 0x405e0e in ??
#4 0x7f5c7de2f445 in ??
#5 0x405e6e in ??
Aborted (core dumped)
С включенным дополнительным ведением журнала dnsmasq я вижу это для axfr:
Oct 04 12:17:41 hostname.hosts.domain.com dnsmasq[16055]: forwarded us1.domain.com to 10.0.0.1
Oct 04 12:17:41 hostname.hosts.domain.com dnsmasq[16055]: reply _kerberos.us1.domain.com is DOMAIN.COM
Oct 04 12:17:41 hostname.hosts.domain.com dnsmasq[16055]: reply consul-acl.prod.us1.domain.com is us4
А в верхних логах связывания:
Oct 4 12:20:07 upstreamdns named[17388]: client 10.22.10.20#42228: transfer of 'us1.domain.com/IN': AXFR started
Oct 4 12:20:07 upstreamdns named[17388]: client 10.22.10.20#42228: transfer of 'us1.domain.com/IN': AXFR ended
Я подозреваю, что это связано с максимальными размерами пакетов или что-то в этом роде, но я пробовал варьировать настройки от разных размеров кэша до увеличения dns forwards и edns-packet-max. Очень странно, что запрос axfr из вышестоящего dns работает нормально, но через dnsmasq он возвращает только частичный результат, прежде чем вызвать зависание dig.
Изменить: Я попробовал версию 1.76, а также скомпилировал последний официальный коммит 7cbf497da4100ea0d1c1974b59f9503e15a0cf80 с теми же результатами.
Я использую CentOS Linux версии 7.5.1804 (Core).
Новая информация
После выполнения tcpdump обоих с / без dnsmasq я вижу, что ответ разделяется на два пакета. По какой-то причине dig никогда не получает этот второй пакет при запросе dnsmasq, поэтому он просто зависает. Размеры пакетов составляют 2521 байт и 189 байт, если это что-нибудь значит для кого-либо.
1 ответ
По словам профессора Саймона Келли (создателя dnsmasq), эта проблема вызвана передачей зоны, превышающей 65536 байт, и dnsmasq не реализует методы продолжения, используемые для передачи передач в несколько сообщений.
Поэтому передача в большие зоны не будет работать, и рекомендуется обойтись напрямую с вышестоящим уполномоченным сервером.