@lniwn
2017-09-27T20:21:04.000000Z
字数 2366
阅读 4201
Linux
ipset是iptables的附属工具,用以提高iptables性能,将O(n)的操作变成了O(1)。
创建一个空集合
ipset create set_test hash:ip
这条命令创建一个名为set_test的集合,以hash方式存储,存储内容是ip地址,也就是以ip地址作为hash的键,除了ip地址,还可以是网段、端口号(支持指定TCP/UDP协议)、mac地址、网络接口名称,或者上述各类型的组合。
比如hash:ip,port
指定ip地址和端口号共同作为hash的键。
ipset create set_test hash:ip
ipset add set_test 1.2.3.4
ipset list set_test # 查看set_test集合的内容
hash:net
ipset create r2d2 hash:net
ipset add r2d2 1.2.3.0/24
ipset add r2d2 1.2.3.0/30 nomatch
ipset add r2d2 6.7.8.9
ipset test r2d2 1.2.3.2
hash:net 指定了可以往 r2d2 这个集合里添加 IP 段或 IP 地址。
第三条命令里的 nomatch
的作用简单来说是把 1.2.3.0/30 从 1.2.3.0/24
这一范围相对更大的段里“剥离”了出来,也就是说执行完 ipset add r2d2 1.2.3.0/24
之后1.2.3.0/24
这一段 IP 是属于 r2d2 集合的,执行了 ipset add r2d2 1.2.3.0/30 nomatch
之后,1.2.3.0/24
里 1.2.3.0/30
这部分,就不属于 r2d2 集合了。执行 ipset test r2d2 1.2.3.2
就会得到结果 1.2.3.2 is NOT in set r2d2.
hash:ip,port
ipset create c-3po hash:ip,port
ipset add c-3po 3.4.5.6,80
ipset add c-3po 5.6.7.8,udp:53
ipset add c-3po 1.2.3.4,80-86
第二条命令添加的是 IP 地址为 3.4.5.6,端口号是 80 的项。没有注明协议,默认就是 TCP,下面一条命令则是指明了是 UDP 的 53 端口。最后一条命令指明了一个 IP 地址和一个端口号范围,这也是合法的命令。
自动过期,解封
ipset 支持 timeout 参数,这就意味着,如果一个集合是作为黑名单使用,通过 timeout 参数,就可以到期自动从黑名单里删除内容。
ipset create obiwan hash:ip timeout 300
ipset add obiwan 1.2.3.4
ipset add obiwan 6.6.6.6 timeout 60
上面第一条命令创建了名为 obiwan 的集合,后面多加了 timeout 参数,值为 300,往集合里添加条目的默认 timeout 时间就是 300。第三条命令在向集合添加 IP 时指定了一个不同于默认值的 timeout 值 60,那么这一条就会在 60 秒后自动删除。
隔几秒执行一次 ipset list obiwan 可以看到这个集合里条目的 timeout一直在随着时间变化,标志着它们在多少秒之后会被删除。
如果要重新为某个条目指定 timeout 参数,要使用 -exist 这一选项。
ipset -exist add obiwan 1.2.3.4 timeout 100
这样 1.2.3.4 这一条数据的 timeout 值就变成了 100,如果这里设置 300,那么它的 timeout,也就是存活时间又重新变成 300。
如果在创建集合是没有指定 timeout,那么之后添加条目也就不支持 timeout 参数,执行 add 会收到报错。想要默认条目不会过期(自动删除),又需要添加某些条目时加上 timeout 参数,可以在创建集合时指定 timeout 为 0。
ipset create luke hash:ip
ipset add luke 5.5.5.5 timeout 100
# 得到报错信息 kernel error received: Unknown error -1
更大
hashsize, maxelem 这两个参数分别指定了创建集合时初始的 hash 大小,和最大存储的条目数量。
ipset create yoda hash:ip,port hashsize 4096 maxelem 1000000
ipset add yoda 3.4.5.6,3306
这样创建了名为 yoda 的集合,初始 hash 大小是 4096,如果满了,这个 hash 会自动扩容为之前的两倍。最大能存储的数量是 100000 个。
如果没有指定,hashsize 的默认值是 1024,maxelem 的默认值是 65536。
另外几条常用命令
ipset del yoda x.x.x.x # 从 yoda 集合中删除内容
ipset list yoda # 查看 yoda 集合内容
ipset list # 查看所有集合的内容
ipset flush yoda # 清空 yoda 集合
ipset flush # 清空所有集合
ipset destroy yoda # 销毁 yoda 集合
ipset destroy # 销毁所有集合
ipset save yoda # 输出 yoda 集合内容到标准输出
ipset save # 输出所有集合内容到标准输出
ipset restore # 根据输入内容恢复集合内容
还有……