Я использую 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