Coloque um comando de reconexão no hook de suspensão e o problema parece resolvido. Só fica resolvido se o hook rodar depois que a rede existe, com uma identidade que o cliente reconhece, por um caminho que o cliente realmente implementa. A maioria das falhas após a retomada é uma dessas três, e nenhuma delas aparece como erro no próprio hook. O hook retorna sucesso de qualquer forma.

Um script que termina com zero não disse nada sobre se um túnel voltou.

O hook roda, e depois?

#!/bin/sh
case "$1" in
  pre)
    vpn-client disconnect
    ;;
  post)
    vpn-client connect
    ;;
esac

Cada evento chama o hook duas vezes, antes e depois da transição, passando a fase e o nome do evento. Ele roda como root com um ambiente mínimo, então são necessários caminhos absolutos e nenhuma variável de sessão de desktop deve ser esperada. O retorno rápido das duas chamadas diz apenas que o script rodou. Se o perfil subiu depois é uma observação separada e precisa da própria evidência no log.

Trate o argumento de fase como parte do projeto. Uma tentativa de reconexão na fase pre acontece enquanto a máquina está prestes a perder tudo, e não pode dar certo.

Root, ambiente mínimo, usuário errado

Se o cliente guarda o token de login por usuário, rodar o hook como root o deixa sem nada a apresentar. Verifique o estado sob a identidade que o hook realmente usa, não a que você testou em um terminal de desktop. Algumas compilações também deixam um daemon segurando a interface após uma desconexão, então a reconexão cai em um estado obsoleto, e limpar o processo antes o restaura ao custo de um desligamento sujo. Nenhum dos dois comportamentos aparece se você testar apenas o caminho feliz.

Escreva o hook com caminhos absolutos, mantenha-o como propriedade de root e executável, e registre o que ele fez. Sem esse log a próxima investigação começa do zero.

A conexão automática não é o caminho da VPN

O NetworkManager oferece dois mecanismos de ativação: uma flag de conexão automática no perfil e conexões secundárias que iniciam quando um perfil primário é ativado. Tipos de dispositivo nativos implementam o primeiro; plugins de VPN historicamente implementaram apenas o segundo, então marcar a conexão automática em um perfil OpenVPN pode não ter efeito nenhum. Inspecione as duas propriedades e depois anexe a VPN como secundária do perfil Wi-Fi ou Ethernet.

[Unit]
PartOf=NetworkManager.service
Requires=NetworkManager-wait-online.service
After=NetworkManager-wait-online.service

Uma interface WireGuard gerenciada por uma unidade do systemd precisa desse arquivo adicional em vez de um hook, ordenada depois que a rede estiver online.

Espere a rede, com um teto

timer=1
while ! ping -c1 -n -w1 203.0.113.1 >/dev/null; do
  sleep 1; timer=$((timer+1))
  [ $timer -ge 300 ] && exit 0
done
nmcli connection up "work-vpn"

Ao retomar, o túnel pode ser solicitado enquanto o Wi-Fi ainda reassocia, o que torna qualquer espera fixa um palpite. Espere um endereço alcançável, depois suba o perfil, e limite a espera para que um hook não possa manter o caminho de retomada aberto indefinidamente. Prefira o nome do perfil a um índice numérico, e se o perfil correto variar conforme a rede, faça o túnel saudável registrar sua escolha em um arquivo de antemão.

Proteja-se também de tempestades de reinício, contando tentativas e parando. Um watchdog que reage a cada sondagem falha transforma uma queda em um laço.

Suspenda uma vez e depois leia o journal para ver a saída do próprio hook. Esse é o único teste que prova a ordenação.

Artigos relacionados