Apakah permintaan DNS selalu melewati UDP?

33

Saya telah menghabiskan sedikit waktu meneliti topik ini dan sepertinya tidak dapat menemukan jawaban yang tepat, jadi saya cukup yakin itu bukan duplikat, dan sementara pertanyaan saya didasarkan pada kebutuhan keamanan, saya pikir masih aman untuk tanyakan di sini tetapi beri tahu saya jika saya perlu memindahkannya ke komunitas keamanan.

Pada dasarnya, apakah permintaan DNS pernah menggunakan TCP (jika demikian, skenario apa yang bisa terjadi)? Sekali lagi, saya hanya berbicara tentang pertanyaan. Apakah mungkin bagi mereka untuk melakukan perjalanan melalui TCP? Jika domain hanya panjang maksimal 253 byte, dan paket UDP dapat sebesar 512 byte, bukankah kueri selalu keluar sebagai UDP? Saya tidak berpikir permintaan dapat diselesaikan cukup besar untuk memerlukan penggunaan TCP. Jika server DNS pernah mendapatkan permintaan untuk domain yang lebih besar dari 253 byte, apakah server akan menjatuhkannya / tidak mencoba dan menyelesaikannya? Saya yakin saya telah membuat beberapa asumsi yang salah di sini.

Untuk beberapa konteks, saya bekerja dengan grup keamanan untuk memasukkan permintaan DNS ke dalam alat pemantauan keamanan mereka, dan untuk berbagai alasan kami telah memutuskan kami akan menangkap lalu lintas ini melalui penangkapan paket standar pada server DNS dan pengontrol domain. Persyaratan inti adalah untuk menangkap semua permintaan DNS sehingga mereka dapat mengidentifikasi apa yang dicoba klien untuk menyelesaikan domain yang diberikan. Berdasarkan persyaratan ini, kami tidak peduli dengan menangkap respons DNS atau lalu lintas lain seperti transfer zona, yang juga didorong oleh kenyataan bahwa kami perlu membatasi volume log sebanyak mungkin. Karena itu, kami berencana untuk menangkap hanya permintaan DNS yang ditujukan untuk server DNS dan dikirim melalui UDP. Untuk lebih banyak konteks (semacam ruang lingkup pertanyaan merayap di sini), sekarang telah diangkat bahwa kita mungkin perlu memperluas keamanan ' Visibilitas sehingga mereka dapat memantau aktivitas seperti saluran terselubung yang berjalan di atas DNS (yang akan menghadirkan kebutuhan untuk menangkap respons DNS juga, dan selanjutnya trafik TCP). Tetapi bahkan dalam skenario semacam itu, saya pikir setiap lalu lintas DNS keluar akan dalam bentuk pencarian / permintaan, dan bahwa ini akan selalu lebih dari UDP, bahkan jika dari sumber jahat (karena alasan saya pada paragraf pertama). Jadi ini memunculkan beberapa pertanyaan tambahan:

  • Bukankah kita setidaknya akan menangkap setengah dari percakapan dengan pendekatan yang saya uraikan? Atau apakah klien pernah mengirimkan lalu lintas DNS yang tidak dalam bentuk kueri? (mungkin seperti semacam balasan untuk respons server DNS, dan mungkin berakhir melalui TCP)

  • Bisakah DNS query dimodifikasi untuk menggunakan TCP? Apakah server DNS menerima dan menanggapi permintaan DNS yang datang melalui TCP?

Tidak yakin apakah itu relevan, tapi kami membatasi permintaan DNS ke server DNS resmi dan memblokir semua lalu lintas keluar lainnya melalui port 53. Saya jelas pemula, jadi saya minta maaf jika pertanyaan saya tidak sesuai, dan beri tahu saya bagaimana saya harus memodifikasi.

Caderade
sumber
2
Paging @Alnitak, kami sedang mendiskusikan bayi Anda. :)
Andrew B
Bagaimana saya bisa memaksa permintaan DNS default untuk bekerja dalam mode TCP? . Meskipun OS X / macOS q / a dengan beberapa mod juga berfungsi untuk Linux / Windows.
klanomath
Tentu saja saat ini dengan DNS over HTTPS dan DNS over TLS dan segera DNS over QUIC ...
Patrick Mevzek
Mengapa tidak mengalihkan semua permintaan DNS ke (a) server DNS pilihan Anda?
Craig Hicks

Jawaban:

38

