Kontena lisiloweza kufikia kitu chochote nyuma ya VPN ya kampuni kwa kawaida huishi katika nafasi ya majina ya mtandao tofauti na handaki. Njia, seva za DNS na alama za firewall za mteja wa mwenyeji ni za staki ya mwenyeji; kontena la mtandao wa daraja lina lake. Ukweli huu mmoja unaeleza ripoti nyingi zinazofika kwa timu ya jukwaa, na pia ndiyo sababu «VPN imeharibika» na «Docker inaikwepa VPN» zinaweza zote kuwa makosa kwa wakati mmoja. Mipangilio miwili tofauti sana imejificha nyuma ya dalili moja, kwa hiyo tambua unao upi kabla ya kubadilisha mpangilio wowote.

Tambua nafasi ya majina ya nani inamiliki handaki

Kwenye Docker Desktop kwa macOS au Windows kontena huendeshwa ndani ya mashine pepe ya Linux. Mteja wa VPN uliosakinishwa kwenye kompyuta ya mezani huunda handaki katika mfumo wa uendeshaji wa mezani, na mashine pepe haioni kamwe. Hakuna mpangilio wa kontena unaotengeneza hilo, kwa sababu kiolesura ambacho kontena lingehitaji hakipo kabisa katika nafasi yake ya majina ya mtandao.

Kwenye mwenyeji wa Linux handaki huishi katika nafasi ya majina ya mwenyeji, na kontena za daraja kwa kawaida huifikia kupitia jedwali la uelekezaji la mwenyeji huku NAT ya chanzo ikitumika wakati wa kutoka. Njia hiyo inaposhindikana, sababu kwa kawaida si njia iliyokosekana, bali ni sera ya upelekaji, uchujaji wa njia ya nyuma au subnet inayopishana. Thibitisha uko katika ulimwengu upi kati ya mawili kabla ya kusoma zaidi:

docker info --format '{{.OperatingSystem}}'
docker run --rm --net=host alpine ip route | head -5
docker run --rm alpine ip route | head -5

Tofauti kati ya majedwali hayo mawili ya uelekezaji ni tatizo lote kwenye skrini moja. Ikiwa mwonekano wa mwenyeji una kiolesura cha handaki na mwonekano wa daraja hauna, unaangalia utengano wa nafasi za majina, na kila kitu kingine ni chaguo la jinsi ya kuivuka.

Mtandao wa mwenyeji ni jaribio, si muundo

Kuendesha kontena kwa mtandao wa mwenyeji, ambao Docker unauandika kama kushiriki nafasi ya majina ya mtandao ya mwenyeji, humfanya arithi moja kwa moja kiolesura cha handaki na njia zake. Ikiwa ombi lilo hilo litafanikiwa baadaye, nadharia ya njia imethibitishwa na kushindikana ni utengano wa nafasi za majina, si vitambulisho, DNS au kanuni ya ufikiaji.

docker run --rm --net=host curl -sS -o /dev/null -w '%{http_code}\n' https://api.internal/health

Ihifadhi kama utambuzi. Mtandao wa mwenyeji unaachana na uchapishaji wa bandari na sehemu kubwa ya utengano ulioutaka kutoka kwa kontena, na kwenye Docker Desktop «host» inamaanisha mashine pepe, si mezani, kwa hiyo mafanikio au kushindwa huko kunaweza kukupotosha ikiwa utasahau ni mwenyeji gani ulikuwa ukihutubia.

Kifaa cha tun na mapendeleo yanayokuja nacho

Mteja wa VPN ndani ya kontena anahitaji kifaa cha handaki na ruhusa ya kukisanidi. Njia ya mkato ya kawaida ni --privileged, ambayo inatoa kila kifaa na kulegeza sera ya usalama katika kontena lote. Hilo ni zaidi ya kazi hii inavyohitaji, na ni vigumu kulihalalisha katika ukaguzi.

sudo modprobe tun
docker run --rm -it --device /dev/net/tun --cap-add NET_ADMIN myvpn-client

