OpenVPN dúró pẹ̀lú ẹ̀dùn errno 2 nípa /dev/net/tun nígbà tí lsmod ń ṣe àkójọ mọ́dùlù tun lọ́nà àìdàà. Àwọn òtítọ́ méjèèjì tọ́ ní àkókò kan náà. Mọ́dùlù ń pèsè awakọ̀ kan, ọ̀nà tí oníbàárà ń ṣí ni kókó ẹ̀rọ tí ohun mìíràn gbọ́dọ̀ dá. Mímú wọn bí ohun kan náà ni ìdí tí àtúnṣe tí ó hàn gbangba ti gbígbé mọ́dùlù wọlé lẹ́ẹ̀kan sí i kò fi ohunkóhun yí padà.

Ohun méjì, olúwa méjì tí ó yàtọ̀

Mọ́dùlù kérnélì àti kókó ẹ̀rọ jẹ́ ohun olómìnira pẹ̀lú àyípoyípo ìgbésí-ayé olómìnira. Gbígbé mọ́dùlù wọlé ń forúkọ awakọ̀, àti nínú ẹ̀rọ tí ó ní devtmpfs kérnélì béèrè kí a dá kókó tí ó bá a mu. Nínú ẹ̀rọ tí kò ní devtmpfs kò sí ohun tí ń dá ohunkóhun, awakọ̀ sì jókòó níbẹ̀ láìsí ọ̀nà kankan tí ń tọ́ka sí i. Mọ́dùlù lè wà lórí ẹ̀rọ, ní ìlera, àti pé a kò lè dé ọ̀dọ̀ rẹ̀ rárá nípasẹ̀ ẹ̀rọ fáìlì ní àkókò kan náà.

Ìdí niyẹn tí ọ̀rọ̀ àṣìṣe àti àkójọ mọ́dùlù kò fi tako ara wọn. Oníbàárà ń ṣí ọ̀nà kan, ọ̀nà kò sí, kérnélì sì ń dá ENOENT padà kí a tó béèrè lọ́wọ́ awakọ̀ tun. Gbígbé mọ́dùlù wọlé lẹ́ẹ̀kan sí i kò lè tún ọ̀nà tí ó sọnù ṣe, dídá ọ̀nà náà kò sì lè tún awakọ̀ tí ó sọnù ṣe.

lsmod | grep -w tun
stat -c "%F %t:%T" /dev/net/tun
grep " /dev " /proc/mounts

devtmpfs lòdì sí mknod tí ó ṣe kedere

Ní deede àwọn ọ̀nà méjì ń dá kókó yẹn, pípe èwo ni ó yẹ kí ó ṣe ojúṣe sọ fún ọ ohun tí ó yẹ kí o túnṣe. devtmpfs ń jẹ́ kí kérnélì dá àwọn kókó ẹ̀rọ nínú àpẹẹrẹ tí a gbé kalẹ̀, udev sì ń fi ẹ̀tọ́ àti àwọn ìyọ̀ǹda kún wọn. mknod tí ó ṣe kedere ni ọ̀nà afọwọ́ ṣe fún àwọn àwòrán àti àwọn ààyè orúkọ níbi tí kò ti sí ẹyọ kan nínú àwọn méjèèjì tí ń ṣiṣẹ́ nígbà ìbẹ̀rẹ̀.

Fi àwọn èsì wé, kì í ṣe àwọn èrò. Bí devtmpfs bá wà ní /dev tí kókó kò sì sí, awakọ̀ kì í ṣe èyí tí o rò, tàbí ohun kan yọ kókó náà kúrò lẹ́yìn ìbẹ̀rẹ̀. Bí /dev bá jẹ́ àkójọpọ̀ déédéé nínú rootfs tí a ṣí, kò sí ọ̀nà aládàáṣiṣẹ́ kankan, ẹni tí ó kọ́ àwòrán náà sì gbọ́dọ̀ dá kókó náà.

stat -c "%F major=%t minor=%T" /dev/net/tun
# expect: character special file major=a minor=c8

