Netfilter
在linux操作系统中,Netfilter组件是集成在linux内核中扩展各种网络服务的结构化底层框架,在内核级提供防火墙功能。内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则。
Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
- 网络地址转换(Network Address Translate)
- 数据包内容修改
- 以及数据包过滤的防火墙功能
iptables
我们知道iptables是按照规则来办事的,我们就来说说规则(rules),规则其实就是网络管理员预定义的条件,规则一般的定义为"如果数据包头符合这样的条件,就这样处理这个数据包"。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
根据上图,报文的流向:
到本机某进程的报文:PREROUTING --> INPUT
由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT --> POSTROUTING
内核中数据包的传输过程:
(1)当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去
(2)如果数据包就是进入本机的,数据包就会到达INPUT链。经INPUT链检查后,数据包被发往本地进程。本地进程进行相应处理后发送响应数据包,数据包经过OUTPUT链,然后到达POSTROUTING链输出;如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
表的概念
我们知道,防火墙的作用就在于对经过的报文匹配"规则",然后执行对应的"动作",所以,当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了"链",所以,我们把每一个"关卡"想象成如下图中的模样 :
每个"链"上都放置了一串规则,但是这些规则有些很相似,为了方便管理,我们把相同类型的规则存储于同一张表,而iptables已经为我们定义了4种表,每种表对应了不同的功能:
| 表 | 功能 | 内核模块 |
|---|---|---|
| filter表 | 负责过滤功能,防火墙 | iptables_filter |
| nat表 | network address translation,网络地址转换功能 | iptable_nat |
| mangle表 | 拆解报文,做出修改,并重新封装 的功能 | iptable_mangle |
| raw表 | 关闭nat表上启用的连接追踪机制 | iptable_raw |
每个"链"中的规则都存在于哪些"表"中?:
| 规则 | 可以出现的表 |
|---|---|
| PREROUTING | raw表,mangle表,nat表 |
| INPUT | mangle表,filter表,(centos7中还有nat表,centos6中没有) |
| OUTPUT | raw表,mangle表,nat表,filter表 |
| FORWARD | mangle表,filter表 |
| POSTROUTING | mangle表,nat表 |
这个表格是什么意思呢?它的意思是说,prerouting"链"只拥有nat表、raw表和mangle表所对应的功能,所以,prerouting中的规则只能存放于nat表、raw表和mangle表中。
换个维度来看上个表:
| 表 | 可以存储的规则 |
|---|---|
| raw | PREROUTING,OUTPUT |
| mangle | PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING |
| nat | PREROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有) |
| filter | INPUT,FORWARD,OUTPUT |
表的顺序
iptables为我们定义了4张"表",当他们处于同一条"链"时,执行的优先级如下。
优先级次序(由高而低):raw --> mangle --> nat --> filter
匹配条件
匹配条件分为基本匹配条件与扩展匹配条件
基本匹配条件:源地址Source IP,目标地址 Destination IP
上述内容都可以作为基本匹配条件。
扩展匹配条件:
除了上述的条件可以用于匹配,还有很多其他的条件可以用于匹配,这些条件泛称为扩展条件,这些扩展条件其实也是netfilter中的一部分,只是以模块的形式存在,如果想要使用这些条件,则需要依赖对应的扩展模块。源端口Source Port, 目标端口Destination Port
上述内容都可以作为扩展匹配条件
匹配规则
- ACCEPT:允许数据包通过。
- DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
- REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
- SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
- MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
- DNAT:目标地址转换。
- REDIRECT:在本机做端口映射。
参考:
http://www.zsythink.net/archives/1199/ iptalbes
https://blog.csdn.net/beanewself/article/details/78317626