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

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

在超级用户问题中通过 SSH 隧道的 UDP 流量,它描述了如何通过 SSH 隧道传输 DNS:

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

ssh -N -L 6667:localhost:6667 user@server

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

mkfifo /tmp/fifo
nc -k -l 6667 < /tmp/fifo | nc -u ip_of_dns_server 53 > /tmp/fifo

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

mkfifo /tmp/fifo
nc -k -l -u 53 < /tmp/fifo | nc 127.0.0.1 6667 > /tmp/fifo

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

client# host m6.fr 127.0.0.1

我怎样才能保持连接以接收更多请求?

答案1

TL;DR:不要使用 Netcat,使用索卡特用于实验。它可以更好地处理任何事情。

它不起作用的原因不是命名管道(即使它是一种丑陋的方法并且存在其他问题)而是 netcat 的限制。

一旦 Netcat 收到 UDP 连接,它就会绑定到该连接。因此它不再监听端口 53,而是连接到发送初始数据包的端口,就像它对 TCP 所做的那样。每次您执行 DNS 请求时,该工具都会更改端口,Netcat 永远不会收到该请求。因此只有第一个请求会起作用。

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

netstat -aunp|grep -w 53
udp        0      0 0.0.0.0:53              0.0.0.0:*                           12316/nc.openbsd 

执行(唯一有效的)查询并再次尝试 netstat:

# netstat -aunp|grep -w 53
udp        0      0 127.0.0.1:53            127.0.0.1:44335         ESTABLISHED 12316/nc.openbsd

如您所见,netcat 只是改变了模式:从监听变为循环连接。由于是 UDP,Netcat 不会自动知道“已建立的连接”不再存在。

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

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

ssh -N -L 6667:localhost:6667 user@server

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

mkfifo /tmp/fifo
nc -k -l 6667 < /tmp/fifo | nc -u ip_of_dns_server 53 > /tmp/fifo

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

mkfifo /tmp/fifo
nc -k -l -u 5555 < /tmp/fifo | nc 127.0.0.1 6667 > /tmp/fifo

socat udp4-listen:53,reuseaddr,fork udp:127.0.0.1:5555,sourceport=55550,reuseaddr

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

第一次查询之前:

# netstat -aunp|egrep -w '53|5555'
udp        0      0 0.0.0.0:5555            0.0.0.0:*                           12715/nc.openbsd    
udp        0      0 0.0.0.0:53              0.0.0.0:*                           12717/socat         

1日后:

udp        0      0 127.0.0.1:55550         127.0.0.1:5555          ESTABLISHED 12736/socat         
udp        0      0 127.0.0.1:5555          127.0.0.1:55550         ESTABLISHED 12715/nc.openbsd    
udp        0      0 0.0.0.0:53              0.0.0.0:*                           12717/socat         

第二次查询后:

udp        0      0 127.0.0.1:55550         127.0.0.1:5555          ESTABLISHED 12750/socat         
udp        0      0 127.0.0.1:5555          127.0.0.1:55550         ESTABLISHED 12715/nc.openbsd    
udp        0      0 0.0.0.0:53              0.0.0.0:*                           12717/socat         
udp        0      0 127.0.0.1:53            127.0.0.1:53255         ESTABLISHED 12750/socat         

Socat 会遇到同样的问题,但有了这个fork选项,它会再次监听,并且似乎检测到了之前丢失的“连接”;我认为这会造成延迟。

,sourceport=55550,reuseaddr如果您仅删除socat 命令中的部分,您就可以获得旧的行为(工作一次) 。

相关内容