我有ipset v7.15的bash脚本(运行在ubuntu22.04中),这是由于马丁 (我已经对这个问题做了一些修改):
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.txtlist.txt的内容:
125.74.0.0/15
1.0.132.249
125.73.0.0/16
130.255.128.0/20
125.76.0.0/17out /tmp/ipset.txt:
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/20out ipset -L (问题):
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)。
-s, -sorted
Sorted output. When listing or saving sets, the entries are listed sorted.但是我使用下面的命令进行了尝试,输出是相同的(没有sort )。也许我没有正确地使用它):
ipset restore -! -s < /tmp/ipset.txt如果从-!命令中删除restore选项,则会得到以下错误:
ipset v7.15: Error in line 1: Set cannot be created: set with the same name already exists因此,我认为我的脚本有一个错误,因为它添加了我认为不应该出现的一行:
create blacklist hash:net family inet hashsize 1024 maxelem 65536 bucketsize 12 initval 0xf164f1c6然后,我可以删除save行以避免错误,将其保留如下:
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中不起作用。
我如何解决这个问题,以便输出被组织起来?
发布于 2022-11-26 07:48:02
关于ipset的一些背景信息:这是一个命令行工具,用于操作内核内存中调整大小的数据集。因此,ipset只是一个调用实际代码的包装器,它驻留在内核中--包括列出集合内容的代码。下面是棘手的部分:
您传递了一个选项,希望以排序的方式将该集的输出进行排序--但负责此操作的内核模块不知道该选项,只是忽略了该选项。在内核上下文中执行的所有函数都必须是快速的,如果需要太长时间,可能会冻结您的系统。这就是为什么内核开发人员在代码不是严格必要的情况下非常挑剔的原因(排序在CPU时间上是昂贵的,而不是必要的--这也可以在用户空间中完成)。
我不知道需要什么内核版本来“启用”一个集合的排序输出,我用6.0.9内核版本进行了测试,在这个版本中,对输出进行排序的选项做了它应该做的事情。令人遗憾的是,他们删除了一些手册页上的提示,这里是仍然具有该提示的手册页的一个版本。
按照这样的顺序设置并不是一个错误,它实际上是一个特性:在列表中,您必须遍历每个项目来检查传入的IP是否是该列表的一部分。这使得每次查找都取决于列表的大小。散列是不同的:函数用于从数据中计算哈希值(在本例中是IP )。此哈希值用于引用数据中的位置--如果其中有条目,则IP位于该列表中。
这种组织您的集合的方式使查找所需的时间恒定--与您的集合大小无关!当涉及到网络流量时,快速响应时间总是很重要的。
我希望这有助于更好地理解事情..。
https://serverfault.com/questions/1116531
复制相似问题