OpenVPN-ის სრული გვირაბი თქვენს SSH სესიას წყვეტს: გაასწორეთ პასუხის გზა
ნაგულისხმევი მარშრუტი SSH პასუხებს გვირაბში აგზავნის. დაამაგრეთ peer, გაფილტრეთ redirect-gateway ან მარშრუტიზაცია გააკეთეთ წყაროს მიხედვით, სანამ მანქანას დაკარგავთ.
SSH-ით მისადგომ მანქანაზე სრული გვირაბის OpenVPN კლიენტის ჩართვამ შეიძლება სესია წამში გაწყვიტოს, და მანქანა არაფერს არ აკეთებს არასწორად. გვირაბი არ ცვლის, როგორ აღწევს პაკეტები სერვერს; ის ცვლის, როგორ გადის პასუხები. როგორც კი ნაგულისხმევი მარშრუტი tun0-ზე მიუთითებს, თქვენს SSH კლიენტზე პასუხი პროვაიდერის ქსელში შედის, რომელსაც თქვენს მისამართზე დაბრუნების მარშრუტი არ აქვს. კავშირი ჩერდება, შემდეგი ცდა დროში იწურება, და დემონი მთელი ამ დროის განმავლობაში 22 პორტზე უსმენს.
წაიკითხეთ მარშრუტიზაციის ცხრილი სანამ VPN-ის ჟურნალს წაიკითხავთ. ჟურნალი იტყვის, რომ გვირაბი ავიდა, და მართალია. საკითხია, რომელ ინტერფეისს გადაეცემა თითოეული პასუხი, და ეს პაკეტ-პაკეტ ძიებაა ცხრილში, რომელიც გვირაბმა ახლახან გადაწერა.
რატომ გადის პასუხი არასწორ კარში
შემომავალი პაკეტები კვლავ ფიზიკურ ინტერფეისზე მოდის, რადგან VPN კლიენტი ვერ შეცვლის, როგორ აღწევს ინტერნეტი თქვენი სერვერის საჯარო მისამართს. პასუხები ცალკე გადაწყვეტილებაა: ყოველი პაკეტისთვის ბირთვი ეძებს დანიშნულებას, და --redirect-gateway-ის შემდეგ ნაგულისხმევი ჩანაწერი ამბობს გვირაბს. პროვაიდერის გასასვლელი ხედავს დანიშნულებას, რომელსაც არ ემსახურება, და პაკეტს ყრის.
OpenVPN-ის საკუთარი დაცვა ზუსტად ერთ დანიშნულებას ფარავს. 2.6-ის სახელმძღვანელო --redirect-gateway-ს აღწერს როგორც მიმდევრობას: გვირაბამდე გამოყენებული კარიბჭის გავლით VPN peer-ისთვის host-მარშრუტს ამატებს, რათა დაშიფრული ტრაფიკი საკუთარ თავში ვერ დაბრუნდეს, შემდეგ კი ნაგულისხმევ მარშრუტს ცვლის. ეს host-მარშრუტი მხოლოდ peer-ისთვისაა. თქვენი SSH კლიენტი უბრალოდ კიდევ ერთი ინტერნეტ მისამართია და არანაირ გამონაკლისს არ იღებს.
ღირს ერთი პრეფიქსის შეცდომის ადრევე გამორიცხვა. ip route add -net 0.0.0.0 gw 10.8.0.1 dev tun0 სიგრძის გარეშე ერთადერთ მისამართს 0.0.0.0-ს ემთხვევა, არა ინტერნეტს; ის უნდა იყოს 0.0.0.0/0. და თუ ნაგულისხმევის აღება გვირაბის საკუთარ ტრანსპორტს ამტვრევს, დაამატეთ ბოლო წერტილი host-მარშრუტად ფიზიკური ინტერფეისის გავლით, პროვაიდერის რეალური მისამართის გამოყენებით.
დაამაგრეთ თქვენი SSH კლიენტის მისამართი დაუყოვნებელი შეკეთებისთვის
ყველაზე სწრაფი შეკეთება host-მარშრუტია თქვენი კლიენტის მისამართზე იმ კარიბჭის გავლით, რომელსაც სერვერი გვირაბამდე იყენებდა. თქვენი მხრიდან იპოვეთ მისამართი, რომელსაც სერვერი დაინახავს, შემდეგ წაიკითხეთ სერვერის ცხრილი ძველი კარიბჭის გასაგებად:
curl -s https://ifconfig.co
ip route
სერვერზე დაამატეთ გამონაკლისი სანამ კლიენტი დაიწყებს. აქ მისამართები დროებითი ადგილმჭერებია; ფორმაა მთავარი:
sudo ip route add 80.128.240.55 via 192.168.178.1
ეს არის ის შეკეთება, რომელიც მოხსენებულ შემთხვევაში გამოიყენეს, და ის დაუყოვნებლივ მუშაობს. ის ასევე მყიფეა ორი წინასწარმეტყველებადი გზით: მარშრუტი გადატვირთვისას ქრება, და ის არასწორი ხდება იმ წუთას, როცა თქვენი ISP სხვა მისამართს მოგცემთ. მოეპყარით როგორც საგანგებო ზომას და განზრახ გახადეთ მდგრადი, ქსელური ერთეულის ან dispatcher-ის კაუჭის მეშვეობით, ან აღიარეთ, რომ დროებითია, და ჩაწერეთ აღდგენის გზა.
ხელი შეუშალეთ კლიენტს ნაგულისხმევის აღებაში
უფრო სუფთა ვარიანტია, გვირაბს საერთოდ არ მისცეთ ნაგულისხმევი მარშრუტის ჩანაცვლების საშუალება. route-nopull, --client-თან ან --pull-თან გამოყენებისას, იღებს გაგზავნილ პარამეტრებს მარშრუტების, block-outside-dns-ის და DHCP-სტილის პარამეტრების, მაგალითად DNS სერვერების, გარდა, ამიტომ მხოლოდ საჭირო პრეფიქსებს ამატებთ. უფრო ვიწრო იარაღია გამოწევის ფილტრი, რომელიც ერთ პრობლემურ დირექტივას აგდებს და დანარჩენს ინახავს:
route-nopull
pull-filter ignore "redirect-gateway"
გამოიყენეთ ერთი ან მეორე, არა ორივე, და ნათლად იცოდეთ რა იცვლება. გვირაბის გავლით ნაგულისხმევი მარშრუტის გარეშე სერვერი აღარ ათვალიერებს ინტერნეტს პროვაიდერის გავლით; ის მხოლოდ იმას აღწევს, რაც თქვენ ცხადად დაამარშრუტეთ. თუ სრული გვირაბი იყო მთელი აზრი ამ კონფიგურაციისა, ეს არასწორი ღილაკია და ზემოთ მოცემული host-მარშრუტი სწორია.
გაყავით დაბრუნების გზა წყაროს ან კავშირის მიხედვით
როცა შემომავალი მისამართი სტაბილურია, წყაროს წესი პასუხებს ლოკალურად ინახავს გვირაბის საკუთარ მარშრუტებს შეხების გარეშე. მიეცით ფიზიკური ინტერფეისის მისამართს თავისი ცხრილი LAN პრეფიქსით და ფიზიკური ნაგულისხმევით, შემდეგ აირჩიეთ ეს ცხრილი მისგან წამომავალი ტრაფიკისთვის:
ip rule add from 192.168.1.11 table 128
ip route add table 128 to 192.168.1.0/24 dev eth0
ip route add table 128 default via 192.168.1.1
ეს მუშაობს, რადგან შემომავალ SSH კავშირზე პასუხები მოდის იმ მისამართიდან, რომელზეც კლიენტი დაუკავშირდა. მოხსენებულ შემთხვევაში, სადაც ყოველ შემომავალ სერვისს მუშაობა უნდა გაეგრძელებინა, ზუსტად ეს ფორმა გამოიყენეს. როცა შემომავალი მისამართი მოძრავია ან გზა დინამიკურია, სამაგიეროდ მონიშნეთ კავშირი: დააყენეთ conntrack ნიშანი ფიზიკური ინტერფეისიდან მომავალ პირველ პაკეტზე, გადაიტანეთ ის OUTPUT-ში პასუხის პაკეტებზე, და მონიშნული პაკეტები გაატარეთ ცხრილით, რომელიც ფიზიკურ კარიბჭეზე მიუთითებს.
iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1234
iptables -t mangle -A OUTPUT -m connmark --mark 1234 -j MARK --set-mark 4321
ip route add default via 192.168.1.1 dev eth0 table 3412
ip rule add fwmark 4321 table 3412
ტესტირებისას ცალ-ცალკე შეინახეთ კავშირის ნიშანი, firewall-ის ნიშანი და ცხრილის ნომერი. ერთი ნომრის ორი როლისთვის ხელახლა გამოყენება ქმნის წესს, რომელიც სწორად გამოიყურება და არასწორ პაკეტებს ემთხვევა. ცხრილის ნაგულისხმევ ჩანაწერს ასევე სჭირდება via LAN კარიბჭესთან ჩვეულებრივ Ethernet კავშირზე; შიშველი dev eth0 მუშაობს მხოლოდ მაშინ, როცა ინტერფეისი წერტილიდან-წერტილამდეა ან შემდეგი ნახტომი სხვა გზით წყდება. მოხსენებული Jessie ჰოსტი შემთხვევით იმ კავშირზე იყო, სადაც შიშველი ფორმა მუშაობდა, და ეს არ არის გასამეორებელი დისტრიბუციის წესი.
გადაამოწმეთ თავის გარეთ არ ჩაკეტვის გარეშე
ნუ ტესტავთ გათიშვით. დატოვეთ პირველი სესია ღია, ასწიეთ გვირაბი, და ჰკითხეთ ბირთვს, რომელ გზას აიღებდა თქვენი საკუთარი მისამართი:
ip route get 80.128.240.55
პასუხმა უნდა დაასახელოს ფიზიკური ინტერფეისი და ძველი კარიბჭე, არა გვირაბი. შემდეგ გახსენით მეორე SSH კავშირი; ეს არის ნამდვილი გამოცდა, რადგან ძველ სესიას შეუძლია გადარჩეს ისეთ მდგომარეობაზე, რომელსაც ახალი კავშირი ვერ გაამრავლებს. თუ მეორე ჩერდება, სანამ პირველი ჯერ კიდევ პასუხობს, წესი არასდროს დაემთხვა იმ ტრაფიკს, რომელიც მნიშვნელოვანია, და ნიშნები ან წყაროს მისამართია საყურებელი ადგილი.
მთელი ვარჯიშის განმავლობაში ხელთ გქონდეთ ზოლის გარეთა კონსოლი. სერვერს, რომლის ერთადერთი მისადგომი გზა ახლახან თქვენ მიერ გატეხილი გვირაბია, ვერ შეაკეთებთ იმავე გვირაბით, და უკან დაბრუნება უფრო ადვილია, როცა ჩაწერილი გაქვთ დამატებული ცხრილის ნომრები და პრეფიქსები.