Ignorar a VPN de casa com um systemd ExecCondition
Uma omissão deliberada e um comando de preparação avariado são desfechos diferentes. Defina os códigos de saída do auxiliar e depois teste a mudança entre redes.
A VPN da rede doméstica não tem nada a fazer quando o portátil já está nessa rede. O atalho tentador é um comando de preparação que termina com um código diferente de zero; isso faz falhar a unit e faz com que todos os painéis pareçam avariados. O systemd tem uma diretiva para exatamente este tipo de decisão, e separa uma omissão deliberada de uma falha real. Fazer isto bem consiste sobretudo em escrever o que significa cada código de saída.
Porque é que uma pré-condição falhada é a forma errada
O ExecStartPre trata uma saída diferente de zero como uma falha de arranque, o que está correto para um comando que prepara o serviço. Usá-lo como condição torna uma decisão de política indistinguível de uma dependência avariada. O ExecCondition existe para que uma unit possa recusar arrancar sem ser marcada como falhada.
Essa distinção conta às três da manhã, quando ninguém quer triar uma unit vermelha que se comportava como concebida. Uma unit falhada também esconde as falhas reais entre as intencionais.
Escreva primeiro o contrato dos códigos de saída
Escreva o contrato antes do script. A saída zero significa continuar, a saída um significa ignorar os comandos de arranque restantes, e a saída 255 significa que a própria condição não conseguiu executar-se. Os códigos entre dois e 254 normalmente também significam ignorar, o que é fácil de esquecer quando o auxiliar devolve um código de erro aleatório. O drop-in abaixo associa o auxiliar ao nome real da unit.
[Service]
ExecCondition=/usr/local/libexec/should-start-home-vpnVerifique a unit efetiva quanto a valores herdados de SuccessExitStatus ou stop-post antes de assumir a semântica predefinida. Depois teste deliberadamente cada um dos três desfechos.
Uma pista de rede não é prova de localização
Um endereço de router acessível ou um MAC conhecido podem sugerir a rede certa, e nenhum dos dois o prova. Outra rede pode reutilizar o mesmo endereço, os dados ARP podem estar desatualizados e os identificadores podem ser imitados. Trate a sonda como uma otimização coerente com a política, não como um resultado de autenticação.
Decida antecipadamente o que significa a incerteza. Arrancar a VPN quando não tem a certeza é seguro para um cliente que simplesmente não conseguiria ligar-se; ignorá-la quando não tem a certeza não é. Torne a sonda limitada e leia a interface ativa em vez de assumir a primeira da lista. Uma sonda que fica pendurada é pior do que uma que responde não, porque a unit espera por ela.
Registe essas suposições junto ao ficheiro da unit para que a próxima pessoa saiba o que o auxiliar acredita. Um comentário no topo do script é o local mais barato para as guardar.
Lide com a mudança entre redes
A condição é executada quando o serviço arranca e não é reavaliada depois. Uma unit ignorada continua ignorada depois de o portátil se mudar para um café, e um túnel em execução continua ativo depois de o portátil voltar a casa. Ligue o ciclo de vida da mudança de rede à decisão de arranque e paragem através de um mecanismo separado.
systemctl cat home-vpn.serviceTeste quatro casos: arranque em casa, arranque fora, uma sonda que não consegue executar-se e uma mudança entre redes enquanto a unit está ativa. Mantenha o motivo da omissão visível no registo para que uma decisão intencional nunca pareça uma falha de autenticação. A referência do serviço documenta a semântica de saída e a versão mínima.