Содержание

Servfail в Windows DNS при делегировании поддомена и запросе несуществующей AAAA-записи

На сервере Alpine Linux столкнулся со следующей ошибкой:

shell-session

# ping srv1.ex.example.com  
ping: bad address 'srv1.ex.example.com'

Домен example.com хостится на TopDNS серверах в интернете, а также на Windows Server DNS внутри сети. На Windows Server DNS поддомен ex.example.com делегирован на серевер TopDNS.

Попытка соединения осуществляется с Alpine Linux сервера во внутренней сети, в качестве DNS выступает внутренний Windows Server.

IPv6 отключен на обоих серверах.

При попытке отображения имени в адрес отправляются два запроса:

shell-session

# nslookup -debug srv1.ex.example.com
Server:         10.1.1.10
Address:        10.1.1.10:53

Query #0 completed in 86ms:
Non-authoritative answer:
Name:   srv1.ex.example.com
Address: 203.0.113.123

Query #1 completed in 694ms:
** server can't find srv1.ex.example.com: SERVFAIL

Один из них запрашивает A-запись, второй — AAAA. При том, что IPv6 отключен. Парам-парам-пам.

shell-session

# ping -4 srv1.ex.example.com
PING srv1.ex.example.com (203.0.113.123): 56 data bytes
64 bytes from 203.0.113.123: seq=0 ttl=36 time=37.447 ms
64 bytes from 203.0.113.123: seq=1 ttl=36 time=36.149 ms

Резолвинг внутренних поддоменов, которые не имеют IPv6 адрес, проходит успешно:

shell-session

# nslookup srv1.in.example.com
Server:         10.1.1.10
Address:        10.1.1.10#53

Name:   srv1.in.example.com
Address: 10.2.2.22

Резолвинг внешних поддоменов, которые имеют IPv6 адрес, проходит успешно:

shell-session

# nslookup srv2.ex.example.com
Server:         10.1.1.10
Address:        10.1.1.10#53

Non-authoritative answer:
Name:   srv2.ex.example.com
Address: 203.0.113.125
Name:   srv2.ex.example.com
Address: 2001:db8:310c::ac42:2f19

Получение AAAA-записи внешнего домена без IPv6 адреса через внутренний Windows DNS сервер с делегацией:

shell-session

# dig srv1.ex.example.com aaaa @10.1.1.10
;; communications error to 10.1.1.10#53: timed out

; <<>> DiG 9.18.13 <<>> srv1.ex.example.com aaaa @10.1.1.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 46760
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;srv1.ex.example.com.              IN      AAAA

;; Query time: 200 msec
;; SERVER: 10.1.1.10#53(10.1.1.10) (UDP)
;; WHEN: Fri Apr 28 22:29:48 UTC 2023
;; MSG SIZE  rcvd: 45

Получение AAAA-записи внешнего домена без IPv6 адреса через внешний DNS сервер:

shell-session

# dig srv1.ex.example.com aaaa @77.247.183.137

; <<>> DiG 9.18.13 <<>> srv1.ex.example.com aaaa @77.247.183.137
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63688
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;srv1.ex.example.com.              IN      AAAA

;; AUTHORITY SECTION:
example.com.              3600    IN      SOA     ns-canada.topdns.com. hostmaster.topdns.com. 2023040603 43200 900 1209600 3600

;; Query time: 60 msec
;; SERVER: 77.247.183.137#53(77.247.183.137) (UDP)
;; WHEN: Fri Apr 28 22:30:02 UTC 2023
;; MSG SIZE  rcvd: 109

Windows DNS сервер возвращает ошибку, а внешний успешный ответ с SOA-записью:

sh

4/28/2023 1:34:08 PM 03D0 PACKET  000002402682D0C0 UDP Rcv 127.0.0.1       0015   Q [0001   D   NOERROR] AAAA   (4)srv1(2)ex(7)example(3)com(0)
UDP question info at 000002402682D0C0
  Socket = 688
  Remote addr 127.0.0.1, port 58024
  Time Query=44628, Queued=0, Expire=0
  Buf length = 0x0fa0 (4000)
  Msg length = 0x0022 (34)
  Message:
    XID       0x0015
    Flags     0x0100
      QR        0 (QUESTION)
      OPCODE    0 (QUERY)
      AA        0
      TC        0
      RD        1
      RA        0
      Z         0
      CD        0
      AD        0
      RCODE     0 (NOERROR)
    QCOUNT    1
    ACOUNT    0
    NSCOUNT   0
    ARCOUNT   0
    QUESTION SECTION:
    Offset = 0x000c, RR count = 0
    Name      "(4)srv1(2)ex(7)example(3)com(0)"
      QTYPE   AAAA (28)
      QCLASS  1
    ANSWER SECTION:
      empty
    AUTHORITY SECTION:
      empty
    ADDITIONAL SECTION:
      empty

