ერთი OpenVPN კლიენტის დაბლოკვა LAN-იდან გვირაბის გაჩერების გარეშე
მიამაგრეთ კლიენტის გვირაბის მისამართი მის სერტიფიკატს, ჩამოაგდეთ მისი LAN ტრაფიკი FORWARD-ის სათავეში, შემდეგ შეამოწმეთ IPv6, თვალთვალის ქვეშ მყოფი სესიები და გადატვირთვის შემდეგ გადარჩენა.
თქვენს OpenVPN სერვერზე ერთმა კლიენტმა უნდა დაკარგოს LAN-ზე წვდომა, სანამ დანარჩენი ყველა გვირაბი მუშაობს. თუ ამას მოძებნით, საუკეთესო პასუხი ჩვეულებრივ ამბობს, რომ დემონს ეს არ შეუძლია, რაც მხოლოდ ნახევრად მართალია: OpenVPN-ს არ აქვს ფაირვოლი თითო კლიენტზე, მაგრამ ჰოსტი, რომელიც გვირაბს ამთავრებს, უკვე ფილტრავს პაკეტებს. ორი გადაწყვეტილებაა მნიშვნელოვანი: რომელ იდენტობას ბლოკავთ და წესის მდებარეობა. სწორად გააკეთეთ ეს ორივე და ცვლილება გახდება ერთი ხაზი, რომელიც შეგიძლიათ გამოსცადოთ და წაშალოთ.
დაამაგრეთ კლიენტი წესის დაწერამდე
OpenVPN გვირაბის მისამართებს აუზიდან ქირაობს, ამიტომ 10.8.0.6 ადგილია და არა ადამიანი. სესიის დასრულებისას ქირა ბრუნდება და შეიძლება გადაეცეს შემდეგ კავშირს, რაც ნიშნავს, რომ ამ მისამართის წინააღმდეგ დაწერილი წესი ადგილს მიჰყვება და არა მომხმარებელს. ამიტომ ჯერ გადაწყვიტეთ, რას ბლოკავთ სინამდვილეში: მისამართს მოკლე ექსპერიმენტისთვის, თუ სერტიფიკატს იმისთვის, ვინც გარეთ გსურთ დატოვოთ.
მისამართის სერტიფიკატზე მისაბმელად შექმენით ფაილი client-config-dir-ით დასახელებულ დირექტორიაში და ფაილს მიეცით ზუსტად სერტიფიკატის common name. ჩაწერეთ მასში ერთი დირექტივა, ifconfig-push 10.8.0.6 255.255.255.0, და ის კლიენტი ინარჩუნებს იმავე გვირაბის მისამართს ხელახალი დაკავშირებისას. ორი პარამეტრი უნდა არსებობდეს, რომ ეს ძალაში შევიდეს: client-config-dir უნდა იყოს გამოცხადებული სერვერის კონფიგურაციაში, და გაგზავნილი მისამართი უნდა იყოს ქვექსელში, რომლის მარშრუტიზაციაც სერვერს შეუძლია. ერთის გამოტოვებისას ფაილი შეცდომის გარეშე იგნორირდება, რაც შემდეგ ფაირვოლის ტესტს შეცდომაში შემყვანს ხდის.
დროებით ბლოკს შეუძლია აუზის მისამართი გამოიყენოს, თუ ბილეთში ჩაწერილია, რომელი სესია ფლობდა მას იმ დროს.
თანმიმდევრობა წყვეტს, შესრულდება თუ არა ჩამოგდება
Linux-ის კარიბჭეზე, რომელიც გვირაბსა და LAN-ს შორის გადაამისამართებს, პაკეტები გადის FORWARD ჯაჭვში. წაიკითხეთ ქვემოთ მოცემული ბრძანება წინადადებად: ჩასვით FORWARD-ის სათავეში, შეუსაბამეთ tun0-იდან შემომავალი, მხოლოდ იმ ერთი ჰოსტიდან, LAN-ის ქვექსელზე მიმართული ტრაფიკი და ჩამოაგდეთ.
iptables -I FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP-I არის ის, რაც წესს ამუშავებს. -A-ით დამატებისას ის ეცემა გვირაბის ქვექსელის ნებისმიერი ფართო დაშვების ქვემოთ და ვერასოდეს ხედავს პაკეტს. შეამოწმეთ მდებარეობა iptables -vnL FORWARD --line-numbers-ით და წაიკითხეთ მრიცხველებიც: ზემოთ ჩამოგდება, რომელიც არაფერს ითვლის, ნიშნავს, რომ ტრაფიკი სხვა გზით მოდის.
კარიბჭის საკუთარი LAN მისამართი სხვა გზაა. თავად ყუთზე გაგზავნილი პაკეტები მიდის INPUT-ში და არა FORWARD-ში, ამიტომ კლიენტმა შეიძლება დაკარგოს LAN ჰოსტი და მაინც გახსნას როუტერის ადმინ გვერდი. დაამატეთ შესაბამისი INPUT წესი, როცა ეს მნიშვნელოვანია.
რასაც ფილტრი ვერ ხედავს
ფილტრაცია ხდება პაკეტის შეფასებისას, ამიტომ დამყარებული TCP სესია შეიძლება გაგრძელდეს გახსნამდე ან გადატვირთვამდე. თუ ბლოკი დაუყოვნებლივ უნდა მოქმედებდეს, გაასუფთავეთ ამ წყაროს თვალთვალის ნაკადები conntrack -D -s 10.8.0.6-ით წესის ჩასმის შემდეგ. თუ რამდენიმე წამის გადაფარვა მისაღებია, ჩაწერეთ ეს არჩევანი და ნუ დატოვებთ იმპლიციტურად. ყოველ შემთხვევაში, შემდეგმა ადამიანმა უნდა იცოდეს, წყვეტს წესი ცოცხალ ტრაფიკს თუ მხოლოდ ახალ კავშირებს.
თანატოლებს შორის ტრაფიკი არასოდეს ეხება ჰოსტის ფაირვოლს. client-to-client-ის ჩართვისას OpenVPN ამ პაკეტებს დემონის შიგნით გადასცემს, ამიტომ ვერც FORWARD და ვერც INPUT ვერ ხედავს მათ. ერთადერთი გამოსავალია client-to-client-ის გამორთვა ან იმის მიღება, რომ თანატოლებს ერთმანეთამდე მისვლა შეუძლიათ; iptables-ის წესი ამ ტრაფიკს ვერ დაინახავს.
IPv6, firmware და გადატვირთვის შემდეგ გადარჩენა
IPv4 წესი არაფერს ამბობს IPv6-ზე. თუ გვირაბი და LAN ორივე ოჯახს ატარებს, ეკვივალენტური წესი უნდა არსებობდეს ip6tables-ში, ან nftables-ის წესების ნაკრებში, რომელიც ამ ჰოსტზე პოლიტიკას ფლობს. როუტერის firmware ხშირად მალავს netfilter-ს საკუთარი აბსტრაქციის უკან, ამიტომ ფორუმიდან კოპირებული სინტაქსი და ცხრილების სახელები შეიძლება არ მოქმედებდეს.
OpenWrt-ზე დოკუმენტირებული გზა ფაირვოლის კონფიგურაციის ჩანაწერია და არა ხელით დაწერილი iptables ხაზი, და ხელით დაწერილი ხაზი შეიძლება გაქრეს ფაირვოლის გადატვირთვისას. სხვა დისტრიბუტივები წესებს აღადგენენ netfilter-persistent-ის, ჩატვირთვის ერთეულის ან მწარმოებლის საცავის მეშვეობით და ეს მექანიზმები ურთიერთშენაცვლებადი არ არის. დაამტკიცეთ არჩეული გადატვირთვით, რადგან გადატვირთვა სხვა გზას ვარჯიშობს.
შეამოწმეთ გზების მიხედვით, შემდეგ სუფთად დააბრუნეთ
თითოეული გზა ცალკე გამოსცადეთ, რადგან ერთი წარმატებული შემოწმება მალავს დანარჩენებს. დაბლოკილი კლიენტი მაინც უნდა აღწევდეს ინტერნეტს გვირაბით, მაგრამ უნდა ჩავარდეს LAN ჰოსტთან; მეორე კლიენტი უნდა აღწევდეს იმავე ჰოსტს; კარიბჭის მისამართს და თანატოლის გზას თითოეულს თავისი დაკვირვება სჭირდება. ჩაწერეთ შედეგები წესის გვერდით, რომ შემდეგ ცვლილებას საფუძველი ჰქონდეს. ქვემოთ მოცემული ცხრილი ის ნაკრებია, რომლის ბილეთში დატოვებაც ღირს.
| გზა | მოსალოდნელი წესით | როცა ჩავარდება |
|---|---|---|
| დაბლოკილი კლიენტი LAN ჰოსტისკენ | პასუხი არ არის | წესი დაშვების ქვემოთაა, ან წყარო არ ემთხვევა |
| დაბლოკილი კლიენტი ინტერნეტისკენ | მუშაობს tun0-ით | წესი ძალიან ფართოა, დანიშნულების დამთხვევის გარეშე |
| მეორე კლიენტი იმავე LAN ჰოსტისკენ | მუშაობს | წესი მეტს დაემთხვა, ვიდრე განზრახული ჰოსტი |
| დაბლოკილი კლიენტი კარიბჭის LAN მისამართისკენ | დაბლოკილია მხოლოდ შესაბამისი INPUT წესით | INPUT წესი აკლია |
| დაბლოკილი კლიენტი თანატოლის გვირაბის მისამართისკენ | კვლავ მუშაობს | client-to-client ჩართულია და ფაირვოლის ფარგლებს გარეთაა |
დაბრუნება სპეციფიკაციით წაშლაა და არა flush: iptables -D FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP ზუსტად იმ ჩანაწერს შლის და ჯაჭვის დანარჩენს უცვლელად ტოვებს. წაშალეთ იგივე ხაზი ნებისმიერი ფაილიდან, რომელიც ჩატვირთვისას აღადგენს წესებს, გადატვირთეთ ის და დაადასტურეთ, რომ კლიენტი კვლავ აღწევს LAN ჰოსტს. FORWARD-ის flush გააუქმებდა იმ წესებსაც, რომლებიც თქვენ არ დაგიწერიათ, რაც დაბრუნებას მეორე ინციდენტად აქცევს.
ბილეთის დახურვამდე დაადასტურეთ სამი რამ: დამაგრებული მისამართი ემთხვევა სერტიფიკატს, წესი დაშვებების ზემოთაა და მრიცხველი ნულოვანი არ არის, და მუდმივობის ფაილი შეიცავს იმავე წესს, რომელიც გამოსცადეთ. თუ რომელიმე აკლია, ბლოკი shell სესიის ილუზიაა.