首先看一下什么是×××隧道防火墙。如下图所示:
![×××隧道防火墙的实现_加密](http://my.csdn.net/uploads/201204/27/1335521353_6568.png)
它有以下的特点:
1.首先它是一台网关设备,且是×××隧道的一个端点;
2.它可以在内网接口截获感兴趣流量进而加密送入隧道;
3.它可以在外网接口截获那些“本应该通过隧道却没有通过隧道”的流量进而丢弃之。
其中第1点和第2点说明它是一个×××设备,而第3点说明它是一个防火墙,该设备的存在意味着该设备对内部加密网段仅仅承载隧道过来的流量,对于其它的到达内部加密网段的流量一律丢弃。这种防火墙还需要满足以下的需求,即:允许内网网段主动发起的任何流量-毕竟我们不是专业的防火墙。这里有一个看似矛盾之处,那就是允许内网主动发起的流量,这就意味着如果它从外网卡出去而不是进入隧道的话,其返回流量也是允许从外网卡进入的。问题就是设置在外网卡的策略如何去区分下列两种流量呢:
1.内部需加密网段主动发起的到非隧道区域的返回流量;
2.外部不受信任网络发起的到内部需加密网段的正向流量。
实际上,这是很简单的,只要将该设备看作一个“有状态”的防火墙就可以了,而这个配置十分简单。我们以Open×××为例,当然Cisco的VTI技术也是一样的,对于隧道流量而言,流量解密后应该来自虚拟网卡,而不是物理的外网卡,因此我们只需要在外网卡上做文章即可。三条命令全部搞定:
1.设置一个策略,区分上述两类流量,为感兴趣的不受信任流量打上mark:
iptables -t mangle -A PREROUTING ! -s $允许网段(比如同一局域网) -d $需要经隧道的加密网段 -i $外网卡 -m conntrack --ctdir REPLY -j MARK --set-xmark 200
注意:REPLY这个ctdir匹配项从字面上理解是有问题的,这是内核的bug
2.设置一条策略路由,单独路由第1个配置中mark流量
ip rule add fwmark 200 iif $外网卡 table fw
3.在策略路由中增加路由表项,丢弃所有的mark流量
ip route add blackhole/unreachable default table fw
注意:unreachable有点便宜这些“不好”的流量了,还通告一声,blackhole比较直接,默默丢弃
总结:
使用路由来完成这个防火墙的功能要比使用诸如iptables filter之类的过滤程序效果更佳,不光是效率更高,也更直接。过滤程序丢弃嘛,顶多记录一条日志了不起了,通过路由的方式甚至可以将这类流量导入到一个专门用于审计的主机:ip route add default via $审计主机的网关 table fw