სიმეტრიული NAT და VPN: გაზომეთ ასახვა და არა ეტიკეტი
ბოლო წერტილზე დამოკიდებული ასახვა გავლენას ახდენს თანატოლთა აღმოჩენაზე და არა ჩვეულებრივ კლიენტ-სერვერის გვირაბზე. გაზომეთ პორტი და შემდეგ, თუ პირდაპირი გზა ვერ გამართლდა, გამოიყენეთ რელე.
მხარდაჭერის თემა მთავრდება განაჩენით „სიმეტრიული NAT, VPN აქ არ იმუშავებს“ და შემდეგ კლიენტი სამჯერ გადაინსტალირდება უმიზეზოდ. ეტიკეტი ზიანს აყენებს, რადგან პასუხობს კითხვას, რომელიც არავის დაუსვამს. კლიენტი, რომელიც გარეთ უკავშირდება ფიქსირებულ სერვერს, ასახვას ქმნის იმ მომენტში, როცა პირველ პაკეტს აგზავნის, და პასუხს უკან გამოშვების უფლება ეძლევა წესებით, რომლებსაც თითქმის ყველა ქსელი ახორციელებს. რასაც ბოლო წერტილზე დამოკიდებული ასახვა ნამდვილად ართულებს, არის ორი თანატოლის მცდელობა ერთდროულად მიაღწიონ ერთმანეთს, და ეს სხვა გამოცდაა.
ერთი ეტიკეტის უკან ორი კითხვა იმალება
პირველი კითხვაა, შეუძლია თუ არა ამ ქსელის უკან მყოფ ჰოსტს გახსნას სესია ცნობილ საჯარო მისამართსა და პორტზე. გვირაბის კლიენტისთვის ეს ჩვეულებრივი შემთხვევაა და პასუხი თითქმის ყოველთვის კი არის. მარშრუტიზატორი იწერს შიდა წყაროს, ანიჭებს გარე პორტს და პასუხს გაატარებს, რადგან ის შიგნიდან დაწყებულ სესიას ეკუთვნის.
მეორე კითხვაა, შეუძლიათ თუ არა სხვადასხვა ქსელის უკან მყოფ ორ ჰოსტს იპოვონ საერთო გზა და ერთმანეთს გაუგზავნონ შუაში სერვერის გარეშე. ეს დამოკიდებულია იმაზე, თუ როგორ ანიჭებს თითოეული ქსელი ამ გარე პორტებს, და ასახვის ქცევას მნიშვნელობა მხოლოდ იქ აქვს.
ორივეს არევა ქმნის კლასიკურ მცდარ დიაგნოზს: თანატოლური ფუნქცია ვერ მუშაობს, ვიღაც NAT-ის ტიპის ტესტს უშვებს, ხედავს ყველაზე ცუდ კატეგორიას და ასკვნის, რომ ჩვეულებრივი გვირაბიც ვერ იმუშავებს. გვირაბი არასდროს ყოფილა ის, რაც ვერ გამართლდა.
ასახვა და ფილტრაცია ცალკეული თვისებებია
RFC-ის ტერმინოლოგია უფრო ზუსტია, ვიდრე მომწოდებლების მიერ გამოყენებული სახელები, და ღირს მისი ბილეთში გადატანა, რადგან კამათს წყვეტს. ასახვა არის ის, თუ როგორ ანიჭებენ გარე პორტს. ფილტრაცია არის ის, თუ რომელი შემომავალი პაკეტი უშვებენ გავლას. ქსელი შეიძლება მკაცრი იყოს ერთში და ლიბერალური მეორეში, და სწორედ ეს კომბინაციაა ის, რასაც თანატოლური პროტოკოლი უნდა გაუძლოს.
| Behaviour | What it means | Effect on a direct peer path |
|---|---|---|
| Endpoint-independent mapping | One external port for every destination | Discovery works if the port is advertised |
| Address-dependent mapping | New port per remote address | Works only if both sides probe the same pair |
| Address-and-port-dependent | New port per remote address and port | Usually needs a relay |
მესამე სტრიქონი არის ის, რასაც მომხმარებელთა მარშრუტიზატორებისა და მობილური ოპერატორების უმეტესობა გულისხმობს სიტყვით სიმეტრიული. გაითვალისწინეთ, რომ ეტიკეტი მხოლოდ ანიჭებას აღწერს. ქსელს ასეთი ასახვითა და ლიბერალური ფილტრაციით მაინც შეუძლია მიიღოს შემომავალი პაკეტები იმ პორტზე, რომელიც ახლახან მიანიჭა, და სწორედ ამიტომ ხვრელების გაბურღვა ზოგიერთზე წარმატებულია, ზოგიერთზე კი არა.
ფილტრაციას თავისი სამი შემთხვევა და თითოეულისთვის თავისი სახელი აქვს. ბილეთში „სიმეტრიული NAT“-ის დაწერა, როცა გულისხმობთ „მისამართსა და პორტზე დამოკიდებულ ფილტრაციას“, შემდეგ ადამიანს სახელმძღვანელოს არასწორ თავში აგზავნის. ორივე ტესტში სხვანაირად იქცევა, ამიტომ შეცდომა აკადემიური არ არის.
გაზომეთ ასახვა და ნუ დაარქმევთ მას
მინიჭებულ პორტს შეგიძლიათ უშუალოდ დააკვირდეთ ნებისმიერი UDP სერვისის სერვერის მხრიდან, რომელსაც აკონტროლებთ. დაიწყეთ ჩაწერა საჯარო ჰოსტზე, გაგზავნეთ კლიენტიდან და წაიკითხეთ წყარო პორტი, რომლითაც პაკეტი მოვიდა:
sudo tcpdump -ni eth0 -c 10 'udp port 51820'
sudo wg show wg0 endpoints
sudo conntrack -L -p udp --dport 51820
ბოლო წერტილის სტრიქონი სამიდან ყველაზე სასარგებლოა, რადგან WireGuard იწერს ბოლო მისამართსა და პორტს, რომელიც თითოეული თანატოლისგან მიიღო. შეადარეთ ეს პორტი იმას, რასაც კლიენტი ფიქრობს, რომ იყენებს. ისინი განსხვავდებიან ყოველ ჯერზე, როცა რაიმე გარდაქმნა ხდება, და მთავარი კითხვაა, რჩება თუ არა მნიშვნელობა სტაბილური.
გაიმეორეთ დაკვირვება მეორე დანიშნულების პორტის ან მეორე სერვერის მიმართ და კვლავ შეადარეთ. თუ გარე პორტი დანიშნულების მიხედვით იცვლება, ასახვა მისამართსა და პორტზეა დამოკიდებული. თუ იგივე რჩება, ქსელი ერთ ასახვას გაძლევთ და აღმოჩენას შანსი აქვს.
STUN-ზე დაფუძნებული ხელსაწყოები იმავე კლასიფიკაციას ერთ საფეხურში იტყობინებიან და მათი გამოყენება სწორია, როცა ქსელი საჯარო STUN სერვერისკენ გამავალ UDP-ს უშვებს. როცა არ უშვებს, ზემოთ აღწერილი ჩაწერის მეთოდი კვლავ მუშაობს და არაფერს მოითხოვს გარდა ჰოსტისა, რომელსაც უკვე აკონტროლებთ.
შეარჩიეთ ხარვეზის შესაბამისი გამოსავალი
თუ წარუმატებელი ფუნქცია თანატოლურია, მხარდაჭერილი პასუხებია რელე, შეხვედრის სერვისი, რომელზეც ორივე თანატოლი მიაღწევს, ან სხვა ტოპოლოგია. TURN ზუსტად ამისთვის არსებობს და პროდუქტი, რომელსაც საკუთარი რელე მოჰყვება, გეუბნებათ, რომ ზოგიერთი ქსელის მტრულ დამოკიდებულებას ელოდება.
თუ წარუმატებელი ფუნქცია ჩვეულებრივი გვირაბია, ასახვის ქცევა თქვენი პრობლემა არ არის და ზემოთქმულიდან არც ერთი არ ვრცელდება. შეამოწმეთ, რომ კლიენტი ნამდვილად აგზავნის, სერვერი ხედავს პაკეტს და პასუხი ბრუნდება. ეს თანმიმდევრობა სამი დაკვირვებაა და ის არ მოითხოვს არაფრის ცოდნას მარშრუტიზატორის NAT კატეგორიაზე.
რაც არ მუშაობს, არის ლოკალური პორტის ცვლილებების გაფანტვა მანამ, სანამ რამე დაუკავშირდება. კლიენტის წყარო პორტის შეცვლა არ ცვლის იმას, თუ როგორ ანიჭებს ქსელი ასახვებს. შემთხვევითი წარმატება მეხუთე ცდაზე ცრუ დადებითია და თვეების განმავლობაში გამოსავლად მოიხსენიებენ.
ჩაწერეთ არქიტექტურა და არა განაჩენი
სასარგებლო ჩანაწერი ამბობს, რომელი პროტოკოლი, რომელი მიმართულებით იწყება სესია, არის თუ არა რელე გზაზე და რა დაფიქსირდა მავთულზე. „სიმეტრიული NAT, არ მუშაობს“ გამოუსადეგარია, რადგან ერთდროულად მცდარია გვირაბის შესახებ და არაფერს ამბობს თანატოლის გზაზე.
ჩართეთ გაზომილი პორტის სტაბილურობა და ფილტრაციის ქცევა, თუ ისინი შეამოწმეთ. ეს ორი ფაქტი სხვას საშუალებას აძლევს იწინასწარმეტყველოს, იმუშავებს თუ არა ახალი ფუნქცია იმ ქსელში მთელი გამოძიების გამეორების გარეშე. ისინი უკეთ ბერდება, ვიდრე მომწოდებლის კატეგორია, რომელიც ყოველ დახმარების გვერდზე ოდნავ განსხვავებულს ნიშნავს.
ბოლოს, წერისას ხელთ გქონდეთ RFC 4787-ის ტერმინოლოგია. ზუსტი ტერმინების გამოყენება ერთი წინადადება ღირს და ხელს უშლის შემდეგ მკითხველს იგივე მცდარი დიაგნოზი გაიმეოროს, და ჩანაწერის დაწერის მთელი აზრი სწორედ ესაა.