使用 netcat 将 UDP DNS 查询转换为 TCP DNS 查询

使用 netcat 将 UDP DNS 查询转换为 TCP DNS 查询

我在独立网络上运行 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

使该示例发挥作用的关键是:

  1. dig 有“+vc+”(“虚拟电路”)标志,允许您告诉它使用 TCP 而不是通常的 UDP
  2. 我们的名称服务器(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 隧道结合还是其他方式?

相关内容