Примусити DNS-передавачі запити в режим TCP


9

Я встановив DNS-сервер на SLES10 (в даний час пов'язує 9,6) на багатодомному сервері. Цей сервер можна запитувати з усіх внутрішніх мереж і надає відповіді для всіх внутрішніх мереж. У нас є дві окремі "майстерні" зони DNS. Кожну з цих зон обслуговує ряд авторитетних Windows-DNS-серверів.

Тепер мій linux-сервер є вторинним DNS-сервером для однієї з цих зон (приватна внутрішня зона) і виступає переадресатором для іншої зони (публічна внутрішня зона).

Ще недавно ця установка працювала без проблем. Тепер я отримую - при запиті в публічну внутрішню зону (наприклад, за допомогою hostкоманди на клієнті Linux) повідомлення про помилку

;; Обрізаний, повторний досвід у режимі TCP

a wireshark-dump виявив причину цього: Перший запит вимикається в режимі UDP, відповідь не вкладається в UDP (через тривалий список авторитетних NS), потім він повторюється в режимі TCP, надаючи правильну відповідь.

Тепер питання: Чи можу я налаштувати свою прив'язку для запиту експедиторів у режимі TCP, не намагаючись спочатку UDP?

Оновлення: Пробую руку на ASCII-art ...

+--------------+   +--------------+   +-----------------+
| W2K8R2 DNS   |   | SLES 10 DNS  |   | W2K8R2 DNS      |
| Zone private +---+ All internal +---+ Zone public     |
| internal 2x  |   |   Zones      |   | internal 30+ x  |
+--------------+   +-+----------+-+   +-----------------+
                     |          |
                  +--+---+   +--+---+
                  |Client|   |Client|
                  +------+   +------+

невелика діаграма цього була б корисною - я намагаюся зрозуміти, який саме сервер є з вашого опису.
Альнітак

дещо краще, хоча досі незрозуміло між якими саме хостами ви виконуєте цю hostкоманду та яким запитом надсилається.
Альнітак

Клієнти вимагають через SLES10 записи із загальнодоступних зон. Зовнішній приватний внутрішній не страждає - оскільки там є лише 2 записи NS.
Нілс

а клієнти - це просто звичайні вирішувачі заглушок?
Альнітак

пропонуємо додати minimal-responses: yesдо конфігурації BIND на SLES 10 - це може зменшити розміри відповідей. У будь-якому випадку, більшість звичайних запитів не перевищуватиме обмеження 512 байт.
Альнітак

Відповіді:


8

По-перше, я б не назвав це помилкою, а лише інформаційним повідомленням.

По-друге, сервери DNS завжди відповідатимуть на запити UDP (принаймні, BIND, я не можу знайти варіанти відключення UDP), і клієнти завжди (?) Спробують спочатку надіслати запит UDP (наприклад, у resoluv.conf немає варіантів, щоб змінити це ні в JVM) - якщо вони вміщуються в пакет UDP (запити зазвичай роблять)

Якщо у вас є конкретний випадок використання, ви можете вказати на використання TCP, наприклад, у скрипті оболонки використовувати 'dig + tcp' або 'host -T' для вирішення, і ви можете використовувати системні виклики 'sethostent / gethostbyname / endhostent' (див. Man сторінки) змусити TCP в інших випадках.

Якщо ви дійсно хочете спробувати заблокувати UDP, єдиний варіант, який я бачу, - це правило iptable, але я не впевнений, що ця настройка спрацює. Я очікую, що дозвіл DNS просто не вдасться.


номінально є користь від продуктивності, оскільки апріорі знає, що UDP-запит не вдасться, і спершу спробує TCP. Див. RFC 5966 для деякого обговорення цього питання.
Альнітак

@Alnitak, і я хотів би отримати цю вигоду.
Нілс

1
@Nils, тому нам потрібно з'ясувати, чому EDNS, мабуть, не працює ...
Alnitak

У мене немає особливого випадку використання - клієнти будуть використовувати свою бібліотеку розділових файлів, але кожен запит і кожна відповідь будуть надходити по мережі двічі - мені це не подобається.
Нілс

@Nils, проблема полягає в тому, що клієнт вирішує UDP / TCP, але сервер знав розмір відповіді.
Dan Andreatta

4

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

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

Це повинно дозволити отримання великого набору NS через UDP, не вимагаючи накладних витрат на з'єднання TCP для інших менших запитів.

Зауважте, що це фактично значення за замовчуванням. Якщо EDNS не використовується, або щось блокує його, або сервери, що отримують параметри EDNS, не підтримують його.

Також зверніть увагу, що hostEDNS не підтримує. Цілком можливо, що ваш запит на сервер -> вже використовує EDNS, і ви просто не можете його бачити при спробі з місцевим клієнтом.

Спробуйте dig +bufsize=4096 @server hostname Aзамість використання host.


Хто повинен цим користуватися? Можливо, як мій сервер, так і мої експедитори із зони "загальнодоступного внутрішнього"?
Нілс

Який сенс взагалі надсилати повний список НС у відповідь?
Нілс

@Nils протокол DNS вимагає, щоб повний набір записів, що відповідають одному і тому ж (QNAME, QTYPE і QCLASS) кордону, був нероздільним (він же "RRset")
Alnitak

чи можете ви, будь ласка, вказати мені на RFC щодо цього RRset?
Нілс

1
Actaully хост використовує стандартну бібліотеку резолюцій, а на моїй робочій станції він підтримує EDNS0. Щоб перевірити, чи запит задає EDNS0, запустіть 'tcpdump -x порт 53', а шістнадцятковий дамп повинен містити (наприкінці, в додатковому розділі) послідовність 0029 1000 0000 8000 0000, яка є двійковим поданням OPT RR.
Дан Андреатета
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.