本文最下方转载自
https://blog.csdn.net/gymaisyl/article/details/101695697
ipset是通过IP集合的方式管理itables,
#创建一个名为myipset的集合,timeout 0允许新增IP带时间参数,最大存储IP数量是1000000
ipset create -exist myipset hash:net family inet hashsize 1024 maxelem 1000000 timeout 0
#添加一个关于ipset myipset的 iptables规则,
iptables -I INPUT -m set --match-set myipset src -j DROP
#添加IP 1.2.3.4到myset中,并且timeout是3600秒
ipset -exist add myipset 1.2.3.4 timeout 3600
官方文档地址
https://ipset.netfilter.org/ipset.man.html
ipset的一个优势是集合可以动态的修改,👍👍👍👍👍
ipset --help
ipset v7.1
Usage: ipset [options] COMMAND
Commands:
create SETNAME TYPENAME [type-specific-options]
Create a new set
add SETNAME ENTRY
Add entry to the named set
del SETNAME ENTRY
Delete entry from the named set
test SETNAME ENTRY
Test entry in the named set
destroy [SETNAME]
Destroy a named set or all sets
list [SETNAME]
List the entries of a named set or all sets
save [SETNAME]
Save the named set or all sets to stdout
restore
Restore a saved state
flush [SETNAME]
Flush a named set or all sets
rename FROM-SETNAME TO-SETNAME
Rename two sets
swap FROM-SETNAME TO-SETNAME
Swap the contect of two existing sets
help [TYPENAME]
Print help, and settype specific help
version
Print version information
Quit interactive mode
Options:
-o plain|save|xml
Specify output mode for listing sets.
Default value for "list" command is mode "plain"
and for "save" command is mode "save".
Print elements sorted (if supported by the set type).
Suppress any notice or warning message.
Try to resolve IP addresses in the output (slow!)
Ignore errors when creating or adding sets or
elements that do exist or when deleting elements
that don't exist.
When listing, just list setnames from the kernel.
When listing, list setnames and set headers
from kernel only.
Read from the given file instead of standard
input (restore) or write to given file instead
of standard output (list/save).
ipset的安装
yum install ipset -y
ipset的配置
1. 命名(创建)一个新的ipset集合
# ipset create myset hash:net
# ipset -N myset nethash
推荐下面的方式
ipset create myset hash:net timeout 259200
#timeout 259200是集合内新增的IP有三天的寿命
2.把希望屏蔽的IP地址添加到集合中
# ipset add myset 14.144.0.0/12
# ipset add myset 27.8.0.0/13
# ipset add myset 58.16.0.0/15
或者添加一个timeout时间
ipset add test 192.168.0.1 timeout 3600
或者修改现存的ip timeout时间
ipset -exist add test 192.168.0.1 timeout 259200
3. 把新建的ipset集合丢到iptables里
# iptables -I INPUT -m set --match-set myset src -j DROP
上面的iptables命令用到了
input链的知识
-m 加模块的知识
-m set --match-set myset(myset是你的ipset的名称)
iptables的其他规则,如何src -j DROP
参考本博客的iptables教程
https://www.cnblogs.com/faberbeta/p/iptables001.html
4.其他知识
ipset默认可以存储65536个元素,使用maxelem指定数量
ipset create blacklist hash:net maxelem 1000000 #黑名单
ipset create whitelist hash:net maxelem 1000000 #白名单
查看已创建的ipset
ipset list
加一个IP到你的集合中
ipset add myset 1.2.3.4
移除一个你的集合中的IP
ipset del myset 1.2.3.4
ipset持久化
创建的 ipset 存在于内存中,重启后将会消失。要使ipset持久化,需要把他保存到一个文件中
# ipset save > /etc/ipset.conf
# ipset save myset -f /etc/ipset_myset.txt
导入 ipset规则
ipset restore -f /etc/ipset_myset.txt
删除名为“myset”的集合。
# ipset destroy myset
删除所有集合。
# ipset destroy
method指定ipset中的entry存放的方式,随后的datatype约定了每个entry的格式。
可以使用的method:(后面会详细解释)
bitmap, hash, list
可以使用的datatype:(后面会详细解释)
ip, net, mac, port, iface
向集合中添加条目时需要注意,创建的集合属于哪种类型,在添加时的数据就要符合对应的类型,如下所示
timeout设置超时时间,如果设置为0,表示永久生效,超时时间可以通过 -exist来进行修改
如果指定了该选项,则使用每个元素支持的包和字节计数器创建集合。当元素(重新)添加到集合中时,除非包和字节选项显式指定包和字节计数器值,否则包和字节计数器将初始化为零。
这个扩展允许您存储每个条目的metainfo(防火墙标记、tc类和硬件队列),并使用SET netfilter target和——map- SET选项将其映射到包。skbmark选项格式:MARK或MARK/MASK,其中MARK和MASK为32位十六进制数字,前缀为0x。如果只指定标记,则使用掩码0xffffffff。skbprio选项有tc类格式:MAJOR:MINOR,其中MAJOR和MINOR号是十六进制,没有0x前缀。skbqueue选项只是一个小数。
ps:这里不是很懂,就没有做案例了,有了解的大神,希望可以指导一下。
它定义了集合的初始哈希大小,默认值为1024。哈希大小必须是2的幂,内核会自动舍入两个哈希大小的非幂到第一个正确的值。
它定义了可以存储在集合中的元素的最大数量,默认值为65536
这个参数对于除hash:mac之外的所有hash类型集的create命令都是有效的。它定义了要存储在集合中的IP地址的协议族
可以存储网络数据类型的哈希集类型(即hash:
net
)在添加条目时支持可选的nomatch选项。当匹配集合中的元素时,将跳过标记为nomatch的条目,就好像这些条目没有添加到集合中一样,这使得在异常情况下构建集合成为可能。参见下面的hash类型hash:net中的示例。当ipset测试元素时,会考虑nomatch标志。如果想要测试集合中使用nomatch标记的元素是否存在,那么也必须指定该标志。
也就是说,这个通常与hash:net搭配使用,用来跳过 hash:net指定的ip netmask address.
当使用此选项创建的集合已满时,集合的下一个添加项可能成功并从集合中删除随机项。
method存储方式:
存储方式有
bitmap, hash, list
;
bitmap和list
: 使用固定大小的存储.
hash
: 使用hash表来存储元素。但为了避免Hash表键冲突,在ipset会在hash表key用完后,若又有新增条目,则ipset将自动对hash表扩大,假如当前哈希表大小为100条,则它将扩展为200条。当在iptables/ip6tables中使用了ipset hash类型的集合,则该集合将不能再新增条目。
hash的自增
前面说过:bitmap link 的储存方式的集合大小是固定,hash类型的储存大小是可变的
下面回顾一下hash的两个参数
hashsize
:指定了创建集合时初始大小
maxelem
:指定了集合最大存储记录的数量
如果集合中最大存储数量不能满足配置的ip数量,则会出现下面的问题:
这也再次证明,其实在hash:ip和hash:ip,port中,即使配置的时候是以ip段的方式配置的,但是存储的时候还是按照单个ip进行保存的。
这里需要注意的是,一旦使用 hash:ip和hash:ip,port 方式 进行ipset配置,而ip又非常多的话,可能会出现下面的情况.(最后是使用hash:net替换hash:ip解决的)
datatype数据类型:
支持的类型有:
ip, net, mac, port, iface
,即除了ip外,还可以是网络段,端口号(支持指定 TCP/UDP 协议),mac 地址,网络接口名称,或者多种。在创建的时候,指定是什么类型,在添加的时候,数据就要按照对应的格式来,不然就会报错
Supported set types 支持的集合类型:
使用哈希存储ip主机地址(默认)或网络地址。零值IP地址不能存储在散列中。
CREATE-OPTIONS(创建可用选项) := [ family { inet | inet6 } ] | [ hashsize value ] [ maxelem value ] [ netmask cidr ] [ timeout value ] [ counters ] [ comment ] [ skbinfo ]
ADD-ENTRY(添加参数 := ipaddr
ADD-OPTIONS(添加可用选项):= [ timeout value ] [ packets value ] [ bytes value ] [ comment string ] [ skbmark value ] [ skbprio value ] [ skbqueue value ]
DEL-ENTRY(删除参数) := ipaddr
TEST-ENTRY(测试参数) := ipaddr
关于netmask :当指定可选的netmask参数时,网络地址将存储在集合中,而不是IP主机地址。cidr前缀值必须在IPv4的1-32和IPv6的1-128之间。如果网络地址是用netmas屏蔽的,则IP地址将在集合中
使用集合存储不同大小的IP网络地址。前缀大小为零的网络地址不能存储在这种类型的集合中。
CREATE-OPTIONS := [ family { inet | inet6 } ] | [ hashsize value ] [ maxelem value ] [ timeout value ] [ counters ] [ comment ] [ skbinfo ]
ADD-ENTRY := netaddr
ADD-OPTIONS := [ timeout value ] [ nomatch ] [ packets value ] [ bytes value ] [ comment string ] [ skbmark value ] [ skbprio value ] [ skbqueue value ]
DEL-ENTRY := netaddr
TEST-ENTRY := netaddr
where netaddr := ip[/cidr]
在添加/删除/测试条目时,如果没有指定cidr前缀参数,则假定主机前缀值。当添加/删除条目时,内核将添加/删除确切的元素,并且不检查重叠元素。当测试条目时,如果测试了主机地址,那么内核将尝试匹配添加到集的网络中的主机地址,并相应地报告结果。netfilter匹配从集合的角度寻找匹配总是从最小的尺寸用于网段(最具体的前缀)最大的一个(至少特定前缀)添加到集合。当添加/删除IP地址设置netfilter设定的目标,它将被添加/删除最特定的前缀,可以发现在一组,或由主机前缀值如果设置为空。查找时间随着添加到集合中的不同前缀值的数量线性增长。
使用hash存储IP地址和端口号对。端口号与协议(默认TCP)一起,不能使用零协议号
CREATE-OPTIONS := [ family { inet | inet6 } ] | [ hashsize value ] [ maxelem value ] [ timeout value ] [ counters ] [ comment ] [ skbinfo ]
ADD-ENTRY := ipaddr,[proto:]port
ADD-OPTIONS := [ timeout value ] [ packets value ] [ bytes value ] [ comment string ] [ skbmark value ] [ skbprio value ] [ skbqueue value ]
DEL-ENTRY := ipaddr,[proto:]port
TEST-ENTRY := ipaddr,[proto:]port
如果创建集合是指定的存储内容包含 ip, 例如 hash:ip 或 hash:ip,port ,在添加记录时,可以填 IP 段,但是仍然是以单独一个个 IP 的方式来存储的
使用hash存储IP地址、端口号和IP网络地址三元组。端口号与协议(默认TCP)一起,不能使用零协议号。前缀大小为零的网络地址也不能存储。
CREATE-OPTIONS := [ family { inet | inet6 } ] | [ hashsize value ] [ maxelem value ] [ timeout value ] [ counters ] [ comment ] [ skbinfo ]
ADD-ENTRY := ipaddr,[proto:]port,netaddr
ADD-OPTIONS := [ timeout value ] [ nomatch ] [ packets value ] [ bytes value ] [ comment string ] [ skbmark value ] [ skbprio value ] [ skbqueue value ]
DEL-ENTRY := ipaddr,[proto:]port,netaddr
TEST-ENTRY := ipaddr,[proto:]port,netaddr
where netaddr := ip[/cidr]
上面仅做4个常用的进行介绍,还有很多其他的类型可供使用
ipset官网直达
还有下面几个未做介绍(有空再更)
bitmap:ip
bitmap:ip,mac
bitmap:port
hash:mac
hash:ip,mac
hash:net,net
hash:net,port
hash:ip,port,ip
hash:ip,mark
hash:net,port,net
hash:net,iface
list:set
ipset和iptables:
在iptables中使用ipset,只要加上
-m set --match-set
即可。(这里只做简单的介绍)
目的ip使用ipset(ipset集合为bbb)
源ip使用ipset(ipset集合为aaa)
iptables -I INPUT -m set --match-set aaa src -d 192.168.100.36 -j DROP
源和目的都使用ipset(源ip集合为aaa,目的ip集合为bbb)
iptables -I INPUT -m set --match-set aaa src -m set --match-set bbb dst -j DROP