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

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

我有一台 Ubuntu 12.04/Zentyal 2.3 服务器,在 上配置了 WAN NAT eth0,在 上配置了本地接口eth1wlan0桥接,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"

相关内容