İletici DNS isteklerini TCP moduna zorla


9

Çok bağlantılı bir sunucuda SLES10 (şu anda 9.6 bağlı) üzerinde bir DNS sunucusu ayarladım. Bu sunucu tüm dahili ağlardan sorgulanabilir ve tüm dahili ağlar için cevaplar sağlar. İki ayrı DNS "ana" bölgemiz var. Bu bölgelerin her birine bir dizi yetkili Windows-DNS sunucusu hizmet vermektedir.

Şimdi linux sunucum bu bölgelerden biri (özel iç bölge) için ikincil bir DNS sunucusudur ve diğer bölge (genel iç bölge) için iletici görevi görür.

Yakın zamana kadar bu kurulum sorunsuz çalıştı. Şimdi anladım - genel iç bölgeyi sorguladıktan sonra (örneğin hostbir linux istemcideki komutla) hata mesajı

;; Kesildi, TCP modunda yeniden deneniyor

bir wireshark-dökümü bunun nedenini ortaya çıkardı: İlk sorgu UDP modunda sönüyor, cevap UDP'ye uymuyor (yetkili NS'nin uzun listesinden dolayı), daha sonra TCP modunda yeniden denenerek doğru cevabı verdi.

Şimdi soru: Bağlantımı ilk önce UDP'yi denemeden TCP modunda ileticileri sorgulayacak şekilde yapılandırabilir miyim?

Güncelleme: ASCII sanatında elimi deniyorum ...

+--------------+   +--------------+   +-----------------+
| W2K8R2 DNS   |   | SLES 10 DNS  |   | W2K8R2 DNS      |
| Zone private +---+ All internal +---+ Zone public     |
| internal 2x  |   |   Zones      |   | internal 30+ x  |
+--------------+   +-+----------+-+   +-----------------+
                     |          |
                  +--+---+   +--+---+
                  |Client|   |Client|
                  +------+   +------+

bunun küçük bir diyagramı yararlı olacaktır - açıklamanızdan hangi sunucunun hangisi olduğunu bulmakta zorlanıyorum.
Alnitak

Bu hostkomutu çalıştırdığınız tam olarak hangi ana bilgisayarlar ile hangi sorgunun gönderildiği arasında hala belirsiz olmasına rağmen, biraz daha iyi .
Alnitak

Müşteriler, SLES10 aracılığıyla, kamusal iç bölgeden girişleri talep eder. Özel iç bölge acı çekmez - orada sadece 2 NS girişi vardır.
Nils

ve istemciler sadece düz saplama çözücüler?
Alnitak

minimal-responses: yesSLES 10'daki BIND yapılandırmasına eklemenizi öneririz - yanıt boyutlarını düşürebilir. Her durumda, çoğu normal sorgu 512 bayt sınırını aşmaz.
Alnitak

Yanıtlar:


8

İlk olarak, buna bir hata demezdim, sadece bilgilendirici bir mesaj.

İkincisi, DNS sunucuları her zaman UDP sorgularını yanıtlar (en azından BIND, UDP'yi devre dışı bırakma seçeneklerini bulamıyorum) ve istemciler her zaman (?) Önce bir UDP sorgusu göndermeye çalışır (örneğin, çözümü değiştirmek için seçenek yoktur. veya JVM'de) - bir UDP paketine uyuyorlarsa (istekler genellikle)

Belirli bir kullanım durumunuz varsa, TCP kullanmayı seçebilirsiniz, örneğin kabuk komut dosyasında çözünürlük için 'dig + tcp' veya 'host -T' kullanın ve 'callhostent / gethostbyname / endhostent' sistem çağrılarını kullanabilirsiniz (bkz. sayfa) TCP'yi başka durumlarda zorlamak için.

Gerçekten UDP'yi denemek ve engellemek istiyorsanız, görebildiğim tek seçenek iptable kuralıdır, ancak bu kurulumun çalışacağından emin değilim. DNS çözümlemesinin başarısız olacağını umuyorum.


nominal olarak , UDP sorgusunun başarısız olacağına dair a priori bilmekten ve önce TCP üzerinden denemeden bir performans avantajı vardır . Bununla ilgili bazı tartışmalar için RFC 5966'ya bakınız.
Alnitak

@Alnitak ve ben bu faydayı almak istiyoruz.
Nils

1
@Nils, bu yüzden EDNS'nin neden işe yaramadığını anlamamız gerekiyor ...
Alnitak

Özel bir kullanım durumum yok - istemciler çözümleyici kütüphanelerini kullanacaklar - ancak her istek ve her cevap ağ üzerinden iki kez geçecek - bunu sevmiyorum.
Nils

@Nils, sorun, istemcinin UDP / TCP'ye karar vermesi, ancak sunucunun yanıtın boyutunu bilmesidir.
Dan Andreatta

4

512 bayttan daha uzun UDP paketlerine izin vermek için BIND sunucunuz EDNS (bkz. RFC 2671) kullanıyor olmalıdır .

options {
    edns-udp-size 4096;
    max-udp-size 4096;
};

Bu, büyük NS setinizin diğer küçük sorgular için bir TCP bağlantısının ek yükünü gerektirmeden UDP üzerinden alınmasına izin vermelidir.

Ancak bunların aslında varsayılan değerler olduğunu unutmayın. EDNS kullanılmıyorsa ya bir şey engelliyor ya da EDNS seçeneklerini alan sunucular desteklemiyor.

Ayrıca, hostEDNS'yi desteklemediğini unutmayın. İletici -> sunucu sorgularınızın zaten EDNS kullanıyor olması mümkündür ve yerel istemcinizi denediğinizde bunu göremezsiniz.

dig +bufsize=4096 @server hostname AKullanmak yerine deneyin host.


Bunu kim kullanmalı? Muhtemelen hem sunucum hem de ileticilerim "genel dahili" bölgesinden mi?
Nils

Zaten cevapta NS'nin tam listesini göndermenin anlamı nedir?
Nils

@Nils DNS protokolü, aynı (QNAME, QTYPE ve QCLASS) grubuyla eşleşen tüm girdi kümesinin bölünmez olmasını gerektirir (diğer adıyla "RRset")
Alnitak

bu RRset ile ilgili olarak beni RFC'ye yönlendirebilir misiniz?
Nils

1
Actaully host standart çözümleyici kütüphanesini kullanır ve iş istasyonumda EDNS0'ı destekler. İsteklerin EDNS0 belirtip belirtmediğini test etmek için 'tcpdump -x port 53' çalıştırın ve altıgen dökümü (sonuna doğru, ek bölümde) OPT RR'nin ikili gösterimi olan 0029 1000 0000 8000 0000 dizisini içermelidir.
Dan Andreatta
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.