PPTP se povezuje pa se zamrzne iza Linux NAT-a: GRE pomoćnik
TCP 1723 se poveže, a put podataka umre: PPTP putuje u GRE-u koji nema portove. Učitajte pomoćnike, prikačite ih izričito i otvorite protokol 47.
Netko prosljeđuje 1723, klijent stigne do poslužitelja, počne autentifikacija i onda sve stane bez pogreške. Prirodan zaključak je pogrešna lozinka, pa se lozinka ponovno upiše tri puta. Prosljeđivanje je bilo ispravno i vjerodajnice su bile ispravne. Slomio se drugi protokol koji prosljeđivanje nikada nije pokrivalo, i zadana vrijednost jezgre koja je tiho prestala pomagati s njim.
Prosljeđivanje nikada nije bilo problem
Pravilo prosljeđivanja porta opisuje TCP ili UDP promet. Ono ne može opisati sadržaj koji usred sesije prijeđe na drugi IP protokol, a PPTP upravo to čini.
Zato veza izgleda zdravo sve do trenutka kad se zamrzne. Dio kojim pravilo porta može upravljati uspio je, a dio kojim ne može upravljati jest dio koji je pao.
TCP za nadzor, GRE za podatke
Poziv se pregovara preko TCP-a 1723. Kad se uspostavi, sadržaj prelazi u GRE, IP protokol 47, koji uopće ne nosi brojeve portova. Pravilo koje se oslanja na portove nema se s čime usporediti.
Ono što GRE nosi jest identifikator poziva u svom zaglavlju, a NAT prevoditelj mora to polje dosljedno prepisivati u oba smjera ili dvije polovice sesije prestaju se slagati. Jedan smjer prepisan, a drugi ne, daje sesiju koja se autentificira i zatim odbacuje svaki podatkovni paket. Upravo takav je oblik simptoma: uspjeh, pa tišina.
Goli GRE bez PPTP-a ne treba takvo prepisivanje, zato običan GRE tunel može raditi kroz usmjerivač koji zakaže za PPTP klijenta na istom putu.
Četiri modula i sysctl koji ih je isključio
Dva modula obrađuju uokvirivanje, nf_conntrack_proto_gre i nf_nat_proto_gre. Još dva obrađuju identifikator poziva, nf_conntrack_pptp i nf_nat_pptp. Učitavanje posljednjeg od njih povlači ostale kroz ovisnosti, pa bi popis modula trebao pokazati sva četiri.
Starije upute koriste prefiks ip_ iz razdoblja 2.6. Te se naredbe mogu činiti kao da rade dok ništa ne učitavaju, zato provjerite učitani popis, a ne izlazni status.
Učitani više nisu dovoljni. Od Linuxa 4.7 net.netfilter.nf_conntrack_helper sysctl je po zadanom 0, što isključuje automatsku dodjelu pomoćnika za nove tokove. Usmjerivač može imati svaki modul i ipak ništa ne prevoditi. Provjerite stvarnu vrijednost prije nego ponovno pogledate popis modula.
Ili ponovno uključite automatsku dodjelu globalno, ili prikačite pomoćnik na tokove kojima treba i ostavite sve ostalo na miru:
iptables -t raw -A PREROUTING -p tcp --dport 1723 -j CT --helper pptpDrugi je izbor bolji. On ograničava ponašanje na PPTP promet umjesto da ponovno omogući automatsku dodjelu na cijelom usmjerivaču.
Otvaranje protokola koji nema portove
Pravilo vatrozida koje dopušta 1723 ne govori ništa o protokolu 47. Na firewalldu dopustite protokol u zoni okrenutoj prema klijentu. Na običnom iptablesu prihvatite protokol gre u ulaznom lancu.
Zatim snimajte na obje strane. Paketi koji napuštaju klijent bez dolaznih odgovora znače da je povratni put filtriran, a to je druga kvar od odbijenih vjerodajnica.
Nakon spajanja, ograničenje veličine
GRE umeće zaglavlje, a PPP unutar njega dodaje još, pa radna veza prijavljuje MTU znatno ispod 1500. Mali se odgovori učitavaju, a veliki zapnu, što izgleda kao drugi, nepovezani problem koji se pojavi u trenutku kad je prvi riješen.
Pročitajte MTU na klijentovu PPP adapteru i uskladite ga s vlastitim izračunom usmjerivača umjesto da snižavate brojke dok nešto ne proradi. Paketi pune veličine koji odlaze bez ičega što se vraća upućuju na to ograničenje, a ne na prevođenje.
Popravak puta vraća korisnika u rad i ne čini PPTP dobrim izborom. MS-CHAPv2 i RC4 odavno su zastarjeli, pa učitavanje modula tretirajte kao privremeni popravak i planirajte prelazak na održavani protokol.