Níbi tí kò ti sí ọ̀nà kan nínú àwọn méjèèjì tí ń ṣiṣẹ́, a gbọ́dọ̀ fi ọwọ́ ṣe kókó náà, ìtẹ̀léntẹ̀lén sì ṣe pàtàkì. Kọ́ àkójọpọ̀ òbí ní àkọ́kọ́, nítorí mknod kò lè dá a, lẹ́yìn náà ẹ̀rọ lẹ́tà, lẹ́yìn náà ipò tí ó fi í sílẹ̀ kí root nìkan lè kọ̀wé sí i. Gbé mọ́dùlù wọlé lẹ́ẹ̀kan sí i kí o tó dá kókó, kí o sì yọ ọ̀nà tí ó wà kúrò lẹ́yìn tí ls ti fi hàn pé àkójọpọ̀ ni, kì í ṣe ẹ̀rọ.

sudo modprobe tun
sudo mkdir -p /dev/net
sudo mknod /dev/net/tun c 10 200
sudo chmod 600 /dev/net/tun
ls -l /dev/net/tun

Olùyàtọ̀ tí ó yára jùlọ ni irú tí stat ń ròyìn, àkójọpọ̀ sì wà ní ọ̀nà yẹn ni ìyàlẹ́nu tí ó wọ́pọ̀ jùlọ nínú àwọn àwòrán kékeré. mkdir tí a kọ pẹ̀lú èrò rere nínú Dockerfile fi irú rẹ̀ sílẹ̀, kò sì sí ìwọ̀n gbígbé mọ́dùlù tí yóò fi ẹ̀rọ lẹ́tà rọ́pò àkójọpọ̀. Major 10 pẹ̀lú minor 200 ni bára tí a forúkọ fún tun, tí a fi hàn ní hẹ́sàdẹ́símà bí a àti c8.

Àmì mẹ́rin, ìdí mẹ́rin

Ìdí mẹ́rin ń ṣàlàyé fẹ́rẹ̀ẹ́ gbogbo ọ̀ràn, ọ̀kọ̀ọ̀kan sì ń fi àmì tí ó yàtọ̀ sílẹ̀ nínú àwọn àkọsílẹ̀. Bẹ̀rẹ̀ pẹ̀lú àyíká ìbẹ̀rẹ̀. Àwọn àwòrán tí kò ní díísìkì, àwọn pátákó tí a fi sínú àti àwọn ìpele initramfs kì í fi devtmpfs tàbí /devtí udev ń ṣàkóso kalẹ̀, nítorí náà kò sí ìlànà tí ń kọ kókó náà. Lẹ́yìn náà ka àwọn àṣàyàn gbígbé kalẹ̀ ti ohun tí ó ń gbà /dev, nítorí nodev ń jẹ́ kí ọ̀nà wà nígbà tí ó kọ̀ láti ṣí i, gbígbé bind tí a gbà láti olúwa tí a ti mú le ń gbé àsíá yẹn láìkéde ara rẹ̀. Gbígbé kíkà-nìkan ń kùnà ní àkọ́kọ́ àti ní ariwo ńlá: mknod ń dá EROFS padà níbẹ̀, nígbà tí EPERM túmọ̀ sí pé ìlànà kò ní agbára, kì í ṣe pé ẹ̀rọ fáìlì ń dáàbò bo ara rẹ̀. Níkẹyìn, runtime kọ́ńtẹ́nà tí ó ní /dev tmpfs tirẹ̀ nílò kí a fi kókó náà sínú ààyè orúkọ tirẹ̀, cgroup ẹ̀rọ rẹ̀ sì gbọ́dọ̀ gbà bára major àti minor.

Ṣàyẹ̀wò ìpele ìlànà kí o tó tún àwọn ìyọ̀ǹda padà. SELinux àti AppArmor lè kọ̀ ṣíṣí kan tí gbogbo àbùdá fáìlì gbà, kíkọ̀ yẹn sì ń farahàn nínú àkọsílẹ̀ àyẹ̀wò, kì í ṣe nínú èsì oníbàárà. Ìyípadà ìyọ̀ǹda tí kò farahàn nínú kíkọ̀ rárá jẹ́ àkókò tí a lò lórí ìpele tí kò tọ́ rárá.

