OpenVPN stunnel-ის უკან: გადაამისამართეთ გარსი და არა 1194 პორტი
ორი მსმენელი, სამი პორტი. შეამოწმეთ სად ხვდება გადამისამართება, სად იკავშირებს გარსი, სად უკავშირდება, რა გამოტოვა ლოკალურმა ტესტმა და ორივე იდენტობა.
მოათავსეთ TLS გარსი OpenVPN-ის წინ და განლაგება მეორე მსმენელს იძენს, რომელთაგან მხოლოდ ერთი უნდა უყურებდეს ინტერნეტს. როცა გვირაბი იმავე მანქანიდან მუშაობს და გარედან ვერ ახერხებს, გადამისამართება ჩვეულებრივ ორიდან არასწორზეა მიმართული. რაც უნდა შეესაბამებოდეს, ჯაჭვია: საჯარო წესი აღწევს გარსამდე, და გარსის საკუთარი backend კავშირი აღწევს ნამდვილ VPN სოკეტამდე. ოთხი ნახტომი ატარებს ამ ჯაჭვს და რომელიმე მათგანმა შეიძლება გამოძიება ადრე დაასრულოს.
ორი სოკეტი, ორი მფლობელი, ერთი საჯარო
გარსი ამთავრებს TLS-ს გარე კავშირისთვის და გაშიფრულ ბაიტურ ნაკადს გადასცემს ჩვეულებრივ OpenVPN TCP მსმენელს. ესენი ცალკე სოკეტები ცალკე კონფიგურაციის ფაილებით არიან, ამიტომ ერთის რედაქტირება მეორეს ხელუხლებლად და კვლავ გარეგნულად ჯანმრთელად ტოვებს. ეს ასევე ნიშნავს, რომ ორივე შეიძლება დაშორდეს ერთმანეთს, როცა ერთი იცვლება მეორის გარეშე.
თავად მანქანიდან მუშაობა ამიტომ საჯარო გზაზე ძალიან ცოტას ამტკიცებს. მშობლიურ პორტზე პირდაპირი კავშირი გარსს გამოტოვებს, გარსთან მის LAN მისამართზე დაკავშირება თარგმანს გამოტოვებს, და მხოლოდ კლიენტის მხარის სრული წყობა ვარჯიშობს იმას, რასაც გარე მომხმარებელი აკეთებს. სახელებიც ყურადღებით უნდა იკითხებოდეს, რადგან localhost ნიშნავს ჰოსტს, სადაც სწორედ ის კომპონენტი მუშაობს და არა ჰოსტს, რომელზეც შემთხვევით აკრიფებთ. შეინახეთ ეს განსხვავება თქვენს ჩანაწერებში, რადგან მის მიერ დაფარული ნახტომის გარეშე დაფიქსირებული ტესტი ორი განსხვავებული რამის შედარებას იწვევს.
სად ხვდება გადამისამართება სინამდვილეში
ჯაჭვის დაჭერა უფრო იოლია ოთხ ნახტომად, ვიდრე სამ პორტის ნომრად, რადგან ერთი და იგივე ნომერი შეიძლება სხვადასხვა რამეს ნიშნავდეს თითოეულ ბოლოში. წაიკითხეთ ცხრილი მწკრივობრივად: თითოეული მწკრივი ერთი სოკეტია, რომელმაც უნდა მიიღოს კავშირი და შემდეგ გახსნას შემდეგი. როცა მწკრივი არასწორი პარტნიორისკენაა მიმართული, ბოლო სვეტის სიმპტომია ის, რასაც მომხმარებელი იტყობინება.
| Hop | Listens on | Must reach | Symptom when it points elsewhere |
|---|---|---|---|
| Client machine | A local plaintext port | The wrapper's public TLS address | Plain text offered to a TLS endpoint |
| Router forward | Public TCP 443 | The wrapper host on its translated port | Wrapper records no connection at all |
| Wrapper, server mode | Its accepted port, 8443 here | The native VPN socket on loopback | Handshake completes, then silence |
| Native VPN listener | Loopback TCP port | Its peer, over TCP only | A 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