Docker prievadų publikavimas ir VPN: kur keliauja atsakymas
Paskelbtas konteineris atsako iš savo adreso prieš atvirkštinį NAT. Du sprendimai gali išlaikyti tą atsakymą viešame kelyje, tačiau skirtingomis sąnaudomis.
Šeimininkas toliau atsako į SSH po to, kai pakyla viso tunelio VPN, o tame pačiame kompiuteryje per Docker paskelbta paslauga nutyla. Su klausytoju viskas gerai: konteineris veikia, prievado susiejimas egzistuoja ir paketas atvyksta. Konteineris sveikas, ir užklausa tikrai jį pasiekia. Skiriasi tai, nuo ko atsakymas prasideda, kai Linux pasirenka maršrutą, ir tas skirtumas nusprendžia, kurio iš dviejų sprendimų žemiau jums reikia.
Sekite tuple per paskirties NAT
Paimkite šeimininką 192.0.2.10, kuris skelbia TCP 2222 konteineriui 172.30.240.5:22. Užklausa iš 198.51.100.25 išverčiama prieš pasiekiant konteinerį, o konteineris atsako kaip pats savimi.
WAN request: 198.51.100.25 -> 192.0.2.10:2222
after DNAT: 198.51.100.25 -> 172.30.240.5:22
container reply: 172.30.240.5:22 -> 198.51.100.25
Šeimininko maršruto sprendimo metu atsakymas vis dar neša konteinerio šaltinio adresą. Atvirkštinis vertimas vėliau atkuria paskelbtą tuple, ir būtent todėl paketas atrodo neteisingai tą pačią akimirką, kai pasirenkamas maršrutas.
Kodėl taisyklė vien šeimininkui to nepastebi
Taisyklė, kuri WAN lentelę pasirenka tik paketams iš 192.0.2.10, apima paties šeimininko demonus ir visiškai praleidžia šį persiųstą atsakymą. Atsakymo šaltinio adresas yra 172.30.240.5, o ne šeimininkas.
Perdėta korekcija yra nukreipti viską iš konteinerio per WAN, o tai taip pat atleidžia nesusijusius konteinerio išeinančius ryšius nuo VPN. Tai kitokia politika nei prašyta, ir paprastai vėliau ką nors nustebina.
Sutapimas po DNAT yra kitas hook
Docker dokumentacija apie užkardas pažymi, kad įprastas naudotojo filtravimas mato paskirtį po DNAT, todėl paskelbto 2222 prievado sutapimas įprastoje taisyklėje nėra tas pats, kas konteinerio 22 prievado sutapimas. Jei pradinis tuple svarbus, naudokite palaikomą pradinės paskirties mechanizmą, o ne spėliokite, kuris prievadas matomas.
Ši hook painiava sukuria taisykles, kurios atrodo teisingos ir niekada nesutampa. Prieš perrašydami politiką patikrinkite skaitiklius pačioje taisyklėje. Taisyklė be jokių pataikymų jums sako, kad ji vertinama ten, kur paketas niekada nepatenka.
Sprendimas A: nešti sprendimą kaip ryšio būseną
Ryšio žymė gali pernešti įėjimo sprendimą per vertimą, bet ji turi būti grąžinta paketui prieš svarbią maršruto paiešką. Etapai yra:
- Rezervuokite žymės lauką ir taisyklės prioritetą, kurie nesusiduria su Docker, VPN ar kitu politikos savininku.
- Identifikuokite tik numatytą naują WAN ryšį prieš DNAT esančiame taške, kuriame prieinamas ryšių sekimas.
- Užrašykite sprendimą ryšio žymėje, neverždami pačios pradinės užklausos į WAN lentelę.
- Atsakymo kryptimi prieš maršrutizavimą grąžinkite paketui tik savo žymės bitus.
- Pasirinkite pilną WAN lentelę pakankamai anksti, kad VPN taisyklė negalėtų laimėti pirmoji.
Tai lentelė turi turėti tikrus prijungtus maršrutus ir šliuzą. Jai taip pat reikia apibrėžto elgesio, kai maršruto nėra. Tylus kritimas į tunelį yra blogiausias rezultatas, nes konfigūracija vis dar atrodo veikianti. Vietoj to nepavykkite uždarai ir užregistruokite tai.
Sprendimas B: užbaigti šeimininke
Sąmoningai sukonfigūruotas šeimininko pusės frontendas, pavyzdžiui, TCP tarpinė arba atvirkštinė tarpinė prieš konteinerį, išlaiko atsakymą kylantį iš šeimininko adreso. Tada šeimininkui parašytos taisyklės elgiasi kaip tikimasi, o konteineris lieka savo privačiame tinkle.
Kaina yra dar viena judanti dalis su sava konfigūracija, šaltinio adresų apdorojimu ir prieigos kontrole. Paprastai tai paprastesnė palaikoma riba, ir dažnai tai teisingas atsakymas, kai maršrutizavimo politiką prižiūrėtų vienas žmogus, kuris gali išeiti.
Patikrinkite pakeitimą, o ne ketinimą
Atidarykite naują leistiną ryšį iš viešos pusės ir patvirtinkite, kad atsakymas išeina per numatytą sąsają. Tada patikrinkite, ar nesusijusi konteinerio pradėta užklausa vis dar eina per VPN.
Neišvalykite kompiuterio ryšių lentelės, kad išbandytumėte vieną taisyklę: esami įrašai išlaiko ankstesnį susiejimą, o išvalymas sulaužo visa kita šeimininke. Prievado paskelbimas apibrėžia pasiekiamumą. Jis neapibrėžia atsakymo kelio. Užrašykite pasirinktą sprendimą su jo lentelių pavadinimais, kad kitas žmogus neprivalėtų jo iš naujo atrasti per incidentą.