Expulsar un cliente OpenVPN: matar, denegar ou revogar un certificado?
Tres accións de OpenVPN eliminan un cliente, pero cada unha remata algo distinto: unha sesión activa, un intento de inicio de sesión ou o dereito a reconectar. Escolle por identidade.
Tes un common name e un enderezo nas túas notas, e tres comandos que parecen todos eliminar un cliente. Só un fai o que queres, e a escolla depende de se necesitas rematar a sesión que se executa agora, rexeitar o próximo inicio de sesión ou quitar o dereito a conectarse de todo. Le a identidade que realmente tes antes de tocar nada, porque un pool de OpenVPN entrega o mesmo enderezo de túnel a outra sesión máis adiante.
Que identidade tes en realidade
Un ficheiro de estado de versión 3 é o punto de partida habitual. A sección CLIENT_LIST leva o common name, o enderezo real, os contadores de bytes e o tempo de conexión; a sección ROUTING TABLE asigna un enderezo virtual a un common name cunha marca de tempo de última referencia. O common name é a identidade estable. O enderezo virtual é unha asignación, e o enderezo real detrás dun NAT pode cambiar entre sesións sen que cambie nada no servidor.
A interface de xestión expón unha vista semellante mediante o seu comando status e engade un ID de cliente por sesión. Ese ID é o que espera client-kill, e non é o enderezo do túnel. Se necesitas saber que common name recibiu que enderezo no momento da conexión, a contorna dun script client-connect ten ambos, xunto co enderezo exterior de confianza, pero ese script execútase como o usuario de OpenVPN e necesita unha ruta de rexistro 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 agora, denegar ao iniciar sesión, revogar para sempre
Ambos os comandos de eliminación da interface de xestión son accións de sesión. kill toma un common name ou un enderezo real e un porto; client-kill toma o ID de cliente e remata esa instancia de inmediato. Ningún é un bloqueo: un cliente expulsado cun certificado e un contrasinal válidos volve conectarse en segundos, o cal está ben cando reciclas un peer de proba e é inútil cando roubaron un portátil.
client-deny é outro tipo de decisión. Normalmente emítese desde un hook de autenticación ou de client-connect e rexeita a sesión cun motivo, así que encaixa nunha política que denega un inicio de sesión en lugar de nunha que interrompe unha conexión. A documentación tamén advirte de que unha denegación emitida durante unha renegociación TLS invalida a clave renegociada mentres a sesión existente pode continuar ata que se peche a xanela de transición. Se o requisito é que o cliente xa non estea, a resposta documentada é client-kill.
A eliminación duradeira está por debaixo de todo isto. Revoga o certificado e asegúrate de que crl-verify apunta a unha lista que o servidor recarga de verdade, desactiva o ficheiro de configuración específico do cliente no directorio ccd, ou desactiva a conta no backend que consulte o hook de autenticación. Unha revogación tampouco é instantánea: coa configuración predeterminada de reneg-sec, unha sesión establecida pode continuar ata que renegocie, así que a acción de sesión e a acción de credenciais son complementarias, non alternativas.
Está libre o socket de xestión?
A interface de xestión atende un cliente á vez. Se unha GUI ou un demo de monitorización xa ten a conexión, o teu script non pode adxuntarse ao seu lado, e segundo o cliente podes expulsar o existente en lugar de fallar limpiamente. O seu contrasinal viaxa en texto claro por ese socket, así que pertence a un enderezo local ou a un socket unix, nunca a unha interface pública.
Cando non podes tomar o socket, aínda tes opcións, e todas son máis lentas. Solta primeiro a sesión da GUI se a controlas, ou acepta a ruta da capa de credenciais e espera a seguinte renegociación. O que non deberías facer é reiniciar o servizo para desfacerse dun cliente, porque iso remata tamén con todas as demais sesións e destrúe a evidencia do ficheiro de estado desta.
A secuencia que executo nun servidor en vivo
Adxúntate, le o estado actual, actúa sobre o ID que acabas de ler e volve lelo. Os valores copiados dun documento son a forma máis habitual de matar a persoa 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 goneO nome e o número de arriba son marcadores de posición, e os ID reutilízanse despois de que outros clientes se desconecten. Confirma que a fila está ausente antes de anotar nada como feito, e comproba que o reconto de clientes conectados se moveu nun e non en varios.
Confirma que quedou fóra
Anota o common name, o enderezo do túnel, o enderezo exterior e o minuto da eliminación. Se o mesmo common name volve aparecer un minuto despois, a acción de sesión funcionou e a capa de credenciais non, o que é unha reparación completamente distinta da dun comando que nunca chegou a ter efecto.
Despois proba desde o lado do cliente. Un certificado revogado debería fallar o seguinte handshake; se aínda se conecta, a CRL non se está lendo en absoluto, e ese é o achado que paga a pena informar. Escolle a acción segundo o que necesites rematar, confirma cun segundo status e arranxa a capa de credenciais cando a resposta teña que durar máis que a sesión.