OpenVPN ndani ya Docker: mkataba wa utekelezaji ambao mteja mdogo anahitaji
Picha iliyopitiwa, wasifu mmoja uliolindwa, ufikiaji wa TUN na NET_ADMIN. Kontena hupata nini, haipaswi kupata nini na jinsi ya kuthibitisha kuwa handaki inafanya kazi.
Weka mteja wa VPN ndani ya kontena na utapata nafasi moja ya majina yenye handaki ndani yake, si mwenyeji anayeelekeza trafiki yake yote kupitia VPN. Hivi ni miradi tofauti, na kuzichukulia kama moja ndiyo njia ambayo kontena huishia kuwa na upendeleo kwa bahati mbaya. Mwongozo huu unashughulikia la kwanza pekee: picha moja iliyopitiwa, wasifu mmoja uliolindwa na mchakato wa mteja uliozuiwa kwa nafasi yake ya majina ya mtandao.
Anza na kifaa ambacho mtu tayari amekikubali. Hatua zifuatazo zinachukulia picha iliyo na faili tekelezwa openvpn na wasifu kamili wa mteja ambao cheti na nyenzo za ufunguo wake tayari zimetatuliwa ndani ya upachikaji. Hazijengi programu, hazitoi vitambulisho na hazishughulikii mazingira yasiyo na root wala kontena asili za Windows, ambazo kila moja hubadilisha jibu.
Kontena hupata nini na haipati nini
Weka wasifu na kila kitu inachorejelea katika saraka ya ndani yenye ruhusa zilizozuiwa, iliyopachikwa kama kusoma pekee. Njia jamaa ndani ya wasifu lazima zitatuliwe ndani ya upachikaji huo; hii ni maelezo ambayo watu hukosa wakati cheti kiko saraka moja juu ya wasifu na kontena haioni kamwe.
services:
vpn:
image: ${VPN_CLIENT_IMAGE:?set the reviewed image reference}
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
volumes:
- ./vpn:/vpn:ro
working_dir: /vpn
entrypoint: ["openvpn"]
command: ["--config", "/vpn/client.ovpn"]
Faili hilo linatoa mambo matatu na haliombi kitu kingine. Rejeleo la picha linapaswa kufungwa kwa digest ikiwa sera yako ya usambazaji inasema hivyo, na wasifu uwe ule uliopitiwa, si nakala ambayo mtu ameihariri mahali pake kwenye mwenyeji.
Kusoma pekee hapa kunamaanisha kontena haiwezi kubadilisha faili zako kwenye mwenyeji; haimaanishi kontena haiwezi kusoma ufunguo wa faragha uliouweka. Hiyo ndiyo dhumuni lote la upachikaji, na ndiyo sababu ruhusa za faili, umiliki na jinsi siri ilivyofika kwa mwenyeji bado ni muhimu. Kamwe usipitishe nenosiri kwenye mstari wa amri wala usilipake kwenye tabaka la picha, kwa sababu zote mbili hubaki mahali ambapo huwezi kusafisha baadaye.
Uwezo, entrypoint na mtego kati yao
Mipangilio miwili inahitajika na hufanya kazi zisizohusiana. NET_ADMIN huruhusu uendeshaji wa violesura na njia ndani ya nafasi ya majina ya kontena. Ingizo la kifaa /dev/net/tun huruhusu mchakato kufungua kifaa cha handaki kabisa. Kutoa kimoja bila kingine hutoa kushindwa wazi, ambayo ni rahisi: kifaa cha TUN kinachokosekana hushindwa wakati wa kufungua, ilhali uwezo unaokosekana hushindwa wakati mteja anajaribu kusanidi kiolesura.
Hakuna kimoja kinachohalalisha privileged: true. Kontena yenye upendeleo hupata uwezo wote pamoja na ufikiaji wa vifaa, na huo ni mto mkubwa zaidi kuliko unaohitajika na mzigo huu wa kazi. marejeleo ya upendeleo na uwezo wa mazingira ya utekelezaji hufafanua umbali wa mto huo. Ikiwa chart au chapisho la blogu linaomba hivyo, kwanza angalia kama hitaji lilikuwa njia ya kifaa iliyokosekana au uwezo uliokosekana.
Kubatilisha entrypoint ni sehemu inayouma. Kuita openvpn moja kwa moja ni sahihi kwa picha ya kawaida na si sahihi kwa picha yoyote ya bidhaa ambayo hati yake ya kuanzisha huandaa kanuni za ukuta wa moto, faili za kisuluhishi au vitambulisho kabla ya kuendesha daemon. Kubatilisha hati hiyo kunaruka maandalizi na kukuacha ukirekebisha hitilafu za handaki iliyoinuka katika nafasi ya majina iliyosanidiwa nusu.
Endesha mteja mbele na umruhusu awe mchakato mkuu wa kontena. Mchakato unaojigeuza daemon hutoka mara moja, kontena huanza upya kwa mzunguko, na kumbukumbu unazohitaji zimetawanyika kati ya uanzishaji upya unaofanana wote.
Thibitisha kutoka ndani ya nafasi ya majina, si kutoka kwa mwenyeji
Inua stack, thibitisha kwenye kumbukumbu kwamba mteja alifikia hali iliyounganishwa, kisha chunguza nafasi ya majina inayoshikilia handaki kwa kweli.
docker compose up -d
docker compose logs --tail 40 vpn
docker compose exec vpn ip -br addr
docker compose exec vpn ip route
Orodha ya anwani inapaswa kuonyesha kiolesura cha handaki chenye anwani kutoka kwenye dimbwi, na jedwali la njia linapaswa kuonyesha marudio yaliyosukumwa yakielekea humo. Ikiwa kiolesura hakipo, mteja hakufika kamwe hatua ya kukiunda. Ikiwa kipo lakini hakuna njia inayokitumia, mahali pa kuangalia ni push au chaguo za njia.
Kisha jaribu marudio unayojali, kutoka nafasi ya majina inayopaswa kutumia handaki, ukitumia programu na si ping pekee. Utatuzi wa majina ni kushindwa tofauti kunakostahili kujaribiwa kwa uwazi: anwani ya DNS iliyosukumwa haisahihishi kisuluhishi cha kontena yenyewe, na mteja huru anayepuuza push atatatua majina kupitia kile ambacho picha imesanidi.
Hali iliyokatwa ni sehemu ya mkataba
Tabia ya kuunganisha upya inahitaji ukaguzi wake, kwa sababu sera ya kuanza upya inathibitisha mchakato huanza upya na haisemi chochote kuhusu kile trafiki inachofanya katikati. Simamisha handaki, jaribu marudio yaliyokusudiwa na uangalie kama muunganisho unakataliwa, unaning'inia au unafanikiwa kimya kupitia njia ya kawaida ya kontena. Matokeo ya mwisho ndiyo muhimu, na hayaonekani kwenye kumbukumbu nzuri.
Ikiwa mzigo wa kazi haupaswi kamwe kutumia njia ya kawaida, unde hilo kwa uwazi kwa kanuni za ukuta wa moto na ishara ya utayari ndani ya nafasi ya majina. Kill switch ni sera unayoandika na kuijaribu, si sifa unayorithi kwa kuendesha mteja kwenye kontena.
Mwisho, kumbuka mpaka: njia hizi zinaishi katika nafasi ya majina ya kontena na hazibadilishi jedwali la uelekezaji la mwenyeji. Kanuni za upelekaji, tafsiri na ukuta wa moto za Docker zinabaki kuwa sehemu ya njia ya nje, na bandari iliyochapishwa si kiolesura cha VPN.