iptables四表五链
四表:
四个表的功能有独立的内核模块实现分别是:iptables_filter,iptables_nat
filter:过滤数据包,根据定义的防火墙规则进行判断数据包是放行还是拒绝。表内包含三个链:INPUT,FORWARD,OUTPUT。
NAT:主要用来共享上网和服务器发布。表内包含三个链:PREROUTING,POSTROUTING,OUTPUT。
managle:修改报文首部中的某些信息,如服务类型,TTL等。表内包含五个链。
raw:关闭nat表上启用的连接追踪功能,表内包含两个链,OUTPUT,PREROUTING。
五链(钩子函数)
prerouting:进入本机后,路由功能发生前
input:到达本机内部(入站)
output:由本机发出(出站)
forward:由本机转发(转发)
postrouting:路由功能发生之后,即将离开本机之前
默认表链规则示意图:
主机型防火墙:主要对服务器本机进行保护,使用的链为INPUT,OUTPUT
网络型防火墙:主要作为网关服务器使用,使用的链为FORWARD,PREROUTING,POSTROUTING
数据报过滤匹配流程
规则表之间的匹配顺序
raw-->mangle-->nat-->filter
规则链直接的匹配顺序
到本内部:首先被prerouting链处理(是否修改数据报地址等)然后进行路由选择(判断该数据包应发往何处);如果数据包 的目标地址是防火墙本机,那么内核将交给input链进行处理(判断是否允许通过),如果允许通过则交给系统上的程序进行处理。
由本机发出:首先被output链处理(判断是否允许通过),然后进行路由选择,在交给 postrouting链进行处理(是否修改数据报的地址等)。
由本机转发:外界防火墙的数据包到达防火墙后,首先被prerouting链处理,然后在进行路由选择;然后交给 forward判断是否允许从本机通过, 最后交给postrouing进行处理。
规则链内匹配顺序
1、按顺序依次检查,匹配到即停止
2、若找不到相匹配的规则,则按该链的默认策略处理。
匹配流程示意图:
链上规则放置次序:
同类规则,匹配范围小的放上面;
如:172.16.0.0/16网段,拒绝所有主机上网,但是只允许172.16.100.100主机上网,172.16.100.100这条规则就应该放在172.16.0.0这条规则上面,因为拒绝了172.16.0.0网段也就拒绝了172.16.100.100这台主机。
不同类规则,匹配报文几率较大的放上面;
如:这时一台web服务器,只开放80端口和22端口,开放80端口的规则就需要放在22端口这条规则上面;因为,如果22端口的规则放在80上面,那么每次用户访问80的时候,都需要和22端口进行比较,然后在和80进行比较,这样就浪费了访问80的时间。
(3) 应该设置默认策略;
添加规则时的考量点:
(1) 要实现的功能:判断添加在哪个表上;
(2) 报文流向及经由路径:判断添加在哪个链上;
编写防火墙规则
iptables 语法:
iptables 表名 管理选项 链名 匹配条件 -j 控制条件
管理命令
管理规则:
-A:在链的尾部添加一条规则,如果不写表,默认是filter表
-I 链 [行号]:插入一条规则,插入为对应链上的指定行,如果省略了行,那么为第一条。
-D 链 [行号]:删除指定链中的指定规则。
-R 链 [行号]:替换指定的规则。
管理链:
-F:清空指定表上所有规则;省略链名时,清空表中所有链;
-N:新建一个用户自定义的链;自定义链只能作为默认链上的跳转对象,即在默认链通过引用来生效自定义链;
-X:删除一个自定义的空链(链比如为空,如果不为空使用-F清空)
-Z:将规则的计数器置0;
-P:设置链的默认处理机制,当所有都无法匹配或有匹配又无法做出有效处理机制时,默认策略即生效。
-E:重命名自定义的链。
查看类:
-L:显示指定表中的所有规则。默认显示的规则和主机,是以协议和主机名出现,如果没有配置dns,查看的速度会非常的慢。
-n:以数字形式显示端口和主机名
-v:显示链及规则的详细信息
-vv:显示更加详细
-x:显示计数器的精确值
--line-numbers:显示规则号码
iptables显示解释
[root@iptables ~]# iptables -L -n -v Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
pkts: 被本规则所匹配到的包个数;
bytes:被本规则所匹配到的所包的大小之和;
target: 处理目标 (目标可以为用户自定义的链)
prot: 协议 {tcp, udp, icmp}
opt: 可选项
in: 数据包流入接口
out: 数据包流出接口
source: 源地址
destination: 目标地址;
匹配条件
根据数据报的各种特征,结合iptables的模块结构,匹配条件的设置包括三大类:通用匹配、隐含匹配、显式匹配。
通用匹配:这种匹配方式可以独立使用,不依赖于其他条件或者扩展模块。常见的通用匹配有协议匹配,地址匹配,网络接口匹配。
隐含匹配:这种匹配方式要求以指定的协议匹配作为前提条件,相当于子条件,因此无法独立使用,其对应的功能有iptables在需要的时候自动载入内核。常见的隐含匹配包括端口匹配,tcp标记匹配,ICMP类型匹配。
显式匹配:这种匹配方式要求有额外的内核模块提供支持,必须手动以"-m 模块名称"的形式调用相应的模块,然后方可设置匹配条件。常见的显式匹配包括多端口匹配,IP范围匹配,MAC地址匹配,状态匹配。
通用匹配:
-s, --src, --source IP|Network:检查报文中的源IP地址;
-d,--dst, --destination:检查报文中的目标IP地址;
-p,--protocol:检查报文中的协议,即ip首部中的protocols所标识的协议;tcp、udp或icmp三者之一;
-i,--in-interface:数据报文的流入接口;通常只用于PREROUTING, INPUT,FORWARD链上的规则;
-o,--out-interface:检查报文的流出接口;通常只用于FORWARD, OUTPUT,POSTROUTING链上的规则;
示例:
只允许172.16.4.230访问本机的ssh服务,并且设置INPUT和OUTPUT的默认策略为DROP
[root@iptables ~]# iptables -A INPUT -d172.16.4.100 -p tcp --dport 22 -j ACCEPT [root@iptables ~]# iptables -A OUTPUT -s172.16.4.100 -p tcp --sport 22 -j ACCEPT [root@iptables ~]# iptables -P INPUT DROP [root@iptables ~]# iptables -P OUTPUT DROP [root@iptables ~]# iptables -L -n -v Chain INPUT (policy DROP 10 packets, 780 bytes) pkts bytestarget prot opt in out source destination 181 16068ACCEPT tcp -- * * 0.0.0.0/0 172.16.4.100 tcp dpt:22 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytestarget prot opt in out source destination Chain OUTPUT (policy DROP 0 packets, 0 bytes) pkts bytestarget prot opt in out source destination 62 6496 ACCEPT tcp -- * * 172.16.4.100 0.0.0.0/0 tcp spt:22
扩展匹配:-m MOD_NAME
隐式扩展:如果在通用匹配上使用-p选项指明了协议的话,则使用-m选项指明对其协议的扩展就变得可有可无了;
tcp:
--dportPORT[-PORT]:指定目标端口
--sport:指定源端口
--tcp-flagsLIST1 LIST2
LIST1:要检查的标志位;
LIST2:在LIST1中出现过的,且必须为1标记位;而余下的则必须为0;
例如:--tcp-flags syn,ack,fin,rst syn
--syn:用于匹配tcp会话三次握手的第一次;
udp:
--sport:源端口
--dport:目标端口
icmp:
--icmp-types
0:回应报文,响应自己ping请求。
3:目标不可达
8:请求报文,自己发出的ping请求
示例:
允许自己ping别人,但是不允许别人ping自己
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
multiport扩展:
以离散定义多端口匹配;最多指定15个端口;
专用选项:
--source-ports,--sports PORT[,PORT,...]
--destination-ports,--dports PORT[,PORT,...]
示例:
设置允许连接本机的22,80,443端口
iptables -I INPUT 1 -d 172.16.4.100 -p tcp -mmultiport --dport 22,80,443 -j ACCEPT iptables -I OUTPUT 1 -s 172.16.4.100 -p tcp -mmultiport --sport 22,80,443 -j ACCEPT
iprange扩展:
指定连续的ip地址范围;在匹配非整个网络地址时使用;
专用选项:
--src-rangeIP[-IP] 指定源
--dst-rangeIP[-IP] 指定目标
示例:
设置只允许172.16.4.100-172.16.4.200这个网段访问本机的web服务
[root@iptables ~]# iptables -A INPUT -d172.16.4.100 -p tcp --dport 80 -m iprange --src-range 172.16.4.100-172.16.4.200-j ACCEPT [root@iptables ~]# iptables -A OUTPUT -s172.16.4.100 -p tcp --sport 80 -m iprange --dst-range 172.16.4.100-172.16.4.200-j ACCEPT
string扩展:
检查报文中出现的字符串,与给定的字符串作匹配;
字符串匹配检查算法:
kmp,bm 这两种算法没有什么区别,用那个都可以
专用选项:
--algo{kmp|bm} 指定算法
--string"STRING" 指定过滤的字符串
示例
准备测试文件
[root@iptables ~]# echo "how old are you">> /var/www/html/test1.html [root@iptables ~]# echo "sex how are you">> /var/www/html/test2.html
访问测试,保证在没有设置规则之前这两个网页都可以正常显示
设置防火墙规则,出站的网页文件中包含sex字眼的通通屏蔽
iptables -I OUTPUT 1 -s 172.16.4.100 -p tcp --sport80 -m string --string "sex" --algo kmp -j REJECT
这时在访问test2.html就无法访问了,但是test1.html还可以继续访问
time扩展:
基于时间区间做访问控制,时间以服务器时间为准
专用选项:
--datestartYYYY[-MM][-DD][hh[:mm[:ss]]] #起始日期
--dattestop #结束日志
--timestart #起始时间
--timestop #结束时间
--weekdaysDAY1[,DAY2,...] #周,下面分别是周一到周日
Mon, Tue, Wed, Thu, Fri, Sat, Sun
示例:
设置禁止在8:30到18:30分访问本机的web服务,时间以服务器时间为准
iptables -I INPUT 1 -d 172.16.4.100 -p tcp --dport80 -m time --timestart 08:30 --timestop 18:30 -j REJECT
设置周一到周五的8:30到18:30分访问
iptables -I INPUT 1 -d 172.16.4.100 -p tcp --dport80 -m time --timestart 08:30 --timestop 18:30 --weekdaysMon,Tue,WedThu,Fri -j REJECT
connlimit扩展:
基于连接数作限制;对每个IP能够发起的并发连接数作限制;
专用选项:
--connlimit-above[n] #指定限制的连接数
示例:
设置只允许开启5个远程连接窗口
iptables -I INPUT 2 -d 172.16.4.100 -p tcp --dport22 -m connlimit --connlimit-above 5 -j REJECT
limit扩展:
基于发包速率作限制;
专用选项:令牌桶算法
--limit n[/second(秒)|/minit(分钟)|/hour(小时)|/day(天)]
--limit-burstn #最大初始匹配的数据报数量,默认为5
示例:
设置每两秒可以通过一个ping请求,第一次可以通过5个ping请求。
iptables -I INPUT 1 -d 172.16.4.100 -p icmp--icmp-type 8 -m limit --limit 30/minute --limit-burst 3 -j ACCEPT
connectiontemplate:连接追踪模板,用于记录各连接及相关状态;基于IP实现,与是否为TCP协议无关;通过倒计时的方式删除条目;
记录连接的状态:
NEW:新建立的连接,连接追踪模板中无相应的条目时,客户端第一次发出的请求;
ESTABLISHED:NEW状态之后,边距追踪模板中的条目删除之前所进行的通信过程,都称为ESTABLISHED;
RELATED:相关联的连接,如ftp协议的命令连接与数据连接即为相关联的连接;
INVALIED:无法识别的状态;
state扩展:启用连接追踪模板记录连接,并根据连接匹配连接状态的扩展;
启用连接追踪功能之前:简单包过滤防火墙;
启用连接追踪功能:带状态检测的包过滤防火墙;
专用选项:
--stateSTATE
示例:假设本机是一台web服务器,只对外提供web服务。那么就可以进行如下设置,入站设置为只允许新建连接和已建立连接入站,出站只允许已建立连接出装
iptables -A INPUT -d 172.16.4.100 -p tcp -mmultiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -s 172.16.4.100 -m state --stateESTABLISHED -j ACCEPT
连接追踪功能,在大并发的web服务器或者负载均衡器上面最好不要开启,否则如果超过了最大连接数目,会造成大量连接超时。
调整连接追踪功能所能容纳的连接的最大数目,可以调到三五百万
[root@localhost ~]# cat/proc/sys/net/nf_conntrack_max 31384
表示开启了连接追踪功能,可以使用modprobe卸载
[root@localhost ~]# lsmod | grep conntrack nf_conntrack_ipv4 9506 2 nf_defrag_ipv4 1483 1 nf_conntrack_ipv4 nf_conntrack 80390 2 nf_conntrack_ipv4,xt_state
查看当前追踪的所有连接
[root@localhost ~]# cat /proc/net/nf_conntrack ipv4 2tcp 6 299 ESTABLISHEDsrc=172.16.4.100 dst=172.16.4.10 sport=22 dport=49404 src=172.16.4.10dst=172.16.4.100 sport=49404 dport=22 [ASSURED] mark=0 secmark=0 use=2
放行被动模式ftp
示例:服务器开放了http和ftp而且有需要远程管理。那么可以这样设置,第一条规则允许ESTABLISHED(响应请求或已建立连接)和RELATED(与已有连接相关联性)的数据出站,第二条则是设置允许新连接连接服务器的21,22,80端口。出站设置ESTABLISHED和RELATED。默认策略全部为DROP。这样就提高了查询效率
装载ftp模块
[root@localhost ~]# modprobe nf_conntrack_ftp [root@localhost ~]# lsmod | grep nf_conntrack_ftp nf_conntrack_ftp 12913 0 nf_conntrack 80390 1 nf_conntrack_ftp
设置防火墙规则
iptables -A INPUT -d 172.16.4.100 -p tcp -m state--state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -d 172.16.4.100 -p tcp -mmultiport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT iptables -A OUTPUT -s 172.16.4.100 -m state --stateRELATED,ESTABLISHED -j ACCEPT
如何保存及重载规则:
保存:
(1)service iptables save
/etc/sysconfig/iptables文件;
(2)iptables-save > /PATH/TO/SOMEFILE
重载:
(1)service iptables reload
(2)iptables-restore < /PATH/FROM/SOMEFILE
示例:规则保存和重载
保存规则
[root@localhost ~]# iptables-save >/root/iptables [root@localhost ~]# cat iptables # Generated by iptables-save v1.4.7 on Fri Apr 2417:09:23 2015 *filter :INPUT DROP [302:26822] :FORWARD ACCEPT [0:0] :OUTPUT DROP [18:1176] -A INPUT -d 172.16.4.100/32 -p tcp -m multiport--dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT -A OUTPUT -s 172.16.4.100/32 -m state --stateESTABLISHED -j ACCEPT COMMIT # Completed on Fri Apr 24 17:09:23 2015
清除所有IPTABLES规则是
[root@localhost ~]# service iptables restart
重载规则
[root@localhost ~]# iptables-restore iptables [root@localhost ~]# iptables -L -n -v Chain INPUT (policy DROP 4 packets, 312 bytes) pkts bytestarget prot opt in out source destination 25 2132 ACCEPT tcp -- * * 0.0.0.0/0 172.16.4.100 multiportdports 22,80 state NEW,ESTABLISHED Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytestarget prot opt in out source destination Chain OUTPUT (policy DROP 1 packets, 120 bytes) pkts bytestarget prot opt in out source destination 17 1784 ACCEPT all -- * * 172.16.4.100 0.0.0.0/0 stateESTABLISHED