Como detectar un túnel VPN activo desde o código en calquera plataforma
Existe o túnel, pasa esta destinación por el ou responde o extremo remoto? Son tres comprobacións distintas e tres sinais distintos.
«A VPN está activa?» son en realidade tres preguntas nunha soa frase. Cal delas necesita o seu código é a primeira decisión, e é a que a maioría das implementacións salta. Existe un túnel neste dispositivo, o tráfico cara a esta destinación sae a través del, ou o extremo remoto responde coa identidade que vostede espera. Escolla a propiedade, logo escolla o sinal que a mide e, por último, diga no rexistro cal mediu realmente.
Tres propiedades, tres sinais
Comprimidas a unha liña cada unha, as tres preguntas teñen tres respostas distintas. A táboa de abaixo é a decisión mesma, non un resumo dela.
| Property | Signal that answers it | What it still leaves open |
|---|---|---|
| Existence | The platform's own connection state: RAS on Windows, NetworkManager on D-Bus on Linux, scutil on macOS | Tunnels of a type the platform does not manage, which includes most third-party clients |
| Path | A route lookup for the one destination, or a scoped proxy or interface key that names the tunnel | Whether the far end is the peer you trust |
| Identity | An authenticated response from the far end, or a source-address policy applied on the server | Which local interface carried the packets |
Lea a última fila devagar. Un host privado que responde demostra que algo respondeu, non que a resposta chegase polo túnel, e non di nada sobre quen está ao outro lado. Se a propiedade que necesita é a ruta, mida a ruta.
Existencia: o estado propio da plataforma
Windows responde a isto para os perfís nativos mediante a API de Remote Access Service. RasEnumConnections enumera o que está conectado, RasGetConnectStatus informa do estado dunha entrada e RasGetLinkStatistics engade velocidade, contadores de bytes e antigüidade da conexión. Os límites son o punto: OpenVPN, WireGuard e os clientes de fabricantes nunca rexistran unha conexión RAS, así que un túnel san dese tipo mostra unha lista baleira e o código inxenuo informa del como caído.
Os escritorios Linux expoñen a mesma propiedade mediante NetworkManager sobre D-Bus, onde PropertiesChanged no obxecto de conexión VPN converte a comprobación nun evento e a propiedade State informa de cando a ligazón acada o estado conectado. Desde unha consola, nmcli connection show --active le a mesma información, que é o que vostede quere mentres depura. macOS garda esa lista no marco System Configuration, con scutil como a súa vista de liña de ordes. As tres describen unha conexión que xestiona a plataforma, e as tres calan ante un túnel que non xestiona.
Ruta: a onde vai realmente o paquete
A coincidencia de nomes é o atallo ao que todos recorren primeiro: enumere as interfaces, probe a cadea contra tun, tap, ppp ou ipsec e tome un acerto como proba. É unha heurística, e o conxunto de interfaces pode parecer o mesmo haxa ou non algo movéndose por el. As compilacións antigas de iOS respondían así e as posteriores deixaron de facelo, porque as interfaces visibles xa non distinguían os dous estados.
O que o substituíu alí é o dicionario de proxy do sistema. Mentres hai unha VPN conectada, a chamada de axustes de proxy devolve claves acoutadas ás interfaces relacionadas co túnel, e sen nada conectado o dicionario volve baleiro. É unha afirmación máis feble do que parece, porque rexistra a crenza do sistema de que existe un túnel, non que destinación o usa.
Android ten a súa propia versión da trampa: a difusión vpn.connectivity chega a receptores declarados no manifesto nalgunhas compilacións e a receptores rexistrados en tempo de execución noutras. Trátea como mellor esforzo e mantén unha sonda directa detrás.
Cando a destinación é o que importa, pregunte á táboa de enrutamento en lugar de á lista de adaptadores. As heurísticas de porta de enlace predeterminada rompen en máquinas con varias redes e en túneles que instalan a súa propia porta de enlace.
Identidade: sondar o extremo remoto
Un bucle que envía un eco ICMP ao extremo remoto cada poucos segundos é a comprobación máis barata deste tipo, e falla nunha dirección útil. Apúnteo a un enderezo que só exista dentro da rede privada, porque un público responde por calquera ligazón ascendente que funcione e non demostra nada. Onde se filtra ICMP, unha conexión TCP breve ao porto do servizo fai o mesmo traballo.
Unha comprobación do lado do servidor ten exactamente un sinal dispoñible: o enderezo de orixe da conexión. Manter o inventario de rangos é traballo de mantemento, e non pode separar un túnel de calquera outra rede que casualmente use o mesmo bloque.
A política grossa pode convivir con iso. A identidade non, así que autentique o cliente en lugar de confiar en de onde parecen vir os seus paquetes.
Rexistre a categoría, non o veredicto
Manteña as categorías de fallo separadas no rexistro: ningunha interface, interface presente pero destinación inalcanzable, destinación alcanzable pero autenticación rexeitada. Son tres propietarios distintos, e cada un abre unha investigación diferente.
Colapsalas nun só «VPN caída» envía o informe a un equipo que non pode arranxalo. A categoría é a saída útil; o veredicto é o que o fai incorrecto.