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-ті тікелей шақыру қарапайым бейне үшін дұрыс және іске қосу скрипті демонды іске қоспас бұрын firewall ережелерін, шешуші файлдарды немесе тіркелгі деректерін дайындайтын кез келген өнім бейнесі үшін қате. Сол скриптті қайта анықтау дайындықты өткізіп жібереді және жартылай конфигурацияланған атаулар кеңістігінде көтерілген туннельді жөндеуге қалдырады.

Клиентті алдыңғы планда іске қосыңыз және ол контейнердің негізгі процесі болсын. Демондалатын процесс бірден шығады, контейнер циклде қайта іске қосылады, ал қажет журналдар бірдей көрінетін қайта іске қосулар арасында шашырайды.

Атаулар кеңістігінің ішінен тексеріңіз, хосттан емес

Стекті көтеріңіз, журналда клиенттің қосылған күйге жеткенін растаңыз, содан кейін туннельді шын мәнінде ұстап тұрған атаулар кеңістігін қарап шығыңыз.

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 мекенжайы контейнердің шешушісін өздігінен жаңартпайды, ал push-ты елемейтін дербес клиент атауларды бейне конфигурациялаған нәрсе арқылы шешеді.

Ажыратылған күй келісімнің бөлігі

Қайта қосылу мінез-құлқы өз тексерісін қажет етеді, өйткені қайта іске қосу саясаты процестің қайта іске қосылатынын дәлелдейді және осы аралықта трафиктің не істейтіні туралы ештеңе айтпайды. Туннельді тоқтатыңыз, көзделген межені сынап көріңіз және қосылым қабылданбай ма, ілініп қала ма, әлде контейнердің қарапайым маршруты арқылы үнсіз сәтті бола ма, соны бақылаңыз. Соңғы нәтиже маңызды, және ол сау журналда көрінбейді.

Егер жүктеме қарапайым жолды ешқашан пайдаланбауы тиіс болса, оны firewall ережелерімен және атаулар кеңістігінің ішіндегі дайындық сигналымен анық жобалаңыз. Kill switch — сіз жазатын және тексеретін саясат, контейнерде клиент іске қосу арқылы мұраға алатын қасиет емес.

Соңында, шекараны ұмытпаңыз: бұл маршруттар контейнердің атаулар кеңістігінде өмір сүреді және хосттың маршруттау кестесін алмастырмайды. Docker-дің қайта бағыттау, трансляция және firewall ережелері сыртқы жолдың бөлігі болып қалады, ал жарияланған порт VPN интерфейсі емес.

Қатысты мақалалар