ერთ წესს შეუძლია დააშოროს დაშვებული VPN პული დანიშნულების დიაპაზონს, გეითვეის სხვა საქმიანობის შეფერხების გარეშე. თავად წესი მოკლეა; იმას, იმუშავებს თუ არა, განსაზღვრავს hook, რომელშიც ის ცხოვრობს, და მისი პოზიცია ჯაჭვში. ამ ორში შეცდომა იძლევა firewall-ს, რომელიც სწორად გამოიყურება და არათანმიმდევრულად იქცევა. დაიწყეთ იმით, თუ რას აკეთებს პაკეტი, როცა წესი მას ხედავს.

რას ემთხვევა წესი სინამდვილეში

წესი ერთდროულად სამ რამეს ემთხვევა: შემავალი ინტერფეისი, წყაროს პრეფიქსი და დანიშნულების პრეფიქსი. სამივე უნდა იყოს ჭეშმარიტი სანამ drop გამოვიყენებთ, და ეს ხდის მას ვიწროს. მისი როგორც ერთი გამოსახულების, ისე წაკითხვა უფრო ადვილია, ვიდრე სამ ცალკე პოლიტიკად.

ინტერფეისის დამთხვევა გამოყოფს გადაგზავნილ კლიენტურ ტრაფიკს გეითვეის საკუთარი კავშირებისგან. მის გარეშე, წესი, რომელიც მხოლოდ წყაროს პულს ასახელებს, იმოქმედებს იმ პაკეტებზეც, რომლებსაც გეითვეი თავად ქმნის ამ მისამართიდან, თუ ეს ოდესმე მოხდება. წყაროს პრეფიქსი პოლიტიკას დაშვებულ კლიენტებზე ზღუდავს, ხოლო დანიშნულების პრეფიქსი — ერთ დიაპაზონზე. წაიკითხეთ წესი როგორც გადაკვეთა და არა როგორც სია.

ჩაწერეთ სამი მნიშვნელობა სანამ რამეს შეცვლით: გვირაბის ინტერფეისის სახელი, პული, რომელსაც სერვერი ანაწილებს, და პრეფიქსი, რომლის უარყოფასაც აპირებთ. რომელიმეში ბეჭდვითი შეცდომა იძლევა წესს, რომელიც სუფთად იპარსება და არაფერს იცავს. შეინახეთ ეს სამი მნიშვნელობა ცვლილების ჩანაწერში წესის გვერდით.

hook განსაზღვრავს, ვისზე ვრცელდება წესი

netfilter-ის ჯაჭვი მიმაგრებულია hook-ზე, და სწორედ hook განსაზღვრავს, რომელ პაკეტებს ხედავს ჯაჭვი. forward hook ხედავს ტრაფიკს, რომელიც გეითვეიზე გადამისამართდება, და სწორედ ეს არის კლიენტიდან დანიშნულებამდე ტრაფიკი. ჯაჭვში დანარჩენი ყველაფერი სხვა აუდიტორიაზეა მიმართული.

input hook ხედავს თავად გეითვეიზე მიმართულ ტრაფიკს, ამიტომ იქ განთავსებული წესი მართავს მისივე სერვისებზე წვდომას და არა ტრანზიტს. output hook ხედავს ტრაფიკს, რომელსაც გეითვეი თავად წარმოქმნის, და ეს საპირისპიროა იმისა, რაც კლიენტური პულის პოლიტიკას სჭირდება. ჯაჭვების სახელები თვითნებური იარლიყებია, რომლებიც წესების ავტორმა აირჩია, ამიტომ hook არ გამოიტანოთ სახელიდან. შეამოწმეთ, სად არის ჯაჭვი მიმაგრებული, სანამ ივარაუდებთ, რას შეიძლება ემთხვეოდეს.

HookTraffic it seesRight for this policy
inputAddressed to the gatewayNo, that is the host's own services
forwardRouted through the gatewayYes, for client-to-destination traffic
outputGenerated by the gatewayNo, that is the opposite direction

მიმაგრების წაკითხვა ერთსტრიქონიანი შემოწმებაა, რომელიც ხელს უშლის წესის მოხვედრას ჯაჭვში, რომელიც პაკეტს არასდროს ხედავს.

განათავსეთ წესი ფართო accept-ამდე

წესები თანმიმდევრობით ფასდება და პირველი განაჩენი იმარჯვებს. ჯაჭვში ადრინდელი ფართო accept ამთავრებს შეფასებას იმ პაკეტებისთვის, რომლებსაც ემთხვევა, ამიტომ შემდგომში დამატებული drop მათთვის არასდროს გაეშვება. სწორედ ეს რიგის წესია მთელი მიზეზი იმისა, რომ სწორად გამოყურებულ წესს ეფექტი არ ჰქონდეს.

