分类: LINUX
2015-07-16 10:36:06
状态防火墙,即可以根据连接状态来进行报文处理的防火墙。
应用场景
当想拒绝外部网络主动连接内网,但同时又允许内网主动和外网发起通信,这样防火墙应该放行外网的回应报文,这种情况下该防火墙非常有用。
比如,防火墙只开放了目的端口是80的访问。当内网主机使用源端口1234访问外网web服务器时,防火墙放过,当web服务器回应该请求时,目的端口是1234。这样该回应到达防火墙就被拦截了,无法通过。
使用状态防火墙后,当内网使用源端口1234访问外网web服务器的报文到达防火墙时,防火墙会记录该连接记录,把它加入到防火墙内的连接状态表中。当外网web服务器的回应报文到达防火墙后,会先在防火墙的连接状态表里查找,发现该回应的请求连接是有记录的,防火墙就可以根据rule放行该回应了。
TCP这种面向连接的协议,源和目的的连接终止时,状态防火墙通过检查TCP头的控制标记注意到这个过程,并动态地将该连接从状态表中删除。
UDP和ICMP不是面向连接的协议,无法通过报文来判断连接是否终止。状态防火墙会把将UDP流量看成是有连接的,通过在状态表中设置一个定时器,来定期的老化删除一些无用连接。
期望连接:
一些协议,连接时会分为控制连接和数据连接,我们把数据连接称为是控制连接的期望连接。
我们以tftp协议为例来说明一下期望连接
如果,客户端先发起连接,使用熟知的69端口。因为69端口是分给了tftp server的,tftp server接收到连接请求后,会自己申请一个server主机上未用的端口1235(因为tftp server的69端口还需要接收其他client发来的连接请求,所有不能使用69来传输数据),给tftp client发送回应。以后client和server就使用端口1235来进行通信了。
现在来看,上面连接是两条不同的连接。我们把第二条连接是其一条连接的期望连接。
比如防火墙上只放开了目的端口号69的访问,当内网访问外网的tftp server时,回应报文就会被拦截,导致tftp 功能失效。状态防火墙提出期望连接,当回应报文根据目的端口号发现该回应是已存在连接的期望连接,防火墙放过该回应报文,这样tftp功能OK。
做个实验:
在一台主机上配置如下规则:
iptables -P INPUT DROP //丢弃所有到本机的报文
iptables -A INPUT -p udp --dport 69 -j ACCEPT //放行目的端口69的报文
这时把该主机当tftp client,从tftp server下载东西是无法下载的。
iptables -A INPUT -m conntrack --ctstatus EXPECTED -j ACCEPT//放行期望连接
这时tftp功能OK。
上面介绍了状态防火墙,以及期望连接。现在我们来看看Netfilter是怎么实现状态防火墙的功能。
Ipv4 Netfilter 的状态防火墙实现的基础是IP conntrack,并且结合扩展match conntrack,完成了整个状态防火墙的功能。
结合上面的说明,我们先来归纳一下Netfilter中连接跟踪需要实现哪些功能。
1、需要一张连接状态表,来存放连接记录
2、连接状态表中,需要有定时的垃圾回收机制
3、根据报文进行连接状态的建立及对已有连接状态的更新
4、期望连接的建立和关联
5、在连接跟踪上需要提供易于扩展的接口,来实现用户自定义的一些功能。
(未完待续)