Servfail в Windows DNS при делегировании поддомена и запросе несуществующей AAAA-записи
На сервере Alpine Linux столкнулся со следующей ошибкой:
# 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 отключен на обоих серверах.
Поиск проблемы
При попытке отображения имени в адрес отправляются два запроса:
# 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 отключен. Парам-парам-пам.
# 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
AAAA
Резолвинг внутренних поддоменов, которые не имеют IPv6 адрес, проходит успешно:
# 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 адрес, проходит успешно:
# 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 сервер с делегацией:
# 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 сервер:
# 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-записью:
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 отключить защиту от отравления кэша:
- Открываем DNS Manager;
- Выбираем сервер -> Properties -> Advanced;
- Снимаем галочку Secure cache against pollution;
- Сохраняем, перезапускаем сервис.
# 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