다음 링크에 따라 네임서버를 설정했습니다.https://www.digitalocean.com/community/tutorials/an-introduction-to-dns-terminology-comComponents-and-concepts
일반적으로 네임서버 resolv.conf에는 2
사용 가능한 다른 네임서버 IP가 포함됩니다. 그러나 resolv.conf가 다음과 같이 서버 이름으로 127.0.0.1만 사용하는 경우:
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.0.1
#nameserver 172.31.0.2
#nameserver 127.0.0.53
search ec2.internal
그런 다음 사용자 정의 네임서버에서 터미널에 다음 명령을 입력했습니다.
telnet www.yahoo.com 80
Trying 98.139.180.149...
Connected to fd-fp3.wg1.b.yahoo.com.
Escape character is '^]'.
GET / HTTP/1.1
Host: www.yahoo.com
테스트해본 결과 네임서버가 제대로 작동하고 있습니다.
그러므로 나는 두 가지 가설을 가지고 있습니다.
1:resolv.conf 파일에 127.0.0.1만 포함된 경우 이름 서버는 "루트" 서버, TLD 이름 서버 등을 반복합니다.
2:바인드9 등 네임서버에는 root
서버에 대한 기록이 있기 때문에 추가 쿼리 없이 바로 쿼리를 보낼 수 있다.
내 말이 맞다면 네임서버는 루트 서버 주소를 어디에 기록합니까?
하지만 제가 틀렸다면 이 경우의 쿼리 흐름은 어떻게 되나요? 감사해요.
고쳐 쓰다
tcpdump를 사용하여 쿼리 프로세스를 추적한 후 이름 서버는 먼저 루트 이름 서버를 쿼리합니다. 그런데 루트 서버가 다른 모든 루트 이름 서버를 나에게 반환하는 이유는 무엇입니까?
k.root-servers.net.domain > ip-172-31-8-42.55523: Flags [P.], cksum 0x8784 (correct), seq 1:1100, ack 31, win 229, options [nop,nop,TS val 1581998147 ecr 403293], length 109964020*- q: NS? . 14/0/27 . NS b.root-servers.net., . NS g.root-servers.net., . NS i.root-servers.net., . NS c.root-servers.net., . NS e.root-servers.net., . NS f.root-servers.net., . NS d.root-servers.net., . NS l.root-servers.net., . NS k.root-servers.net., . NS a.root-servers.net., . NS j.root-servers.net., . NS h.root-servers.net., . NS m.root-servers.net., . RRSIG ar: a.root-servers.net. A 198.41.0.4, b.root-servers.net. A 192.228.79.201, c.root-servers.net. A 192.33.4.12, d.root-servers.net. A 199.7.91.13, e.root-servers.net. A 192.203.230.10, f.root-servers.net. A 192.5.5.241, g.root-servers.net. A 192.112.36.4, h.root-servers.net. A 198.97.190.53, i.root-servers.net. A 192.36.148.17, j.root-servers.net. A 192.58.128.30, k.root-servers.net. A 193.0.14.129, l.root-servers.net. A 199.7.83.42, m.root-servers.net. A 202.12.27.33, a.root-servers.net. AAAA 2001:503:ba3e::2:30, b.root-servers.net. AAAA 2001:500:84::b, c.root-servers.net. AAAA 2001:500:2::c, d.root-servers.net. AAAA 2001:500:2d::d, e.root-servers.net. AAAA 2001:500:a8::e, f.root-servers.net. AAAA 2001:500:2f::f, g.root-servers.net. AAAA 2001:500:12::d0d, h.root-servers.net. AAAA 2001:500:1::53, i.root-servers.net. AAAA 2001:7fe::53, j.root-servers.net. AAAA 2001:503:c27::2:30, k.root-servers.net. AAAA 2001:7fd::1, l.root-servers.net. AAAA 2001:500:9f::42, m.root-servers.net. AAAA 2001:dc3::35, . OPT UDPsize=4096 DO (1097)
이름 서버에 이미 모든 루트 서버에 대한 레코드가 있는 경우 이 단계는 의미가 없습니다.
답변1
이 파일은 /etc/resolv.conf
네임서버와 관련이 없습니다. 이는 확인자 라이브러리의 구성 파일이며 이름 서버를 찾을 수 있는 위치를 라이브러리에 알려줍니다. 이 경우 파일에는 를 nameserver
가리키는 항목 만 포함되어 있으므로 127.0.0.1
로컬 호스트의 일부 소프트웨어 구성 요소가 이름 서버 역할을 합니다. 구성을 알지 못하면 그것이 바인드9인지 프록시(예: 위에서 제안한 dirkt의 dnsmasq)인지 알 수 없습니다.
중요한 점은 이 resolv.conf
파일이 네임 서버의 기능에 영향을 미치지 않으며 네임 서버 구성 파일이 아니라는 것입니다.
답변2
실시간으로 DNS 흐름/경로를 디버깅할 수 있습니다. dnstracer
디버그 모드 nslookup
또는 dig
추적 모드에서 이 명령을 설치하고 사용할 수 있습니다.
이 명령을 사용하는 방법에 대한 관련 질문에 대한 내 대답을 참조하십시오.특정 호스트 이름을 확인하는 이름 서버를 찾는 방법
답변3
개선이나 더 나은 답변을 기대하면서 내 자신의 질문에 대답하려고 노력하고 있습니다.업데이트 제외
내 가정은 모두 정확했습니다. resolv.conf 파일에 127.0.0.1만 포함되어 있으면 이름 서버가 직접 묻습니다 root server
.
나는 bind9
모든 루트 서버 정보가 저장되어 있는 네임 서버를 사용합니다 /etc/bind/db.root
. 그래서 네임 서버는 단지 그것을 가져와서 그 중 하나를 무작위로 사용합니다.
그런 다음 이를 사용하여 tcpdump
쿼리 프로세스를 기록할 수 있습니다.
tcpdump -w tcpdump.out & telnet www.google.com 80 tcpdump -t -r tcpdump.out
tcpdump -vv
를 사용하여 자세한 내용을 볼 수도 있습니다 .
답변4
서버에 있는 것과 같은 재귀 이름 서버가 시작되면 127.0.0.1
"루트 부팅"을 수행합니다. 즉, 파일(설치 시 소프트웨어와 함께 배포됨)의 루트 서버 IP 주소 중 하나에서 시작하여 다음을 요청합니다 NS .
. tcpdump 출력에서 볼 수 있듯이 루트 서버의 모든 현재 이름과 IP 주소(v4 및 v6)를 얻을 수 있습니다(루트 서버 IP 주소는 로컬 파일에 오래된 정보가 포함될 수 있기 때문에 거의 변경되지 않지만 가끔 변경됨).
따라서 이 단계는 의미가 없으며 소프트 자동 업데이트입니다.