![将流量从 VPN 服务器重定向到 VPN 客户端](https://linux22.com/image/181576/%E5%B0%86%E6%B5%81%E9%87%8F%E4%BB%8E%20VPN%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%20VPN%20%E5%AE%A2%E6%88%B7%E7%AB%AF.png)
我在家里设置了 RaspberryPi、PiHole 和 Wireguard VPN 服务器,这样我就可以通过手机始终通过家庭服务器路由流量并过滤移动流量。现在我想在输出中放置一个 VPN(具体来说是 NordVPN),但由于我启动 NordVPN 连接,我的手机既无法访问内部网络(通过 ssh 客户端)也无法访问互联网。
这是我的路由表,同时启用了 VPN(wg0 是我的手机和树莓派之间的wireguard 接口,tun0 是从树莓派到 NordVPN 的传出 VPN - *** ip 是我要连接的特定服务器):
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.8.0.1 128.0.0.0 UG 0 0 0 tun0
0.0.0.0 192.168.1.1 0.0.0.0 UG 202 0 0 eth0
10.6.0.0 0.0.0.0 255.255.255.0 U 0 0 0 wg0
10.8.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
***.***.***.*** 192.168.1.1 255.255.255.255 UGH 0 0 0 eth0
128.0.0.0 10.8.0.1 128.0.0.0 UG 0 0 0 tun0
192.168.1.0 0.0.0.0 255.255.255.0 U 202 0 0 eth0
如何让我的手机通过 SSH 访问内部网络并通过 NordVPN 隧道访问互联网?
我希望我说清楚了,非常感谢!
答案1
第一个问题是,由于 OpenVPN 客户端设置的默认路由,握手响应被路由到 tun0 接口。
为了解决这个问题:
#adds the default route to respond via the eth0
ip route add default via 192.168.1.1 dev eth0 table 1
#adds the default route to the local network
ip route add 192.168.1.0/24 dev eth0 table 1
#adds the response route
ip route add 10.6.0.0/24 dev wg0 table 1
#adds the policy so that all the traffic that comes through eth0 goes back by eth0
ip rule add from 192.168.1.0/24 table 1
因此,现在进来的所有内容都eth0
将被该规则拦截,并使用表 1 中的内容进行路由,即将所有流量路由回同一接口的那 3 条规则。
现在我们可以成功完成握手并访问本地网络,但我们仍然无法访问互联网,这是我们的第二个问题。默认情况下,wireguard 客户端(或者至少是与 piVPN 一起安装的我的配置)会设置一条 iptables nat 规则,将流量从wireguard 子网 NAT 到接口eth0
。但是使用新的路由表,流量会直接到达接口tun0
,因此它不会被 nat 并会以其原始 IP(10.6.0.2
或其他内容)出去。所以我们必须添加另一个 iptables nat 规则:
iptables -t nat -A POSTROUTING -o tun0 -s 10.6.0.0/24 -j MASQUERADE
希望这可以帮助其他人,我花了整个周末才弄清楚——我必须从头开始!