Kueri DNS normal menggunakan port UDP 53, tetapi kueri yang lebih lama (> 512 oktet) akan menerima balasan 'terpotong', yang menghasilkan percakapan TCP 53 untuk memfasilitasi pengiriman / penerimaan seluruh kueri. Juga, server DNS mengikat port 53, tetapi permintaan itu sendiri berasal dari port acak nomor tinggi (49152 atau lebih tinggi) yang dikirim ke port 53. Respons akan dikembalikan ke port yang sama dari port 53.

Port Jaringan Digunakan oleh DNS | Microsoft Documents

Jadi, jika Anda berencana melakukan pengintaian keamanan pada permintaan DNS dari jaringan Anda, Anda harus mempertimbangkan hal di atas.

Adapun lalu lintas non-pencarian, pertimbangkan bahwa DNS juga menggunakan transfer zona (tipe permintaan AXFR) untuk memperbarui server DNS lainnya dengan catatan baru. Seorang pria di serangan tengah dapat mulai dengan transfer seperti itu, DDOS server nama Primer sehingga terlalu sibuk untuk menanggapi permintaan Sekunder meminta catatan diperbarui. Peretas kemudian menipu tipuan yang sama itu untuk memberi makan catatan 'beracun' ke Sekunder, yang mengarahkan domain DNS populer ke host yang dikompromikan.

Jadi audit keamanan Anda harus memperhatikan jenis permintaan AXFR, dan sistem DNS Anda hanya harus menerima pertukaran AXFR dari alamat IP tertentu.

Ruang Baca InfoSec SANS Institute | sans.org

George Erhard
sumber
1
Terima kasih George, hal yang sangat membantu! Jadi, untuk dengan cepat memperjelas kalimat pertama Anda - paket UDP hanya dapat memuat 512 byte, bukan? Jadi, jika kueri DNS lebih besar dari 512, bukankah itu akan dimulai melalui TCP langsung dari gerbang? Saya mencoba mengujinya sendiri dengan menjalankan wireshark dan menggunakan nslookup untuk menyelesaikan domain besar, tetapi tampaknya menghalangi saya untuk mencoba domain yang lebih besar dari 200 karakter (bukan angka pastinya, tetapi intinya saya tidak bisa sepenuhnya menguji skenario ini) .
Caderade
3
Itu bukan "kueri" tetapi "respons" yang akan lebih dari 512Bytes dan klien tidak akan tahu seperti apa "respons" itu.
AbraCadaver
7
@ Leader Ya, Anda benar bahwa mereka bisa TCP atau UDP, namun hanya Zone Transfer yang akan dimulai sebagai TCP. Kueri klien akan menjadi UDP kecuali jika mereka mendapat respons dari server yang memiliki bit set truncate. Kemudian bisa menggunakan TCP.
AbraCadaver
1
Bisakah klien menggunakan TCP untuk respons kecil?
Mehrdad
2
"paket UDP hanya dapat memuat 512 byte" Tidak, itu asumsi bahwa buffer klien hanya dapat memuat 512 byte yang menyebabkan server berperilaku seperti ini. Server dapat diberi tahu adanya buffer yang lebih lama menggunakan EDNS.
Bryan
28

Ini dimulai sebagai komentar atas jawaban George, tapi itu sudah lama. Gambaran yang lebih besar agak rumit, karena membutuhkan pemahaman tentang sejarah.

  • RFC 1035 awalnya disebut untuk batas 512 byte untuk menghindari fragmentasi UDP. Datagram UDP dan TCP yang terfragmentasi dipilih sebagai opsi terakhir untuk meminimalkan overhead transaksi DNS. Transfer zona selalu menggunakan TCP, karena transfer zona mengambil> 512 byte sesuai sifatnya. (Ini akan menjadi pemborosan bandwidth untuk memulai dengan UDP sama sekali)

  • Retry TCP pada pemotongan banyak didukung karena telah ditentukan dalam RFC 1123 sejak 1989.

  • EDNS (0) didefinisikan oleh RFC 6891 (2013), dan sebelum itu ada sebagai Usulan Standar sejak tahun 1999 . Ini mendefinisikan mekanisme di mana klien dan server dapat menegosiasikan ukuran UDP lebih besar dari 512. Karena kebaruan EDNS (0), banyak peralatan perangkat keras membuat asumsi tentang struktur paket DNS yang menyebabkan paket yang sesuai paket dibuang. Alasan yang paling sering adalah asumsi bahwa pesan DNS lebih dari 512 byte tidak valid, tetapi ini adalah satu di antara beberapa.

