რატომ ჩნდება vpnc-ის მარშრუტის გასუფთავების გაფრთხილება კონტეინერში
მარშრუტების ქეშის გასუფთავება იმ ბირთვის ნარჩენია, რომელიც ამ ქეშს აღარ ინახავს; მხოლოდ-წაკითხვის შეცდომა კონტეინერის მონტაჟიდან მოდის და არა გვირაბიდან.
ახალი კონტეინერის ჟურნალები ხშირად /proc/sys/net/ipv4/route/flush-ის შესახებ Read-only file system ჩივილით მთავრდება და ეს ხაზი გვირაბს აბრალებენ, რომელიც შეიძლება სრულიად ჯანმრთელი იყოს. მის უკან არსებული ჩაწერა ბირთვის იმ ჩანაწერს მიმართავს, რომელიც 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.10grep-ის პასუხი უფრო სუსტია, ვიდრე ჩანს, რადგან პოვნა ამტკიცებს ხაზის არსებობას და არა იმას, რომ ის დაცვის გარეშე მუშაობს; მხარდაჭერილ სკრიპტს შეუძლია ჩაწერა იმ დაცვის შიგნით ატაროს, რომელიც მას გამოტოვებს. findmnt -no OPTIONS /proc/sys მონტაჟს უშუალოდ წყვეტს და ამ გამომავალში ro ნიშნავს, რომ ამ წერტილის ქვემოთ ყველა ჩაწერა უარყოფილია, რაც არ უნდა გააკეთოს სკრიპტმა. შემდეგ მარშრუტის ძებნა აჩვენებს, წყდება თუ არა აპლიკაციისთვის საჭირო დანიშნულება გვირაბის ინტერფეისით თუ კონტეინერის ნაგულისხმევი კარიბჭით. ნაგულისხმევი კარიბჭის ამომრჩევი ძებნა ნიშნავს, რომ გვირაბი ავიდა და მასში არაფერი მარშრუტიზდება, რაც მარშრუტიზაციის პრობლემაა და არა პრივილეგიის.
საიდან მოდის სინამდვილეში გამოსწორება
მხარდაჭერილი გამოსწორება სკრიპტში ცხოვრობს და არა კონტეინერის დროშებში. upstream vpnc-script-მა შეცვალა, როგორ ამუშავებს ამ ოპერაციას, ამიტომ შეადარეთ გამოსახულების შიგნით არსებული ასლი მიმდინარე upstream-ს და განაახლეთ იმ პაკეტის ან გამოსახულების აწყობის მეშვეობით, რომელიც მას აწვდის. მოქმედ კონტეინერში ხელით რედაქტირებული ფაილი გადახედვადი არ არის და შემდეგ აწყობას ვერ გადაურჩება.
--privileged დოკუმენტირებულია როგორც ყველა შესაძლებლობისა და მოწყობილობებზე ფართო წვდომის მიმნიჭებელი, რაც დიდი დათმობაა შეტყობინებისთვის, რომელიც არაფერს ცვლის, ამიტომ დაასახელეთ ნაკლული შესაძლებლობა, თუ ის ნამდვილად აკლია. განახლების შემდეგ გაიმეორეთ მარშრუტის ძებნა და მისცეთ აპლიკაციას გვირაბის გამოყენების საშუალება, რადგან მშვიდი ჟურნალი და მომუშავე კავშირი ცალკეული შედეგებია.