: 显示规则编号;
-x: exactly,显示计数器的精确值;
3、CRITERIA
(1)通用匹配:
[!] -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链上的规则;
(2)扩展匹配:
使用iptables的模块实现扩展性检查机制(rpm -ql iptables可中有/lib64/xtables/libxt_NAME.so或者/lib64/xtables/libipt_NAME.so的都是有扩展的,其中小写字母的表示是扩展模块的,大写字母的表示是扩展target的)
扩展模块的:/lib64/xtables/libxt_string.so
/lib64/xtables/libxt_tcp.so
扩展target的:/lib64/xtables/libipt_CLUSTERIP.so
(2.1)隐式扩展:
如果在通用匹配上使用-p选项指明了协议的话,则使用-m选项指明对其协议的扩展就变得可有可无了;
①tcp:
--dport PORT[-PORT] 即可以指明一个或连续的多个端口
--sport PORT[-PORT]
--tcp-flags LIST1 LIST2
LIST1: 要检查的标志位;
LIST2:在LIST1中出现过的,且必须为1标记位;而余下的则必须为0;
例如:--tcp-flags syn,ack,fin,rst syn
--syn:用于匹配tcp会话三次握手的第一次(等同于--tcp-flags syn,ack,fin,rst syn);
②udp:
--sport
--dport
③icmp:
--icmp-type
ping的先发出的那根线就是8,无关s和d;响应的那根线就是0,无关自己是响应的还是对方响应的
8: echo request
0:echo reply
练习:
1、放行本机上的ssh和http服务;要求input和output策略默认均为DROP;
[iyunv@kingdom ~]#iptables -t filter -I INPUT 1 -d 172.16.20.150 -p tcp -m tcp --dport 80 -jACCEPT
[iyunv@kingdom ~]#iptables -t filter -I INPUT 1 -d 172.16.20.150 -p tcp -m tcp --dport 22 -jACCEPT
[iyunv@kingdom ~]#iptables -t filter -I INPUT 2 -d 172.16.20.150 -p tcp -m tcp --dport 80 -jACCEPT
[iyunv@kingdom ~]#iptables -t filter -I OUTPUT 1 -s 172.16.20.150 -p tcp -m tcp --sport 22 -jACCEPT
[iyunv@kingdom ~]#iptables -t filter -I OUTPUT 2 -s 172.16.20.150 -p tcp -m tcp --sport 80 -jACCEPT
[iyunv@kingdom ~]#iptables -t filter -P INPUT DROP
[iyunv@kingdom ~]#iptables -t filter -P OUTPUT DROP
[iyunv@kingdom ~]#iptables -L -n
Chain INPUT (policyDROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.16.20.150 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 172.16.20.150 tcp dpt:80
Chain FORWARD(policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policyDROP)
target prot opt source destination
ACCEPT tcp -- 172.16.20.150 0.0.0.0/0 tcp spt:22
ACCEPT tcp -- 172.16.20.150 0.0.0.0/0 tcp spt:80
2、开放本机对ping的响应,和ping请求;
[iyunv@kingdom ~]#iptables -t filter -A INPUT -d 172.16.20.150 -p icmp -m icmp --icmp-type 8 -jACCEPT
[iyunv@kingdom ~]#iptables -t filter -A OUTPUT -s 172.16.20.150 -p icmp --icmp-type 0 -j ACCEPT
[iyunv@kingdom ~]#iptables -t filter -A OUTPUT -s 172.16.20.150 -p icmp -m icmp --icmp-type 8 -jACCEPT
[iyunv@kingdom ~]#iptables -L -n
Chain INPUT (policyDROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.16.20.150 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 172.16.20.150 tcp dpt:80
ACCEPT icmp -- 0.0.0.0/0 172.16.20.150 icmp type 8
Chain FORWARD(policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policyDROP)
target prot opt source destination
ACCEPT tcp -- 172.16.20.150 0.0.0.0/0 tcp spt:22
ACCEPT tcp -- 172.16.20.150 0.0.0.0/0 tcp spt:80
ACCEPT icmp -- 172.16.20.150 0.0.0.0/0 icmp type 0
ACCEPT icmp -- 172.16.20.150 0.0.0.0/0 icmp type 8
(2.2)显式扩展:必须指明使用的扩展机制;
-m 模块名称
每个模块会引入新的匹配机制;
想知道有哪些模块可用:
rpm -ql iptables
小写字母,以.so结尾;
①multiport扩展:
以离散定义多端口匹配;最多指定15个端口;
专用选项:
--source-ports, --sports PORT[,PORT,...]
--destination-ports, --dports PORT[,PORT,...]
--ports PORT[,PORT,...] 无论是源还是目标都匹配,但实际中不常见,因为源和目标端口号一般都不同
例子:
# iptables -I INPUT 1 -d 172.16.100.11 -p tcp -m multiport --dports 22,80,443 -j ACCEPT
# iptables -I OUTPUT 1 -s 172.16.100.11 -p tcp -m multiport --sports 22,80,443 -j ACCEPT
②iprange扩展:
指定连续的ip地址范围;在匹配非整个网络地址时使用;
专用选项:
[!] --src-range IP[-IP]
[!] --dst-range IP[-IP]
示例:
# iptables -A INPUT -d 172.16.100.11 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
# iptables -A OUTPUT -s 172.16.100.11 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT
③string扩展:
检查报文中出现的字符串,与给定的字符串作匹配;
字符串匹配检查算法:
kmp, bm
目前来说,这两者在性能上没太大差别了,用哪个都可以。起的作用是加快匹配的速度。
专用选项:
--algo {kmp|bm}
--string "STRING"
--hex-string "HEX_STRING":HEX_STRING为编码成16进制格式的字串;
第一种写法:
--algo kmp --string ”sex“
第二种写法:
--hex-string ”XXX“
XXX : 编码成的16进制格式的字串
示例:
# iptables -I OUTPUT 1 -s 172.16.100.11 -p tcp --sport 80 -m string --string "sex" --algo kmp -j REJECT
④time扩展:
基于时间区间做访问控制
专用选项:
--datestart YYYY[-MM][-DD][hh[:mm[:ss]]]
--dattestop YYYY[-MM][-DD][hh[:mm[:ss]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays DAY1[,DAY2,...]
示例:
# iptables -R INPUT 1 -d 172.16.100.11 -p tcp --dport 80 -m time --timestart 08:30 --timestop 18:30 --weekdays Mon,Tue,Thu,Fri -j REJECT
⑤connlimit扩展:
基于连接数作限制;对每个IP能够发起的并发连接数作限制;
注:计数器是从rule生效时才开始计数的
专用选项:
--connlimit-above [n]
# iptables -I INPUT 2 -d 172.16.100.11 -p tcp --dport 22 -m connlimit --connlimit-above 5 -j REJECT
⑥limit扩展:
基于发包速率作限制;
令牌桶算法——只发这么多个令牌,匹配到了就给个令牌执行本rule的target,如果超过了限制的则本规则直接不管(相当于每隔几秒发一个令牌后就下班休息了,连关卡都不看了,由其他规则匹配。超过数量规则限制的则直接去匹配下面的规则,如果匹配到了就能执行对应的target,如果没有,则最终采用默认policy。
专用选项:
--limit n[/second|/minute|/hour|/day]
--limit-burst n
# iptables -R INPUT 3 -d 172.16.100.11 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
练习:
(1) 配置本机的dns服务,并放行之;默认策略为drop;
(2) 配置本机的telnet服务,要求只允许来自于172.16.0.0/16网络中的主机访问,且只允许工作时间访问,而且,每个来源IP最多的并发连接数不能超过2个;
# iptables -t filter -I INPUT 3 -d 172.16.20.150 -p tcp -m tcp--dport 53 -p udp -m udp --dport 53 -j ACCEPT
# iptables -t filter -I OUPUT 3 -s 172.16.20.150 -p tcp -m tcp--sport 53 -p udp -m udp --sport 53 -j ACCEPT
# iptables -t filter -I OUTPUT 4 -s 172.16.20.150 -p tcp -m tcp-dport 53 -p udp -m udp --dport 53 -j ACCEPT
# iptables -t filter -I INPUT 4 -d 172.16.20.150 -p tcp -m tcp-sport 53 -p udp -m udp --sport 53 -j ACCEPT
# iptables -t filter -P INPUT DROP
# iptables -t filter -P OUPUT DROP
(2)
# iptables -t filter -I INPUT 5 -s 172.16.0.0/16 -d 172.16.20.150 -ptcp -m tcp --dport 23 -m time--timestart 08:30 --timestop 17:30 --weekdays Mon,Tue,Wen,Thu,Fri -m connlimit! --connlimit-above 2 -j ACCEPT
# iptables -t filter -I OUTPUT 5 -d 172.16.0.0/16 -s 172.16.20.150-p tcp -m tcp --sport 23 -m time--timestart 08:30 --timestop 17:30 --weekdays Mon,Tue,Wen,Thu,Fri -m connlimit! --connlimit-above 2 -j ACCEPT
⑦state扩展:
启用连接追踪模板记录连接,并根据连接匹配连接状态的扩展;
启用连接追踪功能之前:简单包过滤防火墙;
启用连接追踪功能:带状态检测的包过滤防火墙;
可以过滤掉事先埋伏在主机内的反弹木马以特定端口(如80)去主动连接某个客户端
专用选项:
--state STATE
NEW:
新建立的连接,连接追踪模板中无相应的条目时,客户端第一次发出的请求;
ESTABLISHED:
NEW状态之后,连接追踪模板中的条目删除之前所进行的通信过程,都称为 ESTABLISHED;(理解:IP和端口号都是一样的)
RELATED:
相关联的连接,如ftp协议的命令连接与数据连接即为相关联的连接;(理解 : IP是一样,但端口号不一样)
INVALIED:
无法识别的状态;如 ① syn 1,fin 1;② 6个标志位全为1 或全为0 ;
4、TARGET:
ACCEPT:放行
DROP:丢弃
REJECT:明确拒绝
SNAT:源地址转换
DNAT:目标地址转换
MASQUERADE :动态地址转换(当私网主机是通过DHCP动态获得IP地址时使用)
LOG:日志
REDIRECT:端口重定向;
RETURN: 返回至调用者;
MARK:防火墙标记
(1)SNAT:
主要用于实现让内网客户端访问外部主机时使用;
注意:要定义在POSTROUTING链;也可以在OUTPUT上使用,但很少;
定义方法:
# iptables -t nat -A POSTROUTING -s 内网网络或主机地址 -j SNAT --to-source NAT服务器上的某外网地址
(即要将发出的源地址改为NAT服务器上的外网地址,让外网的服务器能先回复到NAT上)
另一个TARGET:
MASQUERADE:地址伪装;能自行判断该转为哪个源地址;
# iptables -t nat -A POSTROUTING -s 内网网络或主机地址 -j MASQUERADE
(2)DNAT:
主要用于发布内部服务器,让内网中的服务器在外网中可以被访问到;
注意:要定义在PREROUTING链;
定义方法:
# iptables -t nat -A PREROUTING -d NAT服务器的某外网地址 -p 某协议 --dport 某端口 -j DNAT --to-destination 内网某服务器地址[:PORT]
练习:INPUT和OUTPUT默认策略为DROP;
1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
# iptables -A INPUT-s 172.16.0.0/16 -d 172.16.0.1 -p tcp -m tcp --dport 80,443 -m time --weekdaysMon -j REJECT
# iptables -A INPUT-s 172.16.0.0/16 -d 172.16.0.1 -p tcp -m tcp --dport 80,443 -m limit --limit100/second -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT-s 172.16.0.0/16 -d 172.16.0.1 -p tcp -m tcp --dport 80,443 -m string --string"admin" --algo kmp -j REJECT
# iptables -A OUTPUT-s 172.16.0.1 -p tcp -m state --state ESTABLISHED -j ACCEPT
# iptables -P INPUTDROP
# iptables -P OUTPUTDROP
2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;
# iptables -A INPUT-s 172.16.0.0/16 -d 172.16.0.1 -p tcp --dport 21 -m time --timestart 08:30--timestop 18:00 --weekdays Mon,Tue,Wen,Thu,Fri -m state --stateNEW,ESTABLISHED -j ACCEPT
# iptables -A INPUT-s 172.16.0.0/16 -d 172.16.0.1 -p tcp -m time --timestart 08:30 --timestop18:00 --weekdays Mon,Tue,Wen,Thu,Fri -m limit --limit 5/minute -m state --stateRELATIVED -j ACCEPT
# iptables -A OUTPUT-s 172.16.0.1 -p tcp -m state --state ESTABLISHED -j ACCEPT
3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的座位号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;
# iptables -A INPUT-d 172.16.0.1 -p tcp -m tcp --dport 22 -m iprange --src-range172.16.20.1-172.16.20.100 -m limit --limit 2/minit -j ACCEPT
# iptables -A OUTPUT-s 172.16.0.1 -p tcp -m state --state ESTABLISHED -j ACCEPT
4、拒绝TCP标志位全部为1及全部为0的报文访问本机;
# iptables -A INPUT -d 172.16.0.1 -m tcp--tcp-flags all all -j REJECT
# iptables -A INPUT -d 172.16.0.1 -m tcp--tcp-flags all none -j REJECT
5、允许本机ping别的主机;但不开放别的主机ping本机;
# iptables -A OUTPUT-s 172.16.0.1 -p icmp -m icmp --icmp-type 8 -j ACCEPT
# iptables -A INPUT-d 172.16.0.1 -p icmp -m state --state ESTABLISH -j ACCEPT
练习:判断下述规则的意义:
#iptables -N clean_in
在filter表中新建一个名字为clean_in的链
#iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
经由clean_in到255.255.255.255的icmp包都丢弃
#iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP
经由clean_in到172.16.255.255的icmp包都丢弃
#iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
经由clean_in新建立的连接的tcp包中追踪状态是NEW且不是(syn=1,ack=0,fin=0,rst=0)的都丢弃
#iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
经由clean_in的tcp包中丢弃tcp标识都为1的包
#iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
经由clean_in的tcp包中丢弃tcp标识都为0的包
#iptables -A clean_in -d 172.16.100.7 -j RETURN
经由clean_in的发往172.16.100.7的包都跳转至调用clean_in的链中规则的下一条接着处理
#iptables -A INPUT -d 172.16.100.7 -j clean_in
经由INPUT链的发往172.16.100.7的包都交由clean_in链处理
#iptables -A INPUT -i lo -j ACCEPT
通过INPUT链时,数据报文指明接口为lo的都放行
#iptables -A OUTPUT -o lo -j ACCEPT
通过OUTPUT链时,发出的数据报文指明接口为lo的都放行
#iptables -A INPUT -i eth0 -m multiport-p tcp --dports 53,113,135,137,139,445 -j DROP
经eth0流入的tcp数据包经由INPUT时,只要目标端口是53,113,135,137,139,445的都丢弃
#iptables -A INPUT -i eth0 -m multiport-p udp --dports 53,113,135,137,139,445 -j DROP
经eth0流入的udp数据包经由INPUT时,只要目标端口是53,113,135,137,139,445的都丢弃
#iptables -A INPUT -i eth0 -p udp --dport1026 -j DROP
经eth0流入的udp数据包经由INPUT时,只要目标端口是1026的丢弃
#iptables -A INPUT -i eth0 -m multiport-p tcp --dports 1433,4899 -j DROP
经eth0流入的tcp数据包经由INPUT时,只要目标端口是1433和4899的都丢弃
#iptables -A INPUT -p icmp -m limit--limit 10/second -j ACCEPT
进入的icmp包经由INPUT链时限速10个/秒,超过的不被本规则放行