Dois routers domésticos, nenhuma porta encaminhada e uma VPN que às vezes se liga mesmo assim. O UDP permite isso, porque uma firewall admitirá um pacote que consiga emparelhar com um fluxo que a máquina já iniciou. É um truque condicional, não uma funcionalidade, e as condições são fáceis de enunciar quando se sabe o que a firewall compara. São também a razão pela qual perfis idênticos se comportam de forma diferente em redes diferentes.

A comparação que uma firewall faz

Cada datagrama de saída cria uma entrada efémera: endereço de origem, porta de origem, endereço de destino, porta de destino. Tudo o que chega e corresponde à entrada é tratado como resposta e deixado passar. As regras de entrada não entram nisto.

Portanto a questão não é se a firewall deixa o par entrar. É se o pacote do par se parece com a resposta que a entrada espera. Mude um campo dessa tupla de quatro partes e o pacote torna-se um estranho. É por isso que uma configuração que funciona pode quebrar quando só o número da porta muda, e por isso a mesma porta pode funcionar num router e falhar no seguinte.

Fixe a porta de origem local e o mesmo número aparece nos dois lados da troca. É todo o mecanismo, e explica por que o truque é frágil e não misterioso.

Fixar uma porta em cada extremidade

A porta UDP predefinida do OpenVPN é 1194, e lport define a porta de origem a partir da qual envia. Fixe ambos os pares e a tupla de saída de cada um aponta para uma porta em que o outro escuta:

# peer A
lport 1194
remote 198.51.100.20 1194
# peer B
lport 1194
remote 203.0.113.10 1194

Isto só funciona enquanto nenhum router entre eles reescrever a porta de origem. Quando os pacotes aparecem numa captura mas não sobe nenhum túnel, a reescrita é o primeiro suspeito.

Onde a tupla deixa de corresponder

Um NAT que mapeia por destino dá a cada par uma porta externa diferente. O endereço que disseram ao seu par para usar não é o endereço que chega até ele, por isso o pacote de entrada não corresponde a nada e é descartado em silêncio.

A tradução de operadora, o NAT empilhado e a aleatorização de portas terminam todos da mesma forma. Tal como qualquer caixa intermédia que reescreve portas e deixa os endereços em paz.

Os transportes de fluxo estão pior. Um handshake TCP é seguido passo a passo, por isso uma VPN baseada em TCP não pode ser perfurada desta forma de maneira nenhuma e precisa de um ouvinte em algum ponto do caminho.

Normalmente um lado falha primeiro

Na prática as duas redes raramente se comportam da mesma forma. Um router pode dar um mapeamento previsível enquanto o outro dá portas por destino, e o resultado é uma configuração que funciona entre duas casas e falha a partir de uma rede móvel. Relatos que se contradizem descrevem normalmente dois pares de routers diferentes. Nenhum dos autores está errado, e nenhum dos resultados se generaliza.

Descubra que lado descartou o pacote antes de mexer nos perfis. Capturas nas duas pontas resolvem-no numa única tentativa: datagramas que saem de A e nunca chegam a B significam que o fluxo foi reescrito em trânsito, enquanto datagramas que chegam a B sem que volte qualquer resposta significam que a firewall não os aceitou como relacionados.

Dois pares com endereços IPv6 públicos contornam todo o problema. Sem tradução não há nada para emparelhar, por isso basta uma regra de firewall que nomeie os pares e o desenho deixa de depender do comportamento do router.

Quando parar de tentar

Um host com endereço público é a resposta fiável. Pode terminar o túnel para ambos os pares, ou simplesmente ajudá-los a descobrir o endereço externo atual um do outro, e ambas as disposições funcionam faça o que fizer o NAT. Uma camada sobreposta gerida oferece a mesma coordenação se a política o permitir.

Nenhuma destas soluções precisa de uma firewall desativada. Desligar a proteção para ganhar a ligação direta descarta a razão pela qual a tentativa direta era atrativa, e deixa a máquina aberta durante todo o teste.

Experimente primeiro a disposição direta e depois registe o que viu. O comportamento do NAT e a captura que o mostrou valem mais do que o par de portas que acabou por usar, porque a próxima rede será diferente. O manual do OpenVPN 2.6 documenta lport e as opções remote de que isto depende.

Artigos relacionados