Prevádzka kontajnerov Docker obchádza VPN hostiteľa: ako to overiť
VPN hostiteľa pokrýva iba sieťový menný priestor hostiteľa. Pomocou týchto kontrol zistíte, či prevádzka kontajnerov na moste vstupuje do tunela alebo odchádza priamo.
Váš prehliadač na hostiteľovi zobrazuje výstupnú adresu VPN, kontajner hlási vaše domáce pripojenie a niekto to nazýva únik. Nič neuniklo. Tunel hostiteľa je súbor rozhraní, trás a pravidiel, ktoré patria sieťovému mennému priestoru hostiteľa, a kontajner na moste je iný menný priestor s vlastnou predvolenou trasou. Sedel som na stacku Compose, kde bol klient VPN pripojený týždne a nevošiel doň ani jeden paket kontajnera.
Skontrolujte menný priestor skôr než ikonu v oznamovacej oblasti
Menné priestory sú celý argument. Keď Docker spustí kontajner v mostovej sieti, vytvorí sieťový menný priestor, pripojí doň jeden koniec páru veth a dá tomu priestoru adresu a predvolenú trasu. Rozhranie tunela, nech sa volá akokoľvek, žije v mennom priestore hostiteľa. Prevádzka vnútri kontajnera ho nevidí a žiadne nastavenie klienta to zvonku nemení.
Dva podporované kroky vás dostanú z izolácie. --network host umiestni kontajner do menného priestoru hostiteľa, takže zdedí trasy hostiteľa a tým aj tunel. --network container:vpn zdieľa menný priestor iného kontajnera, a tak väčšina návrhov so sidecarom posiela záťaž cez kontajner VPN. Oboje je výslovná voľba; zvyčajne len jedna z nich je to, čo mal na mysli ten, kto to nasadzuje.
Režim hostiteľa nie je bezplatný upgrade. Kontajner prestane mať vlastnú adresu, publikovanie portov prestane platiť a proces, ktorý tam drží NET_ADMIN, môže prepísať smerovanie hostiteľa. Prijať to môže byť správne rozhodnutie. Predpokladať, že už je zapnutý, je spôsob, akým ľudia strávia večer ladením tunela, ktorý nikdy nebol na ceste.
Sledujte paket z mosta von
Kontajner na moste pošle svoj paket svojej predvolenej bráne, čo je mostové rozhranie na hostiteľovi. Hostiteľ potom paket prepošle a v predvolenej konfigurácii preloží zdrojovú adresu na svoju, skôr než paket odíde. Práve tento krok prekladu potichu ruší politiku.
Kým paket dorazí ku koncovému bodu tunela, nesie adresu hostiteľa. Akékoľvek pravidlo, politická trasa alebo rozhodnutie o rozdelenom tuneli viazané na pôvodnú adresu kontajnera prestane zodpovedať a dva kontajnery určené na odchod rôznymi výstupmi nemožno rozlíšiť len podľa zdroja. Ak potrebujete smerovanie pre jednotlivé kontajnery, rozhodnutie musí padnúť pred prekladom alebo v mennom priestore, ktorý ovládate.
Docker tieto pravidlá udržiava sám, prostredníctvom toho firewallového backendu, s ktorým bol démon nakonfigurovaný. Ručne napísané pravidlá mimo podporovaného háku pre preposielanú prevádzku, DOCKER-USER, môžu byť preusporiadané alebo zrušené, keď sa démon restartuje alebo hostiteľ aktualizuje. Dokumentácia Dockeru k filtrovaniu paketov ukazuje poradie reťazcov; praktický bod je, že každé pravidlo potrebuje vlastníka a cestu na opätovné načítanie, ktorú ste skutočne otestovali.
Testujte oba systémy oddelene
Dôkaz z jedného menného priestoru nehovorí nič o druhom. Požiadavka spustená vnútri kontajnera VPN dokazuje, že tunel pre tento kontajner funguje. Nie je to dôkaz o hostiteľovi a ten istý príkaz spustený z kontajnera s --network host nie je dôkazom o moste.
# host namespace
ip route get 1.1.1.1
ip -brief addr show
# a fresh container on the same bridge network
docker run --rm --network appnet alpine sh -c 'ip route; cat /etc/resolv.conf; ip -6 route'
Potom test zopakujte vnútri skutočného kontajnera aplikácie, nie v podobnom obraze. Aplikácia môže niesť extra trasu, premennú prostredia pre proxy alebo iný resolver, a každé z toho mení odpoveď. Zakaždým skontrolujte preklad názvov a druhú rodinu adries: kontajnery na používateľsky definovaných mostoch sa prekladajú cez vstavaný resolver Dockeru na 127.0.0.11 a predvolená trasa IPv6 na moste môže odniesť prevádzku von, zatiaľ čo sa zaoberáte testovaním tunela len pre IPv4.
Prečítajte si vzorec, skôr než sa dotknete prihlasovacích údajov
Keď hostiteľ funguje a kontajner nie, príčina je takmer vždy štrukturálna a rotácia kľúčov alebo preinštalovanie klienta premrhá popoludnie. Najprv roztrieďte symptóm a oprava sa zvyčajne pomenuje sama.
| What you see | Usual cause | First check |
|---|---|---|
| Host exits through the VPN, container shows the ISP address | The container never entered the tunnel | Default route inside the container |
| Container works until the daemon restarts, then stops | Rules outside the supported hook, or a changed backend | Daemon's reported firewall backend and DOCKER-USER |
| Container loses internal hosts after the tunnel comes up | VPN prefix overlaps the Docker bridge subnet | ip route on the host, then docker network inspect |
| Small replies arrive, large ones hang | Tunnel MTU or missing MSS clamping | Link MTU on both ends of the tunnel |
| Container falls back to the ISP address when the tunnel drops | Nothing enforces the kill switch for forwarded traffic | Stop the tunnel with a request in flight |
Riadok o prekrytí si zaslúži vlastnú vetu. Profil VPN, ktorý pretlačí trasu pre 172.17.0.0/16 alebo pre 10.0.0.0/8, ktoré náhodou obsahuje prefix vášho mosta, prinúti tunel nárokovať si podsiete kontajnerov, a odpovede na preložené adresy sa vydajú nesprávnym smerom alebo zmiznú. Prečíslovanie siete Docker je zvyčajne čistejšie než hromadenie výnimiek.
Urobte pokrytie výslovným a potom ho úmyselne rozbite
Dva návrhy obstoja pri kontrole. Zdieľajte menný priestor kontajnera VPN a každá pokrytá záťaž použije jeden tunel s jednou hranicou reštartu, čo je jednoduché, kým jedna služba nepotrebuje iný výstup alebo vlastnú cestu DNS. Alebo presmerujte sieť kontajnerov na bránu VPN na hostiteľovi: preposielanie zapnuté, prefix mosta namierený na tunel, spätná prevádzka výslovne ošetrená. To kupuje kontrolu pre každú sieť a stojí vás sadu pravidiel, ktorú musíte udržiavať naprieč aktualizáciami démona aj klienta.
Tak či onak, test, na ktorom záleží, je prípad zlyhania. Zastavte tunel s požiadavkou kontajnera za letu a sledujte, kam paket ide. Ak sa vráti na priamu cestu, pokrytie nikdy nebolo vynútené, pretože kill switch klienta riadi vlastnú prevádzku klienta, nie preposielané pakety z mosta. Potom reštartujte démona a hostiteľa a výsledok potvrďte druhýkrát; to je okamih, keď ručne písané pravidlá miznú.
Skôr než to vyhlásite za hotové, potvrďte štyri veci: rozhranie tunela je v tom istom mennom priestore ako prevádzka, test kontajnera prebehol vnútri skutočného kontajnera, preklad názvov aj obe rodiny adries boli skontrolované a test zlyhania tunela stále zlyháva zatvorene. Potom zapíšte firewallový backend, verziu klienta a vlastníka každého pravidla. Práve tento záznam bráni tomu, aby ďalšia aktualizácia nechala na mieste nedokumentovanú zmes starých predpokladov.