sudo journalctl -k -n 20 --no-pager
sudo ausearch -m AVC -ts recent | tail -5

Fi ojú-ìwọlé ṣe àfihàn rẹ̀, kì í ṣe àkójọ

Àkójọ tí ó ṣàṣeyọrí fi hàn pé ọ̀nà kan wà àti pé kò sí ohun mìíràn. Ṣí kókó tun tí ó ní ìlera fún kíkà, ìpè náà yóò padà wá pẹ̀lú àṣìṣe, nítorí ẹ̀rọ kò ní ìtumọ̀ kíkà, kì í sì ṣe fáìlì déédéé. Àṣìṣe yẹn ni àmì àṣeyọrí níbí, pípè é mọ̀ sì ń dá ọ lẹ́kọ̀ọ́ láti má ṣe lé e bí àbùkù.

head -c 1 /dev/net/tun
head: error reading '/dev/net/tun': File descriptor in bad state

Ìdánwò tí ó pinnu ń dá ojú-ìwọlé kan, nítorí ó ń dán awakọ̀, kókó àti àwọn àǹfààní rẹ wò ní ìgbésẹ̀ kan. Bí àfikún bá ṣàṣeyọrí tí ìsopọ̀ sì farahàn, àwọn mẹ́tẹ̀ẹ̀ta ń ṣiṣẹ́. Nígbà tí ó kùnà, errno ń ya àwọn ìdí: ENOENT túmọ̀ sí pé kò sí kókó tí a lè lò, EPERM ń tọ́ka sí agbára, àsíá gbígbé kalẹ̀ tàbí ìlànà, EBUSY sì túmọ̀ sí pé ìlànà mìíràn ti ni ojú-ìwọlé náà.

sudo ip tuntap add dev tun7 mode tun
ip -brief link show tun7
sudo ip tuntap del dev tun7 mode tun

Ṣe ìdánwò yẹn nínú àyíká tí ó ń kùnà ní tòótọ́, nítorí ẹ̀yà iṣẹ́, kọ́ńtẹ́nà tàbí iṣẹ́ tí a ṣètò lè gbé àpapọ̀ agbára tí ó yàtọ̀ sí ti shell ìwọlé rẹ. Ìdánwò tí ó kọjá nínú àyíká tí kò tọ́ kò fi ohunkóhun hàn nípa èyí tí ń kùnà.

Nígbà tí ẹ̀rọ kì í ṣe ìṣòro

Bí ìdánwò ojú-ìwọlé bá ṣàṣeyọrí tí oníbàárà sì ṣì ń kùnà, ìṣòro tí ó kù ni prófáìlì, àyíká iṣẹ́ tàbí ọ̀nà, ẹ̀rọ sì dára. Ìyẹn ni àkókò láti dá ṣíṣàtúnṣe àwọn kókó ẹ̀rọ dúró, nítorí àwọn ìyípadà mìíràn ń ṣàfikún jìnnà sí ẹ̀rọ tí ń ṣiṣẹ́.

Ṣe àwọn àyẹ̀wò márùn-ún kan náà ní gbogbo ìgbà dípò dídá tuntun: mọ́dùlù wà lórí ẹ̀rọ láìsí mọ́dùlù alátakò, ọ̀nà jẹ́ ẹ̀rọ lẹ́tà pẹ̀lú major àti minor tí ó tọ́, àwọn àṣàyàn gbígbé kalẹ̀ mọ́, àyíká ìlànà gbé agbára, àti kíkọ̀ ìlànà wà ní àkókò ìkùnà. Àbùkù tí ó yè já àwọn márùn-ún kò ṣe ìṣòro ẹ̀rọ, ohunkóhun tí ìfiránṣẹ́ sọ.

Àwọn àpilẹ̀kọ tó jọra