zzxworld

Linux ipset 命令用法示例和选项参考

在使用 iptables 管理 IP 进出规则时,碰到数量大的场景就非常头痛了。一是维护规则麻烦,二是数量上来后,iptables 的执行效率也会下降。使用 ipset 命令正好可以解决这种问题。

ipset 是 iptables 的扩展,它把 iptables 要匹配的数据源抽象出来,作为一个单独的存储对象。从而实现了在 iptables 规则不变的情况下,单独管理 IP 地址数据的功能。以黑名单的场景来举例,在 iptables 命令中只要指定禁止访问规则和 ipset 的集合名称,然后就只要通过 ipset 命令来增减 IP 即可。而且使用 ipset 提供的集合数据结构,再多的数量也不会影响到 iptables 的处理性能,一举解决了单独使用 iptables 时的两个痛点。

ipset 命令格式

ipset [选项...] 子命令 [子命令选项...]

ipset 命令示例

创建一个以 mylist 命名的 IP 集合,使用散列类型保存 IP 地址:

ipset create mylist hash:ip hashsize 3

查看创建的 IP 集合:

ipset list

往刚创建的 IP 集合中添加 IP 地址:

ipset add mylist 127.0.0.1

使用 IP 段的方式添加:

ipset add mylist 192.168.0.0/32

删除添加的 IP:

ipset del mylist 127.0.0.1

或是直接清空:

ipset flush mylist

IP 集合可以保存为文件:

ipset save mylist -f mylist.txt

同样也可以从文件中还原:

ipset -exist restore -f mylist.txt

定义好的 IP 集合可以在 iptables 中直接使用。使用 iptables 命令的 -m set 加 --match-set 选项指定集合名称即可。比如要禁止 mylist 集合中的 IP 访问:

iptables -I INPUT -m set --match-set mylist src -j DROP

或是只允许 mylist 集合中的 IP 访问:

iptables -I INPUT -m set --match-set mylist src -j ACCEPT

ipset 命令选项

Ipset 的命令选项类型比较复杂,下面通过类型来罗列这些选项和参数。

子命令

名称 说明
n, create SETNAME TYPENAME [ CREATE-OPTIONS ] 创建一个以指定名称(SETNAME)和指定类型(TYPENAME)为标识的集合。
add SETNAME ADD-ENTRY [ ADD-OPTIONS ] 向指定集合中添加条目。
del SETNAME DEL-ENTRY [ DEL-OPTIONS ] 从集合中删除一个条目。
test SETNAME TEST-ENTRY [ TEST-OPTIONS ] 测试集合中是否存在指定条目。
x, destroy [ SETNAME ] 删除指定集合。
list [ SETNAME ] [ OPTIONS ] 列出指定集合的头数据和条目。
save [ SETNAME ] 保存指定的集合。
restore 从保存的集合会话中恢复集合。
flush [ SETNAME ] 清空集合中的所有条目。
e, rename SETNAME-FROM SETNAME-TO 重命名指定集合。
w, swap SETNAME-FROM SETNAME-TO 交换两个集合的内容。
help [ TYPENAME ] 显示帮助信息。
version 显示命令版本。
- 使用交互模式,并从标准输入读取命令。使用 quit 伪命令退出。

常用选项

缩写 完整名称 说明
-! -exist 在创建,编辑,或是删除集合条目时,忽略与条目是否存在相关的错误。
-o -output { plain | save | xml } 指定 list 子命令的数据输出格式。
-q -quiet 静默执行命令,不输出任何信息。
-r -resolve 显示集合列表时,强制解析主机名称。
-s -sorted 在显示或保存集合时进行排序处理。
-n -name 查看集合列表时只显示名称。
-t -terse 显示集合名称和表头。
-f -file filename 使用指定的文件名替换命令的标准输入和输出。

create 和 add 子命令选项

名称 说明
timeout 指定条目的超时时间,单位为秒,可使用的最大值为 2147483。
counters, packets, bytes 设置集合计数器。
comment 设置集合注释。
skbinfo, skbmark, skbprio, skbqueue 设置集合可存储元数据。
hashsize 设置哈希集合大小,默认为 1024。
maxelem 设置哈希集合下能存储的元素数量,默认为 65536。
bucketsize 设置哈希桶(hash bucket)的大小。
family { inet | inet6 } 设置集合的 IP 协议族。
nomatch 标记不匹配的集合条目。当匹配集合中的元素时,标记为 nomatch 的条目会被跳过。
forceadd 强制添加集合条目。
wildcard 此选项只对 hash:net 和 iface 类型的集合有效。在对集合元素进行匹配时,将使用前缀匹配模式。

集合类型

名称 说明 示例
bitmap:ip 使用内存范围存储 IPv4 格式的主机或网络地址。可存储 65536 个条目。 ipset create foo bitmap:ip range 192.168.0.0/16
bitmap:ip,mac 使用内存范围存储 IPv4 + MAC 地址。可存储 65536 个条目。 ipset create foo bitmap:ip,mac range 192.168.0.0/16
bitmap:port 使用内存范围存储端口号。可存储 65536 个端口条目。 ipset create foo bitmap:port range 0-1024
hash:ip 使用散列存储 IP 或网络地址。 ipset create foo hash:ip netmask 30
hash:mac 使用散列存储 MAC 地址。 ipset create foo hash:mac
hash:ip,mac 使用散列存储 IP + MAC 地址。 ipset create foo hash:ip,mac
hash:net 使用散列存储网络地址。 ipset create foo hash:net
hash:net,net 使用散列存储网络地址 + 网络地址。 ipset create foo hash:net,net
hash:ip,port 使用散列存储 IP + 端口。 ipset create foo hash:ip,port
hash:net,port 使用散列存储网络地址 + 端口。 ipset create foo hash:net,port
hash:ip,port,ip 使用散列存储 IP + 端口 + IP。 ipset create foo hash:ip,port,ip
hash:ip,port,net 使用散列存储 IP + 端口 + 网络地址。 ipset create foo hash:ip,port,net
hash:ip,mark 使用散列存储 IP + 包标记。 ipset create foo hash:ip,mark
hash:net,port,net 使用哈希存储网络地址 + 端口 + 网络地址。 ipset create foo hash:net,port,net
hash:net,iface 使用散列存储网络地址 + 网卡名称。 ipset create foo hash:net,iface
list:set 使用列表存储集合名称。