基本上我有一个配置为 NAT 的 armbian 发行版,其中 wlan0 是内部接口,eth0 是提供互联网的“公共”接口(该集是由 armbian-config 开箱即用提供的)。
我的设备通过 wlan0 连接并获取 IP,例如 172.24.1.114
我已将 VPN 添加到远程网络,从而创建了 ppp0,IP 为 10.10.10.12
有了这些信息,我想要实现的是:
只有一个 IP(例如 172.24.1.114)必须始终流向 ppp0(即所有来回流量都应流向 ppp0,因此我可以使用远程 IP 到达计算机并在互联网上导航)
所有其他 IP 通常可以访问 eth0
从 armbian-config 配置的 NAT 开始,我添加了额外的 iptables 规则:
-A FORWARD -i wlan0 -o ppp0 -j ACCEPT (this is before -A FORWARD -i wlan0-o eth0 -j ACCEPT created by armbian-config)
-A POSTROUTING -o ppp0 -j MASQUERADE (order shouldn't impact with -A POSTROUTING -o eth0 -j MASQUERADE created by armbian-config)
-A FORWARD -i ppp0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT (just to be sure!)
这些额外的规则 + armbian-config 中的规则似乎效果最好:
From 172.24.1.114 client I can see content of a remote web server, say http://10.10.10.20 ( so apparently it goes thru ppp0)
From 172.24.1.114 client I can navigate on internet, but unfortunately checking the IP I go out with (using a geo ip website), it still results the one from eth0
All other clients correctly navigate going out thru eth0
总结一下,我现在可以通过 VPN 访问该 IP 的远程网络,但无法通过 ppp0 导航
作为最后一次尝试,我找到了设置规则策略的方法,就像本指南中的那样(http://wiki.wlug.org.nz/SourceBasedRouting),这样我就可以指定源 IP 172.24.1.114 转到主表以外的自定义表;然后我在这个新表中添加了 10.10.10.1 dev ppp0 的默认网关。这会导致该 IP 缺乏网络导航。
答案1
我已经全部解决了。首先,所需的 iptables 规则是(这些规则允许访问远程 VPN 机器):
-A FORWARD -i wlan0 -o ppp0 -j ACCEPT
-A POSTROUTING -o ppp0 -j MASQUERADE
然后,为了指示哪些 IP 或 IP 范围必须具有不同的路由,您需要策略规则:
打开
/etc/iproute2/rt_tables
并输入您的条目(ID 表名):100 my_custom_table
ip rule add from 172.24.1.114/24 table my_custom_table
(指示转到除主表之外的另一表以获取源 IP 172.xxx)ip route add 172.24.1.0/24 dev wlan0 table my_custom_table
(需要接收从 ppp0 返回的数据包)ip route add default via 10.10.10.1 dev ppp0 table my_custom_table
(将数据包路由到 VPN 的网关)
确保 VPN 服务器上的防火墙允许来自 VPN IP 的传入流量。
答案2
ip rule
为该源地址创建一个是正确的方法。
诊断此类问题tcpdump
是有用的。
VPN客户端本身可以通过VPN访问互联网吗?
- 如果是,您需要在 VPN 客户端中为您的地址添加 NAT。
- 如果没有,您需要在VPN服务器中添加NAT,并确保它没有被阻止。