Как сразу сбросить соединение tcp на обоих концах при определенном условии, используя linux netfilter/iptables?
Уважаемое сообщество Serverfault,
У меня следующая проблема: мне нужно немедленно сбросить (отключить) tcp-соединения на обеих сторонах сети, если в пакетных данных обнаружена определенная строка. У меня нет контроля над приложениями с обеих сторон, и я могу только использовать linux iptables (или аналогичные инструменты) для прерывания соединения.
Моей первой идеей было использование следующего правила iptables для достижения того, что я искал:
/usr/sbin/iptables -A INPUT -p tcp --dport 1234 -m string --algo bm --string 'BAD STRING' -j REJECT --reject-with tcp-reset
Это отлично работает на удаленной стороне, посылая пакет TCP RST клиенту, который будет немедленно отключен. К сожалению, локальная сторона не будет уведомлена о принудительном отключении, и процесс сервера (соединение) зависает навсегда.
Я думал, что требование немедленно отключить уже установленное соединение с обеих сторон при определенном условии (в данном случае совпадение строк в IP-пакете) не является чем-то необычным. Поэтому я выполнил поиск в Google, но, к моему удивлению, не смог найти ничего полезного за разумное время.
Есть ли способ добиться отключения tcp на обеих сторонах сети, используя iptables? Если нет, какие еще инструменты я могу использовать (имейте в виду, что я не могу контролировать приложения клиент / сервер)?
Заранее большое спасибо за ваши ценные ответы!
С наилучшими пожеланиями,
Jens
3 ответа
Вы можете настроить свое приложение на тайм-аут.
Другое решение - настроить TCP KeepAlive и проводить более частые проверки, например каждые 10 минут.
Некоторые приложения реализуют KeepAlive на уровне приложений. Например, SSH, apache.
Когда подтверждение активности отправлено, и соединение на удаленном конце закрыто, вы получите RST с удаленного конца.
Statefull firewall забудет о соединении после периода бездействия. Это означает, что вы можете получить отброшенные пакеты и наполовину открытые соединения, если у вас нет трафика в течение некоторого времени (30 минут или 1 час).
Я думаю, что лучше спросить о вашей конкретной проблеме, которую вы пытаетесь решить, чем о конкретном решении, которое вы пытаетесь реализовать.
К сожалению, местная сторона не будет уведомлена о принудительном отключении
Должно быть, tcp-reset означает, что клиенту нужно сообщить, что соединение закрыто. Если ваш клиент зависает при отправке сброса, это означает, что он неправильно обрабатывает сброс, возвращаемый с вашего хоста, на котором запущены IPTables. Если у вас нет средств для решения этой проблемы, я не могу придумать, как вы можете этого достичь.