Programar un cliente VPN: escolla a capa antes do contrasinal
A CLI do provedor, rasdial, unha intención de aplicación ou a automatización da interface fallan cada un de xeito distinto. Escolla a capa, manteña o segredo fóra de argv e agarde o estado, non os códigos de saída.
Os scripts arrincan clientes VPN na capa que escolleu o autor, e esa capa raramente é a que precisaba o traballo. A liña de ordes do provedor, o marcador do sistema operativo e unha intención de aplicación móbil volven todos en momentos distintos da vida da conexión. Tamén tratan o segredo de forma diferente, e esa diferenza decide se o contrasinal é visible para cada usuario da máquina. Escolla a capa antes de escribir a primeira liña do script.
Capa 1: a liña de ordes do provedor
A maioría dos clientes de escritorio inclúen unha liña de ordes que acepta un nome de perfil e, con demasiada frecuencia, un contrasinal. O antigo cliente de Cisco aceptaba un verbo connect con argumentos de usuario e contrasinal; macOS expón o servizo integrado mediante networksetup; NetworkManager responde a nmcli. Estas chamadas volven cando remata a orde, o que non é o mesmo momento en que o túnel pasa a ser utilizábel. Lea a documentación do propio provedor para a versión que despregue, porque estas interfaces cambian e algunhas elimínanse por completo.
nmcli connection up "Work VPN"
networksetup -connectpppoeservice "Work VPN"
A vantaxe é que o provedor coñece o seu propio almacén de perfís, así que a chamada usa a mesma configuración que usaría a GUI. A desvantaxe é que cada provedor inventa os seus propios verbos, e un script escrito para un cliente non se traslada a outro. Considere esta capa como o camiño máis curto cando o cliente é fixo e a versión está fixada.
Capa 2: o servizo propio do sistema operativo
En Windows o marcador forma parte do sistema operativo e traballa contra unha entrada da libreta de teléfonos en lugar do almacén de perfís do provedor. Iso faino máis portátil entre clientes e máis doado de automatizar desde unha conta de servizo. Tamén significa que a conexión pode existir nun sitio e non no outro, o que confunde a quen mira na lista equivocada.
rasdial "Work VPN" user pass
Get-VpnConnection -Name "Work VPN" | Select-Object ConnectionStatus
Use a superficie de PowerShell cando necesite crear ou eliminar a entrada en lugar de marcala. As capas WMI e cmdlet expoñen os mesmos obxectos con nomes distintos, e a eliminación é unha operación separada da desconexión. Un script que só marca deixará entradas obsoletas despois dunha migración. Comprobe en que almacén escribe a súa automatización antes de prometer que a limpeza ocorre.
Remove-VpnConnection -Name "Old VPN" -Force
Get-VpnConnection
En macOS o equivalente é a lista de servizos de rede, onde un servizo existente se conecta polo nome en lugar de crearse sobre a marcha.
As credenciais fíltranse en cada capa, así que escolla a canle
Todo o que pasa pola liña de ordes aparece na táboa de procesos para cada usuario local, e normalmente tamén sobrevive no historial da shell. A alternativa compatible de OpenVPN é ler o segredo desde un ficheiro con --askpass, e o ficheiro en si necesita permisos que coincidan coa confianza que deposita nel. Unha tubaxe con nome evita escribir o segredo no disco pero permite que calquera proceso capaz de abrila escriba alí. En Windows, garde o segredo no xestor de credenciais, ou nun ficheiro que só a conta de servizo poida ler, e nunca como literal nun ficheiro batch.
openvpn --config /etc/openvpn/work.conf --askpass /etc/openvpn/work.secret --auth-nocache --daemon
ls -l /etc/openvpn/work.secret
A mesma regra aplícase aos tokens e aos códigos dun só uso: se a automatización os necesita, a automatización necesita unha canle que non sexa un argumento de liña de ordes. Rote o segredo cando cambie o mecanismo, porque o valor antigo estivo nun rexistro nalgún sitio. Un script que funciona e filtra non é un script que funcione.
Agarde o estado e despois supervise un só propietario
Cada unha destas chamadas volve antes de que o túnel estea listo, así que sondee o estado que expón o cliente ou probe un destino dentro del cun tempo de espera. Copiar ficheiros ou abrir unha conexión de base de datos xusto despois da chamada de conexión é unha carreira, e falla de xeito intermitente dun modo que parece un fallo de rede.
ip link show tun0
nmcli -t -f GENERAL.STATE connection show "Work VPN"
curl -sS --max-time 5 https://app.internal.example/health -o /dev/null
A desconexión ten o mesmo problema ao revés: o proceso pode rematar antes de que as rutas desaparecesen. Use os hooks do cliente onde existan, como os scripts up e down de OpenVPN ou o ExecStartPost dunha unidade systemd, porque se executan no punto que de verdade lle importa. Os hooks executanse cos privilexios de quen os invocou, así que un hook que reinicia a rede necesita unha regra explícita en lugar dunha suposición. Manteña exactamente un propietario durante a vida da conexión.
Cando dous supervisores arrincan e paran o mesmo perfil, o resultado é un bucle de reconexión que se le como unha caída do provedor. O runbook remata cando a capa está documentada, o segredo ten unha canle que non é argv, a condición de espera é unha comprobación de estado con tempo de espera, e un só proceso posúe o ciclo de vida.