Как немедленно сбросить TCP-соединение на обоих концах при определенном условии, используя Linux Netfilter/IPtables?

Как немедленно сбросить 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? Если нет, то какие еще инструменты я могу использовать (имейте в виду, что у меня нет контроля над клиент-серверными приложениями)?

Заранее большое спасибо за ваши ценные ответы!

С наилучшими пожеланиями,

Йенс

решение1

Вы можете использоватьxt_RESET, например,-j RESET

решение2

Вы можете настроить свое приложение на тайм-аут.

Другое решение — настроить TCP KeepAlive и проводить более частые проверки, например, каждые 10 минут.

Некоторые приложения реализуют KeepAlive на уровне приложения. Например, SSH, Apache.

Когда подтверждение активности отправлено и соединение закрыто на удаленном конце, вы получите RST с удаленного конца.

Файрволы с сохранением состояния забудут соединение после определенного периода бездействия. Это означает, что вы можете получить отброшенные пакеты и полуоткрытые соединения, если у вас нет трафика в течение некоторого времени (30 минут или 1 час).

Я думаю, лучше спросить о конкретной проблеме, которую вы пытаетесь решить, чем о конкретном решении, которое вы пытаетесь реализовать.

решение3

К сожалению, местная сторона не будет уведомлена о принудительном отключении.

Так и должно быть, tcp-reset означает, что клиент должен быть проинформирован о закрытии соединения. Если ваш клиент зависает при отправке сброса, это означает, что он не обрабатывает сброс, отправляемый обратно с вашего хоста, на котором запущены IPTables, должным образом. Если у вас нет способа решить эту проблему, я не могу придумать, как вы можете этого добиться.

Связанный контент