Berapa jumlah maksimum IP yang dapat dimiliki catatan DNS A?

30

Saya punya ide aneh - biarkan beberapa orang / organisasi meng-host aplikasi yang sama, dan biarkan semua node mereka dapat diakses melalui satu nama domain. Itu untuk memiliki, katakanlah, jaringan sosial yang benar-benar terdistribusi, di mana kegunaan tidak dikorbankan (yaitu pengguna tidak harus mengingat url penyedia yang berbeda dan kemudian ketika satu penyedia turun, beralih ke yang lain)

Untuk mencapai itu, saya pikir catatan DNS dengan beberapa IP dapat digunakan.

Jadi, berapa banyak IP yang dapat disimpan oleh catatan DNS A tunggal? Jawaban ini mengatakan sekitar 30, tetapi penggunaannya berbeda. Untuk skenario di atas saya tidak akan peduli jika ISP yang diberikan cache hanya 30, asalkan ISP lain cache 30 lainnya, dan sebagainya.

Bozho
sumber
2
Apakah Anda mengambil tentang Anycast ?
Lie Ryan
4
Saya mengetahui beberapa saat yang lalu bahwa jika Anda harus bertanya "Berapa jumlah maksimum X?" Anda mungkin salah menggunakannya ...
LordOfThePigs
Tidak harus;) Tetapi secara umum, ya
Bozho

Jawaban:

78

Penafian: Jangan tersinggung, tapi ini ide yang sangat buruk. Saya tidak menyarankan siapa pun melakukan ini di kehidupan nyata.

Tetapi jika Anda memberi seorang pria IT lab bosan, hal-hal lucu akan terjadi!

Untuk percobaan ini, saya menggunakan server Microsoft DNS yang berjalan di Server 2012 R2. Karena komplikasi hosting zona DNS di Active Directory, saya membuat zona primer baru bernama testing.com yang tidak terintegrasi dengan AD.

Menggunakan skrip ini:

$Count = 1
for ($x = 1; $x -lt 256; $x++)
{
    for ($y = 1; $y -lt 256; $y++)
    {
        for ($z = 1; $z -lt 256; $z++)
        {
            Write-Host "1.$x.$y.$z`t( $Count )"
            $Count++
            dnscmd . /RecordAdd testing.com testing A 1.$x.$y.$z
        }
    }
}

Saya melanjutkan untuk membuat, tanpa kesalahan, 65025 catatan host untuk nama testing.testing.com. , dengan setiap alamat IPv4 dari 1.1.1.1 ke 1.1.255.255.

Kemudian, saya ingin memastikan bahwa saya bisa menembus 65536 (2 ^ 16 bit) jumlah total catatan A tanpa kesalahan, dan saya bisa, jadi saya berasumsi saya mungkin bisa sampai ke 16581375 (1.1.1.1 hingga 1.255 .255.255,) tetapi saya tidak ingin duduk di sini dan menonton skrip ini berjalan sepanjang malam.

Terlalu banyak catatan

Jadi saya pikir aman untuk mengatakan bahwa tidak ada batasan praktis untuk jumlah catatan A yang dapat Anda tambahkan ke zona untuk nama yang sama dengan IP yang berbeda di server Anda.

Tetapi apakah itu benar-benar bekerja dari sudut pandang klien?

Inilah yang saya dapatkan dari klien saya seperti yang dilihat oleh Wireshark:

dua pertanyaan (Buka gambar di tab browser baru untuk ukuran penuh.)

nslookup

Permintaan TCP

Seperti yang Anda lihat, ketika saya menggunakan nslookup atau ping dari klien saya, ia secara otomatis mengeluarkan dua kueri - satu UDP dan satu TCP. Seperti yang sudah Anda ketahui, yang paling saya bisa menjejalkan ke dalam datagram UDP adalah 512 byte, jadi begitu batas itu terlampaui (seperti 20-30 alamat IP), seseorang harus menggunakan TCP sebagai gantinya. Tetapi bahkan dengan TCP, saya hanya mendapatkan subset A yang sangat kecil untuk testing.testing.com. 1000 catatan dikembalikan per permintaan TCP. Daftar A dirotasi oleh 1 dengan benar dengan setiap kueri yang berurutan, persis seperti yang Anda harapkan DNS round-robin berfungsi. Dibutuhkan jutaan pertanyaan untuk menyelesaikan semua ini.

