რას გადაიტანს სინამდვილეში persist-tun და persist-key OpenVPN-ში
ორივე პარამეტრი რბილ გადატვირთვას მოიცავს ცოცხალი პროცესის შიგნით. ისინი არ ინარჩუნებენ ინტერფეისს გაჩერების შემდეგ და არ არიან ტრაფიკის დაბლოკვის პოლიტიკა.
სერვისის გაჩერება ინტერფეისს შლის მაშინაც, როცა persist-tun დაყენებულია. ეს პარამეტრის დოკუმენტაციის მიხედვით მუშაობაა და არა ჩავარდნა. პარამეტრი აღწერს ერთ გადატვირთვის გზას მომუშავე პროცესის შიგნით, და systemctl stop არ არის ეს გზა.
წაიკითხეთ ორი სახელი ერთად და დიზაინი ცხადი გახდება. ერთი ინარჩუნებს დესკრიპტორს, მეორე ინარჩუნებს გასაღების მასალას, და ორივე არსებობს იმის გამო, რაც ხდება პრივილეგიების მიტოვების შემდეგ.
ორი რესურსი და გადატვირთვა, რომელსაც ისინი ეკუთვნიან
OpenVPN საკუთარ გადატვირთვას აცხადებს ორ ჩვეულებრივ სიტუაციაში. გამოკვეთილი SIGUSR1 ამას აკეთებს, და მკვდარი პარტნიორით გამოწვეული ping-restart იგივეს აკეთებს. ორივე პროცესს ცოცხლად ტოვებს და კავშირის დაყენებას ხელახლა უშვებს, და სწორედ იქ იმსახურებს პარამეტრები თავიანთ ადგილს.
| Event | TUN/TAP device | Key and auth files | Addresses and routes | up/down hooks |
|---|---|---|---|---|
Soft reset, from SIGUSR1 or from a ping-restart the daemon sends itself | survives only with persist-tun | survive only with persist-key | survive with the device, otherwise rebuilt | run again only when restart hooks are enabled |
Configuration reload, SIGHUP | recreated | re-read from disk | rebuilt once the device returns | run again |
| Service stop | lost | re-read at the next start | removed | run at the next start |
მხოლოდ რბილი გადატვირთვის სტრიქონია ის, რასაც ეს ორი პარამეტრი ცვლის, და სამუშაო, რომელსაც ისინი გამოტოვებენ, დატვირთულ კავშირზე ძვირი ნაწილია. მოწყობილობის ხელახლა გახსნა რღვევს მასზე მიმაგრებულ მისამართებსა და მარშრუტებს, და მათი ხელახლა აგება შეიძლება ჩამოყაროს პაკეტები, რომლებიც გადატვირთვის დაწყებისას გზაში იყო. გაჩერება ანადგურებს იმავე ობიექტებს მათი შენარჩუნების არავითარი პარამეტრის გარეშე.
რატომ არსებობენ ეს პარამეტრები საერთოდ
გამაგრებული OpenVPN სერვერი ჩვეულებრივ root-ად იწყება, ხსნის თავის გასაღებებსა და მოწყობილობას, შემდეგ უპრივილეგიო მომხმარებელზე გადადის. ამ გადასვლის შემდეგ ზოგი ოპერაცია უბრალოდ ქრება. 0600 რეჟიმის გასაღების ფაილის წაკითხვა, ქსელური ინტერფეისის შექმნა ან მარშრუტების შეცვლა ყველა შეიძლება უარყოფილ იქნას.
persist პარამეტრების გარეშე, პარტნიორი, რომელიც საკმარისად დიდხანს დუმს ping-restart-ის გამოსაწვევად, ზუსტად იმ ოპერაციებს აიძულებდა. ხელახალი დაკავშირება ჩავარდებოდა, თუმცა კონფიგურაციაში არაფერი შეცვლილა. პროცესი ისე გამოიყურებოდა, თითქოს უმიზეზოდ კვდებოდა, და ჟურნალი ქსელური შეცდომის ნაცვლად ნებართვის შეცდომას აჩვენებდა.
მათთან ერთად რბილი გადატვირთვა იმას ხელახლა იყენებს, რაც პრივილეგირებულ ფაზას უკვე მიუღია. არავითარი მაგია არ არის და პროცესი არაფერს გადაიტანს. რესურსების მიღება უბრალოდ გადაიდება.
წაიკითხეთ პირველი შეცდომა და არა ბოლო
როცა გადატვირთვა ვერ ხერხდება, წაიკითხეთ პირველი შეცდომა ბოლოის ნაცვლად. დაცული გასაღები, auth ფაილი, ინტერფეისის ioctl და გარე კაუჭი ოთხი განსხვავებული რესურსია. ერთის შენარჩუნება არაფერს ამბობს დანარჩენებზე წვდომაზე. კაუჭი, რომელიც firewall-ის ხელსაწყოს იძახებს, კვლავ საჭიროებს იმ პრივილეგიებს, რომლებსაც ეს ხელსაწყო მოითხოვს.
კაუჭებს თავისი გადამრთველი აქვთ. OpenVPN-ის სახელმძღვანელო persist პარამეტრებს აკავშირებს up-restart-ს, რომელიც წყვეტს, გაუშვას თუ არა up და down სკრიპტები ხელახლა გადატვირთვის შემდეგ. ამიტომ ზემოთ დარჩენილი ინტერფეისი არაფერს გეუბნებათ იმაზე, განახლდა თუ არა თქვენი resolver-ის ინტეგრაცია.
# which restart path just happened?
journalctl -u openvpn-client@office --since '10 min ago' | grep -E 'SIGUSR1|ping-restart|Restart pause|NOTE:'
# did the interface survive, and do its routes still exist?
ip -brief link show tun0
ip route show dev tun0
ეს ორი ბრძანება ორი ჩავარდნის რეჟიმს წამებში აცალკევებს. არსებული ინტერფეისი, რომელსაც მარშრუტები აკლია, კაუჭის ან მარშრუტის პრობლემაა. გაქრა ინტერფეისი ნიშნავს, რომ პროცესი ნამდვილად დასრულდა.
შენარჩუნებული ინტერფეისი kill switch არ არის
თუ მოთხოვნაა, რომ ტრაფიკი არასდროს გავიდეს გვირაბის გარეთ, შენარჩუნებული მოწყობილობა ამას არ იძლევა. მეორე მისამართების ოჯახის მარშრუტები, მეორე ნაგულისხმევი მარშრუტი და შემთხვევა, როცა პროცესი სრულად გადის, ყველა პარამეტრის ფარგლებს გარეთ რჩება.
ორ მოთხოვნას ცალკე მოეპყარით. გვირაბის ობიექტის შენარჩუნება ხელახალი დაკავშირებებს შორის დემონისთვის მოხერხებულობაა. გასვლის დაბლოკვა, როცა გვირაბი გამორთულია, არის firewall-ის პოლიტიკა საკუთარი წესებითა და საკუთარი ტესტით. მათი შერევა ქმნის კონფიგურაციას, რომელიც დამცავად გამოიყურება და იქცევა როგორც საუკეთესო ძალისხმევის ხელახალი დაკავშირება.
დაარქვით მოვლენას სახელი დიაგნოსტიკამდე. რბილი გადატვირთვა, წარუმატებელი კავშირის მცდელობა და სერვისის გაჩერება სამი მოვლენაა სამი ქცევით, და მხოლოდ პირველია ის, რასაც ეს პარამეტრები აღწერენ.