Kontena lako la handaki linafanya kazi, docker compose exec vpn curl -s https://ifconfig.me hujibu kwa anwani ya mtoa huduma, na bado kivinjari kwenye dawati lako kinatoka kupitia ISP yako. Pengo hilo linatarajiwa. Kontena linaloendesha mteja wa VPN linashikilia nafasi ya majina ya mtandao, njia na kiolesura cha handaki, na hakuna kinachozungumza HTTP au SOCKS; kuchapisha mlango juu yake hakuwezi kuunda kisikilizaji ambacho hakikuwahi kuwepo.

Mahali mteja anapoendesha huamua muundo. Kontena jirani linaweza kuhamia katika nafasi ya majina ya handaki, programu ya dawati haiwezi, na kipanga njia kinahitaji njia badala ya uwanja wa proksi. Ukikosea ramani, dalili ni ile ile: muunganisho umekataliwa, au trafiki inayochukua njia ya zamani kimya kimya.

Oanisha mpangilio na mahali mteja anapoendesha

Uliza swali moja kabla ya kuhariri Compose: je, mteja anaweza kuanzishwa ndani ya nafasi ya majina ya mtandao ya kontena la VPN? Kitu chochote kinachoendesha kama kontena la Linux kinaweza. Kivinjari, IDE au CLI kwenye dawati lako hakiwezi, kwa sababu mpangilio wake wa proksi unatarajia huduma ya itifaki, si nafasi ya majina.

ClientArrangementWhat must already exist
Another Compose serviceShares the vpn namespace via network_mode: service:vpnA working tunnel and correct start order
Host browser, IDE or CLIProxy listener inside the namespace, published to host loopbackA configured SOCKS or HTTP proxy and its access rules
Router, VM or phoneThe container as a layer-3 gatewayForwarding, NAT and a return route

Haya matatu hayachanganyiki. Uwanja wa proksi wa HTTP unaoelekea anwani ya daraja la kontena haufikii chochote isipokuwa proksi inasikiliza hapo, na kisikilizaji cha proksi hakiendeshi trafiki ya kipanga njia. Amua kwanza, kisha fuata sehemu inayolingana.

Shiriki nafasi ya majina ya handaki na kontena jirani

Hili ni chaguo la bei nafuu zaidi kwa sababu hakuna itifaki ya proksi inayohusika. Programu inajiunga na nafasi ya majina ya huduma ya vpn na kurithi violesura vyake, njia zake na nafasi ya milango:

services:
  vpn:
    image: your-vpn-client
    cap_add:
      - NET_ADMIN
    healthcheck:
      test: ["CMD-SHELL", "ip link show tun0 >/dev/null"]
      interval: 10s
      retries: 5
  app:
    image: your-app
    network_mode: service:vpn
    depends_on:
      vpn:
        condition: service_healthy

Vikwazo vitatu hufuata kutokana na ukweli kwamba nafasi ya majina ni mali ya huduma nyingine. Programu haipati ufunguo wake networks, kwa sababu haina nafasi ya majina ya kushikamana nayo. Uchapishaji wa milango ni wa vpn, kwa kuwa hapo ndipo nafasi ya majina inaishi. Na kuunda upya vpn huharibu nafasi ya majina ambayo programu iliingia, kwa hiyo docker compose up -d --force-recreate vpn inakuachia kuunda upya app pia; kuanzisha upya kwa kawaida hakitoshi kila wakati. Rejea ya huduma za Compose inashughulikia mpangilio huu na kikwazo chake cha uchapishaji wa milango.

Usidhani kwamba kitatuzi kinakuja pamoja. /etc/resolv.conf ni faili kwa kila kontena, si sehemu ya nafasi ya majina ya mtandao, kwa hiyo programu bado inaweza kuuliza kitatuzi cha mwenyeji wakati pakiti zake zinatoka kupitia handaki. Soma kutoka ndani ya kontena na weka dns: kwenye programu wakati majina ya kibinafsi yanapaswa kutatuliwa kupitia handaki.

docker compose exec app ip route
docker compose exec app cat /etc/resolv.conf
docker compose exec app curl -s https://ifconfig.me

Ikiwa orodha ya njia ina kiolesura cha handaki na anwani ni ya mtoa huduma, programu iko ndani ya handaki. Ikiwa kiolesura hakipo, app ilianza kabla vpn kuwa na handaki, kwa hiyo unde upya app mara vpn inaporipoti afya.

Weka kisikilizaji halisi cha proksi katika nafasi ya majina kwa wateja wa mwenyeji

Kivinjari cha dawati hakiwezi kujiunga na nafasi ya majina, kwa hiyo handaki lazima lifunuliwe kama huduma. Endesha proksi halisi ya SOCKS au HTTP ndani ya nafasi ya majina ya vpn na uchapisha mlango wake pekee:

