Назад | Перейти на главную страницу

TCP DOS: как завершить соединения CLOSE_WAIT?

Один из моих серверов переходит в режим DOS - большое количество подключений в CLOSE_WAIT состояния, которые не позволяют законным пользователям подключаться к системе.

Так есть ли способ закрыть CLOSE_WAIT соединение, не убивая базовый серверный процесс? Прерывание процесса приведет к простою, которого я хочу избежать.

Есть ли другой путь?

Насколько я знаю, невозможно закрыть соединение CLOSE_WAT, не прерывая процесс.

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

Вот пример (измените eth0 для вашего сетевого интерфейса или просто удалите его):

iptables -N LOGDOS
iptables -A LOGDOS -m limit --limit 5/minute --limit-burst 5 -j ULOG --ulog-nlgroup 1 --ulog-prefix "LOGDOS" --ulog-cprange 0 --ulog-qthreshold 1
iptables -A LOGDOS -j DROP
iptables -A INPUT -i eth0 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 27015 -m state --state NEW -m recent --set --name cssdos
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 27015 -m state --state NEW -m recent --update --name cssdos --seconds 60 --hitcount 4 -j LOGDOS
iptables -A INPUT -i eth0 -p tcp -m state --state NEW -m tcp --dport 27015 -j ACCEPT

Краткое объяснение:

  1. Первые 3 строки будут использоваться ulogd. Это позволяет нам регистрировать потерянный трафик. Мы создаем новую цепочку iptables под названием LOGDOS.
  2. 4-я строка принимает установленные соединения.
  3. Пятая строка будет использоваться последним модулем для отслеживания новых подключений.
  4. Шестая строка будет использоваться последним модулем. В случае, если имеется более 3 новых подключений с одного и того же IP-адреса менее чем за 60 секунд, оно будет отправлено в цепочку LOGDOS.
  5. Цепочка LOGDOS будет использовать демон ulogd для записи журнала (например, в /var/log/ulog/syslogemu.log, все зависит от конфигурации ulog) и по умолчанию разрывает соединение.

Надеюсь, это сработает для вас.