什么是iptables
iptables是Linux系统下常用的防火墙软件,是Linux
netfilter机制的一部分,通过iptables可以操纵linux对网络访问进行精细的控,例如丢掉特定地址来源的数据包。
Iptables工作原理
在Linux系统中,iptables是用于操作Linux内核netfilter系统的用户接口,在Linux系统中,当外部网络的数据包进入内核后,会通过Linux系统预先定义好的流程进行传递,在传递过程中,Linux内核暴露了一系列的接口给用户,从而允许用户在数据包传递的不同点上允许对数据包进行丢弃,修改等操作,这套机制在Linux系统中被称为netfilter机制。
五链四表
Linux系统在系统中总共设置了PREROUTING,INPUT,FORWARD,POSTROUTING,OUTPUT五个控制点(被称为规则链,即五链)通过应用预先定义在filter,nat,mangle,raw四张表中的规则对进出系统的数据包进行精细控制。
对于进入系统的一个数据包,可以在PREROUTING控制点对该数据包进行过滤,修改等操作;PREROUTING控制点完成数据包处理后,进入数据包的路由转发阶段,判断数据包需要路由到本地还是转发出去;路由到本地的数据包,还可以在INPUT控制点被进一步进行处理;需要转发出去的数据包可以在FORWARD控制点和POSTROUTING控制点被进一步处理。
对于本机要发出去的数据包,用户进程将数据包传递到内核空间后,首先可以在OUTPUT控制点进行处理,处理完成后可以通过POSTROUTING控制点进行进一步的处理后,从本机路由出去。
为了能在这几个控制点进行数据包的处理,Linux内核设置了filter,nat,mangle,raw四张控制表,通过在这几个控制表中定义对应的控制规则,则可以完全控制进出Linux系统的数据包,当然,不同的控制点只并不一定能使用全部的控制表,且控制表在进行处理时也具有现后顺序,以raw->mangle->nat->filter顺序进行处理。
不同的控制表具有不同的特征,其情况如下:
RAW表:主要确定是否对数据包进行状态跟踪。
Mangle表:用于修改数据包的服务类型,生存周期,为数据包设置标记,实现流量整形等。
NAT表:修改数据包的IP地址,端口等信息。
Filter表:对数据包进行过滤,根据特定规则确定对数据包如何处理。
netfilter
netfilter是iptables的核心机制,netfilter允许用户通过hook的方式,让Linux内核执行注册的回调函数并完成一系列功能。Netfilter提供了5个可注册接口,具体内容如下:
1:NF_IP_PRE_ROUTING,位于数据包被路由之前,数据包一致性检查完成后,进入该hook位置。
2:NF_IP_LOCAL_IN,位于数据包被路由后,并且数据包的目的地是本机时。
3:NF_IP_FORWARD,位于数据包被路由后,但数据包目的地址不是本机时。
4:NF_IP_LOCAL_OUT:由本机发出的数据包,在被路由之前,进入该hook处理。
5:NF_IP_POST_ROUTING:即将离开本机的数据包,在该hook被处理。
可以看到,iptables的五链四表其实就是利用Linux内核的hook机制进行的实现。
当Linux内核模块被注册后,注册的函数由可以有5种返回值,不同的返回值,内核会进行不同的处理。
1:NF_ACCEPT,报文被正常处理,允许报文通过。
2:NF_DROP,报文被丢弃。
3:NF_STOLEN,取走这个报文,不在进行后续处理。
4:NF_QUEUE,报文进行重新排队,可以被送到用户程序。
5:NF_REPEAT,对该报文重新调用hook函数。
Iptables是利用netfilter机制实现的报文控制系统,也可以理解为iptables是基于netfilter机制的一个应用功能;利用netfilter机制,我们可以自己编码实现类似于iptables的工具,对进出Linux的数据报文进行控制。
netfilter用法示例
下面通过一个简短的样例代码说明,如何使用netfilter机制,在Linux系统种注册自己的回调函数完成对数据报文的控制(需要了解Linux内核模块知识)
iptables工具使用
iptables工具分为两部分,内核部分以及用户部分,内核部分通过Linux
netfilter机制实现,用户部分传递控制参数到内核部分。
Iptables命令格式:
iptables [-t table] COMMAND [chain]
CRETIRIA -j ACTION
-t table,是指操作的表,filter、nat、mangle或raw, 默认使用filter
COMMAND,子命令,定义对规则的管理,可以添加,删除,插入,替换。
chain,指明链路,指明控制点可能更好理解,即在INPUT,FORWARD等5个控制点的哪个控制点进行控制。
CRETIRIA,匹配的条件或判断标准。
ACTION,执行的动作,例如丢弃或接受。
例如对下面这样一条iptables命令:
iptables-A INPUT -s 10.8.0.0/16 -d 172.16.55.7 -p tcp --dport 80 -j DROP
其中参数-A表示添加一条规则。INPUT表示该规则添加在INPUT控制点,-s 10.8.0.0/16 -d 172.16.55.7 -p tcp --dport 80 描述源地址为10.8.0.0/16,目标地址为172.16.55.7,协议类型为tcp,目的端口为80的数据包。-j
DROP表示对满足匹配条件的数据包执行丢弃动作。
COMMAND有四种情况,通过以下参数描述。
-A, --append
chain rule-specification:追加新规则于指定链的尾部。
-I, --insert
chain [rulenum] rule-specification:插入新规则于指定链的指定位置,默认为首部。
-R, --replace
chain rulenum rule-specification:替换指定的规则为新的规则。
-D, --delete
chain rulenum:根据规则编号删除规则。
-L,
--list [chain]:列出规则
匹配条件
通过几个关键的控制字,可以描述一个匹配的数据包。
-s,
--source address[/mask][,...]:检查报文的源IP地址是否符合此处指定的范围,或是否等于此处给定的地址
-d,
--destination address[/mask][,...]:检查报文的目标IP地址是否符合此处指定的范围,或是否等于此处给定的地址
-p,
--protocol protocol:匹配报文中的协议,可用值tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh 或者"all",
-i,
--in-interface name:限定报文仅能够从指定的接口流入,只能用在INPUT, FORWARD and PREROUTING这几个控制链上。
-o,
--out-interface name:限定报文仅能够从指定的接口流出,只能用在FORWARD, OUTPUT and POSTROUTING这几个控制链上。
在特定的协议下,还有一些扩展控制参数:
1:-p tcp:tcp协议场景下,可以使用
--source-port,--sportport[:port]描述源端口。
--destination-port,--dportport[:port]描述目标端口。
--tcp-flagsmask comp描述tcp控制标志位置。
2:-p udp:udp协议下,可使用以下控制参数
--source-port,--sportport[:port]描述源端口。
--destination-port,--dportport[:port]描述目标端口。
3:-p icmp:icmp协议下,可以使用以下控制参数
--icmp-type{type[/code]|typename}描述icmp消息类型
例如:0/0:echo reply或8/0:echo request。
此外,还可以通过匹配报文时间,报文包含的特定字符串对数据包进行匹配。
--timestart hh:mm[:ss]
--timestop hh:mm[:ss] 描述数据包的到达时间。
--algo {bm|kmp} --string pattern描述匹配到的字符串。
--algo {bm|kmp} --hex-string pattern 描述匹配到的16进制字符串。
--connlimit-upto n 匹配连接数目。
--connlimit-above n匹配连接数目。
--state
state限制收发包的状态(状态可以取INVALID,
ESTABLISHED, NEW, RELATED or UNTRACKED)。