Jika kita memecahnya menjadi perilaku yang diamati:

  1. Permintaan DNS biasanya dimulai sebagai UDP, kecuali jika diketahui sebelumnya bahwa balasannya akan terlalu besar untuk memulai. (transfer zona)
  2. Balasan dapat memicu coba ulang TCP di klien jika balasan terpotong terlihat. Ini didukung dengan cukup baik.
  3. Balasan UDP lebih besar dari 512 byte mungkin terlihat jika klien menggunakan EDNS (0) untuk mengiklankan muatan yang lebih besar, dan server penerima mendukungnya. Ini hanya akan terjadi jika perangkat keras yang duduk di antara keduanya tidak mengganggu dan menghasilkan paket yang jatuh atau hancur.
  4. Klien dapat memilih untuk mencoba lagi permintaan EDNS (0) dengan muatan yang diiklankan lebih kecil jika balasan tidak terlihat, tetapi spesifik akan bervariasi di antara implementasi.
    • Penting untuk dicatat bahwa balasan yang akhirnya berhasil mungkin terlalu besar untuk muat dalam ukuran yang diminta, yang menghasilkan perilaku # 2 di atas. (coba lagi coba lagi TCP)
    • Sisi klien dapat memilih untuk mengingat ukuran yang akhirnya menghasilkan kesuksesan. Ini memungkinkannya untuk menghindari membuang-buang pertanyaan yang tidak perlu yang menyelidikinya lagi. Untuk melakukan sebaliknya akan sangat boros, terutama jika hasil akhir diperlukan TCP fallback.

Anda juga harus ingat bahwa RFC 7766 memungkinkan koneksi digunakan kembali melalui TCP , dan dimungkinkan untuk menemukan pipelining query melalui TCP di alam liar. Beberapa alat tidak mendeteksi permintaan DNS di luar yang pertama kali terlihat dalam sesi TCP, dnscap menjadi contohnya.

Andrew B
sumber
Salah satu alasan untuk mendapatkan set bit terpotong adalah Response Rate Limiting (RRL). Sebagai teknik mitigasi amplifikasi DNS, server mungkin mengirim paket terpotong untuk membuat klien yang berperilaku baik beralih ke TCP, semoga mencegah balasan ke paket dari alamat palsu.
Edheldil
Penggunaan kembali koneksi: jadi ajari resolver Anda untuk terlebih dahulu meminta google.com, sebelum meminta scantycladladies.com, lalu dnscap tidak memperhatikan. ;-)
Lenne
6

Ada adalah RFC 7766, DNS Transportasi melalui TCP - Persyaratan Implementasi .

  1. pengantar

Sebagian besar transaksi DNS [ RFC1034 ] terjadi di atas UDP [ RFC768 ]. TCP [ RFC793 ] selalu digunakan untuk transfer zona penuh (menggunakan AXFR) dan sering digunakan untuk pesan yang ukurannya melebihi batas 512 byte asli protokol DNS. Penerapan DNS Security (DNSSEC) dan IPv6 yang semakin meningkat telah meningkatkan ukuran respons dan oleh karena itu penggunaan TCP. Kebutuhan untuk meningkatkan penggunaan TCP juga telah didorong oleh perlindungan yang diberikannya terhadap spoofing alamat dan karenanya eksploitasi DNS dalam serangan refleksi / amplifikasi. Sekarang ini banyak digunakan dalam Pembatasan Tingkat Respons [ RRL1 ] [ RRL2 ]. Selain itu, pekerjaan terbaru tentang solusi privasi DNS seperti [ DNS-over-TLS] adalah motivasi lain untuk meninjau kembali persyaratan DNS-over-TCP.

Bagian 6.1.3.2 dari [RFC1123] menyatakan:

  DNS resolvers and recursive servers MUST support UDP, and SHOULD
  support TCP, for sending (non-zone-transfer) queries.

Namun, beberapa pelaksana telah mengambil teks yang dikutip di atas untuk berarti bahwa dukungan TCP adalah fitur opsional dari protokol DNS.

Mayoritas operator server DNS sudah mendukung TCP, dan konfigurasi default untuk sebagian besar implementasi perangkat lunak adalah mendukung TCP. Audiens utama untuk dokumen ini adalah mereka yang menerapkan dukungan terbatas untuk TCP membatasi interoperabilitas dan menghambat penyebaran fitur DNS baru.

Karena itu, dokumen ini memperbarui spesifikasi protokol inti DNS sehingga dukungan untuk TCP selanjutnya menjadi bagian yang DIBUTUHKAN dari implementasi protokol DNS lengkap.

