Использование netcat для преобразования DNS-запросов UDP в TCP-DNS-запросы

628
Dave

Я использую Debian 9 в изолированной сети и мне нужны службы DNS для разрешения внешних имен хостов.

(Я уверен, что некоторые будут удивляться, почему мне нужно разрешать внешние имена хостов, если я нахожусь в изолированной сети, но это более детально, чем нужно здесь, чтобы задать мой вопрос. Достаточно сказать, что это нужно существует.)

На изолированном хосте, с которого мне нужно разрешить имена внешних хостов, я настроил этот туннель SSH:

ssh -N -L localhost:53:192.168.13.14:53 myUserId@jumpServer 

Здесь 192.168.13.14 - DNS-сервер, который может разрешать все имена глобально. Этот SSH-туннель пересылает все, что слышно на локальном TCP- порту 53, на TCP- порт 53 на 192.168.13.14.

Я могу использовать dig для разрешения имени хоста, указав, что запрос должен выполняться с использованием TCP-порта 53, а не обычного UDP-порта 53:

root@isolatedHost:~# dig @localhost +vc example.com  ; <<>> DiG 9.10.3-P4-Debian <<>> @localhost +vc example.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53054 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1  ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;example.com. IN A  ;; ANSWER SECTION: example.com. 3600 IN A 93.184.216.34  ;; Query time: 133 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Wed Dec 20 15:21:01 MST 2017 ;; MSG SIZE rcvd: 56 

Ключ к созданию этого примера в том, что:

  1. dig имеет флаг «+ vc +» («виртуальный канал»), который позволяет вам использовать TCP вместо обычного UDP
  2. Наш сервер имен (тот, что на 192.168.13.14) настроен на прием обычных рекурсивных запросов по TCP, а также обычного UDP

Конечно, копать это особенное. Можно сказать использовать TCP, а не UDP. В общем случае случайного приложения, вызывающего локальную библиотеку распознавателя, запрос всегда будет выполняться через обычный UDP.

Проблема с моим SSH-туннелем заключается в том, что SSH может пересылать только TCP- порты. Он не может пересылать порты UDP. Итак, мне нужен способ конвертировать все DNS-запросы из обычного UDP в TCP. Затем они могут выйти из нашей изолированной сети через SSH-туннель и добраться до сервера имен.

Первое, что приходит на ум, это netcat:

nc -u -l -p 53 | nc localhost 53 

Это, к сожалению, не работает, и я пока не уверен, почему.

У кого-нибудь есть решение для пересылки UDP-запросов UDP, если это изолированная сеть, с использованием netcat в сочетании с туннелем SSH или иным способом?

0
Вы не можете просто преобразовать дейтаграмму UDP в сегмент TCP. UDP не имеет соединения, но TCP требует соединения между хостами. Запрос DNS должен быть сделан с TCP с самого начала, потому что TCP должен сначала установить соединение между запросчиком и респондентом. Надлежащая реализация DNS требуется для поддержки TCP согласно [RFC 7766] (https://tools.ietf.org/html/rfc7766): «_В этом документе обновляются основные спецификации протокола DNS, так что отныне ТРЕБУЕТСЯ поддержка TCP. часть полной реализации протокола DNS. _ "Ваше приложение и ОС должны поддерживать TCP для DNS. Ron Maupin 6 лет назад 0
XY проблема. [* Как настроить Linux для использования TCP для DNS-запросов? *] (Https://serverfault.com/q/762003) Kamil Maciorowski 6 лет назад 0
Да, целью было то, что для каждого входящего пакета UDP (и стек передает в приложение полные фрагменты, а не фрагменты), будет установлено TCP-соединение, полезная нагрузка UDP, отправленная по TCP-соединению, и TCP-соединение. закрыто. Моя первая попытка команды netcat была слишком упрощенной. Спасибо и Рону и Камилу! Я посмотрю на ссылку "Как настроить Linux для использования TCP для DNS-запросов". Это звучит прекрасно, за исключением того, что у меня нет гарантии, что любое произвольное приложение будет использовать * system * resolver. Dave 6 лет назад 0
Хотите исправить мой последний комментарий, но по какой-то причине не можете его отредактировать ... "(и стек передает приложениям * полные * пакеты * (* не * фрагменты), а не фрагменты ...") Dave 6 лет назад 0
@ Время редактирования комментария ограничено 3 минутами (насколько я знаю). После этого вам просто нужно скопировать / вставить / исправить и опубликовать как новый комментарий (вероятно, удалив старый, если он не верен / не актуален). Anaksunaman 6 лет назад 0

0 ответов на вопрос