Protokol 47 versus TCP port 47: dvě hlavičky, dvě pravidla
Číslo protokolu a port žijí v různých hlavičkách, takže jedno pravidlo nemůže nahradit druhé. PPTP obojí odděluje a pole pro port nedokáže vyjádřit GRE.
Hotelové sítě a konferenční firewally často nabízejí vlastní pole pro povolení a někdo do něj napíše 47 v očekávání, že PPTP bude fungovat. Pravidlo se vytvoří, tunel stále selhává a další pokus použije jiné číslo. Chyba je v samotném paketu: IPv4 má pole protokolu, které pojmenovává, co následuje po hlavičce IP, zatímco TCP a UDP mají pole portu, která existují jen tehdy, když jste uvnitř jedné z těchto hlaviček. Nejsou to dva přepisy téhož povolení.
Hlavička IPv4 pojmenovává následující protokol
Pole protokolu je v hlavičce IPv4 jeden bajt a drží číslo popisující obsah: 6 pro TCP, 17 pro UDP, 47 pro GRE, 50 pro ESP. Vše, co filtruje pakety, čte tuto hodnotu dřív, než se podívá hlouběji, protože hlubší hlavička má smysl až ve chvíli, kdy je znám typ. Změňte později v komunikaci port a toto pole se nepohnulo.
Pravidlo napsané proti protokolu 47 tedy popisuje vrstvu IP. Žádný port se na rozhodnutí vůbec nepodílí.
Porty existují uvnitř TCP a UDP, nikde jinde
Porty jsou šestnáctibitové identifikátory uvnitř hlaviček TCP a UDP a jejich úkolem je oddělit komunikace sdílející jednu adresu. Hlavička GRE nese hodnotu typu protokolu, často EtherType, plus volitelné klíče pro multiplexování. Proto výraz port 47 nepojmenovává nic, s čím by se paket GRE mohl shodovat.
Rozhraní firewallů se liší v tom, kolik z toho vystavují. Některá přijímají číslo protokolu, jiná nabízejí pojmenovaný seznam a několik jich přijímá jen TCP nebo UDP s porty.
PPTP používá obě vrstvy zároveň
PPTP je nejjasnější příklad, protože svou práci záměrně dělí mezi obě vrstvy. Řídicí spojení je relace TCP na port 1723 a datová cesta je GRE, protokol 47, bez jakéhokoli portu. Firewall, který povolí 1723 a nic jiného, nechá vyjednávání začít a pak zahodí obsah. Tunel vypadá, že po ověření visí, místo aby se nepřipojil, a proto se příznak často hlásí jako problém s heslem.
| Path | Outer protocol | Port |
|---|---|---|
| Control channel | TCP, protocol 6 | 1723 |
| Data channel | GRE, protocol 47 | None |
Čtěte oba řádky odděleně, když píšete pravidlo, a každý ověřte proti syntaxi výrobce. Jeden řádek potřebuje port, druhý potřebuje číslo protokolu a žádná jediná položka nepokrývá obojí.
Proč stránka pro přesměrování portů nedokáže vyjádřit GRE
Formulář pro přesměrování, který přijímá jen TCP a UDP, nedokáže popsat GRE, ať se formulář jmenuje jakkoli. Překlad adres přidává druhou obtíž, protože GRE nemá porty a překladač musí místo toho sledovat identifikátor hovoru. Některé domácí routery mají pomocníka, který to zvládne; mnoho ne, a žádná další položka povolení TCP takové chování nevytvoří.
Pokud je skutečným požadavkem moderní tunel, zvolte návrh, který záměrně používá TCP nebo UDP, místo abyste doufali, že překladač uhodne správně.
Zapouzdření rozhoduje, co filtr vidí
Zapouzdření mění vnější paket a pravidlo se shoduje právě s vnějším paketem. Nativní ESP je protokol 50, zatímco průchod přes NAT zabaluje ESP do UDP 4500, aby přežil překlad adres. Filtr, který povolí UDP 4500, nikdy nevidí protokol 50, a filtr napsaný pro protokol 50 nikdy nesedí na zabalenou podobu.
Zeptejte se, na jakém zapouzdření se klient a brána dohodli, a pak napište pravidlo pro tento vnější tvar a nic víc.
Napište pravidlo tak, aby ho někdo mohl zkontrolovat
Vyjádřete každé pravidlo jako rodinu adres, vnější protokol, transportní porty, pokud nějaké jsou, směr a oba koncové body. Recenzent může tuto větu porovnat se zachycením paketů a dojít k verdiktu. Pokyn otevřít 47 nemůže nikdo zkontrolovat, a právě proto přežívá léta v provozních příručkách.
Přidejte test, který to dokáže: připojte se při zachytávání na vnějším rozhraní a potvrďte vnější protokol a port, které se ve stopě skutečně objeví.