Saya telah menyiapkan server DNS pada SLES10 (saat ini mengikat 9.6) pada server multi-homed. Server ini dapat ditanyakan dari semua jaringan internal dan memberikan jawaban untuk semua jaringan internal. Kami memiliki dua zona "master" DNS terpisah. Masing-masing zona ini dilayani oleh sejumlah server Windows-DNS yang resmi.
Sekarang linux-server saya adalah server DNS sekunder untuk salah satu zona ini (zona internal pribadi) dan bertindak sebagai penerus untuk zona lain (zona internal publik).
Sampai saat ini pengaturan ini bekerja tanpa masalah. Sekarang saya mendapatkan - setelah menanyakan zona internal publik (misalnya dengan host
perintah pada klien linux) pesan kesalahan
;; Terpotong, coba lagi dalam mode TCP
wireshark-dump mengungkap penyebabnya: Query pertama keluar dalam mode UDP, jawabannya tidak sesuai dengan UDP (karena daftar agak panjang NS otoritatif), kemudian coba lagi dalam mode TCP, memberikan jawaban yang benar.
Sekarang pertanyaannya: Dapatkah saya mengonfigurasi bind saya untuk meminta forwarder dalam mode TCP tanpa mencoba UDP terlebih dahulu?
Pembaruan: Mencoba tangan saya pada ASCII-art ...
+--------------+ +--------------+ +-----------------+
| W2K8R2 DNS | | SLES 10 DNS | | W2K8R2 DNS |
| Zone private +---+ All internal +---+ Zone public |
| internal 2x | | Zones | | internal 30+ x |
+--------------+ +-+----------+-+ +-----------------+
| |
+--+---+ +--+---+
|Client| |Client|
+------+ +------+
host
perintah ini , dan permintaan apa yang sedang dikirim.minimal-responses: yes
ke konfigurasi BIND pada SLES 10 - ini dapat mengurangi ukuran respons. Dalam keadaan apa pun, sebagian besar kueri normal tidak akan melebihi batas 512 byte.Jawaban:
Pertama, saya tidak akan menyebut itu kesalahan, hanya pesan informasi.
Kedua, server DNS akan selalu menjawab pertanyaan UDP (setidaknya BIND, saya tidak dapat menemukan opsi untuk menonaktifkan UDP) dan klien akan selalu (?) Mencoba mengirim kueri UDP terlebih dahulu (misalnya tidak ada opsi dalam resolv.conf untuk mengubah itu atau di JVM) - jika mereka cocok dengan paket UDP (permintaan biasanya dilakukan)
Jika Anda memiliki kasus penggunaan tertentu, Anda dapat menentukan untuk menggunakan TCP, misalnya dalam skrip shell menggunakan 'dig + tcp' atau 'host -T' untuk resolusi, dan Anda dapat menggunakan panggilan sistem 'sethostent / gethostbyname / endhostent' (lihat man halaman) untuk memaksa TCP dalam kasus lain.
Jika Anda benar-benar ingin mencoba dan memblokir UDP, satu-satunya opsi yang dapat saya lihat adalah dengan aturan iptable, tetapi saya tidak yakin bahwa pengaturan itu akan berfungsi. Saya berharap resolusi DNS akan gagal.
sumber
Server BIND Anda harus menggunakan EDNS (lihat RFC 2671) untuk memungkinkan paket UDP lebih dari 512 byte.
Ini akan memungkinkan set NS besar Anda untuk diambil melalui UDP, tanpa memerlukan overhead koneksi TCP untuk permintaan yang lebih kecil lainnya.
Namun perlu dicatat bahwa ini sebenarnya adalah nilai default. Jika EDNS tidak digunakan, entah ada sesuatu yang memblokirnya, atau server yang menerima opsi EDNS tidak mendukungnya.
Juga, perhatikan bahwa
host
tidak mendukung EDNS. Sangat mungkin bahwa forwarder Anda -> kueri server sudah menggunakan EDNS, dan Anda tidak bisa melihatnya ketika Anda mencoba dengan klien lokal Anda.Coba
dig +bufsize=4096 @server hostname A
alih-alih menggunakanhost
.sumber