标题基本概括了一切。我想通过 SSH 隧道发送 UDP 流量。具体来说,我需要能够通过隧道发送 UDP 数据包,并让服务器能够将它们发送回另一端的我。我知道如何对 TCP 连接执行此操作。使用 UDP 可以做到这一点吗?
答案1
这个小指南告诉您如何使用大多数类 UNIX 操作系统的标准工具 (ssh、nc、mkfifo) 通过 SSH 发送 UDP 流量。
通过 SSH 连接执行 UDP 隧道
一步步
使用 SSH 连接打开 TCP 转发端口
在您的本地机器(本地)上,通过 SSH 连接到远程机器(服务器),并使用附加的 -L 选项,以便 SSH 执行 TCP 端口转发:
local# ssh -L 6667:localhost:6667 server.foo.com
这将允许本地计算机端口号 6667 上的 TCP 连接通过安全通道转发到 server.foo.com 上的端口号 6667。
在服务器上设置 TCP 到 UDP 转发
在服务器上,我们在 TCP 端口 6667 上打开一个侦听器,它将数据转发到指定 IP 的 UDP 端口 53。如果你想像我一样进行 DNS 转发,你可以使用在 /etc/resolv.conf 中找到的第一个名称服务器的 IP。
但首先,我们需要创建一个 fifo。fifo 是两个通道之间进行双向通信所必需的。一个简单的 shell 管道只会将左进程的标准输出传送到右进程的标准输入。
server# mkfifo /tmp/fifo
server# nc -l -p 6667 < /tmp/fifo | nc -u 192.168.1.1 53 > /tmp/fifo
这将允许服务器端口 6667 上的 TCP 流量转发到 192.168.1.1 端口 53 上的 UDP 流量,并返回响应。
在你的机器上设置 UDP 到 TCP 的转发
现在,我们需要在本地机器上执行与上述操作相反的操作。您需要特权访问权限才能绑定 UDP 端口 53。
local# mkfifo /tmp/fifo
local# sudo nc -l -u -p 53 < /tmp/fifo | nc localhost 6667 > /tmp/fifo
这将允许本地计算机端口 53 上的 UDP 流量转发到本地计算机端口 6667 上的 TCP 流量。享受您的本地 DNS 服务器:)
您可能已经猜到了,当在本地计算机上执行 DNS 查询时,例如在本地 UDP 端口 53 上,它将被转发到本地 TCP 端口 6667,然后转发到服务器的 TCP 端口 6667,然后转发到服务器的 DNS 服务器,即 192.168.1.1 的 UDP 端口 53。要在本地计算机上使用 DNS 服务,请将以下行作为第一个名称服务器放入 /etc/resolv.conf 中:
nameserver 127.0.0.1
答案2
这例子(我认为约翰的回答在不同的地方指出了同一件事),描述了如何通过 TCP/SSH 连接访问另一台机器的 UDP/DNS 服务。
我们将本地 UDP/53 流量转发到 TCP,然后使用 SSH 的端口转发机制将 TCP 流量转发到另一台机器,然后在另一端将 TCP 转发到 UDP/53。
通常,您可以使用 openvpn 来完成此操作。
但在这里,我们将使用更简单的工具来完成此操作,仅使用 openssh 和 netcat。
在该页面的末尾,还有另一条评论,其中提到“socat
',
相同的 UDP/DNS 访问通过,
服务器端:
socat tcp4-listen:5353,reuseaddr,fork UDP:nameserver:53
客户端:socat udp4-listen:53,reuseaddr,fork tcp:localhost:5353
参考socat 示例了解更多信息。
答案3
SSH(至少是 OpenSSH)支持简单的 VPN。使用客户端中的-w
或选项,您可以在两端创建一个设备,该设备可用于转发任何类型的 IP 流量。(另请参阅Tunnel
ssh
tun
Tunnel
ssh_config(5)
)请注意,这需要两端都具有 OpenSSH(可能还有 root 权限)。
答案4
我无法nc
使用 SNMP,因为 SNMP 客户端不断选择新的源 UDP 端口,并且可以同时激活多个端口。
相反,我写了一篇文章来描述如何做到socat
这一点博客文章,以 SNMP 为例。本质上,使用两个终端,从概述开始:
一号航站楼:
client$ ssh -L 10000:localhost:10000 server
server$ socat -T10 TCP4-LISTEN:10000,fork UDP4:switch:161
这将创建 TCP 端口 10000 的 SSH 转发,并在服务器上运行 socat。请注意,交换机的 IP 地址在 socat 命令行中显示为“switch”。
二号航站楼:
client$ sudo socat UDP4-LISTEN:161,fork TCP4:localhost:10000
这样就在客户端上设置了 socat。这样就完成了。