Pi როგორც VPN კლიენტი: ერთი მმართველი თუ საკუთარი სკრიპტი?
შეადარეთ NetworkManager-ის პროფილი ხელით დაწერილ კლიენტის სკრიპტს Raspberry Pi-ზე, სრული გვირაბის, DNS-ის, IPv6-ის და გვირაბის ჩავარდნისას ქცევის ჩათვლით.
Raspberry Pi-ს, რომელსაც მხოლოდ საკუთარი გამავალი ტრაფიკის დაცვა სჭირდება, ორი რეალისტური დიზაინი აქვს: მიეცით ქსელის მმართველს გვირაბის მფლობელობა, ან შეინახეთ სკრიპტი, რომელიც მას ფლობს. ორივეს შეუძლია ტრაფიკის ზიდვა. ისინი სხვადასხვა ადგილას ფუჭდებიან, და ის ჩავარდნა, რომლის დიაგნოსტიკაც ღამის ორ საათზე დისტანციურად შეგიძლიათ, სწორედ ის არის, რომლის არჩევაც ღირს. შეადარეთ ისინი მფლობელობით, იმით, თუ რას ნიშნავს სრული გვირაბი, როცა IPv6 და DNS ჩართულია, და იმით, თუ რა ხდება იმ წუთას, როცა გვირაბი ვარდება.
ორი მფლობელი ერთი გვირაბისთვის
დიზაინი A არის პროფილი სისტემის ქსელის მმართველის შიგნით: იმპორტირებული OpenVPN პროფილი ან მშობლიური WireGuard კავშირი, რომელსაც ჩატვირთვისას ააქტიურებს იგივე სერვისი, რომელიც Ethernet-სა და Wi-Fi-ს ხსნის. დიზაინი B არის თქვენი საკუთარი ერთეული, რომელიც კლიენტს უშუალოდ უშვებს, ცვლის რეზოლვერის კონფიგურაციას და აყენებს საკუთარ მარშრუტებსა და firewall-ის წესებს. ორივე ლეგიტიმური დიზაინია; ისინი განსხვავდებიან იმით, თუ ვის აქვს მარშრუტიზაციის ცხრილის შეცვლის უფლება.
ჩავარდნები განსხვავდებიან, რადგან მფლობელები განსხვავდებიან. A-ში, პროფილი, რომელიც არ აქტიურდება, ინტერფეისს აწეულს და გვირაბს ჩამოშვებულს ტოვებს, და მმართველის ჟურნალები ამიხსნიან, რატომ. B-ში, ნახევრად წარმატებული სკრიპტი ტოვებს მარშრუტებს, რომლებიც გადაურჩებიან მათ შემქმნელ პროცესს. ორივეს ერთად გაშვება ყველაზე ცუდი შედეგია: ორი პროცესი წერს ნაგულისხმევ მარშრუტს, ჩატვირთვისას ორი რეზოლვერის ცვლილება ეჯიბრება, და ბრუნვას ორი საიდუმლოების ნაკრები სჭირდება.
აირჩიეთ ერთი მფლობელი თითო გვირაბზე და გამორთეთ მეორე, სანამ რამეს გამოსცდით. ორი მფლობელი ასევე ნიშნავს ორ ადგილს, სადაც უნდა შეხედოთ, როცა გვირაბი აწეულია და არაფერი წყდება. ეს ერთი წესი ხელს უშლის Pi VPN-ის განხილვებში აღწერილი დამაბნეველი მდგომარეობების უმეტესობას.
რას ქმნის იმპორტი და რას არა
Raspberry Pi OS Bookworm-ზე და უფრო ახალ ვერსიებზე ქსელის კონფიგურაციის ნაგულისხმევი ხელსაწყო NetworkManager-ია, ამიტომ პროფილი კლიენტის გვირაბის ბუნებრივი სახლია. იმპორტს სჭირდება შესაბამისი დამატების დაყენება; მის გარეშე იმპორტი ფუჭდება შეტყობინებით მხარდაუჭერელი კავშირის ტიპის შესახებ, რაც გაჩერებისა და დამატების დაყენების პატიოსანი სიგნალია.
nmcli connection import type openvpn file ./provider.ovpn
nmcli connection show
nmcli --ask connection up id provider-name
იმპორტი ინახავს პროფილს. ის არ ამტკიცებს, რომ მეორე მხარე ხელმისაწვდომია, და არ იძლევა გარანტიას, რომ ფაილში ყველა მითითება გადაკეთებას გადაურჩა. წაიკითხეთ მიღებული კავშირი და შეამოწმეთ იდენტობისა და ნდობის მატარებელი ნაწილები: სერტიფიკატი, დისტანციური ჰოსტი და პორტი, და არის თუ არა პაროლი მოთხოვნილი თუ შენახული.
--ask-ით გააქტიურება პაროლის ფრაზას shell-ის ისტორიის გარეთ ინახავს საზიარო მანქანაზე. უყურადღებო Pi-სთვის საბოლოოდ მოგინდებათ, რომ პროფილი ჩატვირთვისას აიწიოს, რაც ცალკე გადაწყვეტილებაა ხელით ერთხელ აწევისგან.
სრული გვირაბი, ორივე დიზაინის შედარებით
სრული გვირაბი მარშრუტებზეა მტკიცება და არა განზრახვაზე, და ორივე დიზაინი მას სხვადასხვანაირად გამოხატავს. პროფილის მიდგომა მმართველს სთხოვს ნაგულისხმევი მარშრუტისა და რეზოლვერის პარამეტრების დაყენებას; სკრიპტის მიდგომა აკეთებს იმას, რასაც სკრიპტი ამბობს, მათ შორის არაფერს. არც ერთი დიზაინი არ ფარავს IPv6-ს, თუ არ უთხარი, და ხელუხლებელი IPv6 ნაგულისხმევი მარშრუტი სიამოვნებით გაიტანს ტრაფიკს გვირაბის გარეთ, სანამ IPv4 სრულყოფილად გამოიყურება.
ip -4 route get 198.51.100.23
ip -6 route show default
resolvectl query example.org
მარშრუტის ძიებისთვის გამოიყენეთ დოკუმენტაციის მისამართი და შეცვალეთ იმ ჰოსტით, რომლის შემოწმებაც ნებადართულია. პირველი ბრძანება გვიჩვენებს, რომელ ინტერფეისს გამოიყენებდა Pi ჩვეულებრივი დანიშნულებისთვის; მეორე გვიჩვენებს, არსებობს თუ არა ჯერ კიდევ IPv6 ნაგულისხმევი მარშრუტი; მესამე ამტკიცებს, რომელი რეზოლვერი უპასუხა. წაიკითხეთ სამივე, სანამ სრული გვირაბის შესახებ რომელიმე მტკიცებას დაუჯერებთ.
თუ პროვაიდერის ინსტრუქციები სრულ გვირაბს გვპირდება, მაგრამ IPv6 ნაგულისხმევი მარშრუტი რჩება, Pi ჟონავს. გამორთეთ IPv6 ზედა რგოლზე ან სთხოვეთ პროფილს მოითხოვოს ის, და გადაწყვიტეთ გააზრებულად, ნაცვლად იმისა, რომ მოგვიანებით აღმოაჩინოთ.
ღია ჩავარდნა დახურულის წინააღმდეგ
როცა გვირაბი ვარდება, მარშრუტიზაციის ცხრილი, რომელიც კარგავს ნაგულისხმევ მარშრუტს, უბრალოდ უბრუნდება ფიზიკურ ზედა რგოლს, და ტრაფიკი ღიად გრძელდება. ეს ღია ჩავარდნაა, და ეს ორივე დიზაინის ნაგულისხმევი ქცევაა, თუ რამე ხელს არ უშლის. ადამიანების უმეტესობა ამას კვირების შემდეგ აღმოაჩენს firewall-ის ჟურნალის კითხვისას.
დახურული ჩავარდნა გაკარგვინებთ დისტანციურ წვდომას, როცა გვირაბი ჩამოშვებულია, ამიტომ მართვის ბილიკისთვის გააზრებული გამონაკლისი სჭირდება. ერთი გზაა წესი, რომელიც გვირაბის გარეთ მხოლოდ VPN-ის პარტნიორის მისამართს უშვებს:
sudo nft add table inet vpnkill
sudo nft 'add chain inet vpnkill out { type filter hook output priority 0; policy accept; }'
sudo nft add rule inet vpnkill out oifname != "tun0" ip daddr != 203.0.113.24 reject
შეადარეთ ოპერაციული ხარჯი პატიოსნად. პროფილი ჩვეულებრივ ვერ გამოხატავს ამ წესს, ამიტომ დახურული ჩავარდნა გიბიძგებთ სკრიპტის დიზაინისკენ ან პატარა ერთეულისკენ, რომელიც წესს გვირაბისგან დამოუკიდებლად აყენებს. ნებისმიერ შემთხვევაში, ერთი კვირა ჩაწერეთ უარები: ჩუმი უარი ზუსტად გატეხილ სერვისს ჰგავს, და მრიცხველი დაგჭირდებათ, როცა მომხმარებელი შეგატყობინებთ, რომ ერთმა საიტმა ჩატვირთვა შეწყვიტა.
არჩევანი ეკრანის გარეშე Pi-სთვის
თუ იმიჯი უკვე უშვებს NetworkManager-ს, გვირაბს არაფერი ეგზოტიკური არ სჭირდება, და გსურთ, რომ ავტომატურად მიჰყვეს ზედა რგოლს, აიღეთ პროფილი. თუ გჭირდებათ პოლიტიკური მარშრუტიზაცია, დანიშნულების მიხედვით არჩეული რამდენიმე გვირაბი, ან დახურული ჩავარდნის წესი, რომელიც უნდა არსებობდეს გვირაბის აწევამდე, აიღეთ სკრიპტი და დაეუფლეთ მის ყველა ნაწილს, ჩატვირთვის რიგისა და გასუფთავების ჩათვლით. ორი დიზაინის შერევა უფრო ძვირია, ვიდრე რომელიმე მათგანი ცალკე.
მათ შორის გადასვლა ძირითადად რიგის საკითხია: გამორთეთ ძველი მფლობელი, დაადასტურეთ, რომ არც ერთი მოძველებული მარშრუტი ან რეზოლვერის ჩანაწერი არ გადარჩა, შემდეგ ჩართეთ ახალი და ორჯერ გადატვირთეთ. ერთმა გადატვირთვამ შეიძლება დამალოს რბოლა, რომელსაც მეორე ამჟღავნებს. დაასრულეთ Pi-ს და არა გვირაბის გამოცდით: ამოხსენით სახელი, წამოიღეთ რამე IPv4-ით, წამოიღეთ IPv6-ით, თუ შეინახეთ, შემდეგ ჩამოაგდეთ გვირაბი და დაადასტურეთ, რომ თქვენ მიერ არჩეული ქცევა ნამდვილად ხდება. ip link-ში ინტერფეისი ტესტის დასაწყისია, არა დასასრული.