Și acum este instabil (erori „nu pot găsi gazda”)
De unde/cum?
Toate rezolutoarele configurate corect, după cum ați observat, vor primi un steag trunchiat la prima lor interogare prin UDP și apoi vor comuta la TCP și totul va fi bine.
Desigur, vă amintiți că DNS este peste UDP ȘI TCP (contrar unui mit popular), așa că trebuie să vă asigurați că serverele dvs. de nume autorizate pot fi interogate prin TCP și totul va fi bine.
După câteva căutări pe Google, am aflat că o interogare multi-IP nu trebuie să aibă mai mult de 512 de octeți pentru a garanta că va fi utilizat UDP
Depinde. Uneori poți să treci peste 1000. Dar cel mai important, lucrurile se retrag la TCP, așa că nu ar trebui să fie o problemă (doar o ușoară pierdere a performanțelor, poate).
și evitați o interogare suplimentară (sau probleme cu clienții sau furnizorii no-tcp dns, vechi dns sw etc).
„clienți sau furnizori no-tcp dns” nu ar trebui să existe deoarece nu are sens și este împotriva specificațiilor DNS scrise... acum mai bine de 40 de ani!
Sau aveți dovezi specifice ale acestor cazuri?
Nu încercați să ocoliți astfel de lucruri. Dacă există aceste bucăți de software, acestea sunt sparte și vor avea O TONĂ de alte probleme, cum ar fi pentru domeniile securizate DNSSEC.
Deci, cum pot să știu câte IP-uri v4 pot avea într-o singură intrare dns pentru a garanta un răspuns UDP de maximum 512 octeți?
Nu se poate răspunde la acest lucru în general (pentru că depinde de nume), dar cel mai important, este oarecum inutil să încerci să optimizezi lucrurile în acest fel.
Oricum, puteți face calculul ușor:
- un pachet UDP are antet de 8 octeți înainte de date (RFC 768)
- un pachet DNS, vezi RFC 1035, are un antet (12 octeți), apoi întrebarea (cantitate variabilă de octeți, vezi mai târziu), apoi răspunsul (vezi mai târziu) și vom considera secțiunea suplimentară și de autoritate ca fiind goală.
Deci suntem deja la 512-8-12 = 492 de octeți pentru întrebarea DNS + răspuns.
Ca răspuns, an A
înregistrarea va fi nume (lungime variabilă) + tip (2 octeți) + clasă (2 octeți) + TTL (4 octeți) + lungime (2 octeți) și apoi datele. Pentru A
datele sunt de 4 octeți (o adresă IPv4).
Întrebarea este nume (lungime variabilă) + tip (2 octeți) + clasă (2 octeți).
Numele din pachetele DNS au aceste două proprietăți:
- sunt codificate ca o listă de etichete prefixate după lungime
- poate fi comprimat astfel încât un nume dat sau o parte din nume să apară o singură dată.
Deci de exemplu exemplu.com
este codificat în DNS ca 7,e,x,a,m,p,l,e,3,c,o,m,0
unde fiecare lungime este de un octet, dar dacă numele este necesar mai târziu, acesta va fi înlocuit cu un indicator care utilizează numai 2 octeți.
Dacă luăm acest nume:
- dimensiunea părții de nume în cauză va fi: 13 octeți, deci dimensiunea totală a întrebării: 13 + 2 + 2 = 17
- ca răspuns, fiecare nume poate fi un indicator de 2 octeți care face referire la numele din întrebare, deci fiecare înregistrare în răspuns va avea lungimea de 2 octeți pentru nume și apoi restul de mai sus, deci 16 octeți.
Prin urmare, pachetul DNS complet va avea dimensiunea 12 (antet) + 17 (întrebare) + x ori 16 unde x este numărul de A
înregistrări.
Deci trebuie sa rezolvam: 512 = 8 + 12 + 17 + 16x
pentru x, care dă x=29
sau așa.
Amintiți-vă că acest lucru este în cele mai bune circumstanțe (fără înregistrări suplimentare/de autoritate și compresie de nume utilizată în întregime) și pentru un anumit nume (dar dacă utilizați compresia numele apare complet o singură dată în cauză, deci doar acea dimensiune se schimbă).
[De asemenea, apropo, nu fiți prinși în moștenirea Internetului din secolul trecut; în zilele noastre IPv6 ar trebui să fie norma; bineinteles ca pui si mai putin aaaa
tipuri de înregistrare într-un pachet DNS de dimensiune fixă decât cele IPv4 :-) ]
Este posibil să configurați ISC Bind să returneze un singur IP într-o interogare multi-IP?
Nu cred și dacă ar exista, cum ar alege bind ce IP să returneze? Dacă sunteți aici, depinde de dvs. să enumerați un singur IP în zonefile. Sau dacă ești cu adevărat atașat de această idee (dar din nou, tot timpul pe care îl pierzi în asta nu va preveni alte probleme, deoarece clienții au probleme, așa că oricum încerci să te lupți cu un deal infinit), poți încerca dnsdist
acesta este un fel de cuțit de armată elvețiană și permite reglajul fin.
PS: de asemenea, amintiți-vă că DNS are o extensie pentru a permite unei părți să specifice dimensiunea bufferului (UDP) pe care o poate primi. Vezi RFC 6891. Un recent săpa
utilizări 1232
implicit acolo. S-ar putea să fiți interesat în general să vă uitați https://kb.isc.org/docs/aa-01219 sau ziua de flag DNS din 2020 la https://dnsflagday.net/2020/ exact despre asta era vorba.