Відповіді:
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
Це відхилить з'єднання вище 15 з одного IP-джерела.
iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 150/second --limit-burst 160 -j ACCEPT
У цьому 160 нових з'єднань (пакетів дійсно) дозволено до застосування межі 150 НОВИХ з'єднань (пакетів) в секунду.
-m conntrack --ctstate
замість -m state --state
. conntrack є новим та вдосконаленим проти штату.
NEW
з'єднань - не робіть цього - це ефективно перетворює вашу INPUT
ланцюг у дефолт accept
!!!
Ви хочете, щоб наступні правила у ваших iptables відповідали на обидва вимоги у вашому запитанні:
iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -I INPUT -p tcp --dport 80 -m state \
--state RELATED,ESTABLISHED -j ACCEPT
# Adjust "--connlimit-above NN" to limit the maximum connections per IP
# that you need.
iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit \
--connlimit-above 10 --connlimit-mask 32 -j DROP
# Adjust "--connlimit-above NNN" to the maximum total connections you
# want your web server to support
iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit \
--connlimit-above 150 -j DROP
Оскільки ми використовуємо -I (відповідно до запиту ОП), ми повинні робити їх у зворотному порядку, тому "читаємо" їх знизу вгору.
Я також пропоную розглянути можливість змінення NN --connlimit-mask з 32 на 24. Це обмежить повну мережу класу C (максимум 256 IP-адрес у тому ж діапазоні) до 10 підключень. Ви також можете використовувати будь-яке інше безкласове число, наприклад 22 або 30, залежно від того, як ви вважаєте, що послуга може бути використана.
Також в залежності від того, як ви хочете, щоб клієнт себе, ви , можливо , захочете використовувати «-j REJECT --reject-з TCP-скидання» замість «-j DROP» в два вище правила, або навіть тільки в 150 з'єднань макс правило.
Якщо Ви відхилите підключення, браузер або програмне забезпечення, що використовує порт 80, одразу покажуть статус "недоступний", але параметр DROP змусить клієнта кілька разів зачекати і повторити спробу перед тим, як повідомити про сайт як недоступний. Я, як правило, схиляюся до DROP, оскільки він поводиться більше як поганий зв’язок, ніж офлайн-сервер.
Крім того, якщо ліміт підключення знизиться нижче 150 (або 10), поки він ще намагається, він, нарешті, перейде на ваш сервер.
Опція REJECT призведе до частки менше трафіку на ваш сайт, оскільки DROP призведе до того, що він надсилатиме додаткові пакети під час повторного повторного завантаження. Напевно, не все так актуально.
Якщо з іншого боку, трафік вашого порта 80 є частиною кластера, то REJECT скаже контролеру кластера, що він знижений, і припинить надсилати йому трафік на час його витримки.
Правило, пов'язане з встановленим, існує за умови, що ваше правило за замовчуванням блокує весь трафік (iptables -t фільтр -P INPUT DROP). Це просто приймає нові пакети, що належать до прийнятих з'єднань.
Також --syn каже йому звернути увагу на (або підрахувати) пакети, які встановлюють TCP-з'єднання.
Вам потрібно використовувати connlimit
модулі, які дозволяють обмежити кількість паралельних підключень TCP до сервера за IP-адресою клієнта (або блоком адреси).
/sbin/iptables -I INPUT -p tcp --syn --dport 80 -m connlimit \
--connlimit-above 10 -j DROP