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 seeUsual causeFirst check
Host exits through the VPN, container shows the ISP addressThe container never entered the tunnelDefault route inside the container
Container works until the daemon restarts, then stopsRules outside the supported hook, or a changed backendDaemon's reported firewall backend and DOCKER-USER
Container loses internal hosts after the tunnel comes upVPN prefix overlaps the Docker bridge subnetip route on the host, then docker network inspect
Small replies arrive, large ones hangTunnel MTU or missing MSS clampingLink MTU on both ends of the tunnel
Container falls back to the ISP address when the tunnel dropsNothing enforces the kill switch for forwarded trafficStop 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.

Súvisiace články