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

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

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

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

2 ответа

Вы можете подумать, что есть другие способы заблокировать 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 это как корень, и использовать setuid в теме.

Большое предупреждение: Вы можете случайно заблокировать себя, если посетите этот ресурс, поэтому вы можете захотеть установить --dport на порт 80 или что-то в этом роде. Это, по крайней мере, позволяет избежать блокировки вашего протокола 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

Другие вопросы по тегам