Мне было интересно, могу ли я предотвратить небольшие (D) DoS-атаки с помощью простого правила IP-таблиц?
Под малым я подразумеваю, что они наводняют мой веб-сервер примерно 400+ запросами с одного или двух IP-адресов. Я могу отбросить IP-адреса после того, как замечаю, что они начали попадать на мой веб-сервер, но обычно IP-таблицам требуется несколько минут, чтобы сработать с этим IP-адресом и начать полностью отбрасывать его, чтобы это не повлияло на этот веб-сервер. .
Я сбрасываю IP с помощью следующей команды:
iptables -I INPUT -s "IP HERE" -j DROP
А потом, очевидно, сохраните:
/etc/init.d/iptables save
Обычно я узнаю атакующий IP-адрес (а) с помощью следующей команды:
netstat -plan|grep :80|awk '{print $5}'|cut -d: -f 1|sort|uniq -c|sort -n
Проблема с тем, чтобы делать это таким образом, заключается в том, что я должен быть там, и это требует, чтобы я действовал постфактум. Есть ли правило IP-таблиц, которое я мог бы использовать для удаления IP-адреса сразу после 150 подключений? Таким образом, мне не нужно беспокоиться о перегрузке веб-сервера, и мне также не нужно быть там в то время, чтобы заблокировать его.
Кстати, я использую Apache на CentOS, если это важно.
Спасибо за уделенное время.
Для чего-то, что предлагает гибкость, изучите последний (и ограниченный) модуль (ы). Недавние будут отслеживать количество подключений, выполненных IP-адресом за определенный период времени, и могут использоваться для запуска определенного правила. Последний модуль (относительно) загружен ЦП, но по сравнению с загрузкой динамической страницы может быть вполне приемлемым.
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m multiport --dports 80,443 -m recent --update --seconds 3600 --name BANNED --rsource -j DROP
-A INPUT -p tcp -m multiport --dports 80,443 -m state --state NEW -j ATTK_CHECK
-A ATTACKED -m limit --limit 5/min -j LOG --log-prefix "IPTABLES (Rule ATTACKED): " --log-level 7
-A ATTACKED -m recent --set --name BANNED --rsource -j DROP
-A ATTK_CHECK -m recent --set --name ATTK –-rsource
-A ATTK_CHECK -m recent --update --seconds 600 --hitcount 150 --name ATTK --rsource -j ATTACKED
-A ATTK_CHECK -m recent --update --seconds 60 --hitcount 50 --name ATTK --rsource -j ATTACKED
-A ATTK_CHECK -j ACCEPT
По сути, вышеизложенное составляет:
Для более подробного объяснения и многоуровневой версии вышеизложенного, которую я использую, см. Эта статья
Имейте в виду, что ipTables совсем не поможет с перегрузкой сети и довольно неэффективен против любых распределенных атак - его преимущество заключается в безопасности и снижении нагрузки на ваш сервер.
Вы жестяная банка используйте iptables, чтобы заблокировать такого нарушителя, но вы должны быть осторожны, потому что iptables очень загружает процессор. Каждый пакет проверяется на соответствие каждому правилу, поэтому добавление правил может быстро привести к исчерпанию циклов на сервере. Однажды у меня был клиент, который добавлял новое правило каждый раз, когда они хотели кого-то заблокировать, а затем в один прекрасный день у них был немного выше, чем обычно, трафик, и система упала. Таблицы могут уменьшить количество просматриваемых правил, но вы не можете просто добавить много правил в iptables.
Другой альтернативой является маршрутизация по черной дыре:
ip route add blackhole $IP_HERE
ip route flush cache
Таблица маршрутизации хешируется (с хеш-таблица), тогда как правила iptables нужно рассматривать последовательно, что гораздо менее эффективно. Таким образом, вы можете без проблем использовать сотни тысяч маршрутов, где тысячи правил iptables будет проблематично выполнять для каждого запроса.
Что касается вашего второго вопроса, вы можете использовать hashlimit
модуль для создания автоматического черного списка для злоумышленников. Смотрите мой пост о предотвращении DDoS-атаки для получения дополнительных сведений, но в краткой форме:
iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-upto 50/min \
--hashlimit-burst 500 --hashlimit-mode srcip --hashlimit-name http -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP