Назад | Перейти на главную страницу

Принудительная пересылка DNS-запросов в режим TCP

Я установил DNS-сервер на SLES10 (в настоящее время привязка 9.6) на многосетевом сервере. Этот сервер может быть запрошен из всех внутренних сетей и доставляет ответы для всех внутренних сетей. У нас есть две отдельные «главные» зоны DNS. Каждая из этих зон обслуживается несколькими авторитетными DNS-серверами Windows.

Теперь мой linux-сервер является вторичным DNS-сервером для одной из этих зон (частная внутренняя зона) и действует как сервер пересылки для другой зоны (общедоступная внутренняя зона).

До недавнего времени эта установка работала без проблем. Теперь я получаю - при запросе общедоступной внутренней зоны (например, host команда на клиенте linux) сообщение об ошибке

;; Усечено, повторная попытка в режиме TCP

дамп wirehark выявил причину этого: первый запрос выходит в режиме 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|
                  +------+   +------+

Во-первых, я бы не назвал это ошибкой, это просто информационное сообщение.

Во-вторых, DNS-серверы всегда будут отвечать на запросы UDP (по крайней мере, BIND, я не могу найти параметры для отключения UDP), а клиенты всегда (?) Будут пытаться сначала отправить запрос UDP (например, в resolv.conf нет параметров, чтобы изменить это ни в JVM) - если они помещаются в пакет UDP (обычно это делают запросы)

Если у вас есть конкретный вариант использования, вы можете указать использование TCP, например в сценарии оболочки используйте 'dig + tcp' или 'host -T' для разрешения, и вы можете использовать системные вызовы 'sethostent / gethostbyname / endhostent' (см. справочную страницу) для принудительного использования TCP в других случаях.

Если вы действительно хотите попытаться заблокировать UDP, единственный вариант, который я вижу, - это правило iptable, но я не уверен, что эта настройка сработает. Я ожидаю, что разрешение DNS просто не удастся.

Ваш сервер BIND должен использовать EDNS (см. RFC 2671), чтобы разрешить UDP-пакеты длиннее 512 байт.

options {
    edns-udp-size 4096;
    max-udp-size 4096;
};

Это должно позволить получить ваш большой набор NS через UDP, не требуя накладных расходов TCP-соединения для других небольших запросов.

Однако обратите внимание, что это фактически значения по умолчанию. Если EDNS не используется, либо что-то блокирует его, либо серверы, получающие параметры EDNS, не поддерживают его.

Также обратите внимание, что host не поддерживает EDNS. Вполне возможно, что ваш сервер пересылки -> запросы к серверу уже используют EDNS, и вы просто не можете его увидеть, когда пытаетесь использовать локальный клиент.

Пытаться dig +bufsize=4096 @server hostname A Вместо того, чтобы использовать host.