Puncte:0

Ubuntu 20.04 a rezolvat așteptările pentru rezultatul IPV6 refuzat cu dnsmasq

drapel cn

TL;DR

Interogările mele DNS sunt lente deoarece systemd-rezolvate interogează cu succes serverul DNS pe IPv4, dar interogează în mod repetat pe IPv6 după ce serverul DNS răspunde cu un REFUSED. Este aceasta o configurație rezolvată? O problemă cu dnsmasq? sau un bug?

Am o instalare ubuntu 20.04 de stoc conectată la dnsmasq care rulează pe un aparat cu aer întrerupt (ubiquity edgerouter) cu „bară” de domeniu de nivel superior (amintiți-vă cu aer întrerupt, dar nu pare, indiferent de ce este acesta - adică .com etc.) . Solicitările DNS se rezolvă rapid prin clienții Mac și Windows. Pentru ubuntu, interogările DNS durează aproximativ 5 secunde pentru a se rezolva. Căutând în jur, problemele Ubuntu DNS sunt discutate în multe locuri, dar comportamentul de bază pe care îl văd nu a fost din cunoștințele mele.

Problemă de nivel superior: dacă dau ping la o mașină folosind ubuntu, durează aproximativ 5 secunde pentru ca răspunsurile să revină:

$ ping foo
# trec aproximativ 5 secunde
PING foo.bar (10.2.1.132) 56(84) octeți de date.
64 de octeți din foo.bar (10.2.1.132): icmp_seq=1 ttl=63 time=1.10 ms
64 de octeți din foo.bar (10.2.1.132): icmp_seq=2 ttl=63 time=1.02 ms
...

Ceea ce pare o problemă evidentă de timeout. Interesant, totuși, se rezolvă. Alergare starea resolvectl îmi oferă rezultatul standard, inclusiv că DNS este furnizat de contractul de închiriere DHCP emis de dnsmasq.

$ resolvectl stare

...
o mulțime de lucruri
...

Link 3 (enp0s25)
      Domenii curente: DNS     
Setare DefaultRoute: da     
       Setare LLMNR: da     
Setare MulticastDNS: nu      
  Setare DNSoverTLS: nu      
      Setare DNSSEC: nu      
    DNSSEC suportat: nu      
         Servere DNS: 10.1.1.1
          Domeniu DNS: ~.      
                      bar

Oprirea rezolvată și rularea în modul de depanare pare să arate problema. Mașina ubuntu interogează serverul DNS prin IPv4 și primește un răspuns imediat. Apoi interogează în mod repetat prin IPv6, la care serverul DNS răspunde cu REFUSED până când expiră.

