მოათავსეთ TLS გარსი OpenVPN-ის წინ და განლაგება მეორე მსმენელს იძენს, რომელთაგან მხოლოდ ერთი უნდა უყურებდეს ინტერნეტს. როცა გვირაბი იმავე მანქანიდან მუშაობს და გარედან ვერ ახერხებს, გადამისამართება ჩვეულებრივ ორიდან არასწორზეა მიმართული. რაც უნდა შეესაბამებოდეს, ჯაჭვია: საჯარო წესი აღწევს გარსამდე, და გარსის საკუთარი backend კავშირი აღწევს ნამდვილ VPN სოკეტამდე. ოთხი ნახტომი ატარებს ამ ჯაჭვს და რომელიმე მათგანმა შეიძლება გამოძიება ადრე დაასრულოს.

ორი სოკეტი, ორი მფლობელი, ერთი საჯარო

გარსი ამთავრებს TLS-ს გარე კავშირისთვის და გაშიფრულ ბაიტურ ნაკადს გადასცემს ჩვეულებრივ OpenVPN TCP მსმენელს. ესენი ცალკე სოკეტები ცალკე კონფიგურაციის ფაილებით არიან, ამიტომ ერთის რედაქტირება მეორეს ხელუხლებლად და კვლავ გარეგნულად ჯანმრთელად ტოვებს. ეს ასევე ნიშნავს, რომ ორივე შეიძლება დაშორდეს ერთმანეთს, როცა ერთი იცვლება მეორის გარეშე.

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

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

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

HopListens onMust reachSymptom when it points elsewhere
Client machineA local plaintext portThe wrapper's public TLS addressPlain text offered to a TLS endpoint
Router forwardPublic TCP 443The wrapper host on its translated portWrapper records no connection at all
Wrapper, server modeIts accepted port, 8443 hereThe native VPN socket on loopbackHandshake completes, then silence
Native VPN listenerLoopback TCP portIts peer, over TCP onlyA UDP socket behind a byte-stream relay

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

grep -nE '^[[:space:]]*(accept|connect)' /etc/stunnel/stunnel.conf
ss -lntp | grep -E ':443|:8443|:1194'

მიბმის მისამართი, რომელიც გაუარყოფს

127.0.0.1-ზე მიბმული accept ხაზი მხოლოდ თავად ჰოსტს პასუხობს, ამიტომ LAN მისამართზე მოსული გადამისამართება ვერ დაუკავშირდება და კლიენტი ხედავს უარყოფას, რომელიც პაკეტის ფილტრის პრობლემას ჰგავს. შეხედეთ სოკეტს სანამ firewall-ს შეეხებით, რადგან სოკეტი უფრო იაფი პასუხია. ან მიაბით გარსი იმ ინტერფეისს, რომელსაც გადამისამართება ემიზანშეწონება, ან დატოვეთ loopback-ზე და მიაღწიეთ იმას, რომ გადამისამართებამ loopback-ს ნამდვილად მომუშავე რაღაცის მეშვეობით მიაღწიოს. ეს ორი დიზაინია და თითოეულს თავისი წესი სჭირდება.

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

ss -lntp '( sport = :8443 )'

რა დაამტკიცა ლოკალურმა ტესტმა სინამდვილეში

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

როცა ცდა ვერ ხერხდება, თვალყური ადევნეთ ერთ კავშირს ორივე ჟურნალში: გარსის მიღებული და დაკავშირებული ხაზები, შემდეგ VPN დემონის საკუთარი სესიის ჟურნალი. პირველი საზღვარი, რომელიც არაფერს აღრიცხავს, შემდეგი ცვლილების ადგილია. როცა OpenVPN პარტნიორის პარამეტრებს ადარებს, ეს შეტყობინებები შეაფასეთ იმ იმპლემენტაციის წესებით. link-mtu-ის შეუსაბამობის გაფრთხილება ავტომატურად ფატალური არ არის, link-mtu-ის 1500-ზე მიმაგრება არ ამტკიცებს, რომ ფრაგმენტაცია შეწყდა, და შიფრის მოლაპარაკება OpenVPN-ის შიდა კონფიგურაციას ეკუთვნის და არა როუტერის გადამისამართებას.

nc -vz 127.0.0.1 1194
journalctl -u stunnel -n 50 --no-pager

ეს ზონდები ფარავს backend სოკეტს და გარსის ჟურნალს, რაც გამორიცხულ backend-ს გამორიცხული ხელის ჩამორთმევისგან გამოყოფს. გაუშვით ისინი სანამ ერთი ცდა მიმდინარეობს და არა შემდეგ. ერთი ცდის დროის ნიშნებია ის, რაც შედარებას სანდოს ხდის.

ორი იდენტობა, ორი წარუმატებლობის რიგი

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

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

openssl s_client -connect vpn.example:443 -servername vpn.example </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer

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