services:
  vpn:
    ports:
      - "127.0.0.1:1080:1080"
  proxy:
    image: your-proxy
    network_mode: service:vpn
    command: ["--socks", "0.0.0.0:1080"]

Anwani ya upande wa mwenyeji ni nusu muhimu ya ramani hiyo. 127.0.0.1:1080 upande wa kushoto huweka kisikilizaji nje ya LAN yako; "1080:1080" uchi huchapisha proksi wazi kwa kila kifaa kinachoweza kufikia mashine yako.

Upande wa kontena una mtego wake. Milango iliyochapishwa hupewa anwani ya kontena kwenye daraja, si loopback yake, kwa hiyo proksi iliyoanzishwa na --socks 127.0.0.1:1080 ndani ya nafasi ya majina hukubali miunganisho kutoka kwa ndugu na hukataa kila kitu kinachofika kupitia mlango uliochapishwa. Ifunge kwa 0.0.0.0 na utegemee ufungaji wa loopback wa upande wa mwenyeji kwa kutenganisha. Sheria hiyo hiyo inatumika kwa anwani ya kusikiliza katika faili ya usanidi wa proksi.

Kisha amua mahali majina yanatatuliwa. Katika curl, --socks5 hutatua jina la mwenyeji ndani ya nchi na --socks5-hostname hutuma jina kwa proksi; vivinjari huonyesha swichi hiyo hiyo chini ya lebo nyingine. Utatuzi wa ndani huvujisha swali hata wakati ukurasa unapakiwa kupitia handaki.

Chukulia kontena kama lango tu ikiwa na njia ya kurudi

Vipanga njia, VM na simu hazitatumia uwanja wa proksi wa HTTP, na programu zingine hupuuza kabisa vigeu vya proksi. Kuelekeza trafiki yao kunamaanisha tabaka 3: kontena husambaza pakiti na kutafsiri anwani kwenye kiolesura cha handaki.

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

Mambo mawili hukosekana kwa urahisi. Mteja anahitaji njia inayoelekeza lango lake chaguo-msingi kwa mwenyeji huyu, na majibu lazima yapate njia ya kurudi, ama kupitia njia tuli kwenye kipanga njia cha juu au kupitia NAT kwenye kiolesura kinachoelekea wateja. Bila moja wapo, handaki hupeleka ombi nje na jibu hupotea.

Pia lina eneo pana zaidi la athari. Mwenyeji anayetumika kama lango kwa LAN yote huwapeleka wateja wote waliosanidiwa vibaya kupitia akaunti yako ya VPN, na handaki likianguka ama huifanya LAN iwe giza au hurudi kwa ISP kulingana na kill switch.

Thibitisha njia ya kutoka, kisha rudi nyuma kwa mpangilio

Kagua kwa mpangilio huu na usimame kwenye kushindwa kwa kwanza: anwani ya kutoka ndani ya nafasi ya majina, anwani ya kutoka kwa mwenyeji kupitia proksi, kisha utatuzi wa majina kwa mwenyeji wa kibinafsi.

docker compose exec vpn curl -s https://ifconfig.me
curl -s -x socks5h://127.0.0.1:1080 https://ifconfig.me
curl -s -x socks5h://127.0.0.1:1080 http://internal.example/health

Anwani mbili za kwanza zinapaswa kulingana na mtoa huduma, na ya tatu inapaswa kutatuliwa kupitia proksi badala ya kushindwa kwa hitilafu ya jina. Mstari wa kwanza unaolingana na wa pili unaoshindwa humaanisha kuwa kisikilizaji au mlango uliochapishwa si sahihi, si handaki.

Kurudi nyuma ni kinyume cha usanidi. Ondoa vigeu vya mazingira vya proksi kutoka wasifu wa shell na kutoka kitengo chochote cha systemd, kisha shusha stack ili nafasi ya majina inayoshirikiwa itoweke pamoja na mmiliki wake. Futa mlango uliochapishwa kabla ya kufuta huduma ya proksi, vinginevyo mwenyeji hubakiza kisikilizaji cha loopback ambacho hakuna anayekisoma.

Kabla ya kuendelea, thibitisha mambo manne: mteja unaomjali anafikia handaki kweli, mmiliki wa nafasi ya majina pekee huchapisha milango, majina ya kibinafsi yanatatuliwa mahali ulipokusudia, na hakuna kinachosikiliza kwenye anwani ya mwenyeji ambayo si loopback. Kila moja yao hushindwa kimya kimya katika uzalishaji, na kila moja ni ukaguzi wa mstari mmoja juu.

Makala zinazohusiana