Matar la conexión tcp en linux

49

Tengo una conexión inactiva en una aplicación que está en estado suspendido si la máquina del cliente está inactiva.

->192.168.1.214:49029 (ESTABLISHED)

¿Hay alguna manera de terminar esta opción desde la línea de comandos de Linux sin reiniciar el servidor?

Después de la búsqueda, encontré una solución llamada tcpkill. Pero no funcionará para mí. Como bloquea permanentemente esa ip.

Vivek Goel
fuente
La respuesta sobre el uso del sscomando es mucho más fácil y más general que las demás.
nealmcb

Respuestas:

35

Originalmente de: http://rtomaszewski.blogspot.sk/2012/11/how-to-forcibly-kill-established-tcp.html

Para "matar" un socket, debe enviar un paquete de restablecimiento de TCP. Para enviarlo (y ser aceptado por el otro lado), debe conocer el número de secuencia TCP real.

1) El tcpkillmétodo ya mencionado aprende el número SEQ olisqueando pasivamente en la red y esperando que lleguen los paquetes válidos de esta conexión. Luego usa el número SEQ aprendido para enviar paquetes RSET a ambos lados. Sin embargo, si la conexión está inactiva / colgada y no fluyen datos, no hará nada y esperará para siempre.

2) Otro método usa el script perl llamado killcx( enlace a Sourceforge ). Esto envía activamente paquetes SYN falsificados y aprende el número SEQ de la respuesta. Luego envía paquetes RSET de la misma manera que tcpkill.

Alternativamente, el enfoque (basado en lo que desea lograr) es usar el gdbdepurador para adjuntar a un proceso que posee este socket / conexión y emitir close()syscall en su nombre, como se detalla en esta respuesta .

Si desea lidiar solo con conexiones colgadas (el otro lado está muerto), hay varios tiempos de espera (TCP keepalive, por ejemplo), que deberían cerrar automáticamente dichas conexiones si se configuran correctamente en el sistema.

Marki555
fuente
¿Funcionaría si simplemente cerráramos el socket TCP por su descriptor de archivo (fd)? exec fd> & -
Alexander Gonchiy
@AlexanderGonchiy para conexiones en vivo, evitaría que el proceso respondiera a los paquetes, por lo que la conexión se agotaría. Para conexiones inactivas no sucedería nada. No estoy seguro de si el kernel enviaría algo a la red al cerrar el fd.
Marki555
He olido el número de secuencia. ¿Que debería hacer entonces?
user3132194
18

tcpkillpodría hacerlo por ti. En Ubuntu está en el dsniffpaquete.

Algo como:

$ sudo tcpkill -i wlan0 host 192.168.1.214

(o alguna otra tcpdumpexpresión similar para saber qué conexión matar).

jcv
fuente
44
Esto funciona solo si la conexión está transmitiendo algo. No funcionará para conexiones TCP colgadas / inactivas (vea mi respuesta para más detalles)
Marki555
17

En linux kernel> = 4.9 puede usar el sscomando de iproute2 con clave-K

ss -K dst 192.168.1.214 dport = 49029

el kernel debe compilarse con la CONFIG_INET_DIAG_DESTROYopción habilitada.

Pavel
fuente
1
Para Linux, esta es realmente la mejor manera y prácticamente la única si tiene conexiones inactivas ( tcpkillno podría funcionar). Sin embargo, admito que no lo he inspeccionado, killcxpero parece que mucho software de seguridad evitará que funcione a menos que modifique sus iptables para permitir que pasen estos paquetes falsificados.
Seth Robertson
¡Gracias! Trabajó como un encanto con sudo ss -K ....Ubuntu Bionic 18.04 LTS. Tuve un tmuxproceso que estaba atascado en un tamaño de pantalla pequeño debido a una conexión remota, pero inactiva, pero no expirada. ¡Todo arreglado!
nealmcb
6

Do - como root netstat -tunp|grep 49029. La última columna de la salida debería mostrarle el PID y el nombre del programa responsable del proceso de esa conexión.

Si tiene suerte, solo hay un proceso para esa conexión.

Si tiene mala suerte, se vuelve más complicado (el PID es responsable de más que solo esa conexión). ¿Qué tipo de servicio es esto?

¿Por qué quieres terminar esa sesión?

Nils
fuente
8
No puedo matar ese proceso. Es el servidor Gearman. Solo quiero cerrar la conexión.
Vivek Goel
0

tcpkillno puede cerrar una conexión muerta (colgada). Está basado libpcap, construye un paquete a FINpaquete enviado . Si la conexión ya está inactiva, no puede obtener el número de secuencia correcto.

La única forma es cerrar el proceso, por lo que hace que todos los lugares NO sean SPOF.

alswl
fuente