$ sudo systemctl stop systemd-rezolvat
$ sudo SYSTEMD_LOG_LEVEL=debug /lib/systemd/systemd-resolved
...
multe înregistrări de pornire
...
Am primit pachetul de interogare UDP stub DNS pentru id 40457
Căutând RR pentru foo.bar ÎN A.
Trecerea la serverul DNS 10.1.1.1 pentru interfața enp0s25.
Cache miss pentru foo.bar IN A
Tranzacția 42924 pentru <foo.bar IN A> scope dns pe enp0s25/*.
Folosind nivelul de caracteristică UDP+EDNS0 pentru tranzacția 42924.
Folosind serverul DNS 10.1.1.1 pentru tranzacția 42924.
Se trimite pachetul de interogări cu id 42924.
Se procesează interogarea...
Am primit un pachet de interogare UDP stub DNS pentru id 59119
Căutând RR pentru foo.bar ÎN AAAA.
Cache miss pentru foo.bar ÎN AAAA
Tranzacția 21734 pentru <foo.bar IN AAAA> scope dns pe enp0s25/*.
Folosind nivelul de caracteristică UDP+EDNS0 pentru tranzacția 21734.
Folosind serverul DNS 10.1.1.1 pentru tranzacția 21734.
Se trimite pachetul de interogări cu id 21734.
Se procesează interogarea...
Se procesează pachetul primit la tranzacția 42924 (rcode=SUCCESS).
Verificat, primim un răspuns la nivelul de caracteristică UDP+EDNS0 de la serverul DNS 10.1.1.1.
S-a adăugat o intrare pozitivă neautentificată în cache pentru foo.bar ÎN A 7200s pe enp0s25/INET/10.1.1.1
Tranzacția 42924 pentru <foo.bar IN A> pe scope dns pe enp0s25/* acum finalizată cu <success> din rețea (nesemnat).
Se trimite pachetul de răspuns cu id 40457 pe interfața 1/AF_INET.
Eliberarea tranzacției 42924.
Se procesează pachetul primit la tranzacția 21734 (rcode=REFUSED).
Serverul a returnat REFUS, schimbând servere și reîncercând.
Reîncercarea tranzacției 21734.
Cache miss pentru foo.bar ÎN AAAA
Tranzacția 21734 pentru <foo.bar IN AAAA> scope dns pe enp0s25/*.
Folosind nivelul de caracteristică UDP+EDNS0 pentru tranzacția 21734.
Se trimite pachetul de interogări cu id 21734.
Se procesează pachetul primit la tranzacția 21734 (rcode=REFUSED).
Serverul a returnat REFUS, schimbând servere și reîncercând.
...
se repetă timp de ~5 secunde
...
Tranzacția 44267 pentru <foo.bar IN AAAA> pe scope dns pe enp0s25/* acum completă cu <attempts-max-reached> din rețea (nesemnat).
Eliberarea tranzacției 44267.

De asemenea, sugerează că aceasta este problema:

$ nslookup foo
Server: 127.0.0.53
Adresa: 127.0.0.53#53

Răspuns neautorizat:
Nume: foo.bar
Adresa: 10.2.1.132
...
trec vreo 5 secunde
...
;; conexiunea a expirat; niciun server nu a putut fi atins

# aceasta revine imediat
$ nslookup -query=A foo
Server: 127.0.0.53
Adresa: 127.0.0.53#53

Răspuns neautorizat:
Nume: foo.bar
Adresa: 10.2.1.132

# în timp ce acest lucru expiră în aproximativ 5 secunde.
$ nslookup -query=AAAA foo
;; conexiunea a expirat; niciun server nu a putut fi atins

Întrebări:

  1. Dacă serverul DNS a furnizat un răspuns IPv4 bun, de ce ar aștepta mașina ubuntu în timp ce încerca în mod repetat, fără succes, să obțină un răspuns IPv6?

  2. Este aceasta o problemă de configurare ubuntu sau o problemă dnsmasq?

Mulțumesc anticipat.

tegtmeye avatar
drapel cn
BTW, am găsit o persoană care postează o problemă similară pe lista de corespondență dnsmasq: https://lists.thekelleys.org.uk/pipermail/dnsmasq-discuss/2019q2/013094.html
tegtmeye avatar
drapel cn
Un conținut suplimentar care mă face să cred că există o problemă atât cu rezolvată, cât și cu dsnmasq. Faptul că dnsmasq returnează REFUSED pare a fi o eroare (consultați RFC 4074 „Comportament inadecvat comun împotriva interogărilor DNS pentru adrese IPv6”). Dacă nu știe care este adresa IPv6, ar trebui să returneze un răspuns gol conform RFC, dar poate că interpretez greșit. Acestea fiind spuse, rezoluția nu ar trebui să bată în mod repetat pe serverul DNS după ce a refuzat să vă răspundă. Vezi si: https://lists.isc.org/pipermail/bind-users/2018-April/100056.html https://bugs.centos.org/view.php?id=16317
Puncte:0
drapel jp

Am întâlnit exact aceeași problemă în timpul configurării systemd-rezolvat și dnsmasq.

Pentru întrebarea dvs. 1, nu reușesc să aflu de ce systemd-rezolvat interogare pentru aaaa înregistrați în mod repetat în timp ce nu există niciun răspuns de la dnsmasq.

Pentru întrebarea 2, the dnsmasq nu este configurat corect pentru a adăuga o înregistrare pentru foo.bar. Tu adaugi doar un A înregistrare pentru acest nume de domeniu, în timp ce systemd-rezolvat interogare pentru ambele A și aaaa inregistreaza in acelasi timp. dnsmasq habar n-are aaaa înregistrează pentru acest domeniu, astfel că trimite această interogare către serverul upsteam. Nu sunt clar ce se va întâmpla în continuare, dar dnsmasq nu da un raspuns asteptat.

Nu ai menționat modul în care ai configurat dnsmasq. În testul meu, orice configurație de mai jos va funcționa conform așteptărilor. Rețineți că există o diferență între 1 și 2, 3.

  1. adresa=/foo.bar/10.2.1.132/
  2. local=/bar/, addn-hosts=/tmp/hosts si adauga 10.2.1.132 foo.bar la /tmp/hosts
  3. host-record=foo.bar,10.2.1.132 și local=/bar/

Din dnsmasq pagina de manual pentru opțiune --local

De asemenea, este permis un flag -S care oferă un domeniu, dar nu o adresă IP; aceasta îi spune dnsmasq că un domeniu este local și poate răspunde la interogări de la /etc/hosts sau DHCP, dar nu ar trebui să trimită niciodată interogări pe acel domeniu către niciun server din amonte. --local este un sinonim pentru --server pentru a face fișierele de configurare mai clare în acest caz.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.