Использование 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