Как заблокировать Китай и сохранить его блокировку после перезагрузки? Возникли проблемы с реализацией

Вам нужно немного написать скрипт. Что-то вроде:

find. -mindepth 2 -type f -print | while read x; do
    y=$(basename "$x")
    if [ -f "$y" ]; then
        mv "$y" "$y".backup
    fi
    mv "$x" "$y"
done
4
02.07.2020, 16:39
1 ответ

ipsetимеет подкоманду для атомарной замены двух наборов:swap(или -W). Это позволяет заполнить новый набор, заменить его старым набором и удалить бесполезный набор с новым именем. Это лучше, чем сбрасывать набор (с помощью ipset flush china), потому что это временно оставляет систему незащищенной и позволяет заменить набор другими параметрами без необходимости удалять правила iptables , ссылающиеся на него (, потому что набор не может быть уничтожен, пока на него все еще ссылаются ). Я также переключаюсь на более новый синтаксис ipset , который является единственным сохраненным в последних справочных страницах(оба синтаксиса работают ).

# -exist for idempotence: don't trigger an error the 2nd time this script is run
ipset -exist create china hash:net

# old cn.zone will stay around if download fails
wget -O /etc/cn.zone.tmp http://www.ipdeny.com/ipblocks/data/countries/cn.zone && \
    mv /etc/cn.zone.tmp /etc/cn.zone

ipset create china.tmp hash:net
sed 's/^/add china.tmp /' /etc/cn.zone | ipset -exist restore   
ipset swap china china.tmp # new set atomically replaces older set
ipset destroy china.tmp

/sbin/iptables-restore < /etc/sysconfig/iptables

Замена цикла на (правильно отформатированные входные данные, подаваемые на )ipset -exist restore, улучшили загрузку записей на два порядка (здесь проверка цикла увеличилась с ~6 с до ~0,06 с ). -existздесь на случай, если сам список ввода содержит дубликаты, чтобы игнорировать их и предотвратить преждевременный аборт при загрузке записей. Если вы считаете, что входной список может содержать неразборчивое содержимое,затем либо отфильтруйте его, чтобы сделать его разборчивым (, например, :удалите любую пустую строку ), либо вернитесь к циклу, но вместо forлучше используйте конструкцию while read, например:

while read net; do
    ipset -exist add china.tmp "$net"
done < /etc/cn.zone

iptables-restoreможно оставить в текущем скрипте или поместить в отдельный скрипт (, который будет зависеть от этого текущего скрипта, поскольку правила iptables зависят от уже созданного набора ), чтобы сохранить функциональные возможности обновления установка и обновление правил iptables отдельно.

Я уверен, что сценарий можно улучшить (, особенно в отношении загрузки файла cn.zone, который, как ожидается, не будет работать во время загрузки, даже если это не повлияет на общий результат. Может быть, это тоже следует разделить ).

1
18.03.2021, 23:22

Теги

Похожие вопросы