Usar duas VPN não é um único pedido. Pode significar alcançar duas organizações uma depois da outra, manter aplicativos de trabalho e pessoais separados, ou executar um túnel dentro de outro. O Android trata esses três casos de formas completamente diferentes, e o número de aplicativos de VPN instalados no celular não é a arquitetura. A pergunta que os separa é simples: dois caminhos precisam existir no mesmo momento para o mesmo aplicativo?

Três disposições, uma pergunta

Se a resposta é não, porque as duas redes são usadas em momentos diferentes, você quer uma troca deliberada. Se a resposta é não porque os próprios aplicativos são separados, você quer separação de perfis, em que cada aplicativo fica no contexto que possui o seu túnel. Se a resposta é sim, e um caminho precisa carregar fisicamente o outro, você quer uma cadeia, e essa é a única das três em que a ordem faz parte do desenho.

Todo o resto decorre dessa escolha. A troca tem uma janela de transição, a separação tem uma fronteira de política, e uma cadeia tem um custo de sobrecarga e um custo de dependência. Escolher a errada não falha de forma limpa; produz um celular que parece conectado e um aplicativo que não alcança nada.

Trocar dentro de um único contexto de usuário

O Android permite um único serviço de VPN ativo por usuário. Iniciar um segundo aplicativo de VPN no mesmo contexto substitui o primeiro ou é recusado de imediato; ele nunca compõe os dois conjuntos de rotas e com certeza não empilha a criptografia deles. Dentro de um usuário, dois túneis são uma sequência, não uma soma.

Isso é viável quando o acesso é realmente sequencial. Dê nomes aos perfis para que o ativo seja óbvio, termine qualquer coisa sensível antes de trocar e espere uma janela curta em que nenhum dos dois caminhos esteja plenamente estabelecido. Fechar uma aba do navegador não é o mesmo que encerrar uma sessão: a aba pode manter o estado da sua conta e simplesmente enviar o próximo pedido pela rede recém-escolhida, e é exatamente esse vazamento que as pessoas percebem depois.

O que a troca não pode dar é uma máquina que esteja nas duas redes ao mesmo tempo. Se um aplicativo precisa de um endereço privado de cada lado, nenhuma disciplina do cliente vai produzi-lo.

Separar por perfil

Um perfil de trabalho gerenciado é um usuário separado com os próprios aplicativos, o próprio armazenamento de chaves e a própria política de rede. Um cliente de e-mail de trabalho pode usar o túnel da organização enquanto um navegador pessoal usa um pessoal, e os dois podem estar conectados ao mesmo tempo porque não estão no mesmo contexto disputando a vaga.

A separação também é o limite. O navegador pessoal não toma emprestado o túnel de trabalho, não vê os sufixos DNS do trabalho e não chega à rede do trabalho só porque os dois serviços aparecem como conectados. Quando alguém relata que um link não abre, verifique qual cópia do aplicativo o tratou e qual perfil possui aquela conta antes de tocar em qualquer uma das duas VPN.

Trate a fronteira como fixa. Criar um segundo perfil ou remover um perfil de trabalho para contornar uma decisão de roteamento do empregador destrói justamente a separação que fazia a disposição funcionar, e num dispositivo gerenciado isso costuma ser uma violação de política e não um ajuste de configuração.

Uma cadeia, em que a ordem é o desenho

Uma cadeia é a disposição que as pessoas costumam querer dizer quando dizem as duas ao mesmo tempo: o túnel do celular viaja dentro do túnel do roteador. Pode funcionar, e as restrições são específicas. O provedor externo precisa permitir um caminho funcional até o endpoint de VPN do celular, o que, para protocolos baseados em UDP, significa que o serviço externo não pode bloquear nem limitar esse tráfego.

Entenda quem vê o quê. O provedor externo vê uma conexão em direção ao endpoint interno. O provedor interno recebe o tráfego do celular pela saída externa e o encaminha adiante. O destino final normalmente vê a saída do serviço interno, e nenhum provedor ao longo da cadeia é cego; as contas dos aplicativos ainda identificam o usuário independentemente do caminho.

Espere custos práticos. Cada camada acrescenta encapsulamento, então a MTU efetiva cai e um valor que era bom para um túnel agora fragmenta ou trava até que a MTU do túnel interno seja definida de forma conservadora. Duas camadas também significam duas dependências de falha e dois conjuntos de mensagens de manutenção, e um túnel interno baseado em TCP sobre um enlace externo com perdas pode travar de maneiras que parecem um servidor morto.

O mais importante: uma cadeia não funde duas redes privadas. As rotas, os prefixos sobrepostos, a resolução DNS e as regras de acesso continuam sendo decisões separadas, e um roteador que carrega uma VPN enquanto um celular carrega outra não concede ao celular os dois espaços de endereços.

Verifique o desenho antes de depurá-lo

Escreva a disposição em uma frase e teste-a contra o aplicativo que falhou. O acesso sequencial deveria mostrar um túnel por vez; a separação de perfis deveria mostrar cada aplicativo no seu próprio usuário; uma cadeia deveria mostrar o túnel interno sendo estabelecido sobre uma interface externa e não sobre a física.

adb shell ip -br addr
adb shell ip route get 10.20.0.8
adb shell dumpsys connectivity | grep -i vpn

Se a consulta de rota nomeia a interface física enquanto um aplicativo espera o túnel, o desenho e o contexto do aplicativo não concordam, e nenhum aplicativo de VPN adicional vai reconciliá-los. A documentação sobre perfis gerenciados cobre as regras de separação se você precisar do detalhe de política e não do de roteamento.

Artigos relacionados