我在独立网络上运行 Debian 9,需要 DNS 服务来解析外部主机名。
(我确信有些人会想知道如果我在隔离网络上,为什么我需要能够解析外部主机名,但这比我在这里提出问题所需的更详细。我只想说,这种需要确实存在。)
在需要能够解析外部主机名的隔离主机上,我设置了此 SSH 隧道:
ssh -N -L localhost:53:192.168.13.14:53 myUserId@jumpServer
此处,192.168.13.14 是可以解析全球所有名称的 DNS 服务器。此 SSH 隧道转发本地听到的任何内容TCP端口 53 至TCP192.168.13.14 上的端口 53。
我可以使用 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
当然,dig 比较特殊。可以指示它使用 TCP 而不是 UDP。在随机应用程序调用本地解析器库的一般情况下,查询将始终通过通常的 UDP 进行。
我的 SSH 隧道的问题是 SSH 只能转发TCP端口。它无法转发 UDP 端口。因此,我需要一种方法将所有 DNS 查询从通常的 UDP 转换为 TCP。然后,它们可以通过 SSH 隧道离开我们的隔离网络并进入名称服务器。
首先想到的是netcat:
nc -u -l -p 53 | nc localhost 53
不幸的是,这不起作用,我还不确定为什么。
是否有人有解决方案来在隔离网络中转发 UDP DNS 查询,使用 netcat 与 SSH 隧道结合还是其他方式?