VPN клиентийг контейнерт хийвэл дотроо хонгил бүхий нэг нэрийн орон зай гарна, бүх трафикаа VPN-ээр чиглүүлдэг хост биш. Эдгээр нь тусдаа төсөл бөгөөд тэдгээрийг нэг гэж үзэх нь контейнерууд санамсаргүйгээр давуу эрхтэй болох зам юм. Энэхүү гарын авлага зөвхөн эхнийхийг хамарна: нэг шалгасан образ, нэг хамгаалагдсан профайл, өөрийн сүлжээний нэрийн орон зайд хязгаарлагдсан клиент процесс.

Хэн нэгэн аль хэдийн зөвшөөрсөн артефактаас эхэл. Доорх алхмууд openvpn гүйцэтгэх файл, гэрчилгээ болон түлхүүрийн материал нь холболтын дотор аль хэдийн шийдэгдсэн бүрэн клиент профайл агуулсан образыг таамаглана. Тэд програм хангамж бүтээдэггүй, итгэмжлэл олгодоггүй, rootгүй ажиллах орчин болон Windows-ийн төрөлх контейнеруудыг хамардаггүй бөгөөд тус бүр нь хариултыг өөрчилдөг.

Контейнер юу авах, юу авахгүй

Профайл болон түүний дурдсан бүх зүйлийг хязгаарлагдмал эрхтэй локал хавтаст хадгалж, зөвхөн унших байдлаар холбоно. Профайл доторх харьцангуй замууд тэр холболтын дотор шийдэгдэх ёстой; гэрчилгээ профайлаас нэг хавтас дээгүүр байх ба контейнер түүнийг хэзээ ч хардаггүй үед хүмүүсийн алддаг нарийн ширийн зүйл энэ юм.

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

Тэр файл гурван зүйл өгдөг бөгөөд өөр юу ч шаарддаггүй. Хэрэв таны байршуулалтын бодлого ингэж зааж байвал образын лавлагааг digest-ээр бэхлэх ёстой, профайл нь шалгасан байх ёстой, хост дээр хэн нэгэн газар дээр нь засварласан хуулбар биш.

Энд зөвхөн унших гэдэг нь контейнер таны хост дээрх файлыг өөрчлөх боломжгүй гэсэн үг; таны холбосон хувийн түлхүүрийг уншиж чадахгүй гэсэн үг биш. Энэ бол холболтын бүх утга бөгөөд файлын эрх, өмчлөл, нууц хост дээр хэрхэн ирсэн нь одоо ч чухал хэвээр байна. Нууц үгийг тушаалын мөрөнд хэзээ ч бүү дамжуул, образын давхаргад бүү шатаа, учир нь хоёулаа дараа нь цэвэрлэж чадахгүй газар үлддэг.

Чадвар, entrypoint болон тэдгээрийн хоорондох урхи

Хоёр тохиргоо хэрэгтэй бөгөөд тэд хамааралгүй ажил хийдэг. NET_ADMIN контейнерын нэрийн орон зайд интерфейс, маршрутыг удирдахыг зөвшөөрдөг. /dev/net/tun төхөөрөмжийн бичлэг процессэд хонгилын төхөөрөмжийг огт нээхийг зөвшөөрдөг. Нэгийг нөгөөгүйгээр өгөх нь тодорхой алдаа үүсгэдэг бөгөөд энэ нь тохиромжтой: байхгүй TUN төхөөрөмж нээх үед бүтэлгүйтдэг, харин байхгүй чадвар клиент интерфейсийг тохируулах гэж оролдоход бүтэлгүйтдэг.

Эдгээрийн аль нь ч privileged: true-ийг зөвтгөхгүй. Давуу эрхтэй контейнер бүх чадвар болон төхөөрөмжийн хандалтыг авдаг бөгөөд энэ нь энэ ачаалалд хэрэгтэйгээс хамаагүй том зөвшөөрөл юм. ажиллах орчны давуу эрх, чадварын лавлагаа энэ зөвшөөрөл хэр хол хүрдгийг тайлбарлана. Хэрэв chart эсвэл блогийн нийтлэл үүнийг шаардвал эхлээд шаардлага нь үнэхээр байхгүй төхөөрөмжийн зам эсвэл байхгүй чадвар байсан эсэхийг шалга.

