OVS以及linux Bridge都是基于Iptables实现的Firewall。要学习FwaaS,首先,需要知道Linux本身的IPtables是如何工作的。
1. 认识Linux的Firewall
防火墙,可以简单地理解为:对进出本机的所有网卡的数据包进行过滤与转发。
1.1. Linux内核如何实现防火墙 – NetFilter
在linux kernel2.4.x及以上的版本中,使用了NetFilter架构。NetFilter不仅仅具有防火墙的功能,还可以进行地址转换与处理,其运行于内核态,与IP协议栈无缝契合。
NetFilter的主要功能:
1) 连接跟踪模块(connection track)
2) 网络地址转换模块(NAT)
3) 数据报修改模块(mangle)
4) 其他高级功能模块
1.2. 理解NetFilter
NetFilter主要通过表 、链实现了规则,因此,可以认为NetFilter是表的容器,表是链的容器,而链则是规则的容器。
首先,分析NetFilter在系统中的位置:
图表 1
从图1可以看到,NetFilter是运行在三层,使用hook机制处理二层上发的报文。
1.3. Hook机制
Hook,又称为钩子,实际上是一个处理消息的程序段(消息回调函数)。
Hook的主要功能是:当消息到达后,在目标消息处理函数处理该消息之前处理它。其原理可以简单地理解为:在原来的消息处理函数链的头部加入一个新的函数,这种机制就是钩子。
如果存在多个钩子,新增的钩子将会被安排在旧的钩子前。
1.4. NetFilter的Hook机制
在OSI七层模型,网络层收到了二层上传的包,对IP头部进行解析后,进行相应的处理,其中并无与防火墙相关的处理过程。
图表 2
图表 3
图3展示了在无防火墙的情况下,数据包的流动与处理情况。
为了对数据进行监控过滤,可以在图3中的某些点增加一些Hook。
图表 4
图4中,NetFilter增加了5个Hook点:A~E。
1) Hook A:Prerouting
在数据包执行路由判决前,将数据包的浮动IP地址转换为局域网内的IP地址。
2) Hook B:Input
在数据包上传到本机协议栈之前,对其进行过滤,丢弃不符合规则的数据包。
3) Hook C:Forward
对非本机的数据包,进行过滤。
4) Hook D:Output
数据包在被转发出去前进行过滤,保证一些用户的敏感数据不会被窃取。
5) Hook E:Postrouting
在数据包发送出去前,可以修改数据包的源IP地址为一个新的IP地址。PreRouting与PostRouting在内外网的数据包交换中,起着非常重要的作用。
图表 5
具体的NetFilter的介绍可阅读:http://blog.csdn.net/wuruixn/article/details/7957368
1.5. IPtables介绍
大部分的用户可能在深入了解Firewall以前,对NetFilter完全没有概念。
但是谈起Iptables,可能就比较熟悉了,在连接不上远程服务器的时候,大部分的网上资料都会先告诉你将iptablesstop掉,以关闭防火墙的功能。
Linux分为内核态以及用户态,用户态不能直接操作内核。而用户又需要能够设置NetFilter的规则,因此,就有了IPtables。
IPtables可以认为是一套管理工具,用于设定防火墙规则。
注:ebtables也是类似于iptables的管理工具,不同的是ebtables设定的规则工作于数据链路层,而iptables的规则包含数据链路层以及网络层。如果同时存在ebtables以及iptables,则先处理ebtables再处理iptables的规则。
1.6. 三张默认的规则表 – mangle、nat、filter
NetFilter是表的容器。在firewall初始化后,默认会有三张表:Mangle、Nat以及Filter。
图表 6
那么,这里就有个问题:
NetFilter中只有5个Hook点,但是每个Hoook点可能对应不同表格中的链,比如,对于INPUT这个Hook点,在mangle表、nat表以及filter表都有对应的链规则:LOCAL_IN。那么执行的先后顺序是什么?
PRE_ROUTING Hook点
Conntrack>Mangle>DNAT
LOCAL_IN Hook点
Mangle> filter > SNAT > Conntrack
FORWARD Hook点
Mangle> Filter
LOCAL_OUT Hook点
Conntrack> mangle > DNAT >filter
POST_ROUTINGHook点
Mangle> SNAT > Conntrack
图表 7
1.7. IPtables的规则设定
讲完了NetFilter与IPtables之后,开始学习IPables的规则的设置。
首选,需要先确定table的默认规则:Policy
Iptables –P<chain name> target [options]
Eg:Iptables –PINPUT DROP –t mangle
在设定中会发现,nat数据表无法设置policy为ACCEPT外的其他Target。
Target有如下四种:
ACCEPT、DROP、REJECT、RETURN
1.8. 数据包的处理结果:ACCEPT、DROP、REJECT、RETURN
ACCEPT
一个数据包被ACCEPT后,不会再:
× 匹配当前链中的其他规则
× 本表中的其他规则
但是,会匹配:下一张表的规则
DROP
REJECT一个数据包被ACCEPT后,不会再:
× 进行后续的任何规则操作,不管是本表的还是后续表
执行了与DROP相似的操作,但是:
在REJECT后,会主动发送错误消息给发送方。
注:DROP只是阻塞数据包
RETURN
使得数据包从当前匹配的规则链中跳出。
这个操作比较有趣,非常类似于函数中的RETURN:
Ø 把一条复杂的链当做是函数,则在这条链中的子链就是退出主链继续判断下一条链;
Ø 如果这条链是table中的一条简单链,则是跳过余下的所有规则,执行默认的POLICY规则。
注:由于在NEUTRON的封装后的规则表中有较多的RETURN相关的规则,建议理解该条规则。
相关内容可参考该文章:http://blog.csdn.net/wuruixn/article/details/7959127
1.9. IPtables的连接状态跟踪(Connection Tracking)
以上的防火墙规则都是对数据报,但是,还有一类更为严格也更为安全的防火墙:状态防火墙。
简单来说,这个防火墙主要是针对TCP/UDP连接,但其本质上还是对数据报进行分析,得到其中的连接状态信息,并维护在一张状态表中。
状态分为:NEW、ESTABLISHED、RELATED以及INVALID。
l NEW
如果该数据包是本次连接的第一个包,则认为是新的包。
l ESTABLISHED
当接收完第一个包,并往这个连接发送出去一个包,则可以认为本次连接已经建立成功。
l RELATED
有些连接会要求新建一个附属的连接,如ftp(端口:21)会再建立一个连接用于传输数据(端口20)。
l INVALID
其他的状态被认为是不可用的。
说到这里,那么这个状态跟踪到底是用来干嘛的?
这里来做一个小实验:使用SSH连接到ubuntu
Ø 清空IPtables
Ø 设定规则:
iptables -A INPUT -p tcp -m state --state ESTABLISHED -jACCEPT
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -jACCEPT
Ø 设定OUTPUT的规则为DROP
iptables -P OUTPUT DROP
结果:ssh连接仍然正常。
Ø 删除OUTPUT的state规则
iptables -D OUTPUT -p tcp -m state --stateNEW,ESTABLISHED -j ACCEPT
结果:ssh连接卡死
<状态连接的作用>
“以前,我们经常打开1024以上的所有端口来放行应答的数据。现在,有了状态机制,就不需再这样了。因为我们可以只开放那些有应答数据的端口,其他的都可以关闭。这样就安全多了。”
正如,在上面的实验中,将OUTPUT链的POLICY设置为DROP后,所有的外发的包都出不去,但是设定了状态连接规则(conntrack)后,OUTPUT会放行已经建立了连接的数据包。
加入了状态跟踪后,整个过滤流程图为:
图表 8
更详细的内容请参考:
http://os.51cto.com/art/201103/249369.htm
http://os.51cto.com/art/201103/249366.htm