Я настроил DNS-сервер на SLES10 (в настоящее время bind 9.6) на многосетевом сервере. Этот сервер может быть запрошен из всех внутренних сетей и предоставляет ответы для всех внутренних сетей. У нас есть две отдельные DNS "основные" зоны. Каждая из этих зон обслуживается рядом авторитетных Windows-DNS-серверов.
Теперь мой linux-сервер является вторичным DNS-сервером для одной из этих зон (частная внутренняя зона) и выполняет функции пересылки для другой зоны (общедоступная внутренняя зона).
До недавнего времени эта настройка работала без проблем. Теперь я получаю - при запросе публичной внутренней зоны (например, с помощью host
команды на клиенте Linux) сообщение об ошибке
;; Усечено, повторная попытка в режиме TCP
Причина этого была выявлена с помощью Wireshark-dump: первый запрос отправляется в режиме UDP, ответ не помещается в UDP (из-за длинного списка доверенных NS), затем повторяется в режиме TCP, обеспечивая правильный ответ.
Теперь вопрос: могу ли я настроить привязку для запроса серверов пересылки в режиме TCP без предварительной попытки UDP?
Обновление: пробую свои силы в ASCII-искусстве ...
+--------------+ +--------------+ +-----------------+
| W2K8R2 DNS | | SLES 10 DNS | | W2K8R2 DNS |
| Zone private +---+ All internal +---+ Zone public |
| internal 2x | | Zones | | internal 30+ x |
+--------------+ +-+----------+-+ +-----------------+
| |
+--+---+ +--+---+
|Client| |Client|
+------+ +------+
host
команду и каким запросом отправляется.minimal-responses: yes
в конфигурацию BIND на SLES 10 - это может уменьшить размеры ответов. В любом случае, большинство обычных запросов не будут превышать 512 байт.Ответы:
Во-первых, я бы не назвал это ошибкой, просто информационное сообщение.
Во-вторых, DNS-серверы всегда будут отвечать на запросы UDP (по крайней мере, BIND, я не могу найти варианты отключения UDP), и клиенты всегда будут (?) Сначала пытаться отправить UDP-запрос (например, в resolv.conf нет параметров, чтобы изменить это. ни в JVM) - если они помещаются в UDP-пакет (обычно это делают запросы)
Если у вас есть конкретный вариант использования, вы можете указать для использования TCP, например, в сценарии оболочки использовать 'dig + tcp' или 'host -T' для разрешения, и вы можете использовать системные вызовы 'sethostent / gethostbyname / endhostent' (см. Man страница), чтобы заставить TCP в других случаях.
Если вы действительно хотите попытаться заблокировать UDP, единственная опция, которую я вижу, - это правило iptable, но я не уверен, что эта настройка будет работать. Я ожидаю, что разрешение DNS просто не удастся.
источник
Ваш сервер BIND должен использовать EDNS (см. RFC 2671), чтобы разрешить пакеты UDP длиннее 512 байт.
Это должно позволить вашему большому набору NS извлекаться по UDP, не требуя дополнительных затрат на соединение TCP для других небольших запросов.
Обратите внимание, что на самом деле это значения по умолчанию. Если EDNS не используется, либо что-то блокирует его, либо серверы, получающие параметры EDNS, не поддерживают его.
Также обратите внимание, что
host
не поддерживает EDNS. Вполне возможно, что ваш сервер пересылки -> запросов уже использует EDNS, и вы просто не можете увидеть его, когда пытаетесь использовать локальный клиент.Попробуйте
dig +bufsize=4096 @server hostname A
вместо того, чтобы использоватьhost
.источник