En alguna ocasión me he encontrado con la necesidad de cortar conexiones establecidas en Linux, dado que no podía reiniciar el servicio y no tenía control sobre el cliente en el otro lado.
Existen dos opciones de hacerlo
Cortar conexiones establecidas con iptables
Esta es la opción que suelo utilizar. No es la más elegante, pero funciona en un plazo de 1 minuto aproximadamente.
root@servidor:~# netstat -na |grep ip_de_cliente tcp 0 37 ip_del_servidor:1234 ip_del_cliente:41427 ESTABLISHED
En este caso, pongamos que la ip del cliente es 1.2.3.4. Si queremos cortar la conexion en estado ESTABLISHED que vemos en netstat, aplicaremos la siguiente regla de iptables
root@servidor:~# iptables -A INPUT -s 1.2.3.4 -m state --state ESTABLISHED,RELATED -j DROP
Cortar conexiones establecidas con tcpkill
tcpkill es una herramienta que viene dentro del paquete de debian/ubuntu dsniff
Con ella podremos matar conexiones de manera bastante selectiva, por ejemplo:
Para matar todas las conexiones establecidas a un puerto sin reiniciar el servicio
tcpkill -i eth0 port 12345
Para matar todas las conexiones establecidas desde o hacia una ip concreta
tcpkill -i eth0 host 1.2.3.4 tcpkill -i eth0 host fqdn.dominio.com
La sintaxis de tcpkill está basada en las expresiones propias de tcpdump, por ejemplo
Para matar todas las conexiones establecidas entre una ip de tu equipo y dos ips remotas concretas
tcpkill -i eth0 ip host ip_de_tu_equipo and host 1.2.3.4.5 or host 5.6.7.8
tcpkill realmente se pone a escuchar y dropea los paquetes, no es que termine las conexiones de una manera mágica, pero el efecto que conseguimos es el mismo. Además, usar tcpkill puede suponer un problema en la red en la que lo emplees si hay detectores de sniffers. Tenlo presente para no hacer saltar falsas alarmas.
Igual que indicaba en el primer método de cortar conexiones establecidas mediante iptables, recuerda poner una regla que prevenga futuras conexiones o en cuanto termines el comando el cliente puede volver a iniciar la conexión a tu servicio.