Я использую модуль ограничения скорости iptables для предотвращения DoS-атак (я знаю, что он не может остановить полномасштабные DDoS-атаки, но, по крайней мере, он может помочь с меньшими атаками).
В моих правилах есть что-то вроде:
/sbin/iptables -A INPUT -p TCP -m state --state NEW -d xx.xxx.xxx.xx --dport 80 -m limit --limit 20/minute --limit-burst 20 -j ACCEPT
Он работал хорошо до прошлой ночи, когда кто-то безостановочно бил мой порт 80. Соединение было сброшено в соответствии с правилом (как показано в журнале). Однако это также делает сервер недоступным для других законных пользователей.
Я не понимаю, почему так произошло. Я думал, что это не повлияет на других пользователей, кроме того, который наводняет сервер.
Это потому, что iptables перегружен?
Любая обратная связь будет принята с благодарностью.
Спасибо!
Он также отключает трафик для законных пользователей, потому что вы не указали исходный IP-адрес для применения этого правила. Если вы изменили правило, чтобы иметь адрес источника, вы тогда ограничили бы этот конкретный адрес RateLimit. Согласно вашему правилу, RateLimit действует для всех адресов.
У меня есть настройка RateLimit для ограничения всех IP-адресов, кроме тех, которые указаны в определенных правилах. Моя конфигурация следующая:
-I ВВОД -m tcp -p tcp --dport 80 -d xx.xxx.xx.xx -j ПРИНЯТЬ
-A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-upto 400 / min --hashlimit-burst 500 --hashlimit-mode srcip --hashlimit-name ratelimit -j ACCEPT
Затем у меня есть несколько правил, например
Это разрешит обмен данными через порт 80 с настроенным ограничением количества подключений и пакетным сигналом, а также ограничением по IP-адресу источника (параметр --hashlimit-mode srcip). IP-адреса будут проверены на наличие в RateLimit (--hashlimit-name ratelimit).
Возможно, что-то подобное - это то, что вы ищете?
В вашем правиле не указано конкретное происхождение. После принятия 20 НОВЫХ подключений в минуту он перестает принимать НОВЫЕ подключения.
Вам нужно использовать recent
модуль, чтобы iptables запоминал, откуда приходят соединения, и блокировал людей, которые слишком быстро подключаются с одного и того же адреса. Для этого нужны два правила: одно для iptables, чтобы «узнать» адрес, а второе для iptables, чтобы узнать, сколько раз этот адрес попадал на сервер за указанное время:
/sbin/iptables -A INPUT -p TCP -m state --state NEW -d xx.xxx.xxx.xx --dport 80 -m recent --set
/sbin/iptables -A INPUT -p TCP -m state --state NEW -d xx.xxx.xxx.xx --dport 80 -m recent --update --seconds 60 --hitcount 20 -j DROP
Эта статья входит в более подробную информацию.