Bir alan adını izin listesine eklediniz, sorgu uygulamanıza ulaşıyor, eşleştirici izin verildi döndürüyor ve sayfa yine de hiç yüklenmiyor. Bu noktada çoğu kişi eşleştiriciyi yeniden yazmaya ve joker karakter karşılaştırmaları eklemeye başlar. Deneyimime göre eşleştirici genellikle doğrudur ve arıza bir katman aşağıdadır: sentezlediğiniz DNS yanıtında, kurduğunuz rotada veya sorguyu iletmek için kullandığınız sokette. Liste kolay kısımdır; izin listeleri paket yolunda kırılır.

Eşleştirici nadiren suçludur

İlk ayırmanız gereken şey engellenmiş ile bozuk arasındaki farktır. Engellenmiş bir ad hızlı ve görünür biçimde başarısız olmalıdır, çünkü tarayıcı adın var olmadığına dair bir yanıt alır ve durur. Bozuk bir ad takılır, IPv6 üzerinden yeniden dener, başka bir taşıma yoluna düşer ve sizi dönen bir göstergeyle bırakır. Dönen bir gösterge görüyorsanız izin listeniz muhtemelen istemcinin bir şey yapamayacağı bir yanıt veriyor.

Boş A kaydı klasik hatadır. Sıfır yanıtla NOERROR döndürmek geçerli bir yanıt gibi görünür, bu yüzden stub çözümleyici onu kabul eder, tarayıcı yeniden dener, AAAA dener, başka bir çözümleyici dener ve çok daha sonra pes eder. Soru bölümü tekrarlanmış ve işlem kimliği kopyalanmış bir yanıt kodu 3, yani NXDOMAIN, görüşmeyi anında bitirir. Kasıtlı olarak reddettiğiniz her ad için bunu kullanın.

IPv6 de varsayılan yerine aynı kararı hak eder. A için NXDOMAIN yanıtlayıp AAAA'ya izin verirseniz istemci engellenen ada IPv6 üzerinden ulaşabilir ve filtre sızar. Bazı uygulamalar engellenen AAAA sorgularına loopback adresiyle yanıt verir, böylece bağlantı yedek yola düşmek yerine hemen başarısız olur. Tek bir politika seçin, iki kayıt türüne de uygulayın ve ikisini de kaydedin.

Her şeyi yakalayan rota her şeye sahiptir

Yalnızca DNS tabanlı bir tasarım addRoute("0.0.0.0", 0) asla eklemez, bu yüzden TUN arayüzüne yalnızca sorgular girer ve diğer her şey alttaki ağı kullanmaya devam eder. Güvenli biçim budur ve bazı izin listelerinin Wi-Fi'da çalışıp hücresel ağda neden başarısız göründüğünü de açıklar.

Varsayılan bir rota olduğu anda her akış sizindir. Arayüze gelen ve ne iletilen ne yanıtlanan bir TCP paketi istemcinin süresi dolana kadar kuyrukta bekler ve kaydedilecek hata yoktur çünkü hiçbir şey hata vermemiştir. Birinin bütün bir öğleden sonrasını, aslında 443 numaralı bağlantı noktası için eksik bir iletici olan bozuk bir izin listesinde geçirdiğini gördüm. Düşürmeye karar verdiğiniz her paketin protokolünü ve hedefini kaydedin.

Çözümleyici soketi tünelden çıkmalı

İletme, sıradaki tuzağın yeridir. Operatör çözümleyicileri genellikle tünelin ulaşamadığı özel bir adreste yaşar, bu yüzden ilettiğiniz sorgu hiçbir yere gitmez ve uygulama okuma zaman aşımı bildirir. Onaylanan sorguları erişilebilir olduğunu bildiğiniz bir çözümleyiciye gönderin ve o soketi önce VpnService.protect()'e verin. Korumasız bir soket sorguyu kendi tünelinize geri gönderir, orada yine uygulamaya ulaşır ve zaman aşımı devreye girene kadar döner.

Arıza bir ağ kesintisiyle tıpatıp aynı görünür, bu yüzden hata raporlarında bu kadar uzun yaşar. Gönderilen sorgular ve alınan yanıtlar için sayaç tutun: ilk sayı artıyor ve ikincisi sıfırda kalıyorsa listeye değil sokete bakıyorsunuz.

