Контейнер образдары керектүү бардык OpenVPN бинардык жана конфигурациялык файлдарын алып жүрүп, биринчи тармактык чакырууда эле ийгиликсиз болушу мүмкүн. Ката /dev/net/tun атын атайт, анткени колдонмо ядродон TUN интерфейсин сурады, ал эми контейнерде түзмөк түйүнү да, аны түзүү мүмкүнчүлүгү да жок болчу. Бул эки өзүнчө уруксат, жана бирөөнү оңдоо экинчисин так калган жеринде калтырат.

Аларды бөлүү үчүн ар бирине бир буйрук керек. Кийинки ката билдирүүсү сизге чындыгында кайсы чекте турганыңызды айтат.

Түзмөк түйүнү жана мүмкүнчүлүк эки эшик

Түзмөк түйүнү — файлдык системанын объектиси, ошондуктан контейнер аны өзүнүн mount аттар мейкиндигинде көрүшү керек. Мүмкүнчүлүк — уруксат, ошондуктан процесске интерфейс түзүлө турган аттар мейкиндигинде CAP_NET_ADMIN керек. Түзмөктү мүмкүнчүлүксүз берүү сизге ачылган түйүн жана ийгиликсиз болгон ioctl берет. Мүмкүнчүлүктү түзмөксүз берүү колдонмону эч нерсени ачууга жөндөмсүз калтырат, ошондуктан мисалдарда экөө көбүнчө чогуу көрүнөт.

Dockerдин devices параметри хост түзмөгүн контейнерге чагылдырат, ал эми cap_add мүмкүнчүлүктөр жыйнагын жөндөйт. Ошол эле жолдун bind mount файлды түзмөккө кирүү семантикасын колдонбой көрүнүү талаасына чыгарат.

Аны Compose файлынан тышкары кайталаңыз

Кызматты түзөтүүнүн алдында хостто түзмөк бар экенин жана таза контейнер интерфейс түзө аларын текшериңиз. Төмөнкү буйрук атайын эң аз, анын жалгыз максаты хост маселесин compose маселесинен бөлүү. Эгер ал ийгиликсиз болсо, compose'тогу эч бир өзгөртүү жардам бербейт.

ls -l /dev/net/tun
docker run --rm --cap-add NET_ADMIN --device /dev/net/tun:/dev/net/tun alpine sh -c 'apk add -q iproute2 && ip tuntap add dev tun9 mode tun && ip link show tun9'

Хостто түйүндүн жоктугу tun модулу жеткиликсиз экенин билдирет, бул контейнердин эмес, хост тараптын оңдоосу. Түйүн бар болсо да контейнердин ичинде ачылбаса, ал түзмөккө кирүүнү көрсөтөт, жана билдирүү no such file эмес, permission denied дейт. Бул эки ийгиликсиздиктин тартиби — бүт диагноз. Кайсынысын көргөнүңүздү флагды өзгөртүүнүн алдында жазып коюңуз.

TUN дон кийинки каталар башка маселелер

Интерфейс пайда болушу менен кийинки ийгиликсиздиктин ээси башка болот. Аутентификация каталары туннель серверге жеткенин жана эсептик маалыматтар четке кагылганын билдирет, ошондуктан мүмкүнчүлүк өзгөртүүлөрү жардам бербейт. Колдонмолор дагы эле ийгиликсиз болуп жатканда туннель түзүлсө, ал маршруттарга, жиберүүгө, контейнердин ичиндеги DNS чечилишине же контейнердин өз тармактык жайгашуусуна көрсөтөт. Алардын ар бири TUN уруксаты жооп бере албаган кадимки тармактык суроо. Ар бир өзгөртүүдөн кийин баштапкы тестти кайталоо ийгиликсиздиктердин бир таасирге биригишине жол бербейт.

Иштеп жаткан мисалдан ар бир параметрди көчүрүү — эң аз оңдоону окулбаган кызмат аныктамасына айландырган жол. Ушул жайгаштырууга керектүүлөрдү гана алыңыз жана ар бири эмне үчүн бар экенин жазып коюңуз.

Контейнердин ичинде интерфейсти текшериңиз

Интерфейс жана мүмкүнчүлүктөр жыйнагын текшериңиз хосттон эмес, иштеп жаткан контейнердин ичинен. Төмөнкү буйруктар түзмөк түйүнүн, мүмкүнчүлүктөр тизмесин жана интерфейсти такыр түзүүгө болобу, ошону көрсөтөт. Аларды клиентти иштеткен ошол эле контейнерде иштетиңиз, ал эми образ эң аз болсо, куралдарды орнотуңуз.

ls -l /dev/net/tun
capsh --print | grep -i net_admin
ip link add dev tun9 type tun && ip link show tun9

Bounding set'те бар, бирок effective set'те жок мүмкүнчүлүк эч качан берилбеген мүмкүнчүлүктөн башкача аракеттенет, жана capsh экөөнү тең көрсөтөт. Түйүн бар жана мүмкүнчүлүк бар болсо да түзүү дагы эле ийгиликсиз болсо, аткаруу чөйрөсү башка нерсени колдонот, мисалы, операцияны чектеген seccomp профили же AppArmor саясаты. Бул колдонмо эмес, аткаруу чөйрөсү документтеген үчүнчү чек.

Контейнер флагдарын, образды жана ар бир аракеттин так катасын жазып коюңуз. Ошол жазууну кийинки окуган адам бүт иликтөөнү кайталабай эле кайсы эшик жабык болгонун айта алат.

Тектеш макалалар