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

ნაბიჯი 1: დაამტკიცეთ, რომელმა რეზოლვერმა უპასუხა AAAA მოთხოვნას

Android-ს DNS-ის ერთი გზა არ აქვს. VPN-ს შეუძლია თავისი ქსელისთვის DNS სერვერის გატანა, სისტემას შეუძლია Private DNS-ის გამოყენება იმ ჰოსტსახელებისთვის, რომლებსაც შესაფერისად მიიჩნევს, ხოლო Chrome-ს შეუძლია საკუთარი დაშიფრული რეზოლვერის გაშვება chrome://settings/security-დან. ტელეფონზე, სადაც გვირაბი 10.61.0.1-ს გადასცემს, მაგრამ Private DNS საჯარო პროვაიდერზე მიუთითებს, თქვენი პირადი ზონის შიგნით არსებულ სახელს ის მანქანა არ ხსნის, რომელიც ზონას ფლობს. ბრაუზერი პასუხს იღებს რეზოლვერისგან, რომელსაც ამ სახელზე უფლებამოსილება არ აქვს, და მას არარსებულად თვლის, ხოლო შეცდომის ტექსტი DNS-ს არასოდეს იხსენიებს.

ჰკითხეთ გვირაბის რეზოლვერს პირდაპირ, სანამ რაიმე სხვას შეცვლით. პირველი ორი ბრძანება გვიჩვენებს, რომელი DNS სერვერები მიაბა Android-მა აქტიურ ქსელს და არის თუ არა Private DNS ავტომატურ ან მკაცრ რეჟიმში; მესამე გაშვებულია გვირაბის შიგნით ნებისმიერი კლიენტიდან, არა ტელეფონიდან.

adb shell dumpsys connectivity | grep -A3 "DnsAddresses"
adb shell settings get global private_dns_mode
nslookup -type=AAAA nas.lan 10.61.0.1

ნაბიჯი 2: წაიკითხეთ, რა გამოაცხადა VpnService-მა სინამდვილეში

Android-ის მხარე ცხადია და არა გამოთვლილი. VpnService.Builder addAddress-ით ამატებს მისამართებს, addRoute-ით მარშრუტებს, addDnsServer-ით DNS სერვერებს და შეუძლია მთელი გვირაბი ერთ მისამართების ოჯახზე შეზღუდოს allowFamily-ის მეშვეობით. იმ ამშენებელმა, რომელმაც გამოიძახა allowFamily(AF_INET) და შემდეგ დაამატა IPv6 მარშრუტი, სისტემას ორი ურთიერთსაწინააღმდეგო რამ უთხრა, და სისტემა ოჯახის შეზღუდვას ინარჩუნებს. fd00:61::/64-ის დამფარავი მარშრუტი სხვა პრეფიქსის ინტერფეისის მისამართთან ერთად იმავე მიზეზით ფეილდება: მისამართი არსებობს, მაგრამ ის ამ მარშრუტისთვის on-link არ არის.

წაიკითხეთ დეკლარაცია აპის გადამრთველის ნდობის ნაცვლად. dumpsys netd ბეჭდავს tun ინტერფეისზე მიბმულ მისამართებსა და მარშრუტებს, ხოლო dumpsys connectivity-ის შიგნით ქსელის მიხედვით LinkProperties DNS სიას აჩვენებს იმ ოჯახების გვერდით, რომლებსაც ქსელი აცხადებს.

adb shell ip -6 addr show tun0
adb shell ip -6 route show table all | grep tun0
adb shell dumpsys connectivity | grep -E "LinkAddresses|Routes"

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

ნაბიჯი 3: ბრაუზერი წყვეტს, საერთოდ სცადოს თუ არა IPv6

Chromium არ იყენებს ყველა მიღებულ AAAA ჩანაწერს. მის ჰოსტ რეზოლვერს აქვს IPv6-ის ხელმისაწვდომობის შემოწმებები და კანდიდატების ფილტრაცია, რომლებმაც შეიძლება IPv6 მოიხსნას ან პრიორიტეტი დაუწიოს, როცა ქსელი მის ტარებად უუნაროდ შეფასდება, და რეზოლვერის წყარო აჩვენებს ამ ტესტს მის გარშემო არსებულ პირობებთან ერთად. ლოგიკა ვერსიასა და დროშებზეა დამოკიდებული, და სწორედ ამიტომ შეიძლება ერთ გვირაბზე ორმა ტელეფონმა სხვადასხვანაირად იმუშაოს. კანდიდატების არსებობისას Happy Eyeballs ოჯახებს თითო კავშირზე აჯიბრებს, ამიტომ ნელა მპასუხობი IPv6 გზა მაინც შეიძლება დამარცხდეს სწრაფად მპასუხობ IPv4-თან.