Boyut ve sağlama toplamları mesajsız başarısız olur

Sessiz düşürmeler boyuttan da gelir. Büyük bir yanıt kümesine sahip DNS yanıtı veya cömert seçenekli bir TCP el sıkışması, hiç açıkça ayarlamadığınız bir yol MTU'sunu aşabilir; parça yukarıda kaybolur ve istemci ya daha küçükle yeniden dener ya da denemeyi bırakır. Arayüz MTU'sunu 1280'e ayarlamak, hücresel yolların çoğunda dayanan tutucu bir seçimdir ve kimsenin ölçmediği bir varsayılanı miras almaktan daha iyidir.

Paketleri kendiniz kuruyorsanız sağlama toplamı diğer sessiz katildir. UDP uzunluğunu veya protokol alanını dışarıda bırakan bir sözde başlık üzerinden hesaplanan UDP sağlama toplamı, sizin tarafınızda düzgün görünen ve alıcı tarafından iz bırakmadan atılan bir paket üretir. Sözde başlığınızı şartnameyle alan alan karşılaştırın ve hata ayıklarken bilinen bir akış için hesaplanan sağlama toplamını yazdırın.

Bir VpnService'in sizin için yapmayacağı şeyler

Etrafında tasarım yapmadan önce bilinmeye değer iki sınır var. Hiçbir sıradan uygulama Wi-Fi dışında sistem geneli bir proxy veya PAC dosyası kuramaz ve o kısım değişmedi. Uygulama başına yol değişti: API 29 öncesinde VpnService.Builder hiç proxy taşıyamıyordu ve API 29'dan itibaren setHttpProxy(ProxyInfo.buildPacProxy(uri)) platforma VPN ağı için değerlendirilecek bir PAC betiği verir. Daha eski API'leri hedeflediğinizde veya PAC modeli kuralı ifade edemediğinde kuralları kendi kodunuzda değerlendirin. UDP de bedava değil: tarayıcılar SOCKS proxy üzerinden yalnızca TCP gönderir ve çoğu SOCKS5 istemcisi UDP ASSOCIATE'i hiç uygulamaz, bu yüzden proxy tabanlı bir tasarım TCP sağlıklı görünürken UDP'yi düşürür veya sızdırır.

Bu ikinci sınır, UDP tabanlı bir protokolün sıradan bir ağda çalışıp VPN'iniz bağlandığı anda başarısız olmasının nedenidir. Tünelin UDP taşıması bekleniyorsa iletici bunun için iletme yolunu uygulamalıdır, yalnızca farklı soket türüyle TCP yolunu değil.

Bu sırayla kontrol edin

Listeyi sırayla işleyin ve ilk başarısız olan aşamada durun, çünkü önceki tutmadıkça sonraki her kontrol gürültüdür.

  1. Kurulu rotaları listeleyin ve DNS dışı paketlerin TUN arayüzüne girip girmediğini doğrulayın.
  2. Bir engellenmiş ve bir onaylanmış ad için sorgu adını, kararı ve yanıt kodunu kaydedin.
  3. Çözümleyici soketinin korumalı olduğunu ve seçilen çözümleyicinin tünelin içinden yanıt verdiğini doğrulayın.
  4. Arayüz MTU'sunu ve elle kurduğunuz bir yanıtın sağlama toplamını doğrulayın.
  5. Aynı sayfayı Wi-Fi ve hücresel ağda yineleyin, çünkü operatör çözümleyicileri ve yol MTU'su farklıdır.

Beşi de tutuyor ve sayfa hâlâ takılıyorsa sıradaki şüpheli ileticinin kendisidir: yakalanan bir isteği yakalanan bir yanıtla karşılaştırın ve eksik bayt sayısını veya yarı kapalı soketi arayın. VpnService.Builder referansı rota, DNS ve MTU sözleşmelerini kapsar ve protect() builder seçeneği değil ayrı bir VpnService çağrısıdır; bağlı bir arayüz yalnızca ilk sözleşmenin yerine getirildiği anlamına gelir.

İlgili makaleler