[转帖]ipset详解

ipset,详解 · 浏览次数 : 0

小编点评

* hash:ip 使用hash存储IP地址和端口号对。 * hash:ip,port 使用hash存储IP地址、端口号和IP网络地址三元组。 * hash:ip,port,net 使用hash存储IP地址、端口号和IP网络地址三元组。 * hash:ip,port,net,net 使用hash存储IP地址、端口号和IP网络地址三元组。

正文

https://zhuanlan.zhihu.com/p/489103374

 

ipset创建:create

创建一个新的ipset集合:ipset create SETNAME TYPENAME

  1. SETNAME是创建的ipset的名称,TYPENAME是ipset的类型:TYPENAME := method:datatype[,datatype[,datatype]]

2.method指定ipset中的entry存放的方式,随后的datatype约定了每个entry的格式。

可以使用的method:(后面会详细解释)

bitmap, hash, list

可以使用的datatype:(后面会详细解释)

ip, net, mac, port, iface

例如:

添加条目:add

将ip/port/ip-ip等添加到ipset集合中:ipset add SETNAME ENTRY

向集合中添加条目时需要注意,创建的集合属于哪种类型,在添加时的数据就要符合对应的类型,如下所示

查询条目:list / test

1. 查询对应集合中的具体ip条目内容: ipset list [SETNAME]

2. 检查目标ip是否在ipset集合中:ipset test SETNAME ENTRY

删除条目:del / flush

1. 删除集合中的某ip条目:ipset del SETNAME ENTRY

2. 删除ipset某集合的所有ip条目:flush 【SETNAME】

3. 清空ipset中所有集合的ip条目(删条目,不删集合):ipset flush

4. 删除ipset中的某个集合或者所有集合:ipset destroy [SETNAME]

创建和添加选项(CREATE&ADD-OPTIONS):

1. timeout 超时时间/生效时间 (所有集合适用)

timeout设置超时时间,如果设置为0,表示永久生效,超时时间可以通过 -exist来进行修改

2. counters, packets, bytes (所有集合适用)

如果指定了该选项,则使用每个元素支持的包和字节计数器创建集合。当元素(重新)添加到集合中时,除非包和字节选项显式指定包和字节计数器值,否则包和字节计数器将初始化为零。

3. comment 备注(所有集合适用)

在ipset上启用此扩展可以使用任意字符串注释ipset条目。内核和ipset本身完全忽略这个字符串,纯粹是为了提供一种方便的方法来记录条目存在的原因。注释不能包含任何引号,通常的转义字符()没有任何意义。

4. skbinfo, skbmark, skbprio, skbqueue (所有集合适用)

这个扩展允许您存储每个条目的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:这里不是很懂,就没有做案例了,有了解的大神,希望可以指导一下。

5. hashsize 集合的初始哈希大小(hsah集合适用)

它定义了集合的初始哈希大小,默认值为1024。哈希大小必须是2的幂,内核会自动舍入两个哈希大小的非幂到第一个正确的值。

6. maxelem 集合存储最大数量(hsah集合适用)

它定义了可以存储在集合中的元素的最大数量,默认值为65536

7. family { inet | inet6 } IPv4/IPv6 (适用hash集合(hash:mac除外))

这个参数对于除hash:mac之外的所有hash类型集的create命令都是有效的。它定义了要存储在集合中的IP地址的协议族

8. nomatch (hash:net适用 ):

可以存储网络数据类型的哈希集类型(即hash:net)在添加条目时支持可选的nomatch选项。当匹配集合中的元素时,将跳过标记为nomatch的条目,就好像这些条目没有添加到集合中一样,这使得在异常情况下构建集合成为可能。参见下面的hash类型hash:net中的示例。当ipset测试元素时,会考虑nomatch标志。如果想要测试集合中使用nomatch标记的元素是否存在,那么也必须指定该标志。

也就是说,这个通常与hash:net搭配使用,用来跳过 hash:net指定的ip netmask address.

9. forceadd 集合满时,随机删除(所有集合适用)

当使用此选项创建的集合已满时,集合的下一个添加项可能成功并从集合中删除随机项。

SET TYPES 集合类型:

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的两个参数

  1. hashsize:指定了创建集合时初始大小

2. maxelem:指定了集合最大存储记录的数量

