Netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址假装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。Iptables/Netfilter的这些规则能够经过灵活组合,造成很是多的功能、涵盖各个方面,这一切都得益于它的优秀设计思想。html
Netfilter是Linux操做系统核心层内部的一个数据包处理模块,它具备以下功能:后端
Netfilter 平台中制定了数据包的五个挂载点(Hook Point,咱们能够理解为回调函数点,数据包到达这些位置的时候会主动调用咱们的函数,使咱们有机会能在数据包路由的时候改变它们的方向、内容),这5个挂载点分别是PRE_ROUTING
、INPUT
、OUTPUT
、FORWARD
、POST_ROUTING
。安全
Netfilter 所设置的规则是存放在内核内存中的,而 iptables 是一个应用层的应用程序,它经过 Netfilter 放出的接口来对存放在内核内存中的 XXtables(Netfilter的配置表)进行修改。这个XXtables由表tables
、链chains
、规则rules
组成,iptables在应用层负责修改这个规则文件。相似的应用程序还有 firewalld 。服务器
filter表网络
主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG)。filter 表对应的内核模块为iptable_filter,包含三个规则链:架构
INPUT
链:INPUT针对那些目的地是本地的包FORWARD
链:FORWARD过滤全部不是本地产生的而且目的地不是本地(即本机只是负责转发)的包OUTPUT
链:OUTPUT是用来过滤全部本地生成的包nat表并发
主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(由于包
的大小限制致使数据可能会被分红多个数据包)只会通过这个表一次。若是第一个包被容许作NAT或Masqueraded,那么余下的包都会自动地被作相同的操做,也就是说,余下的包不会再经过这个表。表对应的内核模块为 iptable_nat,包含三个链:框架
PREROUTING
链:做用是在包刚刚到达防火墙时改变它的目的地址OUTPUT
链:改变本地产生的包的目的地址POSTROUTING
链:在包就要离开防火墙以前改变其源地址mangle表tcp
主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,因为须要相应的路由设备支持,所以应用并不普遍。包含五个规则链——PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD。函数
raw表
是自1.2.9之后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其余表。包含两条规则链——OUTPUT、PREROUTING
iptables中数据包和4种被跟踪链接的4种不一样状态:
NEW
:该包想要开始一个链接(从新链接或将链接重定向)RELATED
:该包是属于某个已经创建的链接所创建的新链接。例如:FTP的数据传输链接就是控制链接所 RELATED出来的链接。--icmp-type 0
( ping 应答) 就是--icmp-type 8
(ping 请求)所RELATED出来的。ESTABLISHED
:只要发送并接到应答,一个数据链接从NEW变为ESTABLISHED,并且该状态会继续匹配这个链接的后续数据包。INVALID
:数据包不能被识别属于哪一个链接或没有任何状态好比内存溢出,收到不知属于哪一个链接的ICMP错误信息,通常应该DROP这个状态的任何数据。在处理各类数据包时,根据防火墙规则的不一样介入时机,iptables供涉及5种默认规则链,从应用时间点的角度理解这些链:
INPUT
链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。OUTPUT
链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。FORWARD
链:当接收到须要经过防火墙发送给其余地址的数据包(转发)时,应用此链中的规则。PREROUTING
链:在对数据包做路由选择以前,应用此链中的规则,如DNAT。POSTROUTING
链:在对数据包做路由选择以后,应用此链中的规则,如SNAT。防火墙处理数据包的方式(规则):
ACCEPT
:容许数据包经过DROP
:直接丢弃数据包,不给任何回应信息REJECT
:拒绝数据包经过,必要时会给数据发送端一个响应的信息。
SNAT
:源地址转换。在进入路由层面的route以前,从新改写源地址,目标地址不变,并在本机创建NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决内网用户用同一个公网地址上网的问题。MASQUERADE
,是SNAT的一种特殊形式,适用于像adsl这种临时会变的ip上
DNAT
:目标地址转换。和SNAT相反,IP包通过route以后、出本地的网络栈以前,从新修改目标地址,源地址不变,在本机创建NAT表项,当数据返回时,根据NAT表将源地址修改成数据发送过来时的目标地址,并发给远程主机。能够隐藏后端服务器的真实地址。REDIRECT
:是DNAT的一种特殊形式,将网络包转发到本地host上(无论IP头部指定的目标地址是啥),方便在本机作端口转发。
LOG
:在/var/log/messages文件中记录日志信息,而后将数据包传递给下一条规则
除去最后一个LOG
,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,因此编写的规则顺序极其关键。
咱们已经知道了Netfilter和Iptables的架构和做用,而且学习了控制Netfilter行为的Xtables表的结构,那么这个Xtables表是怎么在内核协议栈的数据包路由中起做用的呢?
网口数据包由底层的网卡NIC接收,经过数据链路层的解包以后(去除数据链路帧头),就进入了TCP/IP协议栈(本质就是一个处理网络数据包的内核驱动)和Netfilter混合的数据包处理流程中了。数据包的接收、处理、转发流程构成一个有限状态向量机,通过一些列的内核处理函数、以及Netfilter Hook点,最后被转发、或者本次上层的应用程序消化掉。是时候看这张图了:
从上图中,咱们能够总结出如下规律:
咱们在写Iptables规则的时候,要时刻牢记这张路由次序图,根据所在Hook点的不一样,灵活配置规则。
命令格式:
[-t 表名]
:该规则所操做的哪一个表,可使用filter、nat等,若是没有指定则默认为filter-A
:新增一条规则,到该规则链列表的最后一行-I
:插入一条规则,本来该位置上的规则会日后顺序移动,没有指定编号则为1-D
:从规则链中删除一条规则,要么输入完整的规则,或者指定规则编号加以删除-R
:替换某条规则,规则替换不会改变顺序,并且必须指定编号。-P
:设置某条规则链的默认动做-nL
:-L
、-n
,查看当前运行的防火墙规则列表chain名
:指定规则表的哪一个链,如INPUT、OUPUT、FORWARD、PREROUTING等[规则编号]
:插入、删除、替换规则时用,--line-numbers
显示号码[-i|o 网卡名称]
:i是指定数据包从哪块网卡进入,o是指定数据包从哪块网卡输出[-p 协议类型]
:能够指定规则应用的协议,包含tcp、udp和icmp等[-s 源IP地址]
:源主机的IP地址或子网地址[--sport 源端口号]
:数据包的IP的源端口号[-d目标IP地址]
:目标主机的IP地址或子网地址[--dport目标端口号]
:数据包的IP的目标端口号-m
:extend matches,这个选项用于提供更多的匹配参数,如:<-j 动做>
:处理数据包的动做,包括ACCEPT、DROP、REJECT等具体实例请参考 iptables经常使用实例备查。
参考