Docker ичиндеги OpenVPN: минималдуу кардарга керектүү аткаруу келишими
Текшерилген образ, бир корголгон профиль, TUN жеткиликтүүлүгү жана NET_ADMIN. Контейнер эмне алат, эмнени албашы керек жана түнөл иштеп жатканын кантип далилдөө керек.
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 интерфейси эмес.