iptables全局报文流向图:
一、增加规则
1.在INPUT链的filter表插入(头插)源IP为192.168.116.1通行的规则
iptables -I INPUT -t filter -s 192.168.116.1 -j ACCEPT
2.在INPUT 链的 filter 表追加 (尾插) 宿IP为 10.9.62.30 传输层协议为tcp的 拒绝规则
iptables -I INPUT -t filter -p tcp -d 10.9.62.30 -j REJECT
3.将某个规则插入INPUT 链第2条
规则:将宿IP为 10.0.1.56 规则拒绝
iptables -I INPUT 2 -t filter -d 10.0.1.56 -j REJECT
二、查看规则
1.查看 INPUT 链 filter 表详细规则
root@ubuntu:~# iptables -t filter -L INPUT -v -n
Chain INPUT (policy ACCEPT 141 packets, 9701 bytes)
pkts bytes target prot opt in out source destination
75 9806 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
Chain INPUT (policy ACCEPT 141 packets, 9701 bytes)
上述ACCEPT代表 INPUT的默认规则,即当链中所有规则都没有匹配到的策略,默认放行。
可通过如下命令修改默认策略为DROP
iptables -P INPUT DROP
三、修改规则
前提:有如下规则
root@ubuntu:~# iptables -L INPUT -vn --line
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- * * 10.1.22.11 0.0.0.0/0 tcp dpt:9090
原规则:源IP:10.1.22.11 协议:tcp 动作:放行
修改后规则:源IP:10.1.22.11 协议:tcp 动作:拒绝
命令:
iptables -R INPUT 1 -t filter -s 10.1.22.11 -p tcp --dport 9090 -j REJECT
结果:
root@ubuntu:~# iptables -L INPUT -vn --line
Chain INPUT (policy ACCEPT 27 packets, 53402 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT tcp -- * * 10.1.22.11 0.0.0.0/0 tcp dpt:9090 reject-with icmp-port-unreachable
注意点:修改规则时候一定把源规则所有规则写全,要不然默认规则是0.0.0.0/0,会导致规则非预期变化!
四、删除规则
前提:有如下规则
root@ubuntu:~# iptables -L INPUT -vn --line
Chain INPUT (policy ACCEPT 186 packets, 262K bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT tcp -- * * 10.1.22.11 0.0.0.0/0 tcp dpt:9090 reject-with icmp-port-unreachable
2 0 0 REJECT tcp -- * * 0.0.0.0/0 10.9.62.30 reject-with icmp-port-unreachable
3 0 0 REJECT all -- * * 0.0.0.0/0 10.0.1.56 reject-with icmp-port-unreachable
4 1290 100K ACCEPT all -- * * 192.168.116.1 0.0.0.0/0
5 230 18154 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
1.删除INPUT 链 第二条规则
iptables -D INPUT 2
结果:
root@ubuntu:~# iptables -L INPUT -vn --line
Chain INPUT (policy ACCEPT 17 packets, 1611 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT tcp -- * * 10.1.22.11 0.0.0.0/0 tcp dpt:9090 reject-with icmp-port-unreachable
2 0 0 REJECT all -- * * 0.0.0.0/0 10.0.1.56 reject-with icmp-port-unreachable
3 1384 107K ACCEPT all -- * * 192.168.116.1 0.0.0.0/0
4 257 19678 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
五、匹配规则
1.匹配协议
参数:-p
支持协议类型:
- centos6: tcp, udp, udplite, icmp, esp, ah, sctp
- centos7: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh
当不使用-p指定协议类型时,默认表示所有类型的协议都会被匹配到,与使用-p all的效果相同。
2.匹配端口
匹配端口属于iptables扩展匹配条件,匹配源宿IP和协议都属于基本匹配条件,在使用端口匹配时候,必须先指定匹配的协议才可以使用!
1.匹配源端口
参数:--sport
iptables -I INPUT -p tcp -m multiport --sport 9090,8080:8090 -j ACCEPT
解释:-m 表示使用扩展模块: multiport进行匹配,这样source-port 就可以指定多个,并且可以指定连续的端口段以及离散的端口组,中间以逗号(,)隔开。
:8080 代表地址段 0-8080
8080: 代表端口段8080-65535(即默认的所有端口段)
2.匹配目的端口
参数:--dport
iptables -I INPUT -p tcp -m multiport --sport 9090,8080:8090 -j ACCEPT
用法同上。
未完待续...
参考:http://www.zsythink.net/archives/1544
六、扩展模块
1、ipset (实现O(1)查找规则)
ipset是iptables的扩展,它允许你创建 匹配整个地址集合的规则。而不像普通的iptables链只能单IP匹配, ip集合存储在带索引的数据结构中,这种结构即时集合比较大也可以进行高效的查找,官网:http://ipset.netfilter.org/
- 安装ipset :yum install ipset
- 创建一个hash表:ipset create myfilter hash:ip(net) maxelem 100000
ipset 默认可以存储65536个元素,可以使用maxelem指定数量 - 查看已创建的ipset :ipset list
- 加入一个黑名单IP:ipset add myfilter 10.1.62.10
- 移除一个黑名单IP:ipset del myfilter 10.1.62.10
- 创建一个防火墙规则:iptables -I INPUT -m set –match-set myfilter src -p tcp -j DROP
参考:http://www.zsythink.net/archives/1564
七、自定义链
1.创建自定义链
在filter表中创建IN_WEB自定义链
iptables -t filter -N IN_WEB
2、引用自定义链
在INPUT链插入规则,tcp协议且目的端口8080的报文走IN_WEB链处理
iptables -I INPUT -p tcp --dport 8080 -j IN_WEB
3、重命名链名称
iptables -E -t filter IN_WEB WEB
4、删除自定义链
前提:
1、自定义链没有被引用
2、自定义链中没有任何规则
iptables -X WEB
如果链被其他链引用需要先删除其他链上的规则,并且清空自定义链的规则,在执行删除自定义链。
删除INPUT链引用WEB链的规则 :iptables -D INPUT 1
清空WEB链规则:iptables -F WEB