默认hashsize大小是1024,如果满了 hash 会自动扩容为之前的两倍,最大能存储的数量是 65536 个.

这时我们可以进行默认值大小的设置和最大值的设置:

如果集合中最大存储数量不能满足配置的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 支持的集合类型:

1. hash:ip

使用哈希存储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地址将在集合中

2. hash:net

使用集合存储不同大小的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设定的目标,它将被添加/删除最特定的前缀,可以发现在一组,或由主机前缀值如果设置为空。查找时间随着添加到集合中的不同前缀值的数量线性增长。

3. hash:ip,port

使用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 的方式来存储的

4. hash:ip,port,net

使用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即可。(这里只做简单的介绍)

  1. 目的ip使用ipset(ipset集合为bbb)

iptables -I INPUT -s 192.168.100.36 -m set --match-set bbb dst -j DROP

源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

与[转帖]ipset详解相似的内容:

[转帖]ipset详解

https://zhuanlan.zhihu.com/p/489103374 ipset创建:create 创建一个新的ipset集合:ipset create SETNAME TYPENAME SETNAME是创建的ipset的名称,TYPENAME是ipset的类型:TYPENAME := me

[转帖]ipset命令介绍与基本使用

一. 介绍 ipset命令是用于管理内核中IP sets模块的,如iptables之于netfilter。ipset字面意思是一些IP地址组成一个集合(set)。但是ipset用于用于存储IP地址,整个子网,端口号(TCP/UDP),MAC地址,网络接口名或者上述这些的组合。ipset主要是由ipt

[转帖]Linux下使用 ipset 封大量IP及ipset参数说明

https://www.cnblogs.com/xiaofeng666/p/10952627.html Linux使用iptables封IP,是常用的应对网络攻击的方法,但要封禁成千上万个IP,如果添加成千上万条规则,对机器性能影响较大,使用ipset能解决这个问题。 iptables 包含几个表,

[转帖]IPSec VPN 与 SSL VPN 区别

https://www.cndba.cn/dave/article/3239 SSL VPN,与传统的IPSec VPN技术各具特色,各有千秋。SSL VPN比较适合用于移动用户的远程接入(Client-Site),而IPSec VPN则在网对网(Site-Site)的VPN连接中具备先天优势。这两

[转帖]

Linux ubuntu20.04 网络配置(图文教程) 因为我是刚装好的最小系统,所以很多东西都没有,在开始配置之前需要做下准备 环境准备 系统:ubuntu20.04网卡:双网卡 网卡一:供连接互联网使用网卡二:供连接内网使用(看情况,如果一张网卡足够,没必要做第二张网卡) 工具: net-to

[转帖]

https://cloud.tencent.com/developer/article/2168105?areaSource=104001.13&traceId=zcVNsKTUApF9rNJSkcCbB 前言 Redis作为高性能的内存数据库,在大数据量的情况下也会遇到性能瓶颈,日常开发中只有时刻

[转帖]ISV 、OSV、 SIG 概念

ISV 、OSV、 SIG 概念 2022-10-14 12:29530原创大杂烩 本文链接:https://www.cndba.cn/dave/article/108699 1. ISV: Independent Software Vendors “独立软件开发商”,特指专门从事软件的开发、生产、

[转帖]Redis 7 参数 修改 说明

2022-06-16 14:491800原创Redis 本文链接:https://www.cndba.cn/dave/article/108066 在之前的博客我们介绍了Redis 7 的安装和配置,如下: Linux 7.8 平台 Redis 7 安装并配置开机自启动 操作手册https://ww

[转帖]HTTPS中间人攻击原理

https://www.zhihu.com/people/bei-ji-85/posts 背景 前一段时间,公司北京地区上线了一个HTTPS防火墙,用来监听HTTPS流量。防火墙上线之前,邮件通知给管理层,我从我老大那里听说这个事情的时候,说这个有风险,然后意外地发现,很多人原来都不知道HTTPS防

[转帖]关于字节序(大小端)的一点想法

https://www.zhihu.com/people/bei-ji-85/posts 今天在一个技术群里有人问起来了,当时有一些讨论(不完全都是我个人的观点),整理一下: 为什么网络字节序(多数情况下)是大端? 早年设备的缓存很小,先接收高字节能快速的判断报文信息:包长度(需要准备多大缓存)、地