Um contêiner de aplicação que compartilha o espaço de nomes de rede de um contêiner VPN não tem interface própria, por isso é fácil supor que não pode enviar nada quando o túnel falha. Essa suposição está errada no modo de falha que importa. Se o processo VPN morre enquanto o espaço de nomes sobrevive, o aplicativo mantém seus sockets e o espaço de nomes mantém suas rotas, e o tráfego continua pelo caminho que ainda está instalado. Um kill switch de verdade é uma política de filtragem explícita mais testes do ciclo de vida do runtime, não uma dependência de inicialização.

Por que compartilhar o espaço de nomes não é um kill switch

Compartilhar um espaço de nomes significa que o aplicativo usa as interfaces, os endereços e a tabela de rotas do contêiner VPN. Isso remove o caminho independente do aplicativo para a rede enquanto o espaço de nomes compartilhado estiver intacto, e não diz nada sobre o que esse espaço de nomes fará quando o túnel desaparecer.

As condições de dependência do Compose podem adiar a inicialização de um aplicativo até que uma dependência esteja saudável. Isso cobre um único instante e nenhuma falha posterior, portanto é uma ferramenta de ordenação de inicialização e não um firewall de saída contínuo.

O que realmente acontece quando o contêiner sai

Distinga três eventos. O processo VPN dentro do contêiner pode morrer enquanto o contêiner continua em execução. O contêiner pode parar ou ser removido, o que destrói o espaço de nomes. O contêiner pode ser recriado, o que constrói um novo espaço de nomes e novas regras.

No primeiro caso o espaço de nomes persiste, a rota padrão pode continuar apontando para a interface física, e o aplicativo continua enviando diretamente. No segundo caso o aplicativo dependente geralmente perde a conectividade por completo, porque seu espaço de nomes desapareceu. No terceiro caso o aplicativo pode se reconectar a um espaço de nomes novo antes que o túnel esteja pronto. Cada caso exige um teste diferente, e um projeto que cobre apenas a desconexão ordeira cobre o menos interessante.

Construa uma política de saída explícita

Escreva a política dentro do espaço de nomes compartilhado para que se aplique aos pacotes do aplicativo. A forma é um descarte padrão com exceções estreitas: loopback, a interface do túnel e o endereço e a porta específicos do endpoint que o transporte do túnel precisa.

A exceção do endpoint precisa estar no lugar antes de o túnel subir, senão o cliente VPN não consegue alcançar seu servidor. Por isso o conjunto de regras permite explicitamente o transporte externo em vez de permitir a interface física em geral. Adicione também regras IPv6 se o espaço de nomes tiver conectividade IPv6, porque uma política apenas IPv4 deixa a outra família aberta.

O DNS também faz parte da política. Se o aplicativo resolve nomes por meio de um resolvedor acessível apenas dentro do túnel, a regra de descarte vai quebrar a resolução quando o túnel estiver fora, o que é o comportamento correto para um kill switch. Decida deliberadamente se é isso que você quer.

Teste o ciclo de vida, não apenas a desconexão

Envie uma requisição nova e inofensiva enquanto o túnel está saudável, depois mate o processo VPN e envie outra. Repita após uma parada do contêiner, após um reinício e após a recriação. Uma requisição nova importa porque uma conexão existente pode sobreviver a uma mudança de regras que bloqueia as novas.

Não confie em uma verificação de integridade nem em uma consulta de IP de saída como o mecanismo de bloqueio. Uma verificação observa o estado e o relata; uma política controla o tráfego. As duas pertencem à mesma implantação, e não são substitutas.

Registre as regras para que o teste sobreviva a uma atualização

Escreva o resultado esperado de cada caso de falha na documentação de implantação, junto com as regras que o implementam. Esse registro permite executar o mesmo teste após uma atualização de imagem ou do runtime, quando o comportamento do espaço de nomes ou as rotas padrão podem mudar sem que ninguém edite o arquivo Compose.

Mantenha o caminho externo necessário do endpoint VPN separado da saída de aplicativo sem restrições, e mantenha o DNS e o IPv6 dentro da cobertura pretendida. Se a política permite toda a interface física por conveniência, o kill switch sumiu. A documentação de redes do Docker descreve o arranjo de espaço de nomes compartilhado sobre o qual a política é construída, e é a referência a consultar quando o comportamento do runtime está em dúvida.

Artigos relacionados