一、防火墙
防火墙用于实现linux下的访问控制的,分为软件和硬件两种防火墙,防火墙工作的地方一定是在网络边缘,我们需要定义的是防火墙到底如何工作,这就是防火墙的策略,规则,以达到它对出入网络IP、数据进行检测。目前市面上比较常见的有3、4层的防火墙,叫网络层的防火墙,还有7层的防火墙,其实是代理层的网关。
二、iptables
netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数linux软件一样,这个包过滤防火墙是免费的,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
规则(rules):网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间信息过滤表中,这些规则分别指定源地址、目的地址、传输协议(TCP、UDP、ICMP)和服务类型(HTTP、FTP和SMTP)等。当数据包和规则匹配时,iptables就根据规则所定义的方法处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙主要就是删除、添加和修改这些规则。
三、netfilter与 iptables关系
iptables是linux防火墙管理工具位于sbin/iptables,真正实现防火墙功能的是netfilter,它是linux内核实现包过滤内部结构。
四、iptables的规则表和链
表:提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于过滤、网络地址转换、包重构(修改)和数据跟踪处理。
表 | 功能 |
filter表 | 过滤 |
nat表 | 网络地址转换 |
mangle表 | 包重构或者修改 |
raw表 | 数据跟踪处理 |
链:是数据包传播的路径,每一条链其实就是众多规则的一个检查清单,每一条链可以有一条或者多条规则。当一个数据包到达一条链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该包;否则iptables将会继续检查下一条规则,如果该数据包不满足链中任何一条规则,iptables就会根据该链预先定义的默认策略来处理该数据包。
iptable采用“表”和“链”的分层结构。在REHL4中是三张表五个链。现在REHL5组成了四张表五个链,不过多出来的表用的不多。
规则表:
表 | 链个数 | 作用 |
filter表 | INPUT链 FORWARD链 OUTPUT链 | 过滤数据包、 内核模块:iptables_filter |
nat表 | PREROUTING链 POSTROUTING链 OUTPUT | 用于网络地址转换、 内核模块:iptables_nat |
mangle表 | PREROUTING链 POSTROUTING链 INPUT链 OUTPUT链 FOEWARD链 | 修改数据包服务类型、TTL、并且可以配置路由实现Qos内核模块 内核模块:iptables_mangle |
raw表 | OUTPUT链 PREROUTING链 | 决定数据包是否被状态跟踪机制处理 内核模块:iptables_raw |
规则链:
链 | 功能 |
INPUT | 进来的数据包应用此规则链中的策略 |
OUTPUT | 外出的数据包应用此规则链中的策略 |
FORWARD | 转发数据包时应用此规则链中的策略 |
PREROUTING | 对数据包做路由选择前应用此链中规则(所有的数据包进来的时候都先由这个链处理) |
POSTROUTING | 对数据包做路由选择后应用此链中的规则(所有的数据包出来的时候都先由这链处理) |
五、iptables传输
数据包过程
- 当一个数据包进入网卡时,首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去;
- 如果数据包就是进入本机的,它就会沿着图下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,转后到达POSTROUTING链输出;
- 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
六、规则表之间的优先顺序
raw -- mangle--nat--filter
规则链之间的优先顺序(分三种情况):
- 入站数据流向
- 转发数据流向
来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或者拦截),然后再交给POSTROUTING链(是否修给数据包地址等)进行处理
- 出站数据流向