Saya tidak melihat bagaimana ini akan membantu Anda membuat jaringan media sosial Anda yang berskala besar dan dapat diukur, tetapi tetap ada jawaban Anda.


Sunting: Dalam komentar tindak lanjut Anda, Anda bertanya mengapa menurut saya ini umumnya ide yang buruk.

  • Katakanlah saya adalah pengguna internet biasa, dan saya ingin terhubung ke layanan Anda. Saya mengetik www.bozho.biz di browser web saya. Klien DNS di komputer saya mendapatkan kembali 1000 catatan. Nasib buruk, 30 catatan pertama dalam daftar tidak responsif karena daftar catatan A tidak diperbarui, atau mungkin ada pemadaman berskala besar yang memengaruhi sebagian besar internet. Katakanlah browser web saya memiliki batas waktu 5 detik per IP sebelum bergerak dan mencoba yang berikutnya. Jadi sekarang saya duduk di sini menatap jam pasir berputar selama 2 setengah menit menunggu situs Anda memuat. Tidak ada yang punya waktu untuk itu. Dan saya hanya berasumsi bahwa browser web saya atau aplikasi apa pun yang saya gunakan untuk mengakses layanan Anda bahkan akan mencoba lebih dari 4 atau 5 alamat IP pertama. Mungkin tidak akan.

  • Jika Anda menggunakan pembersihan otomatis dan memungkinkan pembaruan yang tidak divalidasi atau anonim ke zona DNS dengan harapan menjaga daftar A catatan segar ... bayangkan saja betapa tidak amannya itu! Bahkan jika Anda merekayasa beberapa sistem di mana klien membutuhkan sertifikat TLS klien yang mereka dapatkan dari Anda sebelumnya untuk memperbarui zona, satu klien yang dikompromikan di mana pun di planet ini akan memulai botnet dan menghancurkan layanan Anda. DNS tradisional sangat tidak aman, tanpa kerumunan-sumber.

  • Penggunaan dan pemborosan bandwidth yang sangat besar. Jika setiap permintaan DNS membutuhkan 32 kilobyte atau lebih bandwidth, itu tidak akan skala sama sekali.

  • DNS round-robin bukan pengganti keseimbangan muatan yang tepat. Ini tidak menyediakan cara untuk memulihkan dari satu simpul turun atau menjadi tidak tersedia di tengah-tengah hal. Apakah Anda akan menginstruksikan pengguna Anda untuk melakukan ipconfig / flushdns jika node mereka terhubung turun? Masalah-masalah seperti ini telah diselesaikan oleh hal-hal seperti GSLB dan Anycast.

  • Dll

Ryan Ries
sumber
15
Lambat .... tepuk tangan ....., tuan.
mfinni
4
Untuk menambah ini, jika catatan A sedang ditanyai melalui BIND (yang berjalan di sebagian besar server DNS), itu akan mengocok catatan A dan mengembalikan sejumlah catatan A tertentu dari itu. Nomor tertentu itu didefinisikan dalam MAX_SHUFFLEkode sumber BIND (yang secara default adalah 32).
ub3rst4r
1
Karena penasaran, mengapa Anda tidak merekomendasikannya? Ini tentu saja merupakan hal yang sangat aneh, tetapi selain memiliki simpul jahat yang melayani permintaan di bawah domain 'baik', dan simpul gagal masih mendapatkan permintaan, apa lagi yang bisa salah :-)
Bozho
Juga, bukankah pengalaman pengguna akan terus berubah? Apakah setiap simpul merupakan replika lengkap? Bagaimana Anda memastikan bahwa jika mereka berada di bawah kendali orang lain? Jika mereka berbeda, maka orang akan mendapatkan satu situs hari ini dan situs lain besok. Secara pribadi, itu akan membuatku gila!
Brandon
18

Untuk menjawab pertanyaan seperti yang dinyatakan ("berapa banyak IP yang dapat disimpan oleh satu catatan DNS A?") Jawabannya sangat sederhana: satu Acatatan memegang tepat satu alamat. Namun ada beberapa Acatatan untuk nama yang sama.

Håkan Lindqvist
sumber
10

Setiap alamat IPv4 akan memakan waktu 16 byte dalam balasannya. Setiap alamat IPv6 akan membutuhkan 28 byte dalam balasannya.

