我有一个运行Debian 6的专用Web服务器,以及一些Apache,Tomcat,Asterisk和Mail-stuff。 现在我们需要为特殊的程序添加VPN支持。 我们安装了OpenVPN并向VPN提供商注册。 连接运行良好,我们有一个虚拟tun0接口用于隧道。
为了将通过VPN隧道传输单个程序的目标归档,我们用程序启动程序
sudo -u username -g groupname命令
并添加了一个iptables规则来标记来自groupname的所有stream量
iptables -t mangle -A OUTPUT -m owner –gid-owner groupname -j MARK –set-mark 42
之后我们把iptables告诉一些SNAT,并告诉ip路由使用特殊的路由表来标记stream量数据包。
问题:如果VPN失效,那么特殊的待通过隧道的程序有可能通过正常的eth0接口进行通信。
期望的解决scheme:所有标记的stream量不应该直接通过eth0,必须先通过tun0。
我尝试了以下不起作用的命令:
iptables -A OUTPUT -m owner –gid-owner groupname! -o tun0 -j拒绝
iptables -A OUTPUT -m owner –gid-owner groupname -o eth0 -j REJECT
这可能是问题,上面的iptable规则不起作用,因为数据包首先被标记,然后放入tun0,然后通过eth0传输,而他们仍然被标记。我不知道如何在tun0之后去掉它们,或者告诉iptables,所有标记的数据包可能会通过eth0,如果它们在tun0之前,或者它们去了我的VPN提供商的网关。
有人有任何想法解决scheme吗?
一些configuration信息:
iptables -nL -v -line-numbers -t mangle
链OUTPUT(策略ACCEPT 11M数据包,9798M字节) num pkts字节目标protselect输出源目的地 1 591K 50M MARK全部 - * * 0.0.0.0/0 0.0.0.0/0所有者GID匹配1005 MARK设置0x2a 2 82812 6938K CONNMARK全部 - * * 0.0.0.0/0 0.0.0.0/0店主GID匹配1005 CONNMARK保存
iptables -nL -v -line-numbers -t nat
链POSTROUTING(策略ACCEPT 393包,23908字节) num pkts字节目标protselect输出源目的地 1 15 1052 SNAT all - * tun0 0.0.0.0/0 0.0.0.0/0将0x2a标记为:VPN_IP
ip规则添加从所有的fwmark 42查找42
ip route show table 42
默认通过VPN_IP dev tun0
只要为标记的包添加默认的低优先级路由
ip rule add fwmark 42 table no.out ip route add blackhole 0.0.0.0 metric 100 table no.out
而build立新的VPN连接应该为相同的标记build立路由,但使用较低的度量。