Ограничьте макс. соединения на IP-адрес и новые соединения в секунду с iptables

Это то, что Вы хотите?

#!/bin/bash

(expect - << EOF

...

EOF
) | while read line; do if [[ "$line" =~ "error" ]]; then  echo $line; fi; done

Удивленный у Вас нет grep.

37
11.07.2014, 00:57
3 ответа
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 новых соединений (пакетов) в секунду.

.
48
27.01.2020, 19:36

Вам нужно использовать модули connlimit, которые позволяют ограничить количество параллельных TCP-соединений с сервером на IP-адрес клиента (или адресный блок).

/sbin/iptables -I INPUT -p tcp --syn --dport 80 -m connlimit \
      --connlimit-above 10 -j DROP
5
27.01.2020, 19:36

Вы хотите, чтобы следующие правила в 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 ( согласно запросу OP), мы должны сделать их в обратном порядке, чтобы «читать» их снизу вверх.

Я также предлагаю рассмотреть возможность изменения --connlimit-mask NN с 32 на 24. Это ограничит полную сеть класса C (максимум 256 IP-адресов в том же диапазоне) до 10 подключений. Вы также можете использовать любое другое бесклассовое число, например 22 или 30, в зависимости от того, как, по вашему мнению, может использоваться ваш сервис.

Также в зависимости от того, как вы хотите, чтобы клиент вел себя, вы можете использовать «-j REJECT --reject-with tcp-reset» вместо «-j DROP» в двух правилах выше. , или даже только в правиле максимума 150 подключений.

Если вы ОТКЛЮЧИТЕ соединение, браузер или программное обеспечение, использующее порт 80, немедленно покажет статус «недоступен», но опция DROP заставит клиента подождать и повторить попытку несколько раз, прежде чем сообщать, что сайт недоступен. Я сам склоняюсь к DROP, поскольку он ведет себя больше как плохое соединение, чем автономный сервер.

Кроме того, если лимит подключений упадет ниже 150 (или 10), пока он все еще пытается повторить попытку, то он, наконец, перейдет на ваш сервер.

Параметр REJECT, однако, приведет к незначительному снижению трафика на ваш сайт, поскольку DROP приведет к отправке дополнительных пакетов при повторной попытке. Наверное, не все так актуально.

Если, с другой стороны, ваш трафик порта 80 является частью кластера, то REJECT сообщит контроллеру кластера, что он не работает, и прекратит отправку трафика на него на время тайм-аута повтора.

Правило СВЯЗАНО, УСТАНОВЛЕНО при условии, что ваше правило по умолчанию - блокировать весь трафик (iptables -t filter -P INPUT DROP). Это просто принимает дополнительные пакеты, принадлежащие принятым соединениям.

Также --syn указывает ему обращать внимание (или подсчитывать) пакеты, устанавливающие TCP-соединение.

8
27.01.2020, 19:36

Теги

Похожие вопросы