Kivinjari chako kwenye mwenyeji kinaonyesha anwani ya kutoka ya VPN, kontena linaripoti muunganisho wako wa nyumbani, na mtu anaiita kuvuja. Hakuna kilichovuja. Handaki la mwenyeji ni mkusanyiko wa violesura, njia na kanuni zinazomilikiwa na nafasi ya majina ya mtandao ya mwenyeji, na kontena kwenye daraja ni nafasi nyingine ya majina yenye njia yake ya chaguo-msingi. Nimekaa kwenye stack ya Compose ambapo mteja wa VPN alikuwa ameunganishwa kwa wiki nyingi na hakuna hata pakiti moja ya kontena iliyowahi kuingia ndani yake.

Kagua nafasi ya majina kabla ya ikoni ya tray

Nafasi za majina ni hoja yote. Docker inapoanzisha kontena kwenye mtandao wa daraja, huunda nafasi ya majina ya mtandao, huunganisha upande mmoja wa jozi ya veth ndani yake, na kuipa nafasi hiyo anwani na njia ya chaguo-msingi. Kiolesura cha handaki, kiitwe vipi, kinaishi katika nafasi ya majina ya mwenyeji. Trafiki ndani ya kontena haiwezi kukiona, na hakuna mpangilio wa mteja unaobadilisha hilo kutoka nje.

Hatua mbili zinazoungwa mkono zinakutoa kwenye kutengwa. --network host huweka kontena ndani ya nafasi ya majina ya mwenyeji, kwa hiyo hurithi njia za mwenyeji na hivyo handaki. --network container:vpn hushiriki nafasi ya majina ya kontena lingine, na ndivyo miundo mingi ya sidecar inavyotuma mzigo wa kazi kupitia kontena la VPN. Zote mbili ni chaguo wazi; kwa kawaida ni moja tu kati yao ndiyo iliyokusudiwa na mtu anayesambaza.

Hali ya mwenyeji si uboreshaji wa bure. Kontena huacha kuwa na anwani yake mwenyewe, uchapishaji wa bandari huacha kutumika, na mchakato unaoshikilia NET_ADMIN hapo unaweza kuandika upya uelekezaji wa mwenyeji. Kukubali hilo kunaweza kuwa uamuzi sahihi. Kudhani tayari imewashwa ndiyo jinsi watu wanavyotumia jioni moja kurekebisha handaki ambalo halikuwa kamwe kwenye njia.

Fuatilia pakiti nje ya daraja

Kontena la daraja hutuma pakiti yake kwenye lango lake la chaguo-msingi, ambalo ni kiolesura cha daraja kwenye mwenyeji. Kisha mwenyeji hupeleka pakiti mbele na, katika usanidi wa chaguo-msingi, hutafsiri anwani ya chanzo kuwa yake kabla pakiti haijatoka. Hatua hiyo ya utafsiri ndiyo inayoshinda sera kimya kimya.

Pakiti inapofika kwenye mwisho wa handaki, hubeba anwani ya mwenyeji. Kanuni yoyote, njia ya sera au uamuzi wa handaki lililogawanywa unaotegemea anwani ya awali ya kontena huacha kulingana, na kontena mbili zinazokusudiwa kutoka kwa njia tofauti haziwezi kutofautishwa kwa chanzo pekee. Ikiwa unahitaji uelekezaji kwa kila kontena, uamuzi lazima ufanyike kabla ya utafsiri au ndani ya nafasi ya majina unayodhibiti.

Docker yenyewe hudumisha kanuni hizi, kupitia backend yoyote ya firewall ambayo daemon ilisanidiwa nayo. Kanuni zilizoandikwa kwa mkono nje ya ndoano inayoungwa mkono kwa trafiki inayopelekwa mbele, DOCKER-USER, zinaweza kupangwa upya au kuachwa wakati daemon inapoanza upya au mwenyeji anapoboreshwa. Nyaraka za Docker kuhusu uchujaji wa pakiti zinaonyesha mpangilio wa minyororo; hoja ya kiutendaji ni kwamba kila kanuni inahitaji mmiliki na njia ya kupakia upya ambayo umeijaribu kweli.

