我有 ipset v7.15 的 bash 腳本(在 ubuntu 22.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.txt
內容list.txt
:
125.74.0.0/15
1.0.132.249
125.73.0.0/16
130.255.128.0/20
125.76.0.0/17
出去/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/20
出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
正如您所看到的,輸出中的 IP/CIDRblacklist
很混亂(沒有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
我該如何解決這個問題以便組織輸出?
答案1
一些背景資訊ipset
:這是一個命令列工具,用於操作在核心記憶體中調整大小的資料集。因此,ipset 只是呼叫實際程式碼的包裝器,該程式碼駐留在核心中 - 包括列出集合內容的程式碼。這是棘手的部分:
您傳遞了一個選項,您希望以排序的方式獲得該集合的輸出 - 但負責此操作的核心模組不知道該選項,只是忽略了它。在核心上下文中執行的所有函數都必須很快,如果它們花費太長時間可能會凍結您的系統。這就是為什麼核心開發人員在程式碼不是絕對必要時非常挑剔的原因(排序在 CPU 時間方面是昂貴的,而且不是必需的 - 這也可以在用戶空間中完成)。
我不知道「啟用」一組排序輸出需要什麼核心版本,我使用核心版本 6.0.9 對其進行了測試,其中對輸出進行排序的選項做了它應該做的事情。遺憾的是他們刪除了一些手冊頁上的提示,這裡是手冊頁的一個版本,其中仍有該提示。
以這樣的順序設定並不是一個錯誤,它實際上是一個功能:在清單中,您必須遍歷每個項目來檢查傳入的 IP 是否是該清單的一部分。這使得每次查找都取決於清單的大小。哈希值不同:A功能用於從您的資料(本例中為 IP)計算雜湊值。此雜湊值用作資料內部位置的參考 - 如果那裡有條目,則 IP 位於該清單內。
這種組織集合的方式使得查找值所需的時間恆定 - 與集合的大小無關!當涉及網路流量時,快速回應時間始終很重要。
我希望這有助於更好地理解事情......