Protokoll 47 mot TCP-port 47: två huvuden, två regler
Ett protokollnummer och en port bor i olika huvuden, så en regel kan inte ersätta den andra. PPTP delar de två, och en portruta kan inte uttrycka GRE.
Hotellnätverk och konferensbrandväggar visar ofta en egen tillåten-ruta, och någon skriver 47 i den och förväntar sig att PPTP ska fungera. Regeln skapas, tunneln misslyckas ändå, och nästa försök använder ett annat nummer. Det som gick fel sitter i själva paketet: IPv4 har ett protokollfält som namnger vad som följer efter IP-huvudet, medan TCP och UDP har portfält som bara finns när du är inne i ett av dessa huvuden. De är inte två stavningar av samma tillstånd.
IPv4-huvudet namnger nästa protokoll
Protokollfältet är en byte i IPv4-huvudet, och det håller ett nummer som beskriver nyttolasten: 6 för TCP, 17 för UDP, 47 för GRE, 50 för ESP. Allt som filtrerar paket läser det värdet innan det tittar djupare, eftersom det djupare huvudet först får betydelse när typen är känd. Byt en port senare i samtalet, och detta fält har inte flyttat sig.
En regel skriven mot protokoll 47 beskriver alltså IP-lagret. Ingen port deltar i beslutet.
Portar finns inne i TCP och UDP, ingen annanstans
Portar är sexton bit långa identifierare inne i TCP- och UDP-huvuden, och deras uppgift är att skilja samtal som delar en adress. Ett GRE-huvud bär ett protokolltypvärde, ofta en EtherType, plus valfria nycklar för multiplexning. Uttrycket port 47 namnger därför ingenting som ett GRE-paket kan matcha.
Brandväggsgränssnitt skiljer sig i hur mycket av detta de visar. Vissa accepterar ett protokollnummer, vissa erbjuder en namngiven lista, och några få accepterar bara TCP eller UDP med portar.
PPTP använder båda lagren samtidigt
PPTP är det tydligaste exemplet eftersom det medvetet delar sitt arbete mellan de två. Kontrollanslutningen är en TCP-session till port 1723, och datavägen är GRE, protokoll 47, utan att någon port är inblandad någonstans. En brandvägg som tillåter 1723 och ingenting annat låter förhandlingen börja och kastar sedan nyttolasten. Tunneln ser ut att hänga efter autentiseringen i stället för att misslyckas med att ansluta, och därför rapporteras symtomet ofta som ett lösenordsproblem.
| Path | Outer protocol | Port |
|---|---|---|
| Control channel | TCP, protocol 6 | 1723 |
| Data channel | GRE, protocol 47 | None |
Läs de två raderna var för sig när du skriver regeln, och kontrollera var och en mot leverantörens syntax. Den ena raden behöver en port, den andra behöver ett protokollnummer, och ingen enskild post täcker båda.
Varför en portvidarebefordringssida inte kan uttrycka GRE
Ett vidarebefordringsformulär som bara accepterar TCP och UDP kan inte beskriva GRE, vad formuläret än heter. Adressöversättning lägger till en andra svårighet, eftersom GRE inte har portar och översättaren måste följa anropsidentifieraren i stället. Vissa konsumentroutrar levereras med en hjälpare som hanterar det; många gör det inte, och ingen extra TCP-tillåtelsepost skapar det beteendet.
Där en modern tunnel är det verkliga kravet, välj en design som medvetet använder TCP eller UDP i stället för att hoppas att en översättare gissar rätt.
Inkapsling avgör vad filtret ser
Inkapsling ändrar det yttre paketet, och det yttre paketet är det som en regel matchar. Inbyggd ESP är protokoll 50, medan NAT-traversering packar in ESP i UDP 4500 så att det överlever adressöversättning. Ett filter som tillåter UDP 4500 ser aldrig protokoll 50, och ett filter skrivet för protokoll 50 matchar aldrig den inpackade formen.
Fråga vilken inkapsling klienten och gatewayen kom överens om, och skriv sedan regeln för just den yttre formen och ingenting mer.
Skriv regeln så att någon kan kontrollera den
Uttryck varje regel som adressfamilj, yttre protokoll, transportportar om några, riktning och båda ändpunkterna. En granskare kan jämföra den meningen med en paketdump och komma till ett avgörande. En instruktion att öppna 47 kan ingen kontrollera, och det är därför den överlever i åratal i procedurböcker.
Lägg till testet som bevisar det: anslut medan du fångar på det yttre gränssnittet, och bekräfta det yttre protokollet och den port som faktiskt syns i spåret.