通过 SSH 连接的 DNS 隧道失去连接

Sta*_*low 5 linux dns netcat ssh-tunnel

在 Super User question UDP traffic through SSH tunnel 中,它描述了如何通过 SSH隧道建立 DNS 隧道:

首先,在客户端,执行以下操作:

ssh -N -L 6667:localhost:6667 user@server
Run Code Online (Sandbox Code Playgroud)

然后,在服务器端执行以下操作:

mkfifo /tmp/fifo
nc -k -l 6667 < /tmp/fifo | nc -u ip_of_dns_server 53 > /tmp/fifo
Run Code Online (Sandbox Code Playgroud)

最后,回到客户端执行以下操作:

mkfifo /tmp/fifo
nc -k -l -u 53 < /tmp/fifo | nc 127.0.0.1 6667 > /tmp/fifo
Run Code Online (Sandbox Code Playgroud)

之后,我可以按预期进行 DNS 查询,但仅限于单个请求

client# host m6.fr 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

如何让连接保持活动状态以接收更多请求?

A.B*_*A.B 1

TL;DR:不要\xe2\x80\x99t使用Netcat,使用Socat进行实验。它可以更好地处理任何事情。

\n\n

它\xe2\x80\x99s 不工作的原因是\xe2\x80\x99s 与命名管道有关(即使它\xe2\x80\x99s 是一个丑陋的方法,还潜伏着其他问题),而是netcat 的限制。

\n\n

一旦 Netcat 收到 UDP 连接,它就会与其绑定。因此,它不再侦听端口 53,而是连接到发送初始数据包的端口,就像使用 TCP 一样。每次您\xe2\x80\x99 执行 DNS 请求时,该工具都会更改端口,并且 Netcat 将永远不会收到该请求。所以只有第一个请求才有效。

\n\n

设置示例时,请在第一个查询之前尝试以下命令:

\n\n
netstat -aunp|grep -w 53\nudp        0      0 0.0.0.0:53              0.0.0.0:*                           12316/nc.openbsd \n
Run Code Online (Sandbox Code Playgroud)\n\n

执行(唯一有效的)查询并重试 netstat:

\n\n
# netstat -aunp|grep -w 53\nudp        0      0 127.0.0.1:53            127.0.0.1:44335         ESTABLISHED 12316/nc.openbsd\n
Run Code Online (Sandbox Code Playgroud)\n\n

正如您所看到的,netcat 刚刚改变了模式:从监听连接到循环连接。因为它\xe2\x80\x99s UDP,Netcat不会\xe2\x80\x99自动知道\xe2\x80\x9c建立的连接\xe2\x80\x9d不再存在\xe2\x80\x99。

\n\n

我有一个概念证明(这使它工作并显示问题与此 UDP 模式有关),但除了客户端上的 netcat 之外,它还需要 socat。目标是让所有请求使用相同的 UDP端口到达 netcat。服务器端没有任何变化,但我在链的开头插入 socat(即最后一个命令)以强制将 UDP 请求的源端口发送到 Netcat。

\n\n

首先,在客户端执行以下操作:

\n\n
ssh -N -L 6667:localhost:6667 user@server\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,在服务器端执行以下操作:

\n\n
mkfifo /tmp/fifo\nnc -k -l 6667 < /tmp/fifo | nc -u ip_of_dns_server 53 > /tmp/fifo\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后,回到客户端执行以下操作:

\n\n
mkfifo /tmp/fifo\nnc -k -l -u 5555 < /tmp/fifo | nc 127.0.0.1 6667 > /tmp/fifo\n\nsocat udp4-listen:53,reuseaddr,fork udp:127.0.0.1:5555,sourceport=55550,reuseaddr\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我可以进行多个查询。

\n\n

在第一次查询之前:

\n\n
# netstat -aunp|egrep -w \'53|5555\'\nudp        0      0 0.0.0.0:5555            0.0.0.0:*                           12715/nc.openbsd    \nudp        0      0 0.0.0.0:53              0.0.0.0:*                           12717/socat         \n
Run Code Online (Sandbox Code Playgroud)\n\n

第 1 次之后:

\n\n
udp        0      0 127.0.0.1:55550         127.0.0.1:5555          ESTABLISHED 12736/socat         \nudp        0      0 127.0.0.1:5555          127.0.0.1:55550         ESTABLISHED 12715/nc.openbsd    \nudp        0      0 0.0.0.0:53              0.0.0.0:*                           12717/socat         \n
Run Code Online (Sandbox Code Playgroud)\n\n

第二次查询后:

\n\n
udp        0      0 127.0.0.1:55550         127.0.0.1:5555          ESTABLISHED 12750/socat         \nudp        0      0 127.0.0.1:5555          127.0.0.1:55550         ESTABLISHED 12715/nc.openbsd    \nudp        0      0 0.0.0.0:53              0.0.0.0:*                           12717/socat         \nudp        0      0 127.0.0.1:53            127.0.0.1:53255         ESTABLISHED 12750/socat         \n
Run Code Online (Sandbox Code Playgroud)\n\n

Socat 也会遇到同样的问题,但使用该fork选项,它会再次监听,并且似乎检测到之前丢失的 \xe2\x80\x9cconnection\xe2\x80\x9d;我认为这会导致延迟。

\n\n

,sourceport=55550,reuseaddr如果您只是删除socat 命令中的部分,您可以获得旧的行为(有效一次) 。

\n