UDP远程端口转发最有效的方式?

UDP远程端口转发最有效的方式?

我在连接到家庭宽带的 Raspberry Pi 上安装了 OpenVPN 服务器,但它位于运营商级 NAT 后面。当服务器位于 NAT 后面时,最好的远程 UDP 端口转发方法是什么,才能让 UDP 在 OpenVPN 上运行?我尝试的第一件事是在路由器上进行端口转发,但由于 CGNAT 而不起作用。

我使用此 VPN 的主要原因是,当外出时(例如使用公共 WiFi 时),我可以通过家庭宽带连接路由互联网流量。

我有一个 VPS,目前$ ssh -R :1194:localhost:1194 ubuntu@myvps在 Raspberry Pi 上使用GatewayPorts yesSSH 服务器配置进行端口转发。当 OpenVPN 服务器协议配置为 TCP 而不是 UDP 时,此方法有效。

我试过socat

VPN服务器端:$ socat tcp4-listen:1190,reuseaddr,fork UDP:localhost:1194
VPS端:$ socat udp4-listen:1194,reuseaddr,fork tcp:localhost:1190

但是$ ssh -R :1190:localhost:1190 ubuntu@myvps OpenVPN 客户端在尝试连接一分钟后超时并得到:

pi ovpn-server[81373]: ues/127.0.0.1:35092 tls-crypt unwrap error: packet replay
pi ovpn-server[81373]: ues/127.0.0.1:35092 TLS Error: tls-crypt unwrapping failed from [AF_INET]127.0.0.1:35092
pi ovpn-server[81373]: ues/127.0.0.1:35092 tls-crypt unwrap error: bad packet ID (may be a replay): [ #3 / time = (1628117978) Wed Aug  4 23:59:38 2021 ] -- see the man page entry for --no-replay and --replay-window for more info or silence this warning with --mute-replay-warnings

OpenVPN 服务器日志中多次出现。

然后我尝试SSF——安全套接字漏斗

OpenVPN端:$ ./ssf -V :1194:127.0.0.1:1194 -g myvps
VPS端:$ ./ssfd -g

它可以工作,但比 TCP 慢,并且ssf当有 VPN 活动时,该过程会占用 Pi 上的高 CPU 。我怀疑这与 SSF 使用的加密有关,并且效率不高。

有没有更好的 UDP 远程端口转发方法,以便我获得最快的连接?隧道不一定需要加密,因为 OpenVPN 无论如何都使用加密。

[PiVPN 服务器] <- [CGNAT] <- [VPS] <- [客户端设备 (Windows、Android、iOS 等)]

答案1

我找到了一个解决方案,即使用ssh -w并使用iptables进行端口转发。SSH 服务器将需要:

 PermitTunnel yes

sshd_config

然后在 Pi 上运行:

sudo ip tuntap add dev tun1 mode tun user pi group pi
sudo ip link set tun1 up
sudo ip addr add 10.0.0.200/32 peer 10.0.0.100 dev tun1

在 VPS 上:

sudo ip tuntap add dev tun1 mode tun user <username> group <usergroup>
sudo ip link set tun1 up
sudo ip addr add 10.0.0.100/32 peer 10.0.0.200 dev tun1

sudo iptables -I FORWARD -d 10.0.0.200 -m comment --comment "Accept to forward VPN traffic" \
 -m udp -p udp --dport 1194 -j ACCEPT
sudo iptables -I FORWARD -m comment --comment "Accept to forward VPN return traffic" \
 -s 10.0.0.200 -m udp -p udp --sport 1194 -j ACCEPT
sudo iptables -t nat -I PREROUTING -m udp -p udp --dport 1194 -m comment \
 --comment "redirect pkts to VPN server" -j DNAT --to-destination 10.0.0.200:1194
sudo iptables -t nat -I POSTROUTING -m comment --comment "NAT the src ip" \
 -d 10.0.0.200 -o tun1 -j MASQUERADE

最后在 Pi 上运行:

ssh -w 1:1 -fN username@myvps

现在我已在 UDP 上运行 OpenVPN。它也适用于 WireGuard,因此现在我已将它们都启动并运行。

相关内容