Inicie a VPN dentro do seu próprio espaço de nomes, execute lá uma aplicação, e o tráfego continua a sair pela rota do host. Nada está partido: o espaço de nomes governa apenas os processos que entram nele, e a fuga veio de um que nunca entrou. Interfaces, endereços, rotas, regras de firewall e sockets são o que o espaço de nomes possui. Os ficheiros, as contas e os serviços já em execução não são, e é daí que vêm a maioria das surpresas.

O que o espaço de nomes possui, e onde nasce o socket

Mova uma interface para um espaço de nomes e o host perde-a; construa um túnel lá dentro e o host não o consegue ver. É este o mecanismo de uma VPN limitada a um espaço de nomes: o dispositivo e as rotas que apontam para ele vivem num contexto a que só chegam os processos escolhidos. O host mantém a sua rota predefinida, por isso tudo o que está fora fica intacto.

No WireGuard, o contexto de criação conta tanto como a localização atual: o socket UDP é ligado ao espaço de nomes onde a interface foi criada, mesmo depois de o dispositivo se mudar para outro sítio. De que tabela de encaminhamento dependem os pacotes cifrados depende desse local de nascimento. Quando o socket fica num contexto sem rota para o par, a interface consulta e o aperto de mão nunca sai. Verifique o local de nascimento e depois a localização atual.

O que um espaço de nomes não isola

Nada aqui separa sistemas de ficheiros, contas ou segredos, e nenhuma dessas fronteiras aparece porque criou um espaço de nomes. A configuração do resolvedor é um ficheiro, por isso um processo lá dentro ainda pode ler uma definição que aponta para o resolvedor do host e enviar a sua consulta pela rota que isso implica. Uma aplicação que entrega o pedido a um intermediário ou serviço do sistema já em execução envolve um processo num contexto completamente diferente. Ambos são pedidos a que a fronteira nunca se destinou a responder.

A solução é um ficheiro por espaço de nomes em /etc/netns/<name>/resolv.conf, ou uma bind mount de um ficheiro preparado, apontada a um resolvedor acessível de dentro. Editar /etc/resolv.conf no host não muda nada do que o espaço de nomes vê.

A colocação dos processos é o controlo

O isolamento que obtém é exatamente o isolamento dos processos que inicia lá dentro. Uma shell iniciada pelo assistente exec do espaço de nomes, e tudo o que gera, fica dentro; uma aplicação de ambiente de trabalho lançada a partir da sessão do host não. Crie o contexto, mova o dispositivo e depois prove os dois lados:

ip netns add vpn1
ip link set wg0 netns vpn1
ip netns exec vpn1 wg show
wg show

Leia o primeiro wg show de dentro do espaço de nomes e o segundo do host, e espere que só um deles liste o par. Se ambos o fizerem, o dispositivo nunca se moveu; se nenhum, foi para outro sítio. Quando o lançador é um gestor de serviços, é o ficheiro de unidade que se edita, não o atalho do ambiente de trabalho. Uma unidade sem a definição de espaço de nomes inicia o daemon no contexto do host e desfaz o desenho em silêncio.

Teste a partir do contexto da aplicação

Execute a verificação com o mesmo binário e o mesmo utilizador que a aplicação usa, dentro do espaço de nomes. Inclua DNS e as duas famílias de endereços, porque uma rota IPv6 que nunca considerou é uma saída comum. Um teste a partir da sua própria shell só prova que a sua shell está isolada.

Depois execute a verificação idêntica no host e confirme que as respostas diferem: endereço do túnel e saída prevista dentro, rota do host e saída do escritório fora, e o resolvedor por nome. Nomeie os espaços de nomes pela instalação e não pelo protocolo, para que um script de limpeza não confunda dois deles.

Reencaminhamento, política de falha e limpeza

Para uma gateway, ative o reencaminhamento deliberadamente e decida o que deve acontecer quando o túnel cair. Um espaço de nomes não bloqueia as rotas que instala lá dentro, por isso será usada uma rota de recurso para o host se criar uma. É uma decisão de política, e devia ser escrita antes de uma falha a pôr à prova.

Registe os nomes dos espaços de nomes, as interfaces e quem é o dono da configuração, para que a limpeza remova apenas o que a instalação criou. Repor a rede do host durante um retrocesso transforma uma limpeza numa falha. A página network_namespaces(7) é curta e vale a pena ser lida antes de desenhar esse caminho.

Artigos relacionados