entrypoint-ийг дарж бичих нь хазах хэсэг юм. openvpn-ийг шууд дуудах нь энгийн образд зөв, демоноо ажиллуулахаас өмнө галын хананы дүрэм, resolver файл эсвэл итгэмжлэл бэлтгэдэг аливаа бүтээгдэхүүн образд буруу. Тэр скриптийг дарж бичих нь бэлтгэлийг алгасаж, хагас тохируулсан нэрийн орон зайд боссон хонгилыг дибаг хийхэд үлдээнэ.

Клиентийг урд талд ажиллуулж, контейнерын үндсэн процесс байг. Демон болдог процесс тэр даруй гарч, контейнер давталтад дахин эхэлж, хэрэгтэй логууд бүгд ижил харагдах дахин эхлэлүүдийн хооронд тархана.

Нэрийн орон зайн дотроос шалга, хостноос биш

Стекийг өргөж, клиент холбогдсон төлөвт хүрснийг логт баталж, дараа нь хонгилыг үнэхээр барьж буй нэрийн орон зайг шалга.

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

Хаягийн жагсаалтад сангаас авсан хаягтай хонгилын интерфейс харагдах ёстой, маршрутын хүснэгтэд түүн рүү заасан түлхэгдсэн очих газрууд харагдах ёстой. Хэрэв интерфейс байхгүй бол клиент түүнийг үүсгэх цэгт хэзээ ч хүрээгүй. Хэрэв байгаа боловч ямар ч маршрут ашиглахгүй бол хайх газар нь push эсвэл маршрутын сонголтууд юм.

Дараа нь таны чухал очих газрыг хонгил ашиглах ёстой нэрийн орон зайгаас, зөвхөн ping биш програмаар туршиж үз. Нэр шийдэх нь тусдаа бүтэлгүйтэл бөгөөд түүнийг тодорхой турших нь зүйтэй: түлхэгдсэн DNS хаяг контейнерын resolver-ийг өөрөө шинэчилдэггүй, push-ыг үл тоомсорлосон бие даасан клиент нэрсийг образ тохируулсан зүйлээр шийднэ.

Салсан төлөв нь гэрээний нэг хэсэг

Дахин холбогдох зан үйл өөрийн шалгалт шаарддаг, учир нь дахин эхлүүлэх бодлого процесс дахин эхэлж байгааг баталдаг бөгөөд энэ хооронд трафик юу хийхийг огт хэлдэггүй. Хонгилыг зогсоож, зорьсон очих газрыг туршаад, холболт татгалзаж байна уу, гацаж байна уу, эсвэл контейнерын ердийн маршрутаар чимээгүй амжилттай болж байна уу гэдгийг ажигла. Сүүлийн үр дүн нь чухал бөгөөд эрүүл логт харагдахгүй.

Хэрэв ачаалал ердийн замыг хэзээ ч ашиглах ёсгүй бол галын хананы дүрэм, нэрийн орон зайн доторх бэлэн байдлын дохиогоор тодорхой зохион бүтээ. Kill switch нь таны бичиж, туршдаг бодлого бөгөөд контейнерт клиент ажиллуулснаар өвлөдөг шинж чанар биш.

Эцэст нь хил хязгаарыг сана: эдгээр маршрутууд контейнерын нэрийн орон зайд амьдардаг бөгөөд хостны маршрутжуулалтын хүснэгтийг орлуулдаггүй. Docker-ийн дамжуулах, орчуулах, галын хананы дүрэм гадаад замын хэсэг хэвээр байх бөгөөд нийтэлсэн порт нь VPN интерфейс биш.

Холбоотой нийтлэлүүд