ipset的产生就是为了方便iptables的,ipset可以减少iptables规则的冗余,尤其对于比较复杂的网络过滤时。iptables使用ipset需要通过-m set指定,通过选项达到不同的效果。
[ ! ] --match-set setname flag [,flag] ...
flag可以通过指定为src或dst,flag最多数量为6个,中间使用逗号隔开。
举例:
# 创建名称为test的ipset
ipset create test hash:ip,port
ipset add test 192.168.1.105,tcp:80
# 丢弃来自源IP192.168.1.105,源端口80的包
iptables -A INPUT -m set --match-set test src,src -j DROP
# 丢弃来自源IP192.168.1.105,目的端口80的包
iptables -A INPUT -m set --match-set test src,dst -j DROP
# 丢弃访问目的IP192.168.1.105,目的端口80的包
iptables -A INPUT -m set --match-set test dst,dst -j DROP
# 创建名称为test1的ipset
ipset create test1 hash:ip,mac
ipset add test1 192.168.1.105,3C:7C:3F:D7:94:AF
# 丢弃来自源IP192.168.1.105,源MAC 3C:7C:3F:D7:94:AF的包
iptables -A INPUT -m set --match-set test1 src,src -j DROP
其他情况同test一样
--return-nomatch
匹配被设置了nomatch标志的条目。
举例:
# 创建类型为hash:net的test3 ipset
ipset create test3 hash:net
# 添加nomatch, 匹配时跳过此条目
ipset add test3 192.168.1.0/24 nomatch
# iptables匹配test3中,设置为nomatch的条目的网络段的icmp包丢弃
iptables -I INPUT -m set --match-set test3 src --return-nomatch -p icmp -j DROP
[!] --packets-eq value
如果包匹配了ipset中的一个条目,并且包的数量等于(!不等于)设置的value值时,iptables的动作将作用于此条目。
--packets-lt value
用法同--packets-eq value,但是是当包的数量小于value
--packets-gt value
用法同--packets-eq value,但是是当包的数量大于value
[!] -bytes-eq value; --bytes-lt value; --bytes-gt value
用法同--packets-eq,--packets-lte,--packets-gt。只是匹配的是字节数。
举例:
# 创建test ipset,记得要指定counters选项
ipset create test hash:ip counters
# 添加192.168.1.105到test ipset
ipset add test 192.168.1.105
# 匹配到小于3个icmp包的ipset条目丢弃
iptables -I INPUT -m set --match-set test src --packets-lt 3 -p icmp -j DROP
# ipse list命令可看到当前包的数量统计和字节统计
[root@192 ~]# ipset list
Name: test
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536 counters
Size in memory: 248
References: 1
Number of entries: 1
Members:
192.168.1.105 packets 4 bytes 240
# windows ping的效果,前两个包没ping通,第三个包开始通
C:\Users\admin>ping 192.168.1.40
Pinging 192.168.1.40 with 32 bytes of data:
Request timed out.
Request timed out.
Reply from 192.168.1.40: bytes=32 time<1ms TTL=64
Reply from 192.168.1.40: bytes=32 time<1ms TTL=64
Ping statistics for 192.168.1.40:
Packets: Sent = 4, Received = 2, Lost = 2 (50% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
! --update-counters
如果ipset命令指定了counters选项创建一个IP set时,匹配的条目的包和字节的数量会增加,如下所示。
[root@192 ~]# ipset list
Name: test
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536 counters
Size in memory: 248
References: 1
Number of entries: 1
Members:
192.168.1.105 packets 4 bytes 240
[root@192 ~]# ipset list
Name: test
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536 counters
Size in memory: 248
References: 1
Number of entries: 1
Members:
192.168.1.105 packets 6 bytes 360
如果指定!--update-counters,IP set条目后的packets和bytes匹配到了包,数量不会增加。
1. iptables如果使用ipset,需要指定"-m set"。
2. iptables可以用"--nomatch"选项,专门匹配ipset中带nomatch的条目。
3. iptables要根据IP set中条目包数量动作时,需要ipset创建IP set时,要指定counters选项。