Назад | Перейти на главную страницу

Использование iptables для блокировки IP-адресов, запросивших определенный HTTP-ресурс

В настоящее время меня засыпают запросами к /wpad.dat, и это выглядит как атака.

Теперь я хотел бы запускать iptables для каждого IP-адреса, который запрашивает /wpad.dat, а затем добавлять его в черный список. Есть ли способ сделать это? Это означает, что IP-адрес сможет отправить один запрос флуд, а затем ни одного.

Любой изящный способ сделать это эффективно?

Вы можете подумать, что есть другие способы заблокировать IP-адреса. Например, Fail2ban предназначен для сканирования файлов журналов на предмет заданных шаблонов и временной блокировки IP-адресов.

Как упоминалось в комментариях, вы потенциально можете добавить тысячи IP-адресов в свой черный список. Пока iptables работает, каждое дополнительное правило может увеличить время обработки каждого запроса. Ты можешь использовать ipset в качестве альтернативы, которая оказывается намного быстрее, когда добавляется много IP-адресов. Для ускорения матчей требуется хэш-подход. Видеть Массовая блокировка IP-адресов с помощью ipset для подробностей и сравнения между iptables и ipset.


Если вы хотите использовать iptables, это, вероятно, будет зависеть от того, как настроен ваш веб-сервер. Предположим, вы используете apache или nginx, вы можете настроить его для запуска какого-либо cgi-скрипта, когда wpad.dat запрашивается.

Например, если ваш веб-сайт уже использует PHP, вы можете использовать внутреннюю перезапись для запуска скрипта php (или ruby ​​/ python / java в зависимости от языка, который вы обычно используете).

После запуска скрипта просто заставьте его запустить что-то вроде этого в командной строке:

iptables -I INPUT -s {IP-HERE} -j DROP

Сценарий должен быть запущен от имени пользователя root, и, вероятно, не рекомендуется давать веб-пользователю права root, поэтому вы можете упаковать его как сценарий оболочки, chown это как root, и используйте setuid в теме.

Большое предупреждение: Вы можете случайно заблокировать себя, если посетите этот ресурс, поэтому вы можете установить --dport на порт 80 или что-то в этом роде. Это, по крайней мере, позволяет избежать блокировки вашего протокола ssh, поэтому, если вам удастся заблокировать себя, вы можете подключиться к своему серверу по ssh и разблокировать себя.

Срок действия: Поскольку постоянная блокировка многих IP-адресов редко бывает хорошей идеей, вы можете отслеживать заблокированный IP-адрес (возможно, добавить его в файл журнала) и создать задание cron для периодического удаления этих IP-адресов. Вам просто нужно запустить что-то вроде:

iptables -D INPUT -s 192.168.1.100 -j DROP

Автоматическая блокировка с iptables не совсем тривиальна, но вместо этого вы можете регулировать соединения, чтобы не перегружать все ваши ресурсы, добавив это правило:

iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 50/minute --limit-burst 200 -j ACCEPT