ipset 学习总结
用途:当机器受到网络攻击时,使用 iptables 封 IP,有时候可能会封禁成千上万个 IP,如果添加成千上万条规则,
在一台注重性能的服务器或者本身性能就很差的设备上就不在适用了。ipset 就是为了避免这个问题而生的。
ipset的参数:
ipset [-exist | -output { plain | save | xml } | -quiet | -resolve | -sorted | -name | -terse | -file filename ] Command [ Command-Options ]
-o,-output plain|save|xml
#为清单集指定输出模式。“list”命令的默认值是“plain”模式,“save”命令的默认值是“save”模式。
-f,-file #restore时,指定从文件中恢复,list/save时,保存数据到文件.
-s,-sorted #打印排序的元素(如果集合类型支持)。
-!,-exist #创建或添加已存在的set,或 删除不存在的set时,不报错
-q,-quiet #静默模式
-r,-resolve #反向解析IP地址.
-n,-name #仅列出内核中的setname。
-t,-terse #仅从内核中列出setnames和set header。
ipset的可用 Command 选项:
create SETNAME TYPENAME [Command-Options]
add SETNAME ENTRY [Command-Options] #在指定集合中添加条目(Entry),仅在创建时,
指定了Command-Options才能使用相应的参数.
del SETNAME ENTRY
flush [SETNAME] #清空指定集合或全部集合中所有条目
destroy [SETNAME] #删除一个指定的集合,或删除所有集合
test SETNAME ENTRY #测试一个条目是否包含在该集合
list [SETNAME] #显示一个指定的集合,或列出所有集合
save [SETNAME] #保存一个指定的集合,或保存所有集合
restore #恢复已保存的状态
rename FROM-SETNAME TO-SETNAME #重命名集合名
swap FROM-SETNAME TO-SETNAME #交换两个集合的内容
TYPENAME: 是集合类型,它包括存储数据的 存储方法 和存储在集合中的 数据类型
格式:
TYPENAME := method:datatype[,datatype[,datatype]]
当前方法列表为 bitmap, hash, 和list,可能的数据类型为ip、net、mac、port和iface。
bitmap和list: 使用固定大小的存储.
hash: 使用hash表来存储元素。但为了避免Hash表键冲突,在ipset会在hash表key用完后,
若又有新增条目,则ipset将自动对hash表扩大,假如当前哈希表大小为100条,则它将
扩展为200条。当在iptables/ip6tables中使用了ipset hash类型的集合,则该集合将
不能再新增条目。
集合的dimension(维度)等于其类型名称中的数据类型的数量。
如:
ipset create test hash:ip,port,net
ipset add test 1.1.1.1,80,1.1.1.0/24 #这就是所谓的集合维度,有几个类型,就必须有几个与其对应的类型值.
另注:
#若使用非ip,net,port等数字或编号类,而使用域名或服务名等时,必须使用中括号括起来.
若提供了域名,ipset内部通过DNS解析为多个IP时,ipset将使用第一个IP.
ipset add foo [test-hostname],[ftp-data]
TYPENAME使用注意事项:
hash:port
port的格式有三种:
1.直接写端口号.
2.udp:端口号, 默认是tcp
3.端口范围,如:8000-9000
hash:mac
mac: 只能是源MAC. 因为iptables无法获取互联网上的目标MAC.
集合存储方式有三类:
bitmap: 是将条目存储到内存中一段连续的空间中.
hash: 使用hash表来存储集合条目
list: 是存储集合的集合
CentOS7上可用的集合类型名:
注: 这些类型名都是固定格式,每种类型名支持的Command-Options不同,具体可看man手册.
hash:net
hash:ip
hash:ip,port
hash:net,port
hash:net,iface
hash:ip,port,net
hash:ip,port,ip
bitmap:ip
bitmap:port
bitmap:ip,mac
list:set
Command-Options:
hash自增参数:
hashsize:指定了创建集合时初始大小
maxelem:指定了集合最大存储记录的数量
例:
ipset create test1 hash:ip,port hashsize 4096 maxelem 1000000
family [inet |int6] : 指定集合是ipv4 或ipv6的集合.
nomatch:
若使用hash:net, 指定了一个网段为192.168.0.0/24,但我不想让此集合包含0~4这一段,
即:192.168.0.0~192.168.0.4,怎么办? 这就可以使用nomatch参数.
注: nomatch参数是在追加条目时,使用的参数。
ipset create test hash:net
ipset add test 192.168.0.0/24
ipset add test 192.168.0.0/30 nomatch
注: 这句就表示192.168.0.0/30此网段中第一段子网将从test集合中移除.
timeout:
集合中的条目超时后自动删除,需在创建集合时指定此参数,否则后期无法给集合中的条目追加超时参数.
timeout 0:表示永不超时,但在添加条目时,可手动指定其超时值,若不指定则默认为永不超时.
如:
ipset create test2 hash:net timeout 1000
注: 这就创建了一个test2的集合,其内部每个条目均在1000秒后,自动删除.
ipset add test2 192.168.1.0/24 timeout 100
注: 这表示不使用默认值,手动指定其超时值.【必须在集合创建时,指定了超时参数才可用】
counters:
计数器选项,可用于统计条目匹配的数据包和字节数,也可在新增或重新添加时指定这些初始计数值.
注: 此参数需要在创建时指定后,集合内的条目才能支持计数器.
comment:
注释选项,需在创建集合时指定,集合内的条目才能使用comment来添加注释.
例:
ipset create test4 hash:net comment
ipset add test4 1.1.1.0/24 comment "This is a test."
ipset add test4 1.1.2.0/24 comment "This comment is \"bad\""
ipset add test4 1.1.3.0/24 comment "This is file:\\\\Bad\\"
注: 以上是对双引号和“\”的转义,但不建议使用,这可能导致save和restore时出错。
skbinfo:
此扩展选项支持在每个条目中存储metainfo(firewall mark, tc class和hardware queue),
并使用SET netfilter target 的 --map-set选项将其映射到数据包中。
skbmark:其值为MARK[/MASK]其中MARK和MASK是带有0x前缀的32位十六进制数,
若仅指定了MARK 则掩码默认为:0xffffffff
skbprio: 此选项具有tc class格式:MAJOR:MINOR,它们都是无0x前缀的十六进制数.
skbqueue: 此选项是一个整数。
例:
ipset create test5 hash:ip skbinfo
ipset add test5 skbmark 0x1111/0xff00ffff skbprio 1:10 skbqueue 10
forceadd: 当hash集合满时,追加依然能成功,但它会随机从集合中删除一个条记录.
简单例子:
#创建集合指定初始hash大小是4096,如果满了,这个hash会自动扩容为之前的两倍。
最大能存储的数量是100000个
ipset create black_list hash:net,port hashsize 4096 maxelem 1000000
ipset add black_list 3.4.5.6,80 #指定端口80,但是没指定协议,默认是TCP
ipset add black_list 5.6.7.8,udp:53 #
ipset add black_list 1.2.3.4,80-86 #指定一个端口范围
ipset add black_list 123.123.123.0/24
ipset add black_list 123.123.123.0/30 nomatch
#黑名单用法(拒绝规则集里的地址)
iptables -I INPUT -m set --match-set black_list src -j DROP
#白名单用法(不拒绝规则集里的地址)
iptables -I INPUT -m set --match-set black_list src -j ACCEPT