Sangat disarankan agar Anda memastikan balasan akan masuk dalam 512 byte. Itu akan memungkinkan sekitar 25 alamat IPv4 dan 14 alamat IPv6 (mengingat Anda juga memerlukan beberapa informasi lain dalam paket). Batas tepat tergantung pada panjang nama domain Anda.

Jika Anda memiliki 25 alamat IPv4 dan 14 alamat IPv6, maka Anda mengandalkan klien yang meminta alamat IPv4 dan IPv6 dalam kueri terpisah. Jika klien meminta kedua jenis alamat dalam satu permintaan (yang jarang), maka Anda harus lebih rendah.

Jika ukuran balasan melebihi 512 byte, itu mungkin masih berfungsi di atas UDP jika klien dan server mendukung EDNS. Tanpa EDNS, klien akan menerima balasan yang terpotong, dan harus coba lagi melalui TCP. Ini meningkatkan komunikasi dari 1 hingga 4 pulang pergi. Tetapi lebih buruk lagi, kadang-kadang ada kesalahan konfigurasi yang mencegah DNS over TCP dari bekerja.

Bahkan jika Anda bisa memasukkan lebih dari 14 alamat ke dalam balasan tanpa menyebabkan masalah pada lapisan DNS, itu tidak akan sangat berguna. Batas waktu yang digunakan oleh klien sebelum menyerah pada satu alamat dan melanjutkan ke yang berikutnya sering kali signifikan.

Harus menunggu waktu habis itu sekali saja dapat menyebabkan pengalaman pengguna yang buruk. Jika klien harus melalui 14 alamat sebelum mendapatkan respons, pengguna harus menunggu 13 timeout.

kasperd
sumber
2
Setiap DNS harus mendukung EDNS hari ini. Batas 512 byte pada respons DNS tidak lagi praktis karena DNSSEC.
Barmar
@Barmar Tetapi jika Anda mengaktifkannya, ada risiko yang cukup signifikan, bahwa server Anda akan digunakan dalam serangan amplifikasi. Terakhir kali saya memeriksa saya menemukan bahwa pada bind mematikannya adalah satu-satunya hal, yang dapat dilakukan untuk mengurangi serangan amplifikasi. Hingga EDNS diperluas dengan bidang cookie, dan dukungan untuk yang digunakan secara luas, mematikan dukungan untuk balasan yang lebih besar dari 512 byte masih merupakan praktik yang disarankan.
kasperd
1
Saya tidak terlalu mempermasalahkan hasil pencarian untuk menonaktifkan EDNS sebagai praktik terbaik. Kutipan silakan? Serangan amplifikasi yang meningkatkan server rekursif akan terjadi terlepas dari apakah EDNS diaktifkan atau tidak jika jaringan Anda tidak melakukan validasi alamat sumber. Bahkan jika kita berbicara tentang server khusus-otoritatif, itu hanya menjadi relevan setelah Anda mengonfigurasinya untuk mengembalikan sebanyak itu data dalam satu balasan, pada titik mana menonaktifkannya tidak akan membantu Anda.
Andrew B
@AndrewB Saya tidak ingat di mana saya membaca rekomendasi itu. Saya telah membaca banyak rekomendasi berbeda tentang cara menghindari serangan amplifikasi, dan semuanya menghisap. Sayang sekali EDNS tidak memperkenalkan cookie, yang bisa menjadi solusi efisien untuk serangan amplifikasi menggunakan DNS. Apa yang saya rekomendasikan dalam jawaban saya adalah untuk menghindari menempatkan begitu banyak catatan dalam kueri, sehingga Anda mengandalkan orang lain untuk mengaktifkan EDNS agar jawaban menjadi efisien.
kasperd
@AndrewB Jika saya menempatkan lebih dari 512 byte nilai A catatan di zona dan memastikan itu di-host di server DNS yang otoritatif di mana EDNS diaktifkan, itu mungkin menjadi masalah bagi pengguna resolver rekursif yang tidak mengizinkan respons yang besar. Dan itulah mengapa saya merekomendasikan agar jumlah A lebih rendah. Selain itu saya menjelaskan mengapa manfaat yang dirasakan dari banyak catatan A itu tidak begitu relevan.
kasperd
5

