首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在执行还原ipset时组织I/CIDR?

如何在执行还原ipset时组织I/CIDR?
EN

Server Fault用户
提问于 2022-11-24 16:25:13
回答 1查看 136关注 0票数 0

我有ipset v7.15的bash脚本(运行在ubuntu22.04中),这是由于马丁 (我已经对这个问题做了一些修改):

代码语言:javascript
复制
ipset create -! blacklist hash:net family inet hashsize 1024
ipset save -! > /tmp/ipset.txt

cat list.txt | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n | while read line; do
    echo "add blacklist $line" >> /tmp/ipset.txt
done
ipset restore -! < /tmp/ipset.txt

list.txt的内容:

代码语言:javascript
复制
125.74.0.0/15
1.0.132.249
125.73.0.0/16
130.255.128.0/20
125.76.0.0/17

out /tmp/ipset.txt

代码语言:javascript
复制
create blacklist hash:net family inet hashsize 1024 maxelem 65536 bucketsize 12 initval 0xf164f1c6
add blacklist 1.0.132.249
add blacklist 125.73.0.0/16
add blacklist 125.74.0.0/15
add blacklist 125.76.0.0/17
add blacklist 130.255.128.0/20

out ipset -L (问题):

代码语言:javascript
复制
sudo ipset -L
Name: blacklist
Type: hash:net
Revision: 7
Header: family inet hashsize 1024 maxelem 65536 bucketsize 12 initval 0xf164f1c6
Size in memory: 696
References: 0
Number of entries: 5
Members:
125.74.0.0/15
1.0.132.249
125.73.0.0/16
130.255.128.0/20
125.76.0.0/17

如您所见,blacklist输出中的up /CIDR是混乱的(没有sort)。

Ipset有此选项

代码语言:javascript
复制
-s, -sorted
Sorted output. When listing or saving sets, the entries are listed sorted.

但是我使用下面的命令进行了尝试,输出是相同的(没有sort )。也许我没有正确地使用它):

代码语言:javascript
复制
ipset restore -! -s < /tmp/ipset.txt

如果从-!命令中删除restore选项,则会得到以下错误:

代码语言:javascript
复制
ipset v7.15: Error in line 1: Set cannot be created: set with the same name already exists

因此,我认为我的脚本有一个错误,因为它添加了我认为不应该出现的一行:

代码语言:javascript
复制
create blacklist hash:net family inet hashsize 1024 maxelem 65536 bucketsize 12 initval 0xf164f1c6

然后,我可以删除save行以避免错误,将其保留如下:

代码语言:javascript
复制
ipset -! create blacklist hash:net family inet hashsize 1024
cat list.txt | while read line; do
    echo "add blacklist $line" >> /tmp/ipset.txt
done
ipset -s restore -f /tmp/ipset.txt

但是当我运行ipset -L时,输出保持不变,没有排序,因此-sorted (-s)选项在restore中不起作用。

我如何解决这个问题,以便输出被组织起来?

EN

回答 1

Server Fault用户

回答已采纳

发布于 2022-11-26 07:48:02

关于ipset的一些背景信息:这是一个命令行工具,用于操作内核内存中调整大小的数据集。因此,ipset只是一个调用实际代码的包装器,它驻留在内核中--包括列出集合内容的代码。下面是棘手的部分:

您传递了一个选项,希望以排序的方式将该集的输出进行排序--但负责此操作的内核模块不知道该选项,只是忽略了该选项。在内核上下文中执行的所有函数都必须是快速的,如果需要太长时间,可能会冻结您的系统。这就是为什么内核开发人员在代码不是严格必要的情况下非常挑剔的原因(排序在CPU时间上是昂贵的,而不是必要的--这也可以在用户空间中完成)。

我不知道需要什么内核版本来“启用”一个集合的排序输出,我用6.0.9内核版本进行了测试,在这个版本中,对输出进行排序的选项做了它应该做的事情。令人遗憾的是,他们删除了一些手册页上的提示,这里是仍然具有该提示的手册页的一个版本。

按照这样的顺序设置并不是一个错误,它实际上是一个特性:在列表中,您必须遍历每个项目来检查传入的IP是否是该列表的一部分。这使得每次查找都取决于列表的大小。散列是不同的:函数用于从数据中计算哈希值(在本例中是IP )。此哈希值用于引用数据中的位置--如果其中有条目,则IP位于该列表中。

这种组织您的集合的方式使查找所需的时间恒定--与您的集合大小无关!当涉及到网络流量时,快速响应时间总是很重要的。

我希望这有助于更好地理解事情..。

票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1116531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档