如何通过两个网关路由 VPN 流量?

如何通过两个网关路由 VPN 流量?

我希望能够建立从互联网到地址为 192.168.1.45 的 OpenVPN 服务器的 VPN 隧道。我的家庭网络设置有点复杂,因为我使用 Raspberry pi 作为网关,通过另一个 VPN(图中称为 VPN 1,用粗线表示)路由家庭网络上的所有流量。

链接到网络设置的架构(显然我还不能嵌入图像)

我的设置工作正常,只是在此配置下我无法通过 VPN 2 建立连接。

更多配置详细信息:所有网关都有固定 IP。LAN 网关由 VPN1 网关使用,并将端口 8787 上的传入流量转发到端口 1194(使用我的 ISP GW GUI 设置规则)。以下是 VPN 1 网关上的 iptables 规则:

Chain PREROUTING (policy ACCEPT 15038 packets, 1421K bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain INPUT (policy ACCEPT 10 packets, 1246 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 344 packets, 25041 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 183 packets, 13486 bytes)
num   pkts bytes target     prot opt in     out     source               destination
3     9959 1007K MASQUERADE  all  --  any    tun0    anywhere             anywhere
Chain INPUT (policy DROP 3111 packets, 248K bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
2        8   688 ACCEPT     icmp --  eth0   any     anywhere             anywhere
3     3507  233K ACCEPT     tcp  --  eth0   any     192.168.1.0/24       anywhere             tcp dpt:ssh
4        0     0 ACCEPT     tcp  --  eth0   any     10.8.0.0/24          anywhere             tcp dpt:ssh
5     193K  202M ACCEPT     all  --  any    any     anywhere             anywhere             state RELATED,ESTABLISHED
6        0     0 ACCEPT     udp  --  eth0   any     anywhere             anywhere             udp dpt:openvpn

Chain FORWARD (policy DROP 16 packets, 1408 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     tcp  --  eth0   eth0    anywhere             anywhere             tcp spt:ssh
2        0     0 ACCEPT     tcp  --  eth0   eth0    anywhere             anywhere             tcp dpt:ssh
5    97203   12M ACCEPT     all  --  eth0   tun0    anywhere             anywhere
6     190K  190M ACCEPT     all  --  tun0   eth0    anywhere             anywhere             state RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT 104K packets, 18M bytes)
num   pkts bytes target     prot opt in     out     source               destination

我尝试添加如下规则:

sudo iptables -t nat -A PREROUTING -p tcp --dport 1194 -j DNAT --to-destination 192.168.1.45:1194
sudo iptables -t nat -I POSTROUTING -p tcp -d 192.168.1.45 --dport 1194 -j SNAT --to-source 192.168.1.43

sudo iptables -t nat -A PREROUTING -p tcp --sport 1194 -j DNAT --to-destination 192.168.1.1:1194
sudo iptables -t nat -I POSTROUTING -p tcp -d 192.168.1.1 --sport 1194 -j SNAT --to-source 192.168.1.45

sudo iptables -I FORWARD -i eth0 -o eth0 -p tcp --dport 1194 -j ACCEPT
sudo iptables -I FORWARD -i eth0 -o eth0 -p tcp --sport 1194 -j ACCEPT

但它不起作用。我现在陷入困境,无法在网上找到解决方案……不幸的是,我在这个领域也是个菜鸟,我做这个只是为了好玩,只是通过反复试验才学到东西。任何帮助都非常感谢 :)

答案1

成功了!我终于设法按照预期的方式路由数据包。解决方案是,仅使用 iptables 是不够的,我还需要修改 VPN 数据包的路由并使用命令添加新规则ip

如果有人想做类似的事情,我会这样做:

# do port forwarding to the VPN 2 server and allow forward traffic
iptables -t nat -A PREROUTING -p tcp --dport 1194 -j DNAT --to-destination 192.168.1.45:1194
iptables -I FORWARD -i eth0 -o eth0 -p tcp --dport 1194 -j ACCEPT
iptables -I FORWARD -i eth0 -o eth0 -p tcp --sport 1194 -j ACCEPT
# mark all packets that have to be routed through the 192.168.1.1 gateway
iptables -t mangle -A PREROUTING -p tcp --sport 1194 -j MARK --set-mark 1
# define desired specific route for marked packets
echo 201 openvpn1194.out | tee --append /etc/iproute2/rt_tables
ip rule add fwmark 1 table openvpn1194.out
ip route add default via 192.168.1.1 dev eth0 table openvpn1194.out

请注意,这些更改在重新启动后将不会保留,如果它们适合您,则需要使它们永久保留。

相关内容