Rhowch gleient VPN mewn cynhwysydd a chewch un gofod enwau ag twnnel y tu mewn iddo, nid gwesteiwr sy'n llwybro ei holl draffig trwy VPN. Mae'r rhain yn brosiectau ar wahân, a'u trin fel un yw'r ffordd y mae cynwysyddion yn troi'n freintiedig ar ddamwain. Dim ond y cyntaf y mae'r llawlyfr hwn yn ei gwmpasu: un ddelwedd a adolygwyd, un proffil gwarchodedig, a phroses gleient wedi'i chyfyngu i'w gofod enwau rhwydwaith ei hun.

Dechreuwch o arteffact y mae rhywun eisoes wedi'i gymeradwyo. Mae'r camau isod yn tybio delwedd sy'n cynnwys y gweithredadwy openvpn a phroffil cleient cyflawn gyda'i dystysgrif a'i ddeunydd allwedd eisoes wedi'u datrys y tu mewn i'r mownt. Nid ydynt yn adeiladu meddalwedd, yn bathu cardiau adnabod nac yn cwmpasu amgylcheddau heb root na chynwysyddion Windows brodorol, ac mae pob un ohonynt yn newid yr ateb.

Beth mae'r cynhwysydd yn ei gael ac na chaiff ei gael

Cadwch y proffil a phopeth y mae'n cyfeirio ato mewn cyfeiriadur lleol â chaniatadau cyfyngedig, wedi'i fowntio'n ddarllen yn unig. Rhaid i lwybrau cymharol y tu mewn i'r proffil ddatrys o fewn y mownt hwnnw; mae hynny'n fanylyn y mae pobl yn ei golli pan fydd tystysgrif un cyfeiriadur uwchben y proffil ac na fydd y cynhwysydd byth yn ei gweld.

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"]

Mae'r ffeil hon yn rhoi tri pheth ac nid yw'n gofyn am ddim arall. Dylid pinio cyfeiriad y ddelwedd â digest os yw eich polisi defnyddio'n dweud hynny, a'r proffil ddylai fod yr un a adolygwyd yn hytrach na chopi a olygwyd yn ei le ar y gwesteiwr.

Mae darllen yn unig yma'n golygu na all y cynhwysydd newid eich ffeiliau ar y gwesteiwr; nid yw'n golygu na all y cynhwysydd ddarllen yr allwedd breifat a fowntiwyd gennych. Dyna holl bwynt y mownt, a dyna hefyd pam mae caniatadau ffeil, perchnogaeth a'r ffordd y daeth y gyfrinach i'r gwesteiwr yn dal i fod o bwys. Peidiwch byth â throsglwyddo cyfrinair ar y llinell orchymyn nac â'i bobi i mewn i haen delwedd, oherwydd mae'r ddau yn goroesi mewn lleoedd na allwch eu glanhau'n ddiweddarach.

Galluoedd, entrypoint a'r trap rhyngddynt

Mae angen dau osodiad ac maent yn gwneud gwaith heb gysylltiad. Mae NET_ADMIN yn caniatáu trin rhyngwynebau a llwybrau y tu mewn i ofod enwau'r cynhwysydd. Mae'r cofnod dyfais /dev/net/tun yn caniatáu i'r broses agor y ddyfais twnnel o gwbl. Mae rhoi'r naill heb y llall yn cynhyrchu methiant clir, sy'n gyfleus: mae dyfais TUN sydd ar goll yn methu wrth agor, tra bod gallu sydd ar goll yn methu pan fydd y cleient yn ceisio ffurfweddu'r rhyngwyneb.

Nid yw'r naill na'r llall yn cyfiawnhau privileged: true. Mae cynhwysydd breintiedig yn cael pob gallu ynghyd â mynediad i ddyfeisiau, ac mae hynny'n grant llawer mwy na'r hyn y mae'r llwyth gwaith hwn ei angen. Mae'r cyfeirnod ar freintiau a galluoedd yr amgylchedd rhedeg yn esbonio pa mor bell y mae'r grant hwnnw'n cyrraedd. Os yw chart neu bost blog yn gofyn amdano, gwiriwch yn gyntaf ai llwybr dyfais sydd ar goll neu allu sydd ar goll oedd y gofyniad mewn gwirionedd.

