[关闭]
@lniwn 2017-09-27T20:21:04.000000Z 字数 2366 阅读 4201

ipset学习笔记

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的键。

  1. ipset create set_test hash:ip
  2. ipset add set_test 1.2.3.4
  3. ipset list set_test # 查看set_test集合的内容

hash:net

  1. ipset create r2d2 hash:net
  2. ipset add r2d2 1.2.3.0/24
  3. ipset add r2d2 1.2.3.0/30 nomatch
  4. ipset add r2d2 6.7.8.9
  5. 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/241.2.3.0/30 这部分,就不属于 r2d2 集合了。执行 ipset test r2d2 1.2.3.2 就会得到结果 1.2.3.2 is NOT in set r2d2.
hash:ip,port

  1. ipset create c-3po hash:ip,port
  2. ipset add c-3po 3.4.5.6,80
  3. ipset add c-3po 5.6.7.8,udp:53
  4. ipset add c-3po 1.2.3.4,80-86

第二条命令添加的是 IP 地址为 3.4.5.6,端口号是 80 的项。没有注明协议,默认就是 TCP,下面一条命令则是指明了是 UDP 的 53 端口。最后一条命令指明了一个 IP 地址和一个端口号范围,这也是合法的命令。
自动过期,解封
ipset 支持 timeout 参数,这就意味着,如果一个集合是作为黑名单使用,通过 timeout 参数,就可以到期自动从黑名单里删除内容。

  1. ipset create obiwan hash:ip timeout 300
  2. ipset add obiwan 1.2.3.4
  3. 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。

  1. ipset create luke hash:ip
  2. ipset add luke 5.5.5.5 timeout 100
  3. # 得到报错信息 kernel error received: Unknown error -1

更大
hashsize, maxelem 这两个参数分别指定了创建集合时初始的 hash 大小,和最大存储的条目数量。

  1. ipset create yoda hash:ip,port hashsize 4096 maxelem 1000000
  2. ipset add yoda 3.4.5.6,3306

这样创建了名为 yoda 的集合,初始 hash 大小是 4096,如果满了,这个 hash 会自动扩容为之前的两倍。最大能存储的数量是 100000 个。
如果没有指定,hashsize 的默认值是 1024,maxelem 的默认值是 65536。

另外几条常用命令

  1. ipset del yoda x.x.x.x # 从 yoda 集合中删除内容
  2. ipset list yoda # 查看 yoda 集合内容
  3. ipset list # 查看所有集合的内容
  4. ipset flush yoda # 清空 yoda 集合
  5. ipset flush # 清空所有集合
  6. ipset destroy yoda # 销毁 yoda 集合
  7. ipset destroy # 销毁所有集合
  8. ipset save yoda # 输出 yoda 集合内容到标准输出
  9. ipset save # 输出所有集合内容到标准输出
  10. ipset restore # 根据输入内容恢复集合内容

还有……

参考地址

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注