Linux 上带有 socat 的双向 UDP 隧道

Bidirectional UDP tunnel with socat on Linux

是否可以使用 socat 创建双向 UDP 隧道?起点是与服务器 (S) 通信并接收回复的客户端 (C),因此 C⟷S。当然,C 和 S 在不同的网络上,它们之间有一个中继 (R),因此需要 C⟷R⟷S。中继是运行UbuntuLinux.

例如使用 socat this:

sudo nohup socat UDP-LISTEN:1194,fork,reuseaddr UDP:IP-ADDRESS-OF-HOME-ROUTER:1194 &

显然导致中继 (R) 收到的所有数据包都转发到 IP-ADDRESS-OF-HOME-ROUTER,包括来自服务器或 C⟶R⟷S 的回复数据包。

所以我的问题是,是否可以让socat等待来自服务器的回复数据包,并将它们转发回客户端?是否有其他方法可以实现此目标?

第二种方法(带UDP-RECVFROM/UDP-SENDTO的数据报)仅在query/answer模式下有效;来自 OpenVPN 服务器的第二个答案将不会传回给客户端;并且对于每个查询数据包,将分叉一个子进程。

第一种方法为每个“连接”(由源端口确定)派生一个子进程,并且 - 在来自客户端的初始数据包之后 - 双向转发。 子进程将“永远”挂起,因此建议使用超时选项 -T 3600 左右。