您需要实现策略路由,这意味着有两个路由表。我们不会触摸main
已经正确设置的路由表。如果您启用了IPv4转发,它将自动从eth1通过您的OpenVPN推送数据包。
首先,我们需要了解OpenVP如何设置路由表。为此,请从命令行启动OpenVPN客户端:
sudo openvpn --config YourConfigFile.conf
(或者YourConfigFile.ovpn
,无论你使用哪个)。最后几行将告诉您如何设置新的路由表,例如在我的情况下它说:
Tue Jul 14 18:58:07 2015 / sbin / ip route添加My.Server.Public.IPaddress / 32 via 192.168.105.1
Tue Jul 14 18:58:07 2015 / sbin / ip route通过10.8.73.5添加0.0.0.0/1
Tue Jul 14 18:58:07 2015 / sbin / ip route通过10.8.73.5添加128.0.0.0/1
星期二7月14日18:58:07 2015 / sbin / ip route通过10.8.73.5添加192.168.73.0/24
Tue Jul 14 18:58:07 2015 / sbin / ip route add 10.8.73.0/24 via 10.8.73.5
Tue Jul 14 18:58:07 2015初始化序列完成
上面的路由应该引入可执行文件,除了这些数字中的一些是这个VPN的特定实例所特有的。然而,OpenVPN提供了有用的环境变量,它们将保存上面使用的接口的值,并且非常方便:在这种特定情况下,它们是
route_net_gateway -> 192.168.105.1
route_vpn_gateway -> 10.8.73.5
因此,您需要添加到文件(让我们称之为/etc/openvpn/route_up.sh
)的行是:
/sbin/ip route add Your.OpenVPN.Server.IPAddress/32 via $route_net_gateway table vpn
/sbin/ip route add 0.0.0.0/1 via $route_vpn_gateway table vpn
/sbin/ip route add 128.0.0.0/1 via $route_vpn_gateway table vpn
/sbin/ip route add Remote.LAN.Net/24 via $route_vpn_gateway table vpn
/sbin/ip route add 172.18.2.0/24 via $route_vpn_gateway table vpn
如果您使用它,请记住在上面替换远程服务器的IP地址和本地LAN的IP地址; 如果您只是使用OpenVPN来获取服务器的IP,那么您根本不需要最后一个语句的旁边。记得让文件可执行,chmod 700 route_up.sh
。
此外,您还必须创建一个新文件,/etc/openvpn/route_down.sh
也是可执行文件,它会删除完全相同的路径(只需更改add
为del
)。
现在我们需要告诉您的OpenVPN避免实现路由,因为我们将手动执行此操作:在YourConfigFile.conf中,添加以下行:
route-nopull
up /etc/openvpn/route_up.sh
down /etc/openvpn/route_down.sh
最后,我们需要为VPN设置不同的路由表。添加一个新的路由表,让我们称之为vpn
:
echo 200 vpn >> /etc/iproute2/rt_tables
现在我们介绍一条规则:
ip rule add from 10.0.0.0/24 table vpn
我假设后面的网络eth1
是10.0.0.0/24
,如果不是,请相应地改变。
最后,您将不得不引入MASQUERADE iptables规则:
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
就是这个。