Я запускаю несколько сотен веб-серверов за балансировщиками нагрузки, размещая множество различных сайтов с множеством приложений (которые я не контролирую). Примерно раз в месяц один из сайтов взламывается, и загружается сценарий наводнения для атаки на какой-либо банк или политическое учреждение. В прошлом это всегда были UDP-потоки, которые эффективно устранялись путем блокирования исходящего UDP-трафика на отдельном веб-сервере. Вчера они начали наводнять крупный банк США с наших серверов, используя множество TCP-соединений к порту 80. Поскольку эти типы соединений идеально подходят для наших приложений, просто их блокировка не является приемлемым решением.
Я рассматриваю следующие варианты. Какой из них вы бы порекомендовали? Вы реализовали это и как?
- Ограничение исходящих TCP-пакетов веб-сервера (iptables) с портом источника! = 80
- То же самое, но с очередями (tc)
- Ограничение скорости исходящего трафика на пользователя на сервер. Довольно административная нагрузка, поскольку на сервере приложений потенциально могут быть тысячи разных пользователей. Может быть, это: как я могу ограничить пропускную способность для каждого пользователя?
- Что-нибудь еще?
Естественно, я также ищу способы минимизировать вероятность того, что хакеры попадут на один из наших хостинговых сайтов, но, поскольку этот механизм никогда не будет на 100% водонепроницаемым, я хочу серьезно ограничить воздействие вторжения.
Обновление: я в настоящее время тестирую с этими правилами, которые предотвратили бы эту специфическую атаку. Как бы вы предложили сделать их более общими? Я пропускаю известную TCP DoS-атаку, когда я ограничиваю скорость только для пакетов SYN?
iptables -A OUTPUT -p tcp --syn -m limit --limit 100/min -j ACCEPT
iptables -A OUTPUT -p tcp --syn -m limit --limit 1000/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
iptables -A OUTPUT -p tcp --syn -j REJECT --reject-with tcp-reset
Ура!