我有一个运行 Debian 的服务器,它有这样的网络:
eth0 - has public IP address 1.2.3.4
eth1 - has public IP address 1.2.3.5
我正在尝试在我可以从我的 Android 手机连接到的服务器上设置一个 VPN。我按照http://wiki.debian.org/HowTo/AndroidVPNServer上的说明安装和配置 xl2tpd 和 racoon。一切正常,但我还有最后一项要调整:当我将手机连接到 VPN 时,从中路由手机流量的公共 IP 地址是 eth0 上的地址,即 1.2.3.4。我希望 VPN 流量在 eth1 的 IP 地址后进行 NAT,即 1.2.3.5(理想情况下,VPN 客户端继续连接到 1.2.3.4)。
我的防火墙规则如下所示:
VPN_CLIENT_RANGE=192.168.200.0/24
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -p esp -j ACCEPT
iptables -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT
# Enable VPN traffic on the ppp+ adapters (only active when a call is established)
# to go through the machine using SNAT/masquerading.
iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp+ -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s $VPN_CLIENT_RANGE -j MASQUERADE
我曾希望在最后三行中将 eth0 更改为 eth1 会达到正确的效果,但它没有 - VPN 客户端可以连接但无法再看到互联网,并且日志显示来自 VPN 客户端的流量(pppX 接口在服务器)仍然从 eth0 发送出去(防火墙在没有最后三行的情况下阻止了它)。
我是否需要以某种方式在 pppd 中配置源地址?或者更改 ppp 接口的默认路由?
我已经解决了。
当客户端连接到 VPN 时,就建立了 PPP 连接。
数据包从客户端流向服务器上的 pppN 接口。导致它们通过“错误”IP 地址从那里流到互联网的原因是服务器的默认路由表:
即所有出站流量都通过 eth0。
假设我们不想更改默认路由,我们需要创建一个单独的路由表,其中包含通过 eth1 的默认路由,并让 VPN 使用它。
将新表的条目添加到 /etc/iproute2/rt_tables :
该编号可以是文件中唯一的任何内容;该名称是手头工作的描述性名称。
现在通过 eth1 将默认路由添加到此表中:
最后,强制根据我们的新表路由传入的 VPN 流量(在 pppN 接口上)。最简单的方法是使用 /etc/ppp/ip-up.d 和 ip-down.d 机制在 ppp 接口启动和关闭时添加和删除规则。
/etc/ppp/ip-up.d/vpn-路由:
/etc/ppp/ip-down.d/vpn-路由:
为了使所有这些在重启后仍然存在,您需要将“ip route add”行放在启动时执行的某些内容中——例如您的防火墙脚本——或者作为“up”行放在 eth0 上的 /etc/network/interfaces 中。