Защо предупреждението на vpnc за изчистване на маршрута се появява в контейнер
Изчистването на кеша на маршрутите е остатък от ядро, което вече не пази този кеш; грешката „само за четене“ идва от монтирането в контейнера, не от тунела.
Свежите журнали на контейнера често завършват със оплакване Read-only file system относно /proc/sys/net/ipv4/route/flush и този ред бива обвиняван за тунел, който може да е напълно здрав. Записът зад него е насочен към ядрен вход, който вече не прави нищо полезно, след като кешът на маршрутите IPv4 изчезна. Вътре в контейнер /proc/sys се монтира само за четене, затова пренасочването се отхвърля, преди да попадне някаква стойност, и обвивката отпечатва това отхвърляне. Работещ тунел може да печата това предупреждение, докато старият ред остава в скрипта, а --privileged никога не прави записа смислен.
Какво се опитваше да изчисти скриптът
По-старите скриптове за свързване завършваха с изчистване на кеша: запис на стойност в ядрен контролен файл и молба към стека IPv4 да изхвърли кеша си за маршрутизиране, така че нов маршрут на тунела да бъде избран, без да се чака остарели записи да изтекат. Файлът беше адресиран под /proc/sys/net/ipv4/, което правеше операцията пренасочване на обвивката, а не команда за маршрутизиране. Ядро 3.6 премахна този кеш, а с него и причината изчистването да съществува. Нищо в текущия път на данните не зависи от този запис.
Самият вход оцеля като наследен файл само за запис, така че скрипт, който все още пише в него, достига до реален път и реална проверка на правата. На хост записът връща успех и не променя нищо. В контейнер същото пренасочване среща /proc/sys само за четене и се проваля с EROFS, което обвивката отпечатва като съобщение за файлова система само за четене. На ядра, където пътят наистина липсва, формулировката става No such file or directory и заключението не се променя.
Двете грешки казват различни неща и разликата си заслужава да се пази. Read-only file system означава, че ядрото е достигнало до вход и е отказало записа; No such file or directory означава, че входът е изчезнал. Нито едно от съобщенията не съобщава за устройството на тунела, маршрутите или разрешаването на имена, затова нито едно не може да оправдае повече привилегии.
Подредбата е това, което кара съобщението да изглежда причинно. Скриптът за свързване инсталира маршрути, променя състоянието на интерфейса и пренаписва разрешаването на имена, преди да стигне до изчистването в края, затова последният отпечатан ред е редът, който хората цитират, дори когато всяка важна стъпка е върнала успех. Тунел, който се установява и пренася трафик, докато печата това предупреждение, пасва точно на механизма по-горе.
Проверете монтирането и маршрута, преди да добавите привилегия
Три прочита разделят козметично предупреждение от истински провал: дали инсталираният скрипт все още носи реда, как е монтиран /proc/sys и накъде всъщност отива трафикът на приложението. Изпълнете ги в същото именно пространство на контейнера или на хоста, където се появи предупреждението, защото проверка на несвързана машина отговаря на друг въпрос.
grep -n 'ipv4/route/flush' /usr/share/vpnc-scripts/vpnc-script
findmnt -no OPTIONS /proc/sys
ip -4 route get 10.20.5.10Отговорът от grep е по-слаб, отколкото изглежда, защото съвпадение доказва, че редът присъства, а не че се изпълнява без защита; поддържан скрипт може да носи записа в защита, която го прескача. findmnt -no OPTIONS /proc/sys решава монтирането пряко, а ro в този изход означава, че всеки запис под тази точка се отхвърля, каквото и да прави скриптът. След това търсенето на маршрут показва дали дестинацията, от която приложението се нуждае, се разрешава през интерфейса на тунела или през шлюза на контейнера по подразбиране. Търсене, което избира шлюза по подразбиране, означава, че тунелът е вдигнат и нищо не маршрутизира в него, което е проблем с маршрутизирането, а не с привилегиите.
Откъде всъщност идва поправката
Поддържаната поправка живее в скрипта, а не във флаговете на контейнера. upstream vpnc-script промени как обработва тази операция, затова сравнете копието в образа с текущия upstream и актуализирайте чрез пакета или изграждането на образа, което го доставя. Ръчно редактиран файл в работещ контейнер не подлежи на преглед и няма да оцелее до следващото изграждане.
--privileged е документиран като даващ всички възможности плюс широк достъп до устройства — голяма отстъпка за съобщение, което не променя нищо, затова назовете липсващата възможност, ако наистина липсва. След актуализацията повторете търсенето на маршрут и оставете приложение да използва тунела, защото тихият журнал и работещата връзка са отделни резултати.