NAT 将特定 IP 转至 ppp0,将其他 IP 转至来自内部 wifi 接口的 eth0

NAT 将特定 IP 转至 ppp0,将其他 IP 转至来自内部 wifi 接口的 eth0

基本上我有一个配置为 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,并确保它没有被阻止。

相关内容