一、显示扩展:必须显式指明使用的扩展模块
显示扩展:必须使用-m
选项指定使用的扩展
显示当前iptables
可用的显式扩展:
rpm -ql iptables | grep "[[:lower:]]\.so$"
查看man
文档:
- centos 6:
man iptables
- centos 7:
man iptables-extensions
1.multiport
扩展
以离散方式定义多端口匹配;最多指定15个端口;(一条规则实现多端口操作)
- 格式:
[!] –source-ports,–sports port[,port|,port:port]… :指明多个源端口;
[!] –destination-ports,–dports port[,port|,port:port]… :指明多个离散的目标端口;
[!] –ports port[,port|,port:port]… :很少用
示例,放行10.10.0.0/16
这个网段主机允许访问本机22
和80
端口:
iptables -I INPUT -s 10.10.0.0/16 -d 10.10.10.2 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I OUTPUT -s 10.10.10.2 -s 10.10.0.0/16 -p tcp -m multiport --sports 22,80 -j ACCEPT
2.iprange
扩展
指明连续的(但一般不能扩展为整个网络)IP地址范围时使用;
格式:
[!] --src-range from[-to]
:指明连续的源IP地址范围;
[!] --dst-range from[-to]
:指明连续的目标IP地址范围;
示例,放行10.10.100.1
–10.10.100.120
这个网段主机的22
,23
,24
,25
,80
端口:
iptables -I INPUT -d 10.10.10.2 -p tcp -m multiport --dports 22:25,80 -m iprange --src-range 10.10.100.1-10.10.100.120 -j ACCPET
iptables -I OUTPUT -s 10.10.10.2 -p tcp -m multiport --sports 22:55,80 -m iprange --dst-range 10.10.100.1-10.100.120 -j ACCEPT
3.string
扩展
检查报文中出现的字符串(--algo
);
--algo {bm|kmp}
bm= Boyer-Moore
kmp= Knuth-Pratt-
这是两个字符串匹配算法,根据两个开发者命名而来。
示例:
[root@server ~]#cat /var/www/html/bad.html
this is a movie page
[root@server ~]#
当匹配到movie
字符串时,REJECT
掉:
iptables -I OUTPUT -m string --algo bm --string "movie" -j REJECT
此时访问bad.html
这个页面已经打不开
4.time
扩展
根据报文到达的时间与指定的时间范围进行匹配;
--datestart
:指定其实日期
--datestop
:指定结束日期
格式:
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
也可以指定某天:
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]
具体使用请man iptables
的time
扩展(新版iptables
则man iptables-extesions
)
示例,每天的14点到16点不允许访问本机80
端口:
iptables -I INPUT -d 192.168.1.2 -p tcp --dport 80 -m time --timestart 14:00 --timestop 16:00 -j DROP
注意时间分CST
和UTC
时区,data
命令可查看当前时区在哪,iptables
的time扩展
添加的时区一般是按UTC
算的,所以两者相差8个小时。
5.connlimit
扩展
根据客户端IP
(也可以是地址块)做并发连接数数量匹配;
--connlimit-above n
:连接的数量大于n
--connlimit-upto n
:连接的数量小于等于n
示例,对于tcp第一次请求(即第一次握手,--syn
参数)的主机最多请求两次23
端口:
iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT
示例2,限制22
端口最多连接数为3
:
iptables -I INPUT -p tcp --dport 22 -m connlimt --connlimit-above 3 -j REJECT
6.limit
扩展
基于收发报文的速率做检查,涉及令牌桶过滤器;
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
示例,一分钟内只能被ping
30次(所有主机加起来),对于前五个ping
没有限制:
iptables -A INPUT -d 192.168.1.2 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT
iptables -A OUTPUT -s 192.168.1.2 -p icmp --icmp-type 0 -j ACCEPT
7.state
扩展
根据连接追踪机制检查连接的状态;
调整连接追踪功能所能够容纳的最大连接数量:
cat /proc/sys/net/nf_conntrack_max
查看已经追踪到兵记录下的连接:
cat /proc/net/nf_conntrack
不同协议或链接类型追踪时长(可自定义时长):
ls /proc/sys/net/netfilter/
可追踪的连接状态:
NEW
:新发出的请求;连接追踪模板中不存在此连接相关的信息条目,因此,将其识别为第一次发出的请求;ESTABLISHED
:NEW
状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态;RELATED
:相关的连接;如FTP
协议中的命令连接与数据连接之间的关系;INVALIED
:无法识别的连接;
格式:--state STATE1,STATE2...
示例,只允许NEW
和ESTABLISHED
入站,ESTABLISHED
出站:
iptables -I INPUT -d 10.10.10.2 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -s 10.10.10.2 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
这样限制的好处是让所有的连接都安全出去,无法发出NEW
请求(反弹木马攻击就是靠NEW
请求),大大提升安全性。
再比如,想放行80
和22
端口(使用multiport
扩展实现):
iptables -I INPUT -d 10.10.10.2 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -s 10.10.10.2 -p tcp -m multiport --dports 22,80 -m state --state ESTABLISHED -j ACCEPT
规则优化
上面几条命令可以优化为:
iptables -I INPUT -d 10.10.10.2 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptabls -I OUTPUT -m state --state ESTABLISHED -j ACCPET ##优化出站规则
初步优化后的规则如下:
[root@server ~]# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.30.0.12 multiport dports 22,80 state NEW,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 172.30.0.12 icmp type 8 state NEW,ESTABLISHED
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED
[root@server ~]#
可见,入站规则每条都有NEW
和ESTABLISHED
,当有一个ESTABLISHED
请求入站时需要一条条匹配才能放行,可想而知,当有几百条规则时效率是极低的。
此时,可以在入站规则添加一条: 凡是ESTABLISHED
(说明此前被放行过了)请求全部放行。这样所有ESTABELISHED
只要匹配第一条规则即可入站。
优化后的规则如下:
[root@server ~]# iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT
[root@server ~]# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 172.30.0.12 multiport dports 22,80 state NEW,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 172.30.0.12 icmp type 8 state NEW,ESTABLISHED
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED
[root@server ~]#
再接着,INPUT
表的第二、三条的ESTABLISHED
请求可以删了(删之前先添加,因为此时用的ssh
连接服务器,匹配的第二条),改成只检查NEW
即可
最终优化:
[root@server ~]# iptables -I INPUT 2 -d 172.30.0.12 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT
[root@server ~]# iptables -I INPUT 3 -d 172.30.0.12 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
[root@server ~]# iptables -D INPUT 4
[root@server ~]# iptables -D INPUT 4 ##删除第四条后,第五条变为第四条,因此这里还是删除第四条
[root@server ~]# iptables -L -n -v
Chain INPUT (policy DROP 1 packets, 40 bytes)
pkts bytes target prot opt in out source destination
8466 628K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED
2 120 ACCEPT tcp -- * * 0.0.0.0/0 172.30.0.12 multiport dports 22,80 state NEW
30 840 ACCEPT icmp -- * * 0.0.0.0/0 172.30.0.12 icmp type 8 state NEW
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 9 packets, 630 bytes)
pkts bytes target prot opt in out source destination
7065 1062K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED
[root@server ~]#
用state
扩展可以提升系统安全性是必然的,但是,因为其用的是追踪访问机制,所以也会影响效率,所以平时最好综合实际环境使用。
有些协议的追踪访问时间长,而有些则短,比如TCP
会话超时时间两个小时(很长)
因此,可以自定义协议的追踪时间时长
不同协议或链接类型追踪时长:
ls /proc/sys/net/netfilter/
二、隐式扩展
隐式扩展:对-p protocol
指明的协议进行的扩展,可省略-m
选项
-p tcp
--dport PORT[-PORT]:目标端口,可以是单个或连续多个端口;
--sport PORT[-PORT]
--tcp-flags LIST1 LIST2 SYN,ACK,FIN,RST,PSH,URG
#检查LIST1所指明的所有标志位, 且这其中,
#LIST2所表示出的所有标记位必须为1,而余下的必须为0;
#没有LIST1中指明的,不做检查;
例如:
--tcp-flags SYN,ACK,FIN,RST SYN #等于--syn,检查是否为新建TCP请求的第一次请求
-p udp
--dport
--sport
-p icmp
--icmp-type
#可用数字表示其类型:
0:echo-reply #回送应答(ping应答)
8:echo-request #ping请求
比如允许本机ping
任何主机,但不允许任何主机ping
本机:
iptables -A OUTPUT -s 192.168.1.2 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 192.168.1.2 -p icmp --icmp-type 0 -j ACCEPT
示例二,放行本机入站的22端口,-I INPUT 默认插入INPUT第一条链:
iptables -I INPUT -d 192.168.1.2 -p tcp --dport 22 -j ACCEPT
示例三,放行本机出站ssh的22端口:
iptables -I OUTPUT -s 192.168.1.2 -p tcp --sport 22 -j ACCEPT
三、规则保存及重载
- 保存规则至指定文件:
iptables-save > /PATH/TO/SOMEFILE
- 从指定文件重载规则:
iptables-restore < /PATU/FROM/SOMEFILE
其他用法
CentOS 6
:
service iptables save
##相当于iptables-save > /etc/sysconfig/iptables
service iptables restart
##相当于iptables-restore < /etc/sysconfig/iptables
总结:
显示扩展必须使用-m
选项指定扩展,后接扩展参数或选项
隐式扩展是对-p protocol
的协议扩展