OpenVPN yn Docker kin /dev/net/tun net iepenje: wat der ûntbrekt
In TUN-node en de netwurkfeardigens binne twa aparte tastimmingen. Iepenje beide, en lês dan de folgjende flater op syn eigen betingsten ynstee fan deselde oplossing te werheljen.
Konteinerôfbyldings kinne alle OpenVPN-binêre en konfiguraasjebestanden befetsje dy’t se nedich hawwe en dochs by de earste netwurkoanrop mislearje. De flater neamt /dev/net/tun omdat de applikaasje de kernel om in TUN-ynterface frege en de konteiner sawol de apparaatnode as de feardigens om ien te meitsjen miste. Dat binne twa aparte tastimmingen, en it reparearjen fan de iene lit de oare krekt wêr’t er wie.
Se skiede kostet foar elk ien opdracht. De flatermelding dêrnei fertelt jo by hokker grins jo eins stiene.
De apparaatnode en de feardigens binne twa doarren
De apparaatnode is in bestandssysteemobjekt, dus in konteiner moat dy yn syn eigen mount-namespace sjogge. De feardigens is in tastimming, dus it proses hat CAP_NET_ADMIN nedich yn ’e namespace dêr’t de ynterface makke wurdt. It trochjaan fan it apparaat sûnder de feardigens jout jo in node dy’t iepenet en in ioctl dy’t mislearret. It jaan fan de feardigens sûnder it apparaat lit de applikaasje net ta om hokker ding dan ek te iepenjen, en dêrom ferskine de twa meastentiids tegearre yn foarbylden.
De devices-ynstelling fan Docker mapt it hostapparaat yn ’e konteiner, wylst cap_add de feardigensset oanpast. In bind mount fan itselde paad set it bestân yn byld sûnder de semantyk fan apparaattoegong ta te passen.
Reprodusearje it bûten it Compose-bestân
Kontrolearje foar it bewurkjen fan de tsjinst dat de host it apparaat hat en dat in neaken konteiner in ynterface meitsje kin. De opdracht hjirûnder is bewust minimaal, en it iennige doel is om in hostprobleem fan in compose-probleem te skieden. As it mislearret, sil gjin inkele compose-wizing helpe.
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'
In ûntbrekkende node op de host betsjut dat de tun-module net beskikber is, wat in reparaasje oan ’e hostkant is en net oan ’e konteinerkant. In node dy’t bestiet mar net iepene wurde kin yn ’e konteiner wiist op apparaattoegong, en de melding sil permission denied sizze ynstee fan no such file. De folchoarder fan dy twa mislearrings is de hiele diagnoaze. Skriuw op hokker jo seagen foardat jo in flag feroarje.
De flaters nei TUN binne oare problemen
Sadree’t de ynterface ferskynt, hat de folgjende mislearring in oare eigner. Autentikaasjeflaters betsjutte dat de tunnel de server berikt hat en de oanmeldingen wegere binne, dus wizings oan ’e feardigens sille net helpe. In tunnel dy’t ta stân komt wylst applikaasjes noch mislearje, wiist op rûtes, trochstjoeren, DNS-oplossing yn ’e konteiner of de eigen netwurkynrjochting fan ’e konteiner. Elk dêrfan is in gewoane netwurkfrage dy’t de TUN-tastimming net beantwurdzje kin. It werheljen fan de oarspronklike test nei elke wizing hâldt de mislearrings derfan ôf om yn ien yndruk te smelten.
It kopiearjen fan elke ynstelling út in wurkjend foarbyld is hoe’t in minimale reparaasje in ûnlêsbere tsjinstdefinysje wurdt. Nim allinnich dy oer dy’t dizze útrulling nedich hat en skriuw op wêrom’t elk dêr is.
Kontrolearje de ynterface yn ’e konteiner
Kontrolearje de ynterface en de feardigensset fan binnenút de rinnende konteiner ynstee fan fan de host. De opdrachten hjirûnder litte de apparaatnode, de feardigenslist en oft in ynterface hielendal makke wurde kin sjen. Rin se yn deselde konteiner dy’t de klient rint, en ynstallearje it ark as it ôfbylding minimaal is.
ls -l /dev/net/tun
capsh --print | grep -i net_admin
ip link add dev tun9 type tun && ip link show tun9
In feardigens dy’t yn ’e bounding set sit mar ûntbrekt yn ’e effective set, hâldt him oars as ien dy’t nea jûn is, en capsh lit beide sjen. As de node bestiet en de feardigens der is wylst it meitsjen noch mislearret, twingt de runtime eat oars ôf, lykas in seccomp-profyl of in AppArmor-belied dat de operaasje beheint. Dat is in tredde grins, dokumintearre troch de runtime ynstee fan troch de applikaasje.
Skriuw de konteinerflags, it ôfbylding en de krekte flater fan elke poging op. De folgjende persoan dy’t dy notysje lêst, kin sjen hokker doar ticht wie sûnder it hiele ûndersyk te werheljen.