Ada beberapa kelebihan dan kekurangan untuk peningkatan penggunaan TCP (lihat Lampiran A ) serta detail implementasi yang perlu dipertimbangkan. Dokumen ini membahas masalah ini dan menyajikan TCP sebagai alternatif transportasi yang valid untuk DNS. Itu memperluas konten [ RFC5966 ], dengan pertimbangan dan pelajaran tambahan yang dipelajari dari penelitian, pengembangan, dan implementasi TCP dalam DNS dan protokol Internet lainnya.

Walaupun dokumen ini tidak membuat persyaratan khusus untuk dipenuhi oleh operator server DNS, dokumen ini menawarkan beberapa saran kepada operator untuk membantu memastikan bahwa dukungan untuk TCP pada server dan jaringan mereka optimal. Perlu dicatat bahwa kegagalan untuk mendukung TCP (atau pemblokiran DNS melalui TCP pada lapisan jaringan) mungkin akan mengakibatkan kegagalan resolusi dan / atau batas waktu level aplikasi.

Ron Maupin
sumber
2
Hei Ron - Saya benar-benar membaca RFC itu sebelum memposting, tetapi misalnya, jika Anda melihat pada paragraf pertama, tampaknya menekankan bahwa TCP diperlukan untuk mendukung respons yang lebih besar - "Semakin berkembang penyebaran Keamanan DNS (DNSSEC) dan IPv6 telah meningkatkan ukuran respons dan karenanya penggunaan TCP ". Sekali lagi, pertanyaan saya adalah tentang pertanyaan, tapi terima kasih.
Caderade
4
RFC membuatnya sangat jelas bahwa TCP harus didukung untuk DNS, dan ia membahas penggunaan TCP oleh klien. Misalnya, " Klien yang menggunakan TCP untuk DNS harus selalu siap untuk membangun kembali koneksi atau mencoba lagi pertanyaan yang luar biasa. "
Ron Maupin
Poin bagus. Saya akan mengatakan bahwa komentar sebenarnya membantu mengingat kejelasan yang ditambahkan. Maksud saya adalah, saya benar-benar membaca RFC dan masih belum terlalu jelas bagi saya bahwa pertanyaan dapat mulai menggunakan TCP, jadi ketika Anda hanya membuang RFC untuk sebuah jawaban, sementara lucu, itu tidak terlalu membantu. Bunyinya kepada saya seperti, kueri pergi ke UDP dan jika responsnya terlalu besar, server DNS akan memberi tahu klien bahwa ia perlu memulai semua ini dan melakukannya melalui TCP. Jadi saya pikir saya masih memenuhi persyaratan asli saya karena saya akan menangkap permintaan asli. Bagaimanapun, saya sangat menghargai masukan Anda.
Caderade
1
The INTERNET STANDARDRFC adalah tools.ietf.org/html/rfc1034 . Anda mengutip PROPOSED STANDARDuntuk membutuhkan TCP.
AbraCadaver
3
Itu adalah RFC Jalur Standar yang memperbarui RFC Jalur Standar sebelumnya tentang hal yang sama. Jawaban ini di Server Fault menjelaskan hal-hal seperti itu. Bahkan dalam dokumen yang Anda referensi, dikatakan, " Di Internet, pertanyaan dilakukan dalam datagram UDP atau melalui koneksi TCP. " RFC 7766 adalah untuk mengklarifikasi bahwa TCP adalah bagian DNS yang diperlukan, bukan opsional.
Ron Maupin
3

Anda seharusnya tidak memfilter TCP / 53 ke segala arah. Misalnya, nsupdatekueri dapat menggunakan TCP segera setelah permintaan terlalu besar (yang dapat terjadi dengan cepat). Jadi, Anda harus membiarkan UDP dan TCP untuk port 53 (dalam IPv4 & V6!) Mengalir ke semua arah.

Juga ada lebih banyak pekerjaan ke arah DNS melalui TLS, sehingga TCP akan dibutuhkan di kedua arah. Lihat RFC7858.

Patrick Mevzek
sumber
pertanyaan tidak ada hubungannya dengan pemfilteran, dan jawaban Anda tidak menambah apa pun dari jawaban lainnya
Bryan
@Bryan terima kasih atas komentar Anda yang sangat membantu dan berguna!
Patrick Mevzek
@ PatrickMevzek Dipahami - apa yang saya coba katakan adalah kami hanya mengizinkan lalu lintas ke alamat IP tertentu di luar perimeter kami melalui port 53 (TCP dan UDP diizinkan meskipun).
Caderade