Y newid i entrypoint yw'r rhan sy'n brathu. Mae galw openvpn yn uniongyrchol yn gywir ar gyfer delwedd blaen ac yn anghywir ar gyfer unrhyw ddelwedd gynnyrch y mae ei sgript gychwyn yn paratoi rheolau wal dân, ffeiliau datryswr neu gardiau adnabod cyn gweithredu'r daemon. Mae newid y sgript honno'n hepgor y paratoad ac yn eich gadael i ddadfygio twnnel a gododd mewn gofod enwau hanner ffurfweddedig.

Rhedwch y cleient yn y blaendir a gadewch iddo fod yn brif broses y cynhwysydd. Mae proses sy'n daemonigo'n gadael ar unwaith, mae'r cynhwysydd yn ailgychwyn mewn dolen, ac mae'r logiau sydd eu hangen arnoch wedi'u gwasgaru ar draws ailgychwyn sy'n edrych yn unfath.

Gwiriwch o fewn y gofod enwau, nid oddi wrth y gwesteiwr

Codwch y stac, cadarnhewch yn y log fod y cleient wedi cyrraedd cyflwr cysylltiedig, ac yna archwiliwch y gofod enwau sy'n dal y twnnel mewn gwirionedd.

docker compose up -d
docker compose logs --tail 40 vpn
docker compose exec vpn ip -br addr
docker compose exec vpn ip route

Dylai'r rhestr gyfeiriadau ddangos rhyngwyneb twnnel â chyfeiriad o'r pwll, a dylai'r tabl llwybrau ddangos y cyrchfannau gwthiedig yn pwyntio ato. Os yw'r rhyngwyneb ar goll, ni chyrhaeddodd y cleient bwynt ei greu. Os yw'n bodoli ond nad oes unrhyw lwybr yn ei ddefnyddio, y push neu'r opsiynau llwybr yw'r lle i chwilio.

Yna profwch y gyrchfan sy'n bwysig i chi, o'r gofod enwau a ddylai ddefnyddio'r twnnel, gan ddefnyddio'r rhaglen yn hytrach na phing yn unig. Mae datrys enwau'n fethiant ar wahân sy'n werth ei brofi'n benodol: nid yw cyfeiriad DNS gwthiedig yn diweddaru datryswr cynhwysydd ar ei ben ei hun, a bydd cleient annibynnol sy'n anwybyddu'r push yn datrys enwau trwy'r hyn a ffurfweddodd y ddelwedd.

Mae'r cyflwr datgysylltiedig yn rhan o'r contract

Mae angen ei wiriad ei hun ar ymddygiad ailgysylltu, oherwydd mae polisi ailgychwyn yn profi bod y broses yn ailgychwyn ac nid yw'n dweud dim am yr hyn y mae'r traffig yn ei wneud yn y cyfamser. Ataliwch y twnnel, rhowch gynnig ar y gyrchfan arfaethedig, a gwyliwch a yw'r cysylltiad yn cael ei wrthod, yn hongian, neu'n llwyddo'n dawel trwy lwybr arferol y cynhwysydd. Y canlyniad olaf yw'r un sy'n bwysig, ac mae'n anweledig mewn log iach.

Os na chaiff y llwyth gwaith byth ddefnyddio'r llwybr arferol, dyluniwch hynny'n benodol gyda rheolau wal dân a signal parodrwydd o fewn y gofod enwau. Mae kill switch yn bolisi rydych yn ei ysgrifennu a'i brofi, nid yn briodwedd rydych yn ei hetifeddio o redeg cleient mewn cynhwysydd.

Yn olaf, cofiwch y ffin: mae'r llwybrau hyn yn byw yng ngofod enwau'r cynhwysydd ac nid ydynt yn disodli tabl llwybro'r gwesteiwr. Mae rheolau anfon ymlaen, cyfieithu a wal dân Docker yn parhau'n rhan o'r llwybr allanol, ac nid yw porthladd cyhoeddedig yn rhyngwyneb VPN.

Erthyglau cysylltiedig