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)
如何让连接保持活动状态以接收更多请求?
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\nnetstat -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\nssh -N -L 6667:localhost:6667 user@server\n
Run Code Online (Sandbox Code Playgroud)\n\n然后,在服务器端执行以下操作:
\n\nmkfifo /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\nmkfifo /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\nudp 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\nudp 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\nSocat 也会遇到同样的问题,但使用该fork
选项,它会再次监听,并且似乎检测到之前丢失的 \xe2\x80\x9cconnection\xe2\x80\x9d;我认为这会导致延迟。
,sourceport=55550,reuseaddr
如果您只是删除socat 命令中的部分,您可以获得旧的行为(有效一次) 。