4/28/2023 1:34:08 PM 03D0 PACKET  000002402A294100 UDP Snd 77.247.183.137  5889   Q [0000       NOERROR] AAAA   (4)srv1(2)ex(7)example(3)com(0)
UDP question info at 000002402A294100
  Socket = 13208
  Remote addr 77.247.183.137, port 53
  Time Query=0, Queued=0, Expire=0
  Buf length = 0x0fa0 (4000)
  Msg length = 0x002d (45)
  Message:
    XID       0x5889
    Flags     0x0000
      QR        0 (QUESTION)
      OPCODE    0 (QUERY)
      AA        0
      TC        0
      RD        0
      RA        0
      Z         0
      CD        0
      AD        0
      RCODE     0 (NOERROR)
    QCOUNT    1
    ACOUNT    0
    NSCOUNT   0
    ARCOUNT   1
    QUESTION SECTION:
    Offset = 0x000c, RR count = 0
    Name      "(4)srv1(2)ex(7)example(3)com(0)"
      QTYPE   AAAA (28)
      QCLASS  1
    ANSWER SECTION:
      empty
    AUTHORITY SECTION:
      empty
    ADDITIONAL SECTION:
    Offset = 0x0022, RR count = 0
    Name      "(0)"
      TYPE   OPT  (41)
      CLASS  4000
      TTL    0
      DLEN   0
      DATA   
    Buffer Size  = 4000
    Rcode Ext    = 0
    Rcode Full   = 0
    Version      = 0
    Flags        = 0

4/28/2023 1:34:08 PM 03D0 PACKET  0000024028D128E0 UDP Rcv 77.247.183.137  5889 R Q [0084 A     NOERROR] AAAA   (4)srv1(2)ex(7)example(3)com(0)
UDP response info at 0000024028D128E0
  Socket = 13208
  Remote addr 77.247.183.137, port 53
  Time Query=44628, Queued=0, Expire=0
  Buf length = 0x0fa0 (4000)
  Msg length = 0x006d (109)
  Message:
    XID       0x5889
    Flags     0x8400
      QR        1 (RESPONSE)
      OPCODE    0 (QUERY)
      AA        1
      TC        0
      RD        0
      RA        0
      Z         0
      CD        0
      AD        0
      RCODE     0 (NOERROR)
    QCOUNT    1
    ACOUNT    0
    NSCOUNT   1
    ARCOUNT   1
    QUESTION SECTION:
    Offset = 0x000c, RR count = 0
    Name      "(4)srv1(2)ex(7)example(3)com(0)"
      QTYPE   AAAA (28)
      QCLASS  1
    ANSWER SECTION:
      empty
    AUTHORITY SECTION:
    Offset = 0x0022, RR count = 0
    Name      "[C013](7)example(3)com(0)"
      TYPE   SOA  (6)
      CLASS  1
      TTL    3600
      DLEN   52
      DATA   
    PrimaryServer: (9)ns-canada(6)topdns[C019](3)com(0)
    Administrator: (10)hostmaster[C038](6)topdns[C019](3)com(0)
    SerialNo     = 2023040603
    Refresh      = 43200
    Retry        = 900
    Expire       = 1209600
    MinimumTTL   = 3600
    ADDITIONAL SECTION:
    Offset = 0x0062, RR count = 0
    Name      "(0)"
      TYPE   OPT  (41)
      CLASS  4096
      TTL    0
      DLEN   0
      DATA   
    Buffer Size  = 4096
    Rcode Ext    = 0
    Rcode Full   = 0
    Version      = 0
    Flags        = 0

4/28/2023 1:34:08 PM 03D0 PACKET  000002402682D0C0 UDP Snd 127.0.0.1       0015 R Q [8281   DR SERVFAIL] AAAA   (4)srv1(2)ex(7)example(3)com(0)
UDP response info at 000002402682D0C0
  Socket = 688
  Remote addr 127.0.0.1, port 58024
  Time Query=44628, Queued=44628, Expire=44631
  Buf length = 0x0200 (512)
  Msg length = 0x0022 (34)
  Message:
    XID       0x0015
    Flags     0x8182
      QR        1 (RESPONSE)
      OPCODE    0 (QUERY)
      AA        0
      TC        0
      RD        1
      RA        1
      Z         0
      CD        0
      AD        0
      RCODE     2 (SERVFAIL)
    QCOUNT    1
    ACOUNT    0
    NSCOUNT   0
    ARCOUNT   0
    QUESTION SECTION:
    Offset = 0x000c, RR count = 0
    Name      "(4)srv1(2)ex(7)example(3)com(0)"
      QTYPE   AAAA (28)
      QCLASS  1
    ANSWER SECTION:
      empty
    AUTHORITY SECTION:
      empty
    ADDITIONAL SECTION:
      empty

В Windows Server по умоланию включена защита от отравления кэша. Видимо, ему не нравится, что NS не входят в дерево example.com.

Пропатчить musl, чтобы не лез, куда не следует.

На Windows Server отключить защиту от отравления кэша:

  1. Открываем DNS Manager;
  2. Выбираем сервер -> Properties -> Advanced;
  3. Снимаем галочку Secure cache against pollution;
  4. Сохраняем, перезапускаем сервис.

shell-session

# nslookup srv1.ex.example.com
Server:         10.1.1.10
Address:        10.1.1.10:53

Non-authoritative answer:

Non-authoritative answer:
Name:   srv1.ex.example.com
Address: 203.0.113.123
  1. getaddrinfo() fails for domains with no AAAA records
  2. Server 2012R2 DNS server returning SERVFAIL for some AAAA queries
  3. How can I stop DNS Cache pollution?
  4. Nslookup resolves server address but gives server can’t find SERVFAIL error at the same time