как добавить несколько ips cidr с параметрами сохранения и восстановления ipset

как добавить несколько ips cidr с параметрами сохранения и восстановления ipset

У меня есть этот цикл для блокировки 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...

Связанный контент