如何使用 ipset 儲存和復原選項新增多個 ips cidr

如何使用 ipset 儲存和復原選項新增多個 ips cidr

我有這個循環來使用 ipset/iptables 阻止 IP 和 CIDR:

# this is just an example. the actual list IPs/CIDR is very large
cat blockip.txt
13.31.0.254
cat blockcidr.txt
13.32.0.0/15

環形:


#!/bin/bash
ipset -F
ipset -N -! blacklist hash:net maxelem 1000000
for ip in $(cat blockip.txt blockcidr.txt); do
    ipset -A blacklist $ip
done
iptables -A FORWARD -m set --match-set blacklist dst -j DROP

注意:我一直使用該ipset -A選項,但我不知道該選項到底是什麼意思,因為它沒有出現在“曼·伊普塞特",此時,我假設 與add相同-A,因為兩種情況下的輸出是相同的。

#!/bin/bash
ipset -F
ipset -N -! blacklist hash:net maxelem 1000000
for ip in $(cat blockip.txt blockcidr.txt); do
    ipset add blacklist $ip -q
done
iptables -A FORWARD -m set --match-set blacklist dst -j DROP

兩種情況:

sudo ipset -L
Name: blacklist
Type: hash:net
Revision: 7
Header: family inet hashsize 1024 maxelem 1000000 bucketsize 12 initval 0xbc0136c8
Size in memory: 552
References: 0
Number of entries: 2
Members:
13.31.0.254
13.32.0.0/15

“效果很好”,但是我讀過了添加 IP 和 CIDR 的速度ipset -A非常慢。使用哪個更快ipset保存與恢復。但我不明白如何運作,我的嘗試失敗了:

add注意:我還沒有找到為什麼使用保存/恢復選項而不是或更快的解釋-A

#!/bin/bash
ipset -F
ipset -N -! blacklist hash:net maxelem 1000000
for ip in $(cat blockip.txt blockcidr.txt); do
    ipset add blacklist $ip # ??
    ipset save blacklist -f newblacklist.txt # ???
done
ipset restore -! < newblacklist.txt # ??
iptables -A FORWARD -m set --match-set blacklist dst -j DROP # ??

出去:

sudo ipset -L
Name: blacklist
Type: hash:net
Revision: 7
Header: family inet hashsize 1024 maxelem 1000000 bucketsize 12 initval 0xcb0e583b
Size in memory: 552
References: 0
Number of entries: 2
Members:
13.32.0.0/15
13.31.0.254

cat newblacklist.txt # out wrong
create blacklist hash:net family inet hashsize 1024 maxelem 1000000 bucketsize 12 initval 0xcb0e583b
add blacklist 13.32.0.0/15
add blacklist 13.31.0.254

我將不勝感激任何幫助(完整的答案,包括建議的循環或對我的循環的更正)

答案1

這對我有用:

# remove any old reference to the ipset
iptables -D FORWARD -m set --match-set blacklist dst -j DROP
ipset destroy

ipset create blacklist hash:net family inet hashsize 1024
ipset save > /tmp/ipset.txt
ipset destroy

cat blockip.txt blockcidr.txt | while read line; do
    if [ "${line:0:1}" = "#" ]; then
        continue
    fi
    echo "add blacklist $line" >> /tmp/ipset.txt
done

ipset restore < /tmp/ipset.txt
iptables -A FORWARD -m set --match-set blacklist dst -j DROP

請根據您的需求調整 create 語句中的選項 - 根據集合的大小,這些選項非常重要。這進一步假設該文件blockcidr.txt僅包含如下行:

#comment
1.2.3.4/20

之後,恢復就可以正常運作了。

更新
ipset在本例中, 這種循環的瓶頸始終是子進程的建立。如果您有 10000 多個條目,則可執行 ipset 正在載入到記憶體中,並為您要新增的每一行解析選項...

我的循環僅包含 bash 內部命令,因此不必加載/執行任何可執行檔 - 只是將一些文字寫入文件中。當然 - 對 ipset 的單次呼叫比對 ipset 的 10000 多次呼叫要快得多...

相關內容