Umbo jembamba hupanga nodi moja ya kifaa na kuongeza uwezo wa usimamizi wa mtandao pekee. Kwanza pakia moduli kwenye mwenyeji ili nodi iwepo. Ikiwa kontena linaanza na mteja anaripoti kwamba hawezi kufungua kifaa cha handaki, angalia upangaji kabla ya kushuku wasifu, kwa sababu kosa hilo kwa kawaida ni halisi.

Muundo huu pia unamaanisha mteja huendeshwa kwa kila kontena. Hilo ni jibu sahihi wakati kila mzigo wa kazi unahitaji handaki yake, na jibu lisilo sahihi wakati ulitaka tu handaki ya mwenyeji ionekane, ambayo timu ya jukwaa pengine ilidhani unafanya.

NAT ya daraja hubadilisha chanzo ambacho VPN inakiona

Kwa daraja la chaguo-msingi, trafiki inayotoka ya kontena hutafsiriwa kuwa anwani ya mwenyeji. Kwa hiyo nyuma ya VPN upande wa kampuni unaona anwani ya handaki ya mwenyeji si ya kontena, kanuni za ufikiaji kwa chanzo hujifanya kana kwamba mwenyeji alituma ombi, na kontena mbili huwa hazitofautishwi kwa seva ya VPN.

macvlan au ipvlan badala yake humpa kontena anwani ya LAN, ambayo husaidia ugunduzi wa LAN na kuifanya kontena ionekane kama mwenzake kwenye sehemu. Pia inaikwepa kabisa handaki ya mwenyeji, kwa hiyo kontena kama hilo halitafikia viambishi vya VPN-pekee isipokuwa VPN inapatikana pia kutoka LAN hiyo.

Maumbo yote mawili ni halali; yanajibu mahitaji tofauti. Ikiwa hitaji ni «kontena hili lazima lifikie huduma ya VPN-pekee», unachagua kati ya uelekezaji kupitia mwenyeji na kumaliza handaki ndani ya kontena. Andika chaguo hilo kabla ya kupelekwa, si baada ya ombi la kwanza lililoshindwa. Uchague chochote, rekodi anwani ya chanzo ambayo upande wa mbali utaona, kwa sababu ndiyo itakayoonyeshwa na kanuni zake za ufikiaji na kumbukumbu zake. Muundo ambao hauwezi kutaja anwani hiyo haujakamilika.

DNS inafuata daemon, si handaki

Kontena hupata usanidi wake wa kitatuzi wakati wa kuanza, ukiwa umenakiliwa kutoka kwa daemon au kutoka kwa picha. Anwani ambazo VPN inasukuma baada ya kuunganisha hufika marehemu sana kwa nakala hiyo, na husukumwa kwa kitatuzi cha mwenyeji si ndani ya kontena.

Weka kitatuzi kwa uwazi kwa huduma, au kielekeze kwa kitatuzi cha ndani kinachofikiwa kupitia handaki. Kontena linalotatua jina la faragha kuwa anwani ya umma kwa kawaida hutumia kitatuzi cha umma, haliteseki kwa njia iliyovunjika, na marekebisho yako kwenye faili ya compose au usanidi wa daemon.

Hoja hiyo hiyo inatumika kwa swali la anwani ya kutoka. Ikiwa kila kontena lazima lionekane kutoka anwani tofauti ya VPN, handaki moja ya mwenyeji haiwezi kuleta hilo kwa sababu NAT huziunganisha kuwa chanzo kimoja. Maumbo yanayofaa ni mteja katika nafasi ya majina ya kila kontena au sidecar inayomiliki handaki na kushiriki staki yake, na yote mawili hubadilisha jinsi programu inavyoelekezwa.

Orodha ya ukaguzi kabla ya kufunga tiketi: tambua nafasi ya majina inayomiliki handaki, thibitisha njia kwa mtandao wa mwenyeji, panga kifaa cha tun kinachohitajika pekee, kumbuka anwani ya chanzo baada ya NAT, weka kitatuzi kwa uwazi na chukulia anwani za kutoka kwa kila kontena kama uamuzi wa usanifu si bendera.

Makala zinazohusiana