Jaribu mifumo miwili kwa mbalimbali

Ushahidi kutoka nafasi moja ya majina hausemi kitu kuhusu nyingine. Ombi lililotekelezwa ndani ya kontena la VPN linathibitisha handaki linafanya kazi kwa kontena hilo. Hiyo si ushahidi kuhusu mwenyeji, na amri hiyo hiyo iliyotekelezwa kutoka kontena la --network host si ushahidi kuhusu daraja.

# 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'

Kisha rudia jaribio ndani ya kontena halisi la programu badala ya picha inayofanana. Programu inaweza kubeba njia ya ziada, kigeu cha mazingira cha proksi au kisuluhishi kingine, na kila kimoja hubadilisha jibu. Kagua utatuzi wa majina na familia ya pili ya anwani kila wakati: kontena kwenye madaraja yaliyofafanuliwa na mtumiaji hutatuliwa kupitia kisuluhishi kilichojengwa ndani ya Docker kwenye 127.0.0.11, na njia ya chaguo-msingi ya IPv6 kwenye daraja inaweza kupeleka trafiki nje wakati wewe umejishughulisha na kujaribu handaki la IPv4 pekee.

Soma muundo kabla ya kugusa vitambulisho

Wakati mwenyeji unafanya kazi na kontena halifanyi, sababu karibu kila mara ni kimuundo, na kuzungusha funguo au kusakinisha tena mteja hupoteza mchana. Panga dalili kwanza na marekebisho kwa kawaida hujitaja yenyewe.

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

Mstari wa mwingiliano unastahili sentensi yake mwenyewe. Wasifu wa VPN unaosukuma njia kwa 172.17.0.0/16, au kwa 10.0.0.0/8 ambayo kwa bahati ina kiambishi cha daraja lako, hufanya handaki lidai subnet ya kontena, na majibu kwa anwani zilizotafsiriwa yataenda upande mbaya au kutoweka. Kuweka nambari mpya kwa mtandao wa Docker kwa kawaida ni safi zaidi kuliko kukusanya isipokuwa.

Fanya ufunikaji uwe wazi, kisha uvunje kwa makusudi

Miundo miwili hustahimili ukaguzi. Shiriki nafasi ya majina ya kontena la VPN na kila mzigo wa kazi uliofunikwa hutumia handaki moja lenye mpaka mmoja wa kuanza upya, ambayo ni rahisi hadi huduma moja inahitaji kutoka kwingine au njia yake ya DNS. Au elekeza mtandao wa kontena kwenye lango la VPN kwenye mwenyeji: upelekaji umewashwa, kiambishi cha daraja kimeelekezwa kwenye handaki, trafiki ya kurudi imeshughulikiwa wazi. Hiyo hununua udhibiti kwa kila mtandao na hukugharimu seti ya kanuni za kudumisha katika uboreshaji wa daemon na mteja.

Vyovyote vile, jaribio muhimu ni kesi ya kushindwa. Simamisha handaki wakati ombi la kontena likiwa hewani na uone pakiti inakwenda wapi. Ikiwa inarudi kwenye njia ya moja kwa moja, ufunikaji haukuwa kamwe umetekelezwa, kwa sababu kill switch ya mteja inadhibiti trafiki ya mteja mwenyewe na si pakiti zinazopelekwa mbele kutoka daraja. Kisha anzisha upya daemon na mwenyeji na uthibitisha matokeo mara ya pili; huo ndio wakati kanuni zilizoandikwa kwa mkono zinapotea.

Kabla ya kusema imekamilika, thibitisha mambo manne: kiolesura cha handaki kiko katika nafasi ile ile ya majina kama trafiki, jaribio la kontena lilifanyika ndani ya kontena halisi, utatuzi wa majina na familia zote mbili za anwani ulikaguliwa, na jaribio la kushindwa kwa handaki bado linashindwa likiwa limefungwa. Kisha andika backend ya firewall, toleo la mteja na mmiliki wa kila kanuni. Rekodi hiyo ndiyo inayozuia uboreshaji ujao kuacha mchanganyiko usioandikwa wa mawazo ya zamani.

Makala zinazohusiana