我有一台 Ubuntu 12.04/Zentyal 2.3 服务器,在 上配置了 WAN NAT eth0
,在 上配置了本地接口eth1
和wlan0
桥接,br1
并在 上运行 DHCP,在 上配置了 OpenVPN 连接tun0
。我只需要在网关本身上运行某些程序的 VPN,并且我需要确保在网关上运行的所有内容都通过 VPN tun0
。
root:~# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default gw... 0.0.0.0 UG 100 0 0 eth0
link-local * 255.255.0.0 U 1000 0 0 br1
192.168.1.0 * 255.255.255.0 U 0 0 0 br1
A.B.C.0 * 255.255.255.0 U 0 0 0 eth0
root:~# ip route
169.254.0.0/16 dev br1 scope link metric 1000
192.168.1.0/24 dev br1 proto kernel scope link src 192.168.1.1
A.B.C.0/24 dev eth0 proto kernel scope link src A.B.C.186
root:~# ip route show table main
169.254.0.0/16 dev br1 scope link metric 1000
192.168.1.0/24 dev br1 proto kernel scope link src 192.168.1.1
A.B.C.0/24 dev eth0 proto kernel scope link src A.B.C.D
root:~# ip route show table default
default via A.B.C.1 dev eth0
如何配置路由 (或其他方式),以便 LAN 上其他主机的所有转发流量都通过,eth0
但网关本身的所有流量都通过 VPN tun0
? 此外,由于 OpenVPN 客户端在启动/关闭时会更改路由,如果 VPN 发生故障并且永不中断,我如何确保网关本身上运行的所有内容都会失去所有网络访问权限eth0
。
答案1
你需要使用某种形式的策略路由,因为您希望根据目标地址以外的其他内容路由流量。我会首先尝试源策略路由,它使用数据包的源地址来选择路由。我以前没有在这种情况下使用过它,所以我不知道在检查新传出连接的规则时是否已经选择了源地址。
首先为 VPN 连接标记一个新的路由表。此操作只需执行一次。
echo 10 vpn >> /etc/iproute2/rt_tables
用规则填充新的路由表以通过 VPN 发送流量(假设 1.0.0.10/24 是 eth0 地址,VPN 网关位于 10.8.0.1)。
ip route add 169.254.0.0/16 dev br1 table vpn
ip route add 192.168.1.0/24 dev br1 table vpn
ip route add 1.0.0.0/24 dev eth0 table vpn
ip route add default via 18.8.0.1 table vpn
然后添加一条规则,将这个新表用于来自主机本身的流量。
ip rule add from 1.0.0.10/32 lookup vpn
如果这不起作用,那么你将不得不使用防火墙标记来选择正确的数据包。
答案2
我能够使用iif lo
如下方法实现这一点。
将默认路由移至单独的表,以便本地规则可以覆盖它:
default_route=$(ip route list | grep -m 1 "default via")
ip route add $default_route table default
ip route delete $default_route
移动主规则的优先级,以便本地角色可以位于主规则和默认规则之间。
main=$(ip rule list | grep -m 1 "lookup main $")
main_rule=$(echo $main | cut -d ":" -f 2)
main_priority=$(echo $main | cut -d ":" -f 1)
ip rule add $main_rule priority 16384
ip rule delete $main_rule priority $main_priority
将VPN默认网关路由添加到单独的表并添加规则。
echo "10 vpn" >> /etc/iproute2/rt_tables
ip rule add priority 24576 iif lo lookup vpn
通过在配置文件中添加以下内容,告诉 OpenVPN 客户端将默认路由放入 vpn 表中/etc/openvpn/*
:
script-security 2
route-up "/bin/sh -x -c 'route_net_gateway=$(ip route ls table default | cut -d \" \" -f 3) && ip route add $trusted_ip via $route_net_gateway table vpn && /sbin/ip route add default via $ifconfig_remote table vpn' route-up"