Apa yang Anda gambarkan bukanlah ide yang sangat baru. Seperti jawaban lain yang telah dibahas, Anda dibatasi dalam berapa banyak catatan A yang dapat Anda miliki dalam satu jawaban, tetapi itu tidak mengatakan berapa pun tentang total catatan A yang mungkin ada.

Anda bisa, misalnya, mengimplementasikan server DNS yang menjawab pertanyaan apa pun untuk catatan A dengan IP acak. Cukup tanya kali, ini akan menghasilkan catatan unik 4294967296 A: satu untuk setiap alamat IPv4.

Seperti yang saya katakan, ini bukan ide baru. Sebenarnya, sebagian cara kerja Akamai (dan mungkin banyak CDN lainnya). Catatan A yang Anda dapatkan untuk domain Akamai ditentukan oleh server DNS sihir hitam mereka. Saya yakin jawaban yang Anda dapatkan tergantung pada keseimbangan beban dinamis dan masalah geografis.

Sebagai contoh, saya memilih a338.g.akamaitech.net. Jika saya melihatnya di komputer saya sekarang, yang menggunakan server nama yang ditugaskan DHCP dari Comcast:

$ host a338.g.akamaitech.net
a338.g.akamaitech.net has address 23.3.98.65
a338.g.akamaitech.net has address 23.3.98.89

Bagaimana jika saya menanyakan DNS Google?

$ host a338.g.akamaitech.net 8.8.8.8
Using domain server:
Name: 8.8.8.8
Address: 8.8.8.8#53
Aliases: 

a338.g.akamaitech.net has address 23.3.96.152
a338.g.akamaitech.net has address 23.3.96.120

Saya yakin jika Anda mencobanya, saya yakin Anda akan mendapatkan jawaban yang berbeda. Berapa banyak server tepi yang Akamai miliki untuk melayani sumber daya tertentu? Lebih dari dua, saya bertaruh.

Phil Frost
sumber
Terima kasih. Ya, saya tahu bahwa CDN bekerja seperti itu, tetapi dalam pandangan saya mereka memiliki sejumlah catatan per subdomain (2 di ujian Anda). Pertanyaan saya yang lain baru-baru ini adalah persis tentang CDN dan implementasi DNS mereka :-)
Bozho
2

Yang lain telah menyebutkannya sebagai detail, tetapi dari sudut pandang praktis, batas kerasnya adalah batas ukuran paket UDP sebesar 512 byte. Meskipun dimungkinkan untuk beralih ke TCP ketika pemotongan terdeteksi, dalam praktiknya banyak / sebagian besar klien tidak akan melakukannya (dan mereka seharusnya tidak melakukannya; itu akan memberikan pengalaman pengguna yang buruk untuk sebagian besar aplikasi, dan saya hanya akan mengharapkan transfer zona atau lainnya pencarian tujuan khusus untuk mendukung TCP). Jadi Anda mencari batas sekitar 30 alamat untuk IPv4 (catatan A) dan agak kurang untuk IPv6 (AAAA) karena mereka lebih besar. Panjang nama domain memotong ini dan akan membatasi jumlahnya lebih lanjut.

R ..
sumber
1
Anda cukup benar bahwa ada banyak klien yang keliru dan resolver yang tidak menangani respons DNS dengan benar yang tidak masuk ke dalam datagram UDP tunggal, tetapi harap abaikan gagasan bahwa hanya transfer zona atau permintaan tidak biasa yang membutuhkan ukuran respons yang lebih besar. Dari jawaban Anda, Anda jelas tidak menggunakan validasi DNSSEC, tetapi banyak orang (juga bukan DNSSEC satu-satunya alasan mengapa respons yang lebih besar diperlukan, tetapi itu adalah yang sangat penting.)
Michael McNally
@MichaelMcNally: DNSSEC tidak dimaksudkan (setidaknya bukan oleh implementor, berdasarkan utas pada milis glibc yang pernah saya ikuti) untuk digunakan di endpoints (aplikasi yang membuat pencarian DNS) tetapi pada nameserver rekursif lokal yang akan dilakukan pencarian atas nama aplikasi. Jadi bahkan dengan pengaturan DNSSEC tidak ada alasan untuk mengharapkan aplikasi untuk berbicara DNS melalui TCP. UDP bekerja dengan sangat baik.
R ..
1

