用于通过 TCP 隧道传输 UDP 数据报的命令行工具。
它对于通过 SSH 建立 UDP 隧道特别有用
该工具主要针对以下用例而设计:您有两个应用程序需要通过 UDP 相互通信,而没有明显的客户端-服务器关系。也就是说,任一应用程序都可以发起数据包,并且必须在启动时配置另一个应用程序的地址(即端口不能是随机的)。
您在两个应用程序的主机上运行udp-over-tcp
。每个实例都充当另一个实例上运行的应用程序的本地副本。如果一台主机上的应用程序侦听 UDP 端口 P,则udp-over-tcp
将侦听另一台主机上的 UDP 端口 P,并确保到副本 P 的流量流向真实应用程序的端口 P。至关重要的是, udp-over-tcp
将同时对两个应用程序的端口执行此操作并绑定端口。它将有效地“假装”每个应用程序都在另一个应用程序本地运行。
具体来说,如果一台主机上的应用程序从其端口 P 向(本地副本)端口 Q 发送数据报,则该数据报将到达真实(远程)应用程序的端口 Q ,源端口为 P 。这意味着应用程序始终会看到相同的单个地址(本地主机)和端口(另一个应用程序的端口),并且该相同的地址-主机对也可以在应用程序的对等配置中使用。
希望下图可以帮助您理解udp-over-tcp
配置的设置:
该程序针对多种平台进行了预编译(感谢cargo-dist!),并且应该可以开箱即用,没有依赖项。
或者,您可以通过 Cargo 安装它
$ cargo install udp-over-tcp
您有一个在主机 X 的端口 A 上运行的 UDP 应用程序。您希望它与在主机 Y 的端口 B 上运行的 UDP 应用程序进行通信。并且您还希望允许 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-2.0 许可证中所定义)均应获得上述双重许可,没有任何附加条款或条件。