通过eth0路由转发stream量,但通过tun0本地stream量

我有一个configuration了eth0 WAN NAT的Ubuntu 12.04 / Zentyal 2.3服务器,在运行DHCP的br1上桥接的本地接口eth1wlan0以及tun0上的OpenVPN连接。 我只需要在网关上运行一些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 ABC0 * 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 ABC0/24 dev eth0 proto kernel scope link src ABC186 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 ABC0/24 dev eth0 proto kernel scope link src ABCD root:~# ip route show table default default via ABC1 dev eth0 

如何configuration路由(或以其他方式),使LAN上其他主机的所有转发通信都通过eth0但网关本身的所有通信都通过tun0上的VPN? 另外,由于OpenVPN客户端在启动/closures时会更改路由,因此如何确保在网关上运行的所有内容在VPNclosures的情况下都会丢失所有的networking访问权限,并且永远不会出现eth0

您需要使用某种forms的策略路由 ,因为您要根据目标地址以外的路由来路由stream量。 我会首先尝试源策略路由 ,它使用数据包的源地址来select路由。 我之前没有在这种情况下使用过它,所以我不是如果在检查新的传出连接的规则时已经select了源地址。

首先为VPN连接标记一个新的路由表。 这只需要做一次。

 echo 10 vpn >> /etc/iproute2/rt_tables 

使用规则填充新的路由表,通过VPN发送stream量(假设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 

然后添加一个规则来使用这个新表来处理主机本身的stream量。

 ip rule add from 1.0.0.10/32 lookup vpn 

如果这不起作用,那么你将不得不使用防火墙标记来select正确的数据包。

我能够使用iif lo来完成这个工作,如下所示。

将默认路由移动到单独的表,以便本地规则可以覆盖它:

 default_route=$(ip route list | grep -m 1 "default via") ip route add $default_route table default ip route delete $default_route 

移动主规则的优先级,以便本地angular色可以放在它和默认规则之间。

 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 

通过将以下内容添加到/etc/openvpn/* config文件,告诉OpenVPN客户端将默认路由放在vpn表中:

 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"