В настоящее время меня засыпают запросами к /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