PPTP v Dockeru se ověří, ale nepřenáší provoz
PPTP potřebuje TCP 1723 pro řízení a GRE pro data. V kontejneru často chybí pomocník conntrack, takže přihlášení funguje a nic jiného.
Klient se ověří, PPP vyjedná adresu a pak se nic nehýbe. Ping selhává, prohlížeč selhává a kontejner po celou dobu vypadá připojený. Tento vzorec není problém směrovací tabulky, protože problémy se směrováním obvykle rozbijí i řídicí spojení. Je to cesta dat a v PPTP jsou data jiný protokol než ten, který právě uspěl.
Pět kontrol v pořadí, které ušetří nejvíc času.
Kontrola 1: oddělte řídicí kanál od dat
PPTP se ověřuje přes TCP 1723 a pak nese data PPP uvnitř GRE, protokolu IP 47. GRE není ani TCP, ani UDP, takže každé pravidlo, které propouští řídicí port, o něm nic neříká. NAT nebo firewall, který propustí 1723, může bez stížnosti zahodit protokol 47 a relace zůstane napůl postavená způsobem, který vypadá jako úspěch.
Pokud přihlášení funguje a žádný paket se nevrací, předpokládejte nejprve GRE a potom to dokažte.
Kontrola 2: potvrďte pomocníka v jádře hostitele
Sledování spojení nedokáže propojit řídicí spojení TCP s tokem GRE bez pomocníka. Modul je nf_conntrack_pptp, žije v jádře hostitele a načtení v obraze kontejneru nic nepřinese, protože moduly jsou společné pro celý hostitel. lsmod | grep nf_conntrack_pptp na hostiteli Docker je ta kontrola. Pokud chybí, modprobe nf_conntrack_pptp ho načte pro běžící jádro a nic neříká o příštím startu, takže ho přidejte i do konfigurace hostitele.
Modul, který při restartu zmizí, se příští měsíc stane stejným tiketem.
Kontrola 3: přečtěte politiku jádra, která ho vypíná
I když je modul přítomen, jádra od 4.7 nastavují net.netfilter.nf_conntrack_helper ve výchozím stavu na 0, což vypíná automatické přiřazení pomocníka pro každý protokol. Kvůli tomuto výchozímu nastavení správně nainstalovaný modul stále nic nedělá: kód je tam a politika říká, aby se nepoužíval. sysctl net.netfilter.nf_conntrack_helper hlásí aktuální hodnotu a nastavení na 1 za běhu znovu zpřístupní pomocníka. Uložte hodnotu přes konfiguraci sysctl hostitele, pokud to návrh dovoluje.
Automatické přiřazení umožňuje provozu implicitně vytvářet očekávání, a právě proto se výchozí hodnota změnila. Omezte ho na důvěryhodného hostitele nebo použijte explicitní pravidlo cílené na pomocníka.
Kontrola 4: podívejte se na cestu kontejneru zvlášť
Načtený pomocník nevytváří trasu. Kontejner potřebuje cestu k serveru PPTP a přesměrování na hostiteli musí povolit GRE v obou směrech: iptables -L FORWARD -v -n ukazuje, zda je protokol 47 přijímán a zda se čítače hýbou. Pravidla masquerade v Dockeru překládají TCP a UDP, ne protokol 47, takže kontejner v bridge režimu může potřebovat výslovné povolení forward a na některých hostitelích vlastní překladové pravidlo. Ověřte také, že kontejner má podporu zařízení PPP, kterou jeho obraz očekává.
Čtěte čítače, ne text pravidla. Pravidlo, které existuje a s ničím se neshoduje, je dekorace.
Kontrola 5: dokažte, že GRE se sleduje, potom rozhodněte o PPTP
Když klient běží, přečtěte tabulku sledování. Navázaný řídicí záznam PPTP plus související záznam GRE znamená, že pomocník propojuje toky a zbývající závada je jinde. Řídicí záznam bez záznamu GRE znamená, že data jsou zahozena nebo nesledována, což vás vrací ke kontrolám 2 a 3.
Samotné PPTP je zastaralé a MS-CHAPv2 je slabé. Pokud server nabízí také L2TP/IPsec, IKEv2 nebo WireGuard, přechod na jeden z nich odstraní celou tuto třídu problémů.
Tam, kde PPTP musí zůstat, spuštění klienta na hostiteli místo v kontejneru odstraní jednu vrstvu NAT a filtrování, což je často levnější rozhodnutí.