
Estimada comunidad de Serverfault,
Tengo el siguiente problema: necesito restablecer (desconectar) las conexiones TCP en ambos lados de la red inmediatamente si se encuentra una determinada cadena en el paquete de datos. No tengo control sobre las aplicaciones en ambos lados y solo puedo usar iptables de Linux (o herramientas similares) para cancelar la conexión.
Mi primera idea fue utilizar la siguiente regla de iptables para lograr lo que buscaba:
/usr/sbin/iptables -A INPUT -p tcp --dport 1234 -m string --algo bm --string 'BAD STRING' -j REJECT --reject-with tcp-reset
Esto funciona perfectamente en el lado remoto enviando un paquete TCP RST al cliente que, por lo tanto, se desconectará inmediatamente. Desafortunadamente, el lado local no será notificado sobre la desconexión forzada y el proceso (conexión) del servidor se bloquea para siempre.
Pensé que el requisito de desconectar inmediatamente una conexión ya establecida en ambos lados bajo una determinada condición (una coincidencia de cadena en un paquete IP en este caso) no es muy inusual. Entonces hice una búsqueda en Google pero para mi sorpresa no pude encontrar nada utilizable en un período de tiempo razonable.
¿Hay alguna manera de lograr una desconexión TCP en ambos lados de la red usando iptables? Si no es así, ¿qué otras herramientas podría utilizar (tenga en cuenta que no tengo control sobre las aplicaciones cliente/servidor)?
¡Muchas gracias de antemano por sus valiosas respuestas!
Atentamente,
Jens
Respuesta1
Puedes usarxt_RESET, p.ej,-j RESET
Respuesta2
Puede configurar su aplicación para que tenga un tiempo de espera.
Otra solución es configurar TCP KeepAlive y realizar comprobaciones más frecuentes, como cada 10 min.
Algunas aplicaciones implementan KeepAlive a nivel de aplicación. Por ejemplo, SSH, Apache.
Cuando se envía el mensaje Keep Alive y la conexión se cierra en el extremo remoto, recibirá un RST desde el extremo remoto.
Los firewalls con estado olvidarán la conexión después de un período de inactividad. Esto significa que puedes obtener paquetes descartados y conexiones medio abiertas cuando no tienes tráfico por un tiempo (30min o 1h).
Creo que es mejor preguntar sobre el problema particular que estás tratando de resolver, que sobre la solución particular que estás tratando de implementar.
Respuesta3
Desafortunadamente, el lado local no será notificado sobre la desconexión forzada.
Debería serlo, un reinicio de tcp significa que se debe informar al cliente que se está cerrando la conexión. Si su cliente se bloquea cuando se envía el reinicio, esto implica que no está manejando adecuadamente el reinicio que se envía desde su host que ejecuta IPTables. A menos que tenga un medio para abordar ese problema, no se me ocurre ninguna manera de lograrlo.