3个版本
0.1.2 | 2024年7月24日 |
---|---|
0.1.1 | 2024年7月24日 |
0.1.0 | 2024年7月24日 |
#54 在 网络编程
每月357次下载
28KB
249 行
udp-over-tcp
通过TCP隧道传输UDP数据报的命令行工具。
它特别适用于通过SSH隧道传输UDP。
该工具主要针对两种应用程序需要通过UDP进行通信,但没有明显的客户端-服务器关系的使用场景。也就是说,任一应用程序都可以发起数据包,并且必须在启动时配置另一个应用程序的地址(即端口号不能是随机的)。
您需要在两个应用程序的主机上运行 udp-over-tcp
。每个实例都充当其他主机上运行的应用程序的本地副本。如果某个主机上的应用程序监听UDP端口P,则 udp-over-tcp
将在 其他 主机上监听UDP端口P,并确保流量到副本P会到达真实应用程序的端口P。关键的是, udp-over-tcp
将同时为两个应用程序的端口执行此操作并将端口绑定在一起。它将有效地“假装”每个应用程序都在本地运行。
具体来说,如果一个主机上的应用程序从其端口P发送数据报到(本地副本)端口Q,则数据报将带有源端口P到达真实(远程)应用程序的端口Q。这意味着应用程序始终看到相同的单一地址(localhost)和端口(另一个应用程序的端口),并且该地址-主机对也可以用于应用程序的配对配置。
以下图表可能有助于理解 udp-over-tcp
配置的设置。
安装
该程序为许多平台预编译了(感谢cargo-dist!),并且无需依赖项即可直接运行。
或者,您可以通过Cargo安装它
$ cargo install udp-over-tcp
用法
您在主机X上运行一个UDP应用程序,端口号为A。您希望它与在主机Y上运行的UDP应用程序通信,端口号为B。您还希望允许Y上的应用程序与X上的A通信。太好了,请按照以下步骤操作
在任一主机(此处为X)上,首先创建到另一个主机的TCP隧道
ssh -L 7878:127.0.0.1:7878 $Y
接下来,在两个主机上运行 udp-over-tcp,一个使用 --tcp-listen
,另一个使用 --tcp-connect
。应将 --tcp-listen
用于允许连接 到 的主机(这里为 Y)。您可以根据需要以任意顺序运行它们,但最佳实践是先监听。
Y $ udp-over-tcp --tcp-listen 7878 --udp-bind $A --udp-sendto $B
X $ udp-over-tcp --tcp-connect 7878 --udp-bind $B --udp-sendto $A
在 Y 上,这将监听 UDP 端口 $A,通过 TCP 转发到 X,然后将其交付到那里的 UDP 端口 $A。在 X 上,这将监听 UDP 端口 $B,通过 TCP 转发到 Y,然后将其交付到那里的 UDP 端口 $B。
现在配置 X 上的应用程序,使其发送到 127.0.0.1:$B,并配置 Y 上的应用程序,使其发送到 127.0.0.1:$A。换句话说,相同的端口,本地 IP 地址。
每个参数都接受一个端口号(如上所示)或 addr:port 来指定地址。地址默认为 0.0.0.0(监听/绑定)和 127.0.0.1(连接/发送到)。
替代方案
存在其他可以帮助解决这个问题,尽管它们与这个工具具有不同的属性。
依赖于 nc
或 socat
的解决方案不会保留 UDP 数据报边界,这意味着两个 UDP sendmsg
可能只通过 recvfrom
产生一个(组合)消息。许多 UDP 应用程序无法承受这种影响,因为它们依赖于 UDP 提供消息帧。
mullvad 的 udp-over-tcp 只提供单向转发。可以通过运行工具的额外实例来以相反方向转发,但这意味着传入数据报的源端口不会与传出数据报的目的端口匹配。然而,这对于客户端-服务器风格的应用程序来说可能没问题,因为客户端的端口并不重要。
许可证
根据您的选择许可
- Apache License,版本 2.0(《LICENSE-APACHE》或 http://apache.ac.cn/licenses/LICENSE-2.0》)
- MIT 许可证(《LICENSE-MIT》或 http://opensource.org/licenses/MIT》)
。
贡献
除非您明确表示,否则您提交的任何贡献,根据 Apache-2.0 许可证定义,都应如上所述双重许可,没有任何额外的条款或条件。
依赖关系
~7-17MB
~201K SLoC