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

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

Заранее благодарим вас за ценные ответы!

С уважением,

Йенс

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

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

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

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

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

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

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

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

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