Уважаемое сообщество 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? Если нет, то какие еще инструменты я могу использовать (имейте в виду, что у меня нет контроля над приложениями клиент / сервер)?
Заранее благодарим вас за ценные ответы!
С уважением,
Йенс
Вы можете настроить свое приложение на тайм-аут.
Другое решение - настроить TCP KeepAlive и проводить более частые проверки, например каждые 10 минут.
Некоторые приложения реализуют KeepAlive на уровне приложения. Например. SSH, apache.
Когда отправлено подтверждение активности и соединение закрыто на удаленном конце, вы получите RST с удаленного конца.
Межсетевые экраны Statefull забудут о подключении после периода бездействия. Это означает, что вы можете получить отброшенные пакеты и полуоткрытые соединения, когда у вас нет трафика в течение некоторого времени (30 минут или 1 час).
Я думаю, лучше спросить о конкретной проблеме, которую вы пытаетесь решить, чем о конкретном решении, которое вы пытаетесь реализовать.
Ты можешь использовать xt_RESET, например, -j RESET
К сожалению, местная сторона не будет уведомлена о принудительном отключении.
Должно быть, tcp-reset означает, что клиенту следует сообщить, что соединение закрывается. Если ваш клиент зависает при отправке сброса, это означает, что он неправильно обрабатывает сброс, отправляемый обратно с вашего хоста, на котором запущены IPTables. Если у вас нет средств для решения этой проблемы, я не могу придумать, как вы можете этого добиться.