2

Я потратил несколько часов, пытаясь настроить iptables/ufw, чтобы сделать это для HTTP-запросов, обрабатываемых Apache2:

Белый список набор диапазонов IP-адресов (ботов поисковых систем). Добавление IP-адресов в 24-часовой список блокировки после X запросов в течение Y секунд (в идеале я хотел бы установить три правила, подобные этим)

Но мне показалось, что это невозможно сделать с iptables, так как он будет блокировать IP только на короткий период времени.

Кто-нибудь знает, возможно ли сделать то, что я обрисовал в общих чертах, можно достичь с помощью mod_security? Или порекомендуете что-нибудь, что может сделать это? Любые фрагменты кода, которые делают что-то подобное, приветствуются.

2 ответа2

1

Все, что вы ищете, доступно в netfilter (и многое другое! ;-)).

Сопоставление набора диапазонов IP-адресов с белым списком может быть выполнено с помощью ipsets и расширения соответствия «set»:

ipset -N whitelist nethash

ipset --add whitelist 1.2.3.4/24

Тогда в iptables сетевого фильтра:

iptables -A INPUT -m set --match-set whitelist src -j ACCEPT

Для блокировки в течение 24 часов вам нужно два раза использовать расширения совпадения «последние»: одно для проверки скорости входящих и одно для запоминания заблокированных источников:

iptables -N BLOCK24
iptables -A BLOCK24 -m recent --name blocked --set

iptables -A INPUT -m recent --name beforeblock --rcheck --seconds 1 --hitcount 1 -j BLOCK24

Это будет соответствовать, если два пакета в одну секунду. А теперь, чтобы заблокировать источники, просто сопоставьте «заблокированный» недавний список. Это правило, конечно, должно быть в числе первых ваших правил iptables.

iptables -A INPUT -m recent --name blocked --recheck --seconds 86400 -j DROP

Необходимый документ находится здесь: расширения iptables и ipsets. Конечно, можно добавить -p tcp --dport 80 если эти правила должны применяться только к http.

0

Пара твиков потребовалось над вышеупомянутым. Это работает:

sudo ipset -N whitelist nethash
sudo ipset --add whitelist 68.180.228.175
sudo iptables -A INPUT -m set --match-set whitelist src -j ACCEPT
sudo iptables -N BLOCK24
sudo iptables -A BLOCK24 -m recent --name blocked --set
sudo iptables -A INPUT -m state --state NEW -m recent --set
sudo iptables -A INPUT -m state --state NEW -m recent --update --seconds 20 --hitcount 20 -j BLOCK24
sudo iptables -A INPUT -m recent --name blocked --rcheck --seconds 86400 -j BLOCK24
sudo iptables -A BLOCK24 -j LOG --log-prefix='[NETFILTER] ' --log-level 7
sudo iptables -A BLOCK24 -j REJECT

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .