本博客参考博客地址朱双印的博客
iptables 分为链,表,,匹配条件,处理动作
- 链:prerouting ,forward ,postrouting ,input,output
- 表:filter,mangle,nat,raw
- 匹配条件:源地址,目标地址,源端口,目标端口
- 处理动作
ACCEPT,DROP,REJECT,SNAT,MASQUERADE,DNAT,REDIRECT,LOG
链,表,处理动作之间的关系
iptables 的管理规则:
1.查看指定链的规则:
iptables -nL 链名
iptables -nL INPUT
2.刷新之前规则:
iptables -F 链名
iptables -F INPUT
3.增加规则:
iptables -t 表 -I/A 链 -s 源地址 -j 处理动作
-I表示在最前插入,-A表示在最后追加
如果报文被前边的规则匹配到,那么就不会再被后边的规则匹配。
iptables -t filter -I INPUT -s 192.168.1.1 -j DROP
如果表是filter 可以默认不使用
iptables -nvL
Chain INPUT (policy ACCEPT 28 packets, 1900 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 192.168.1.1 0.0.0.0/0
在iptables 中,target 表示动作
pkts 表示有多少包被匹配到,bytes 表示匹配的总大小为多少
4.删除规则:
删除规则有两种方法:
根据规则编号
根据规则匹配条件和动作
查看规则编号:
iptables --line -vnL INPUT
iptables --line -nvL INPUT
Chain INPUT (policy ACCEPT 236 packets, 24265 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 DROP all -- * * 192.168.1.1 0.0.0.0/0
进行删除规则:
iptables -t filter -D INPUT 1
iptables -D INPUT -s 192.168.1.1 -j DROP
删除表上的规则
iptables -t 表名 -F
iptables -F
5.修改规则:
iptables -R INPUT 1 -s 192.168.1.1 -j REJECT
-R 选项表示修改指定的链, 1 表示指定链的第一条规则,-s 选项表示规则对应的源地址,且**-s 不可省略**,即使我们已经指定了规则对应的编号,使用-R修改规则时,也不能省略,如果么有指定的话,修改完成后,规则中的源地址自动变为0.0.0.0/0 ,-j 又是REJECT ,这样,所有的ip 请求都被拒绝。
建议 先删除,再重建。
6.保存规则:
service iptables save
cat /etc/sysconfig/iptables
iptabls-save ,将所有的规则输出到屏幕上
可以使用重定向将其放入配置文件中,原有规则会被覆盖
7.设置默认规则
iptables -t 表名 -P 链名 动作
表示将链名中的默认规则设置为动作。
匹配条件的更多用法
-s 指定多个IP或者指定地址段
iptables -t filter -I INPUT -s 192.168.1.1,182.234.21.1 -j DROP
iptables -t filter -I INPUT -s 192.168.1.0/24 -j DROP
对源地址匹配条件取反
iptables -I INPUT ! -s 120.26.48.161 -j ACCEPT
iptables -t filter -P INPUT ACCEPT
! s 表示对120.26.48.161 不匹配,并没有指定如果是120 的话,如何处理,所以,当120 进行ping 时,匹配不到这个规则,所以继续向下匹配,最后匹配到默认规则。默认规则 时ACCEPT
-d 匹配目标地址
iptables -t filter -I INPUT -s 192.168.21.1 -d 192.158.13.2 -j ACCEPT
表示只有报文来自192.168.21.1,且目的地是192.158.13.2 才会被匹配到。
-p 协议类型
如果要拒绝所有tcp 请求,那么可以如下设置:
iptables -t filter -I INPUT -s 192.168.1.1 -d 192.168.1.2 -p tcp -j REJECT
在centos6 中,-p 选项支持:
tcp ,udp,udplite icmp esp ah ,sctp
tcp : ssh
icmp : ping
-i -o 网卡接口
当主机有多个网卡时,我们可以使用-i 选项来匹配报文是通过那块网卡流入本机的。
由于是流入本机,根据上边的数据流向图可以看出:
-i 选项只适用于PREROUTING ,FORWARD , INPUT 三条链
当主机有多个网卡时,我们可以使用-o选项来匹配报文是通过那块网卡流出本机的。
由于是流出本机,根据上边的数据流向图可以看出:
FORWARD OUTPUT POSTROUTING 三条链, FORWARD 属于中立链,能同时适用于-i 和-o
扩展匹配条件
除了上边的匹配地址,匹配网卡,匹配协议,剩下的都是扩展匹配,扩展匹配要指定扩展模块
如果没有使用-m 指定对应的扩展模块,那么就会默认使用与-p 对应协议名称相同的模块
iptables -t filter -I INPUT -s 192.168.1.22 -p tcp -m tcp --dport 22 -j REJECT
-p 指协议 -m 指模块 --dport 指目标端口 --sport 指源端口 可以指定范围但无法离散指定多个不连续的端口:--dport 20:3306 。 如果需要指定多个离散的端口,需要借助multiport 模块
--dport 22: 指22 端口后的所有端口
iptables -t filter -I INPUT -s 192.168.1.22 -p tcp -m multiport --dport 22,33,44 -j REJECT
```
**iprange 扩展模块**
如果我们需要指定一段连续的IP地址范围,用于匹配报文的源地址或者目标地址,就需要指定iprange模块
iprange 的两个扩展匹配条件:
--scr-range --dst-range 用来匹配范围IP
iptables -I INPUT -s 192.168.1.22 -m iprange –src-range 192.168.1.22-192.168.1.33 -j DROP
iptables -I INPUT -s 192.168.1.22 -p tcp -m iprange –src-range 192.168.1.22-192.168.1.33 -j DROP
**string扩展模块**
使用string 模块,可以指定需要匹配的字符串,如果报文中包含对应的字符串,那么符合匹配条件
创建一个http 服务,在首页写上要过滤的字符。
iptables -I OUTPUT -m string –algo bm –string “hello” -j REJECT
那么,无法通过http 协议访问到该网页
–algo 用于表示匹配算法,可选算法有bm 和kmp ,此选项为必选项,可以任意指定一个
–string 用于指定需要匹配那个字符串
**time 模块**
用于限制访问时间
**connlimit 扩展模块**
connlimit 模块可以限制每个IP地址同时连接到server 的链接数量,不用指定IP,默认就是所有。
如果我们要限制,每个IP,最多只能有两个ssh 连接到server,那么,可以如下:
iptables -I INPUT -p tcp -m tcp –dport 22 -m connlimit –connlimit-above 2 -j REJECT
表示每个客户端IP的ssh 请求最多不能高于2
iptables -I INPUT -p tcp –dport 22 -m connlimit –connlimit-above 2 –connlimit-mask 24 -j DROP
表示在24位子网内,只有2个客户端可以连接。
**limit 扩展模块**
connlimit 是针对链接数量进行限制的,limit模块是对"报文到达速率"限制的
我们可以用limit 限制单位时间内流入的流量。
我们可以以秒,分钟,小时,计算。
比如,限制每秒最多流入3个包,每分钟限制30个包,等等。。
iptables -I INPUT -m limit -p icmp –limit 10/minute -j ACCEPT
iptables -A INPUT -p icmp -j REJECT
第一条规则: 每6秒放行一个包,到第六秒时,达到的报文就会进行规则匹配,执行对应的动作,而上面的动作是ACCEPT,在6秒之前到达的包是无法被上述规则匹配到的,而默认匹配规则是ACCEPT,所以,所有的报文包,都会被接受
添加上第二条规则后,报文默认是REJECT ,没有到第6个包之前,所有的包都拒绝,到第六个包,接受。 所以,ping 报文放行的速率就会发生变化。
注意: limit模块使用了令牌桶算法,使用–limit 用于指定多长时间生成一个新令牌,而–limit-bust 用于指定木桶中存放几块令牌,只有持有令牌的包才能从防火墙中穿过。
(实验未成功,需要外加验证)
tcp 扩展模块”tcp-flags”
TCP报文结构
TCP的三次握手
在使用iptables 时,使用TCP扩展模块”–TCP-flags”选项对应上述的标志位进行匹配。判断指定的标志位值是否为1
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
SYN,ACK,FIN,RST,URG,PSH 表示我们需要匹配报文的TCP头中的那些标志位,根据上述的配置,我们要匹配报文中的6个标志位。
SYN表示在第一部分的表示列表中,那些标志位必须为1 。
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
表示匹配第一次握手的标志位的情况
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
表示匹配第二次握手的情况