Я использую 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
Ключ к созданию этого примера в том, что:
- dig имеет флаг «+vc+» ("виртуальный канал"), который позволяет вам использовать TCP вместо обычного UDP
- Наш сервер имен (тот, что на 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 или иным способом?