დააკვირდით გადაწყვეტილებას და ნუ გამოიცნობთ. chrome://net-export-ით ჩაწერილი და netlog-ის მთვლელში გაშვებული სესია აჩვენებს ყოველ გადაწყვეტასა და არჩეულ ოჯახს; chrome://net-internals/#dns ქეშირებულ შედეგებს აჩვენებს. გადაწყვეტა, რომელიც მხოლოდ A ჩანაწერებს აბრუნებს თქვენსავე რეზოლვერზე AAAA-ს მქონე სახელისთვის, პირდაპირ ამ ეტაპზე მიუთითებს.

ნაბიჯი 4: დარწმუნდით, რომ პაკეტს იქით-აქეთ გზის გავლა შეუძლია

მისამართის არჩევა მიწოდება არ არის. Android ინახავს ქსელის მიხედვით მარშრუტიზაციის ცხრილებსა და პოლიტიკის წესებს, რომლებიც ცხრილს fwmark-ით ირჩევენ, ამიტომ მთავარ ცხრილში ხილული მარშრუტი ავტომატურად არ არის ის მარშრუტი, რომელსაც სოკეტი იყენებს. წესების წაკითხვა და ბირთვისთვის წყაროს მისამართისთვის დანიშნულების გადაწყვეტის თხოვნა ამ ორს ჰყოფს.

adb shell ip -6 rule show
adb shell ip -6 route get fd00:61::20 from fd00:61::10

სწორედ route get-ის გამოსავალი პასუხობს კითხვას. თუ ის tun0-ს ასახელებს და პაკეტები მაინც იღუპება, გადადით გვირაბის MTU-ზე და კარიბჭის IPv6 გადამისამართებაზე, და არა უკან ტელეფონზე.

რატომ აუარესებს ::/0-ის დამატება ჩვეულებრივ სიტუაციას

::/0-ის დამატება გვირაბის მოთხოვნას ერთი პრეფიქსიდან ყველა IPv6 დანიშნულებაზე ცვლის. ტელეფონზე ამან შეიძლება ხელმისაწვდომობის ტესტი დააკმაყოფილოს, რადგან თქვენი პრეფიქსის გარეთ არსებული სატესტო მისამართი ახლა მარშრუტიზებად გამოიყურება. ის არ ქმნის IPv6-ის აღმავალ სიმძლავრეს კარიბჭეზე, და ბევრ სახლის კარიბჭეს საერთოდ არ აქვს მომუშავე IPv6 აღმავალი არხი. შედეგი საჯარო IPv6-ისთვის შავი ხვრელია: სახელები, რომლებიც ადრე IPv4-ზე ვარდებოდნენ, ახლა ჩამოკიდებულია, და პირადი გვერდი შეიძლება უკეთესად გამოიყურებოდეს მხოლოდ იმიტომ, რომ ტესტი სხვა რამეს ზომავს.

პოლიტიკის ფასიც არსებობს. გვირაბში ::/0-ის არსებობისას მთელი IPv6 ტრაფიკი VPN-ით გადის, მათ შორის ის ტრაფიკი, რომლის ტარებაზეც ქსელის მფლობელს არასოდეს დაუთანხმებია. მოეკიდეთ ამას როგორც განლაგების გადაწყვეტილებას დასახელებული მფლობელით, და არა როგორც გამართვის ნაბიჯს, რომელსაც ღამის 1 საათზე დგამთ.

სამუშაოების რიგი, რომელიც ამას ამთავრებს

დაადასტურეთ, რომ AAAA პასუხი იმ რეზოლვერისგან მოდის, რომელსაც ზონა ეკუთვნის, წაიკითხეთ VpnService-ისა და netd-ის მდგომარეობა tun ინტერფეისისთვის, აიღეთ net-export კვალი, რომ ნახოთ, გადაყარა თუ არა Chromium-მა კანდიდატი, შემდეგ შეამოწმეთ იქით-აქეთ გზა ip -6 route get-ით. შეასწორეთ ის ფენა, რომელიც ნამდვილად ჩავარდა, და გაყოფის პოლიტიკას ხელი არ ახლოთ. თუ პირად სახელებს საჯაროებისგან განსხვავებული პასუხები სჭირდება, სწორედ ამისთვისაა split tunneling.

ჩაიწერეთ ტელეფონის build, ბრაუზერის ვერსია და რეზოლვერი, რომელსაც ჰკითხეთ. ეს სამი ფაქტი "IPv6 is broken"-ს აქცევს იმად, რისი გამეორებაც შემდეგ ადამიანს შეეძლება.

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