Jawaban singkatnya: sekitar 25 A catatan yang sesuai dengan paket UDP. Selain itu, DNS akan beralih ke TCP dan tidak akan secepat itu. Anda juga akan mengalami masalah dengan klien yang tidak menggunakan resolver DNS yang mampu memilih IP "terdekat". Juga, dengan wifi dan seluler, "terdekat" sering tidak akan menjadi server yang tepat.

Jawaban yang lebih panjang:

Jangan lakukan itu. Cara yang lebih baik adalah menyiapkan catatan CNAME individual untuk setiap pengguna yang mengarah ke server yang sesuai. Katakanlah Anda memiliki dua server, server-fdan server-rdigunakan untuk IMAP. Konfigurasikan klien IMAP setiap orang dengan nama server menjadi USERNAME.imap.example.com tempat "USERNAME" diganti oleh nama pengguna email mereka. Sekarang Anda dapat memindahkan orang di antara server tanpa harus mengkonfigurasi ulang klien email mereka.

server-f.example.com. IN A 10.10.10.10 server-r.example.com. IN A 10.20.20.20 wilma.imap.example.com. IN CNAME server-f.example.com. fred.imap.example.com. IN CNAME server-f.example.com. betty.imap.example.com. IN CNAME server-r.example.com. barney.imap.example.com. IN CNAME server-r.example.com.

Namun, jika Anda melakukan ini, saya SANGAT SANGAT MENYARANKAN bahwa Anda menghasilkan catatan DNS secara otomatis dari database pengguna. Anda ingin memastikan bahwa ketika akun dibuat dan dihapus, catatan DNS dibuat dan dihapus juga. Kalau tidak, Anda akan berakhir dengan kekacauan dan banyak kebingungan.

Saya telah melihat ini dilakukan di perusahaan-perusahaan dengan ribuan pengguna dan, karena segala sesuatunya otomatis, ini sangat baik.

TomOnTime
sumber
0

Seperti yang telah ditunjukkan orang lain, itu adalah ide yang mengerikan untuk penggunaan di dunia nyata.

Di dunia nyata ada klien dan penyelesai yang tidak sesuai yang memiliki masalah dengan respons yang tidak dapat ditampung dalam datagram UDP tunggal, dan ada firewall yang akan menegakkan gagasan spesifik tetapi tidak sesuai protokol tentang batas ukuran ukuran pesan DNS.

Dan bahkan jika Anda dapat mengandalkan respons besar Anda dalam setiap kasus (yang Anda tidak bisa tegas) ada alasan lain ini adalah Ide yang Sangat Buruk. Semakin besar ukuran respons DNS Anda, semakin menggoda sebagai muatan untuk serangan refleksi karena Anda memberikan faktor amplifikasi yang sangat besar. Dalam jenis serangan denial-of-service, yang umum dalam DNS, kueri UDP dikirim ke penyelesai rekursif terbuka. Alamat sumber permintaan UDP biasanya mudah dipalsukan, dan penyerang menetapkan sumber kueri ke IP target yang dituju. Dua efek yang diinginkan (untuk penyerang) tercapai: pertama - upaya pengiriman yang relatif kecil di pihak mereka (dari permintaan spoofed kecil) menghasilkan torrent yang relatif besar dari lalu lintas yang tidak diinginkan yang tiba di target (ini adalah faktor amplifikasi), dan kedua - sumber serangan yang sebenarnya disembunyikan dari target; target hanya mengetahui alamat resolver rekursif yang digunakan sebagai reflektor.

Michael McNally
sumber
0

Poin menarik dari hal-hal sepele sejarah tentang hal ini. Pada tahun 90-an, AOL memperluas catatan DNS mereka sedemikian rupa sehingga permintaan MX akan kembali> 512 byte. Ini melanggar RFC, memecahkan banyak server SMTP (qmail menjadi yang populer saat itu), dan menyebabkan sysadmin banyak sakit kepala. Perbaikan diperlukan untuk menambal , atau menambahkan rute statis.

Saya tidak tahu bagaimana situasi saat ini, tetapi beberapa tahun yang lalu, ketika saya terakhir menyentuh qmail, patch masih ada.

http://www.gossamer-threads.com/lists/qmail/users/30503

Koperasi
sumber