Expulsar a un cliente OpenVPN: ¿kill, deny o revocar el certificado?
Tres acciones de OpenVPN eliminan a un cliente, pero cada una termina algo distinto: una sesión activa, un intento de inicio de sesión o el derecho a reconectar. Elige por identidad.
Tienes un common name y una dirección en tus notas, y tres comandos que parecen todos eliminar a un cliente. Solo uno hace lo que quieres, y la elección depende de si necesitas terminar la sesión que se ejecuta ahora, rechazar el próximo inicio de sesión o quitar el derecho a conectarse del todo. Lee la identidad que realmente tienes antes de tocar nada, porque un pool de OpenVPN entrega la misma dirección de túnel a otra sesión más adelante.
Qué identidad tienes en realidad
Un archivo de estado de versión 3 es el punto de partida habitual. La sección CLIENT_LIST lleva el common name, la dirección real, los contadores de bytes y el tiempo de conexión; la sección ROUTING TABLE asigna una dirección virtual a un common name con una marca de tiempo de última referencia. El common name es la identidad estable. La dirección virtual es una asignación, y la dirección real detrás de un NAT puede cambiar entre sesiones sin que cambie nada en el servidor.
La interfaz de gestión expone una vista similar mediante su comando status y añade un ID de cliente por sesión. Ese ID es lo que espera client-kill, y no es la dirección del túnel. Si necesitas saber qué common name recibió qué dirección en el momento de la conexión, el entorno de un script client-connect tiene ambos, junto con la dirección exterior de confianza, pero ese script se ejecuta como el usuario de OpenVPN y necesita una ruta de registro escribible.
| What you hold | Where it came from | What it can act on |
|---|---|---|
| Common name | CLIENT_LIST, or the auth hook | kill, and credential revocation |
| Client ID | status on the management socket | client-kill, that one session |
| Tunnel address | ROUTING TABLE, client-connect environment | Nothing durable, the address is recycled |
Matar ahora, denegar al iniciar sesión, revocar para siempre
Ambos comandos de eliminación de la interfaz de gestión son acciones de sesión. kill toma un common name o una dirección real y un puerto; client-kill toma el ID de cliente y termina esa instancia de inmediato. Ninguno es un bloqueo: un cliente expulsado con un certificado y una contraseña válidos vuelve a conectarse en segundos, lo cual está bien cuando reciclas un peer de prueba y es inútil cuando han robado un portátil.
client-deny es otro tipo de decisión. Normalmente se emite desde un hook de autenticación o de client-connect y rechaza la sesión con un motivo, así que encaja en una política que deniega un inicio de sesión en lugar de una que interrumpe una conexión. La documentación también advierte de que una denegación emitida durante una renegociación TLS invalida la clave renegociada mientras la sesión existente puede seguir hasta que se cierre la ventana de transición. Si el requisito es que el cliente ya no esté, la respuesta documentada es client-kill.
La eliminación duradera está por debajo de todo esto. Revoca el certificado y asegúrate de que crl-verify apunta a una lista que el servidor recarga de verdad, desactiva el archivo de configuración específico del cliente en el directorio ccd, o desactiva la cuenta en el backend que consulte el hook de autenticación. Una revocación tampoco es instantánea: con los ajustes predeterminados de reneg-sec, una sesión establecida puede seguir hasta que renegocie, así que la acción de sesión y la acción de credenciales son complementarias, no alternativas.
¿Está libre el socket de gestión?
La interfaz de gestión atiende a un cliente a la vez. Si una GUI o un demonio de monitorización ya tiene la conexión, tu script no puede adjuntarse a su lado, y según el cliente puedes expulsar al existente en lugar de fallar limpiamente. Su contraseña viaja en texto claro por ese socket, así que pertenece a una dirección local o a un socket unix, nunca a una interfaz pública.
Cuando no puedes tomar el socket, sigues teniendo opciones, y todas son más lentas. Suelta primero la sesión de la GUI si la controlas, o acepta la ruta de la capa de credenciales y espera la siguiente renegociación. Lo que no deberías hacer es reiniciar el servicio para deshacerte de un cliente, porque eso termina también con todas las demás sesiones y destruye la evidencia del archivo de estado de esta.
La secuencia que ejecuto en un servidor en vivo
Adjúntate, lee el estado actual, actúa sobre el ID que acabas de leer y vuelve a leerlo. Los valores copiados de un documento son la forma más habitual de matar a la persona equivocada.
status # note the client ID and common name
client-kill 3 # end that session now
kill Test-Client # alternative: by common name
status # confirm the session is goneEl nombre y el número de arriba son marcadores de posición, y los ID se reutilizan después de que otros clientes se desconecten. Confirma que la fila está ausente antes de anotar nada como hecho, y comprueba que el recuento de clientes conectados se movió en uno y no en varios.
Confirma que se quedó fuera
Anota el common name, la dirección del túnel, la dirección exterior y el minuto de la eliminación. Si el mismo common name vuelve a aparecer un minuto después, la acción de sesión funcionó y la capa de credenciales no, lo que es una reparación completamente distinta de la de un comando que nunca surtió efecto.
Después prueba desde el lado del cliente. Un certificado revocado debería fallar el siguiente handshake; si aún se conecta, la CRL no se está leyendo en absoluto, y ese es el hallazgo que merece la pena informar. Elige la acción según lo que necesites terminar, confirma con un segundo status y arregla la capa de credenciales cuando la respuesta tenga que durar más que la sesión.