У меня есть этот цикл для блокировки IP-адресов и CIDR с помощью ipset/iptables:
# 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 намного быстрее, чем 10000+ вызовов ipset...