Kā ieslēgt TUN/TAP LXC konteinerī
TUN/TAP ir Linux virtuālie tīkla interfeisi, kurus izmanto VPN risinājumi (piemēram, OpenVPN, WireGuard “tun” režīmā, dažas tīkla laboratorijas un maršrutēšanas scenāriji). Ja mēģināt palaist VPN LXC konteinerī un saņemat kļūdas kā “/dev/net/tun: No such file or directory”, “Operation not permitted” vai “Cannot open TUN/TAP dev”, gandrīz vienmēr iemesls ir tas, ka konteinerim nav pieejama ierīce /dev/net/tun vai nav atļauju piekļūt šai ierīcei. Šajā pamācībā iziesim cauri drošam un paredzamam ceļam: kā pārbaudīt hostu, kā pievienot ierīci konteinerim, kā sakārtot cgroup/AppArmor, un kā pārliecināties, ka viss strādā arī pēc pārstartēšanas.
LXC konteineri bieži tiek izmantoti kā viegls virtualizācijas slānis uz Linux serveriem. Ja jūs plānojat tīkla tuneļus, VPN vai maršrutēšanu, vispirms pārliecinieties, ka jūsu servera platforma dod pietiekamu elastību. Šādiem uzdevumiem parasti izvēlas VPS, kur jūs kontrolējat hosta konfigurāciju. Ja vajag maksimālu veiktspēju vai īpašu tīkla topoloģiju, noder serveru īre. Savukārt, ja jūsu mērķis ir vienkārši mājaslapa bez VPN, bieži pietiek ar hostingu.
Galvenā doma: TUN/TAP ir “ierīce” hosta pusē (kernel līmenī), un konteinerim tā ir jāredz kā /dev/net/tun, turklāt konteinerim jābūt atļaujai šo ierīci atvērt. Atļauju slāņi parasti ir vairāki: (1) hosta kernel modulim jābūt ielādētam, (2) /dev/net/tun jāeksistē, (3) konteinerim jābūt pievienotai ierīcei, (4) cgroup noteikumiem jāatļauj character device (c) ar pareizo major/minor, (5) drošības profils (AppArmor/SELinux) nedrīkst bloķēt.
1) Pārbaude uz hosta: vai TUN ir pieejams
Uz hosta pārbaudiet, vai ir ielādēts tun modulis un vai ierīce eksistē. Parasti pietiek ar “ls -l /dev/net/tun” un “lsmod | grep tun”. Ja /dev/net direktorijas nav, izveidojiet to un pārliecinieties, ka ierīce ir pareizi izveidota. Daudzās sistēmās udev to izdara automātiski, bet dažos minimālos hostos tas var nebūt.
# hostā ls -l /dev/net/tun lsmod | grep tun modprobe tun # ja /dev/net/tun nav: mkdir -p /dev/net mknod /dev/net/tun c 10 200 chmod 600 /dev/net/tun
Major/minor vērtības TUN ierīcei parasti ir c 10:200. Ja šīs vērtības atšķiras jūsu sistēmā (reti, bet iespējams), pārbaudiet dokumentāciju vai “stat /dev/net/tun”. Ja hosta pusē /dev/net/tun strādā, varat pāriet pie konteinera iestatījumiem.
2) Pievienojiet /dev/net/tun konteinerim (LXC config)
LXC konteinerim ir konfigurācijas fails (bieži /var/lib/lxc/NAME/config vai līdzīgs), kurā var pievienot ierīces un atļaujas. Pirmais solis ir “mount entry” jeb bind-mount, lai konteinerī parādās /dev/net/tun. Otrais solis ir atļaut konteinerim izmantot character device. Atkarībā no cgroup versijas (v1/v2) sintakse atšķiras, bet ideja ir vienāda: atļaut “c 10:200 rwm”.
# LXC config piemēri (pielāgojiet savam ceļam) # 1) iemontējam ierīci konteinerī lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=file 0 0 # 2) atļaujam ierīci cgroup (cgroup v1) lxc.cgroup.devices.allow = c 10:200 rwm # 2b) cgroup v2 sintakse (dažās sistēmās) lxc.cgroup2.devices.allow = c 10:200 rwm
Ja izmantojat “unprivileged container”, dažkārt vajag vēl precīzākas atļaujas vai jāizmanto “lxc.apparmor.profile = unconfined” (vai pielāgots profils). Tomēr “unconfined” ir plašas tiesības, tāpēc labāk sākt ar minimālām izmaiņām: atļaut ierīci un pārliecināties, ka profils to nebloķē.
3) AppArmor/SELinux un “Operation not permitted” kļūdas
Ja /dev/net/tun konteinerī redzams, bet VPN joprojām saka “Operation not permitted”, problēma bieži ir drošības profilā. Ubuntu hostos tas biežāk ir AppArmor, bet dažās CentOS/RHEL bāzēs var būt SELinux. LXC ar AppArmor izmanto profilu “lxc-container-default” vai līdzīgu. Dažos gadījumos TUN tiek bloķēts, ja profils ir pārāk stingrs.
Praktiska pieeja diagnostikai: (1) pārliecinieties, ka konteinerī /dev/net/tun eksistē, (2) pārbaudiet, vai process vispār var atvērt ierīci, (3) paskatieties hosta drošības logus. AppArmor atteikumi bieži ir redzami kernel logā vai audit žurnālos. Ja redzat tiešu AppArmor deny uz /dev/net/tun, izveidojiet pielāgotu profilu vai, testēšanas nolūkiem, īslaicīgi izmantojiet “unconfined”, lai apstiprinātu cēloni.
# konteinerī ls -l /dev/net/tun cat /dev/net/tun # jāatgriež "File descriptor in bad state" vai līdzīgi, nevis "No such file"
Ja izmantojat SELinux (hostā), un tas bloķē piekļuvi, jums var būt jāpielāgo SELinux politikas vai jāizmanto režīms, kas atļauj konkrēto ierīci. Šeit nav viena universāla komanda, jo tas atkarīgs no distro un politikas, bet simptomi parasti ir “permission denied” pat tad, ja cgroup un mount ir pareizi.
4) Privileged vs unprivileged konteineri un “nesting”
Privileged konteineris (root konteinerī ~ root hostā) parasti ir vienkāršāks TUN/TAP gadījumā, bet tas ir arī riskantāks drošības ziņā. Unprivileged konteineri ir drošāki, bet ierīču piekļuves piešķiršana var prasīt papildus soļus. Ja jūs būvējat VPN koncentratoru vai maršrutētāju konteinerī, izvērtējiet, vai labāk to darīt VM/VPS līmenī, nevis konteinerī, lai samazinātu “edge-case” problēmas.
Dažos gadījumos VPN vajag arī net admin spējas (capabilities), piemēram, lai pievienotu maršrutus vai konfigurētu iptables/NFT. Tad konteinerim var būt nepieciešams CAP_NET_ADMIN (un reizēm CAP_NET_RAW). LXC ļauj pievienot capabilities, taču dariet to apzināti: piešķiriet tikai to, kas nepieciešams konkrētajam servisam.
# LXC config (piemērs, ja vajag) lxc.cap.keep = net_admin net_raw
5) Pārbaude: vai TUN tiešām darbojas un VPN startējas
Pēc konfigurācijas izmaiņām pārstartējiet konteineri. Pārbaudiet, vai /dev/net/tun eksistē, un tad palaidiet savu VPN servisu. OpenVPN parasti izveido interfeisu “tun0”, WireGuard var izveidot “wg0” (tas nav tas pats, bet dažos režīmos arī iesaistās TUN). Pārbaudiet ar “ip a” un pārliecinieties, ka interfeiss parādās.
Ja interfeiss izveidojas, bet trafiks neiet, tā jau ir maršrutēšana un ugunsmūris: pārbaudiet IP forwarding, NAT un noteikumus. LXC vidē NAT bieži ir jātaisa hostā (atkarībā no topoloģijas), jo konteineris var nebūt pilnībā tiesīgs manipulēt ar hosta tīklu. Tāpēc, ja jūsu mērķis ir “VPN + NAT uz internetu”, iepriekš izplānojiet, kur tieši notiek NAT — hostā vai konteinerī.
Biežākās kļūdas un drošības ieteikumi
Visbiežākās kļūdas ir: (1) hostā nav tun moduļa vai /dev/net/tun nav izveidots, (2) ierīce nav iemontēta konteinerī, (3) cgroup neļauj “c 10:200”, (4) AppArmor/SELinux bloķē atvēršanu, (5) konteinerim trūkst CAP_NET_ADMIN, lai uzliktu maršrutus. Ja ejat secīgi pa slāņiem, problēmu parasti var atrast 5–10 minūšu laikā.
Drošības ieteikums: nelieciet “unconfined” uz visiem konteineriem pēc noklusējuma. Ja jums vajag TUN tikai vienam servisam, dodiet atļaujas tikai tam konteinerim, un piešķiriet minimālas capabilities. Ideālā gadījumā VPN servisu izolē atsevišķā konteinerī/VM, lai samazinātu risku, ja VPN vai tā konfigurācija kādreiz tiek kompromitēta.