我有一台运行 Debian 的服务器,其网络如下:
eth0 - has public IP address 1.2.3.4
eth1 - has public IP address 1.2.3.5
我正在尝试在服务器上设置 VPN,以便我可以通过 Android 手机连接。我按照以下说明操作:http://wiki.debian.org/HowTo/AndroidVPNServer安装和配置 xl2tpd 和 racoon。一切正常,但我还有最后一个调整要做:当我将手机连接到 VPN 时,手机流量从其路由的公共 IP 地址是 eth0 上的地址,即 1.2.3.4。我希望 VPN 流量在 eth1 的 IP 地址(即 1.2.3.5)后面进行 NAT(理想情况下,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 接口的默认路由?
答案1
我已经解决了。
当客户端连接到 VPN 时,就会建立 PPP 连接。
数据包从客户端流向服务器上的 pppN 接口。导致数据包通过“错误”IP 地址从那里流出到互联网的原因是服务器的默认路由表:
$ ip route show
default dev eth0 scope link
即所有出站流量都通过 eth0 传输。
假设我们不想更改默认路由,我们需要创建一个通过 eth1 具有默认路由的单独路由表,并让 VPN 使用它。
将新表的条目添加到 /etc/iproute2/rt_tables :
101 vpn
该编号可以是文件中任何唯一的数字;该名称则是对手头工作的描述性名称。
现在通过 eth1 向该表添加默认路由:
# ip route add table vpn default dev eth1 scope link
最后,强制传入的 VPN 流量(在 pppN 接口上)根据我们的新表进行路由。最简单的方法是使用 /etc/ppp/ip-up.d 和 ip-down.d 机制在 ppp 接口启动和关闭时添加和删除规则。
/etc/ppp/ip-up.d/vpn-routing:
#!/bin/sh
IF=$1
ip rule add dev $IF table vpn
/etc/ppp/ip-down.d/vpn路由:
#!/bin/sh
IF=$1
ip rule delete dev $IF table vpn
为了使所有这些在重启后继续存在,您需要将“ip route add”行放在启动时执行的某些内容中 - 例如防火墙脚本 - 或者作为 eth0 上的 /etc/network/interfaces 中的“up”行。