Neutron 的FwaaS学习—初识篇(iptables)

 

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

一个数据包被ACCEPT后,不会再:

 ×    进行后续的任何规则操作,不管是本表的还是后续表

REJECT

执行了与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。

NEW

如果该数据包是本次连接的第一个包,则认为是新的包。

ESTABLISHED

当接收完第一个包,并往这个连接发送出去一个包,则可以认为本次连接已经建立成功。

RELATED

有些连接会要求新建一个附属的连接,如ftp(端口:21)会再建立一个连接用于传输数据(端口20)。

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连接仍然正常。

Ø  删除OUTPUTstate规则

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

http://blog.csdn.net/sandflee/article/details/5767038

http://blog.sina.com.cn/s/blog_6151984a0100ewgy.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值