Protocolo 47 contra porta TCP 47: dois cabeçalhos, duas regras
Um número de protocolo e uma porta vivem em cabeçalhos diferentes, então uma regra não pode substituir a outra. O PPTP separa as duas coisas, e uma caixa de porta não consegue expressar GRE.
Redes de hotel e firewalls de conferência costumam mostrar uma caixa de permissão personalizada, e alguém digita 47 nela esperando que o PPTP funcione. A regra é criada, o túnel continua falhando e a próxima tentativa usa outro número. O erro está no próprio pacote: o IPv4 tem um campo de protocolo que nomeia o que vem depois do cabeçalho IP, enquanto TCP e UDP têm campos de porta que só existem quando você está dentro de um desses cabeçalhos. Não são duas grafias da mesma permissão.
O cabeçalho IPv4 nomeia o próximo protocolo
O campo de protocolo é um byte no cabeçalho IPv4 e contém um número que descreve a carga útil: 6 para TCP, 17 para UDP, 47 para GRE, 50 para ESP. Tudo o que filtra pacotes lê esse valor antes de olhar mais fundo, porque o cabeçalho mais interno só faz sentido depois que o tipo é conhecido. Mude uma porta mais adiante na conversa, e este campo não se moveu.
Uma regra escrita contra o protocolo 47 descreve, portanto, a camada IP. Nenhuma porta participa da decisão.
Portas existem dentro de TCP e UDP, em nenhum outro lugar
Portas são identificadores de dezesseis bits dentro dos cabeçalhos TCP e UDP, e a tarefa delas é separar conversas que compartilham um endereço. Um cabeçalho GRE carrega um valor de tipo de protocolo, muitas vezes um EtherType, mais chaves opcionais para multiplexação. Por isso a expressão porta 47 não nomeia nada com que um pacote GRE possa coincidir.
As interfaces de firewall diferem em quanto disso expõem. Algumas aceitam um número de protocolo, outras oferecem uma lista com nomes e poucas aceitam apenas TCP ou UDP com portas.
O PPTP usa as duas camadas ao mesmo tempo
O PPTP é o exemplo mais claro porque divide deliberadamente o trabalho entre as duas camadas. A conexão de controle é uma sessão TCP para a porta 1723, e o caminho de dados é GRE, protocolo 47, sem nenhuma porta envolvida em lugar algum. Um firewall que permite 1723 e nada mais deixa a negociação começar e depois descarta a carga útil. O túnel parece travar após a autenticação em vez de falhar ao conectar, e por isso o sintoma costuma ser relatado como problema de senha.
| Path | Outer protocol | Port |
|---|---|---|
| Control channel | TCP, protocol 6 | 1723 |
| Data channel | GRE, protocol 47 | None |
Leia as duas linhas separadamente ao escrever a regra, e verifique cada uma contra a sintaxe do fabricante. Uma linha precisa de uma porta, a outra precisa de um número de protocolo, e nenhuma entrada única cobre as duas.
Por que uma página de encaminhamento de portas não consegue expressar GRE
Um formulário de encaminhamento que só aceita TCP e UDP não consegue descrever GRE, qualquer que seja o nome do formulário. A tradução de endereços acrescenta uma segunda dificuldade, porque o GRE não tem portas e o tradutor precisa seguir o identificador de chamada. Alguns roteadores domésticos trazem um assistente que resolve isso; muitos não, e nenhuma entrada extra de permissão TCP criará esse comportamento.
Quando o requisito real é um túnel moderno, escolha um projeto que use TCP ou UDP de propósito em vez de esperar que um tradutor adivinhe corretamente.
A encapsulação decide o que o filtro vê
A encapsulação muda o pacote externo, e o pacote externo é o que uma regra faz coincidir. O ESP nativo é o protocolo 50, enquanto o trânsito por NAT envolve o ESP dentro de UDP 4500 para que sobreviva à tradução de endereços. Um filtro que permite UDP 4500 nunca vê o protocolo 50, e um filtro escrito para o protocolo 50 nunca coincide com a forma envolvida.
Pergunte em qual encapsulação o cliente e o gateway concordaram, e depois escreva a regra para essa forma externa e nada mais.
Escreva a regra para que alguém possa verificá-la
Expresse cada regra como família de endereços, protocolo externo, portas de transporte se houver, direção e ambas as extremidades. Um revisor pode comparar essa frase com uma captura de pacotes e chegar a um veredito. Uma instrução de abrir 47 não pode ser verificada por ninguém, e é assim que ela sobrevive por anos nos manuais de procedimentos.
Acrescente o teste que prova isso: conecte-se enquanto captura na interface externa, e confirme o protocolo externo e a porta que aparecem de fato no rastro.