iptables阻止VPNstream量,如果不通过tun0

我有一个运行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立路由,但使用较低的度量。