ჩასვით წესი accept-ამდე და ნუ დაამატებთ ბოლოში. თუ ჯაჭვში უკვე არის გვირაბის ინტერფეისის საერთო accept, ახალი წესი მის წინ უნდა იყოს, თორემ ის მხოლოდ დეკორაციაა. შეამოწმეთ მიღებული რიგი და არა თქვენ მიერ რედაქტირებული ფაილი, რადგან რამდენიმე ფაილისგან შეკრებილი წესების ნაკრები შეიძლება არც ერთს არ შეესაბამებოდეს. შემდეგ დაადასტურეთ პულიდან მიღებული სატესტო პაკეტით.

sudo nft list chain inet filter forward
sudo nft insert rule inet filter forward iifname "tun0" ip saddr 10.90.0.0/24 ip daddr 198.51.100.0/24 drop
sudo nft -c -f /etc/nftables.conf

მესამე ბრძანება ფაილს აანალიზებს გამოყენების გარეშე, რაც სინტაქსურ შეცდომებს იჭერს სანამ ისინი შეფერხებად იქცევა. გამოიყენეთ უკუქცევის გეგმით, რადგან forward ჯაჭვში შეცდომით დაწერილმა წესმა შეიძლება გადაჭრას გვირაბი, რომლითაც მუშაობთ.

არსებულ ნაკადებს თქვენი ახალი წესი არ აინტერესებთ

წესის არსებობამდე შექმნილი conntrack ჩანაწერი აგრძელებს ადრინდელ accept-თან დამთხვევას. ამიტომ ახალი drop ზოგჯერ მუშაობს ახალ კავშირებზე და არაფერს აკეთებს იმაზე, რომელსაც ტესტავთ.

წაიკითხეთ მდგომარეობის დამთხვევა ჯაჭვის თავში. თუ ის established და related ტრაფიკს თქვენს წესამდე იღებს, ყოველი მიმდინარე ნაკადი განაგრძობს დინებას, სანამ დაიხურება. ჩვეულებრივ სწორედ ეს არის სასურველი ქცევა საგანგებო წესისთვის, და დამაბნეველია, როცა მყისიერ შეწყვეტას ელით. გადაწყვიტეთ, რომელი ეფექტი გსურთ, სანამ განათავსებთ. ტესტი, რომელიც ღია კავშირს ხელახლა იყენებს, არასწორ ამბავს მოგიყვებათ.

sudo conntrack -L -s 10.90.0.14 -d 198.51.100.20
sudo nft list ruleset | grep -n -A3 'ct state'

პირველი ბრძანება აჩვენებს, არსებობს თუ არა ნაკადი, ხოლო მეორე — აგრძელებს თუ არა ადრინდელი მდგომარეობის წესი მის მიღებას. ორივე მხოლოდ-კითხვითია და უსაფრთხოა ინციდენტის დროს.

რა არ არის ეს წესი

წესი არ არის დომენების შავი სია, IPv6 პოლიტიკა ან ცალკეული აპლიკაციის ანგარიშზე შეზღუდვა.

თითოეულ მათგანს თავისი მექანიზმი სჭირდება. დომენის ბლოკირებამ სახელები უნდა გადაწყვიტოს, რასაც პაკეტის ფილტრი არ აკეთებს. IPv6 ტრაფიკს საკუთარი დამთხვევა სჭირდება, რადგან ip გამოსახულება ip6 პაკეტებზე არაფერს ამბობს. აპლიკაციის დონის შეზღუდვა ეკუთვნის სერვისს ან აუთენტიფიცირებულ პროქსის და არა პრეფიქსის დამთხვევას. სწორედ ამ მოთხოვნების განცალკევება უშლის ხელს იმას, რომ ერთ ვიწრო წესს ოთხი სამუშაო მოსთხოვონ.

კონტრაქტი, რომელსაც ეს წესი იძლევა, ზუსტია: ტრაფიკი დაშვებული პულიდან ერთ დანიშნულების პრეფიქსამდე უარყოფილია, ხოლო გეითვეის დაუკავშირებელი ტრაფიკი ინარჩუნებს მოქმედ პოლიტიკას. დაწერეთ ეს წინადადება წესის გვერდით და შემდეგი ადამიანი გაიგებს, რისთვის იყო ის.

დაკავშირებული სტატიები