Estado da VPN no macOS a partir do terminal: scutil, rotas ou ping
O estado do serviço, a rota do kernel e um pedido real respondem a três perguntas diferentes. Escreva o script com base no identificador do serviço e verifique também a rota.
Em algum lugar de um script de implantação há uma verificação se o túnel está ativo antes de a cópia começar. Há três respostas disponíveis, e elas não significam a mesma coisa: o estado do serviço que o scutil relata, a rota que o kernel escolheu e se o outro lado realmente responde. Compará-las é a diferença entre uma verificação que prevê a cópia e uma que apenas decora o log.
Três respostas para a pergunta se a VPN está ativa
O estado do serviço é um fato do plano de controle. O macOS sabe que uma configuração está conectada porque o processo cliente disse isso. A rota é um fato do plano de dados: o kernel enviará este destino por essa interface. A alcançabilidade é um fato de ponta a ponta, e pode falhar por motivos que nenhuma das outras duas vê.
| Signal | Answers | Blind spot |
|---|---|---|
scutil --nc status | Is the service connected? | Third-party clients, wrong routes |
route -n get | Where would this go? | The peer may be down |
| A request to the far side | Does it work now? | Slow, and it changes state |
Uma verificação útil combina as duas primeiras e usa a terceira como confirmação de que as outras duas não mentiram. Qualquer uma sozinha é um palpite com carimbo de tempo.
Leia o identificador, não o nome de exibição
scutil --nc list
scutil --nc status "Office"
A listagem imprime uma linha por serviço, e cada linha traz um estado entre parênteses, seguido do identificador do serviço, do tipo e do nome de exibição. Escreva o script com base no identificador, porque o nome de exibição é o que alguém digitou nos Ajustes do Sistema e pode mudar sem aviso. O comando de estado imprime uma única palavra e, para alguns tipos de serviço, estatísticas depois dela; compare essa primeira palavra em vez de procurar o nome em toda a saída, que também aparece em outros lugares.
Iniciar um serviço pode gerar um pedido de autorização ou ser recusado de imediato quando o perfil é gerenciado. Essa recusa não é um defeito do túnel; é uma declaração de política sobre quem pode ativá-lo.
Um cliente de terceiros esconde-se da lista
Uma lista vazia não significa que não exista VPN. Configurações criadas nas próprias configurações de rede do sistema aparecem aqui; um cliente do fornecedor, um perfil de gerenciamento ou um aplicativo de terceiros pode manter um túnel ativo que este comando nunca vê. A ferramenta do próprio é a autoridade para o próprio serviço. Perguntar ao scutil sobre um cliente que nunca se registrou nele retorna nada, e nada não é a mesma resposta que desconectado.
Quando a lista está vazia mas o tráfego está claramente criptografado, procure a interface: um dispositivo utun ou ppp com um endereço na faixa esperada é evidência de que algo estabeleceu um túnel. Esse é um sinal mais fraco do que o estado do serviço, então combine-o com uma verificação de rota em vez de tratar a interface como prova de identidade. Vários clientes podem criar várias interfaces dessas, e apenas uma delas pertence ao túnel que você quis dizer.
Estado não é roteamento
Um serviço conectado diz que o túnel existe. Não diz que o seu destino o usa. Leia os endereços e depois pergunte ao kernel diretamente:
ifconfig | grep -A4 utun
netstat -rn -f inet
route -n get 10.40.0.20
Um cliente de túnel completo instala uma rota padrão pelo túnel; um cliente de túnel dividido instala prefixos privados específicos. Ambos relatam Connected, e um script que verifica apenas o estado vai correr alegremente pelo caminho errado. Parar um túnel não remove necessariamente rotas que outro cliente instalou, e essa é uma das maneiras de uma máquina ficar ao mesmo tempo com um serviço conectado e uma rota desatualizada. Olhe para o destino que lhe interessa, não para a tabela de rotas inteira.
Nomear é um problema separado
Outras máquinas não alcançam o Mac pelo nome enquanto o endereço funciona, e isso é relatado como falha de VPN. O nome local do host, o nome do host e o registro DNS são três coisas diferentes. scutil --get LocalHostName mostra o nome Bonjour; sudo scutil --set HostName mac-office define o nome que o sistema relata.
Nenhuma das configurações cria um registro na zona do escritório. Se outros hosts precisam resolver o nome via DNS, o dono da zona tem de adicioná-lo, ou o script deve usar o endereço. Definir um nome estável torna os anúncios consistentes; não faz o resolvedor responder.
Registre no script o identificador do serviço e a forma esperada da rota juntos, e verifique os dois antes da cópia. Um túnel ativo mas roteado para o lado errado falha exatamente como nenhum túnel, e a linha de log que diz Connected manda a próxima pessoa procurar no lugar errado.