
Уважаемое сообщество 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, должным образом. Если у вас нет способа решить эту проблему, я не могу придумать, как вы можете этого добиться.