我正在尝试创建两个网络(使用 Debian 服务器):
- 第一个旨在以正常方式传递数据包(到我的 ISP)。
- 第二个旨在通过我在启动时建立的 L2TP/IPSec VPN 连接传递数据包。
我当前的拓扑是:
eth0
连接到我的 ISP 路由器:(192.168.1.0/24)eth1
(10.0.0.1)连接到我的局域网(10.0.0.0/16)eth1:1
(10.1.0.1)已连接到我的局域网(10.1.0.0/16)ppp0
我的 L2TP/IPSec 连接
如果客户端使用 10.0.0.1 作为路由器,则通过 eth0 访问,如果客户端使用 10.1.0.1 作为路由器,则通过 ppp0 访问。因此,为了实现这一点,我创建了以下 2 条 IPTables 规则:
iptables -A POSTROUTING -t nat -o eth0 -s 10.0.0.0/16 -j MASQUERADE
iptables -A POSTROUTING -t nat -o ppp0 -s 10.1.0.0/16 -j MASQUERADE
第一个网络 (10.0.0.0/16) 运行良好,nat 伪装效果很好。但对于第二个网络 (10.1.0.0/16),它根本不起作用。
我确信 ppp0 正在运行,因为如果我将服务器上的默认路由更改为使用 ppp0 地址,则会traceroute google.com
显示我正在通过 VPN。
我的问题是:为什么它不能与 nat 一起工作?
答案1
您的问题很可能来自于 IPSec 隧道封装数据包的加密。您需要目标和源标头才能使 Natting 正确转发数据包,但是 IPSec 隧道封装了这些数据包并对其进行加密,这使得您的路由器无法引导流量。
根据您的路由器型号和构造,有一些常见的解决方案。思科硬件可以通过以下方式解决这个问题:访问控制列表
参考文献: VPN 和 Natting 详解
答案2
我怀疑你的路由规则有问题。你需要指定哪些目标地址从哪些接口出去。目前可能所有路由都只是从默认网关出去。路由完成后才会应用这些 POSTROUTING 规则。