DNS Lab.

Q. 루트 힌트 파일은 꼭 설정해야 할까? 사설IP주소의 인버스 도메인은? 본문

BIND DNS

Q. 루트 힌트 파일은 꼭 설정해야 할까? 사설IP주소의 인버스 도메인은?

승홍 2015. 12. 9. 15:40

 

Q. 루트 힌트(root hint) 파일은 꼭 설정해야 하나요?

 

A. 최신 BIND DNS 버전으로 캐시DNS서버 용도로 사용하고 있다면, 굳이 따로 설정하지 않아도 됩니다.

 

캐시DNS서버 경우 루트 힌트 파일은 반드시 필요한 정보이기는 하지만, BIND DNS는 필요한 루트 네임서버 내역을 모두 실행 코드 자체에 내장하고 있기 때문에 따로 설정하는 수고를 하지 않아도 됩니다.

 

설정하지 않아도 된다는 말만 듣고 그냥 믿기에는 좀 그렇습니다. 또 혹시 지금 사용 중인 BIND DNS 버전은 루트 힌트 내용이 하드 코딩되어 있지 않을 수 있지 않을까 싶은 경우에는 직접 확인이 필요하겠지요.

 

지금 시스템에서 구동하고 있는 named의 프로세스가 /usr/local/sbin/named 실행파일이 구동된 프로세스라면, 아래와 같이 strings 유틸을 사용하여 하드 코딩된 루트 힌트 존 내역을 직접 확인할 수 있습니다. named 프로세스를 실행하기 전에 아래와 같이 확인해 보면 되겠지요.

 

※ strings 유틸은 바이너리 파일 내용 중 ASCII 문자열 부분만 추려내여 화면에 출력해 주는 유틸리티입니다.

 

$ strings /usr/local/sbin/named | grep -P '^(\.|[A-M]).+IN\W+(NS|A|AAAA)' 
.                       518400  IN      NS      A.ROOT-SERVERS.NET. 
.                       518400  IN      NS      B.ROOT-SERVERS.NET. 
.                       518400  IN      NS      C.ROOT-SERVERS.NET. 
.                       518400  IN      NS      D.ROOT-SERVERS.NET. 
.                       518400  IN      NS      E.ROOT-SERVERS.NET. 
.                       518400  IN      NS      F.ROOT-SERVERS.NET. 
.                       518400  IN      NS      G.ROOT-SERVERS.NET. 
.                       518400  IN      NS      H.ROOT-SERVERS.NET. 
.                       518400  IN      NS      I.ROOT-SERVERS.NET. 
.                       518400  IN      NS      J.ROOT-SERVERS.NET. 
.                       518400  IN      NS      K.ROOT-SERVERS.NET. 
.                       518400  IN      NS      L.ROOT-SERVERS.NET. 
.                       518400  IN      NS      M.ROOT-SERVERS.NET. 
A.ROOT-SERVERS.NET.     3600000 IN      A       198.41.0.4 
A.ROOT-SERVERS.NET.     3600000 IN      AAAA    2001:503:BA3E::2:30 
B.ROOT-SERVERS.NET.     3600000 IN      A       192.228.79.201 
C.ROOT-SERVERS.NET.     3600000 IN      A       192.33.4.12 
C.ROOT-SERVERS.NET.     3600000 IN      AAAA    2001:500:2::c 
D.ROOT-SERVERS.NET.     3600000 IN      A       199.7.91.13 
D.ROOT-SERVERS.NET.     3600000 IN      AAAA    2001:500:2d::d 
E.ROOT-SERVERS.NET.     3600000 IN      A       192.203.230.10 
F.ROOT-SERVERS.NET.     3600000 IN      A       192.5.5.241 
F.ROOT-SERVERS.NET.     3600000 IN      AAAA    2001:500:2F::F 
G.ROOT-SERVERS.NET.     3600000 IN      A       192.112.36.4 
H.ROOT-SERVERS.NET.     3600000 IN      A       128.63.2.53 
H.ROOT-SERVERS.NET.     3600000 IN      AAAA    2001:500:1::803F:235 
I.ROOT-SERVERS.NET.     3600000 IN      A       192.36.148.17 
I.ROOT-SERVERS.NET.     3600000 IN      AAAA    2001:7fe::53 
J.ROOT-SERVERS.NET.     3600000 IN      A       192.58.128.30 
J.ROOT-SERVERS.NET.     3600000 IN      AAAA    2001:503:C27::2:30 
K.ROOT-SERVERS.NET.     3600000 IN      A       193.0.14.129 
K.ROOT-SERVERS.NET.     3600000 IN      AAAA    2001:7FD::1 
L.ROOT-SERVERS.NET.     3600000 IN      A       199.7.83.42 
L.ROOT-SERVERS.NET.     604800  IN      AAAA    2001:500:3::42 
M.ROOT-SERVERS.NET.     3600000 IN      A       202.12.27.33 
M.ROOT-SERVERS.NET.     3600000 IN      AAAA    2001:DC3::35

 

루트 힌트 내용이 하드 코딩되어 있는 소스 파일은 lib/dns/rootns.c 입니다.

 

그러면, 루트 힌트 파일을 일부러 작성해서 반영해야 하는 경우는 어떻게 해야 할까요? 이전처럼 루트 힌트 파일을 작성해서 named.conf에 설정해 주면 됩니다. named는 내장된 루트 네임서버 내역 대신 관리자가 작성해서 알려준 루트 힌트 파일의 정보를 반영합니다.

 

테스트베드망을 구성하는 특수한 경우, 내부망에 시험망 내에 구축한 루트 네임서버를 사용해야 한다면 직접 루트 힌트 파일의 설정이 필요합니다. 인터넷의 루트 네임서버 대신 시험망 환경에 있는 시험용 루트 네임서버를 이용해야 하니까요.

 

인터넷의 루트 네임서버 IP주소가 바뀌면 루트 힌트 파일 설정이 필요할 수 있습니다. 하지만 13개의 루트 네임서버 IP주소 전부가 한꺼번에 바뀌는 일은 없을 것이므로 루트 네임서버 하나의 IP주소가 바뀌었다 하더라도 굳이 루트 힌트 파일을 작성해 주지 않아도 됩니다. 13개 루트 네임서버 IP주소 중에 하나라도 정확한 것이 있으면 루트 네임서버를 이용하는데 문제는 없습니다. 이번 12월 1일에 H 루트 네임서버의 IP주소가 변경되었지만 13개 중에서 하나의 루트 네임서버 IP주소만 바뀌었기 때문에 내장된 루트 네임서버 정보를 사용해도 무방합니다.

 

 

Q. '127.0.0.1/8'의 인버스도메인 존은?

 
A. 최신 BIND DNS 버전을 사용하고 있다면, 루프백 주소(127.0.0.1/8)와 사설 IP주소, 기타 공중 인터넷에서 사용할 수 없는 주소에 대한 인버스도메인도 따로 설정하지 않아도 됩니다.
 
BIND DNS는 인터넷 표준으로 지정되어 있는 루프백(loopback) 주소, 사설 IPv4/IPv6 주소, 기타 공중 인터넷에서 사용하지 않는 주소 들에 대한 인버스도메인 내역 역시 하드 코딩하여 실행파일 코드에 내장해 두고 있습니다. 그래서 별도의 설정이 없으면 하드코딩된 내역을 적용하여 동작합니다.
 

역시 동일한 방법을 사용해서 하드코딩된 인버스도메인 내역을 확인해 볼 수 있습니다.

 

$ strings /usr/local/sbin/named | grep -P '(IN-ADDR|IP6).ARPA$' 
10.IN-ADDR.ARPA
16.172.IN-ADDR.ARPA
17.172.IN-ADDR.ARPA
18.172.IN-ADDR.ARPA
19.172.IN-ADDR.ARPA
20.172.IN-ADDR.ARPA
21.172.IN-ADDR.ARPA
22.172.IN-ADDR.ARPA
23.172.IN-ADDR.ARPA
24.172.IN-ADDR.ARPA
25.172.IN-ADDR.ARPA
26.172.IN-ADDR.ARPA
27.172.IN-ADDR.ARPA
28.172.IN-ADDR.ARPA
29.172.IN-ADDR.ARPA
30.172.IN-ADDR.ARPA
31.172.IN-ADDR.ARPA
168.192.IN-ADDR.ARPA
64.100.IN-ADDR.ARPA
65.100.IN-ADDR.ARPA
66.100.IN-ADDR.ARPA
67.100.IN-ADDR.ARPA
68.100.IN-ADDR.ARPA
69.100.IN-ADDR.ARPA
70.100.IN-ADDR.ARPA
71.100.IN-ADDR.ARPA
72.100.IN-ADDR.ARPA
73.100.IN-ADDR.ARPA
74.100.IN-ADDR.ARPA
75.100.IN-ADDR.ARPA
76.100.IN-ADDR.ARPA
77.100.IN-ADDR.ARPA
78.100.IN-ADDR.ARPA
79.100.IN-ADDR.ARPA
80.100.IN-ADDR.ARPA
82.100.IN-ADDR.ARPA
83.100.IN-ADDR.ARPA
84.100.IN-ADDR.ARPA
85.100.IN-ADDR.ARPA
86.100.IN-ADDR.ARPA
87.100.IN-ADDR.ARPA
88.100.IN-ADDR.ARPA
89.100.IN-ADDR.ARPA
90.100.IN-ADDR.ARPA
91.100.IN-ADDR.ARPA
92.100.IN-ADDR.ARPA
93.100.IN-ADDR.ARPA
94.100.IN-ADDR.ARPA
95.100.IN-ADDR.ARPA
96.100.IN-ADDR.ARPA
97.100.IN-ADDR.ARPA
98.100.IN-ADDR.ARPA
99.100.IN-ADDR.ARPA
100.100.IN-ADDR.ARPA
101.100.IN-ADDR.ARPA
102.100.IN-ADDR.ARPA
103.100.IN-ADDR.ARPA
104.100.IN-ADDR.ARPA
105.100.IN-ADDR.ARPA
106.100.IN-ADDR.ARPA
107.100.IN-ADDR.ARPA
108.100.IN-ADDR.ARPA
109.100.IN-ADDR.ARPA
110.100.IN-ADDR.ARPA
111.100.IN-ADDR.ARPA
112.100.IN-ADDR.ARPA
113.100.IN-ADDR.ARPA
114.100.IN-ADDR.ARPA
115.100.IN-ADDR.ARPA
116.100.IN-ADDR.ARPA
117.100.IN-ADDR.ARPA
118.100.IN-ADDR.ARPA
119.100.IN-ADDR.ARPA
120.100.IN-ADDR.ARPA
121.100.IN-ADDR.ARPA
122.100.IN-ADDR.ARPA
123.100.IN-ADDR.ARPA
124.100.IN-ADDR.ARPA
125.100.IN-ADDR.ARPA
126.100.IN-ADDR.ARPA
127.100.IN-ADDR.ARPA
0.IN-ADDR.ARPA
127.IN-ADDR.ARPA
254.169.IN-ADDR.ARPA
2.0.192.IN-ADDR.ARPA
100.51.198.IN-ADDR.ARPA
113.0.203.IN-ADDR.ARPA
255.255.255.255.IN-ADDR.ARPA
0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA
D.F.IP6.ARPA
8.E.F.IP6.ARPA
9.E.F.IP6.ARPA
A.E.F.IP6.ARPA
B.E.F.IP6.ARPA
8.B.D.0.1.0.0.2.IP6.ARPA
인버스도메인 존 내역이 하드 코딩되어 있는 소스 파일은 bin/named/server.c 입니다.
 
설정내역이 상당히 많습니다. 이 많은 걸 일일이 수작업으로 설정하는 것 보다는 BIND DNS가 내장된 설정을 사용하도록, 아무 설정도 하지 않는 것이 바람직 할 것입니다.
 
다만, 하드 코딩된 인버스도메인 내역을 활용하려면, named.conf의 options 영역에 'empty-zones-enable no' 설정을 하지 않아야 합니다. 
'empty-zones-enable no' 설정을 하는 경우, 위 내장된 인버스도메인 존 내역은 자동 설정되지 않으며, 관리자가 수작업으로 설정하여야 합니다. 
설정을 하지 않는 경우 'empty-zones-enable yes' 가 디폴트 설정입니다.
 
named는 'empty-zones-enable' 옵션 값을 검사해서 이 값이 'yes'인 경우(디폴트 값이 yes)에 한하여 위의 내장된 인버스도메인 존을 생성합니다. 만약 위 리스트 중에 관리자가 따로 인버스도메인으로 named.conf에 설정한 인버스도메인 존이 있으면 이 존은 관리자가 지정한 존으로 반영처리하고 나머지 내장 인버스도메인 존을 생성합니다. 만일 named.conf 파일의 options 영역에 'disable-empty-zone' 옵션으로 특정한 인버스도메인이 지정되어 있다면 이 인버스도메인은 생성하지 않고 다음 리스트의 인버스도메인 존을 생성합니다.
 
  • empty-zones-enable yes|no : [디폴트 yes] 내장된 사설 및 특수 IP주소의 인버스도메인 리스트에 대해 비어있는 인버스도메인 존을 자동 생성하여 반영
  • disable-empty-zone zone_name : [디폴트 ""] 내장된 사설 및 특수 IP주소의 인버스도메인 리스트 중에서 자동생성하지 않아야 할 인버스도메인 존을 지정. 존마다 여러번 지정할 수 있음. 
  • empty-zone에 관련된 기타 옵션들은 BIND 매뉴얼 참조
 
이 기능은 BIND 9.6이상에서 제공하기 시작했습니다. BIND 9.9 버전부터는 'empty-zones-enable yes'가 디폴트 설정으로 전환되었으므로, 관리자가 일부러 'empty-zones-enable no' 설정을 하는 경우가 아니라면 내장된 인버스도메인 리스트이 존이 자동으로 생성되어 사용됩니다.
 
※ 앞서 "최신 BIND DNS 버전을 사용하고 있다면"이라는 단서를 달았지만, 사실은 BIND9 초기 버전 시절부터 이미 루트 힌트 내역을 코드에 내장하고 있었던 것으로 보입니다. 정확히 어느 버전부터 적용되고 있었는지는 확실하게 언급할 수 없지만 적어도 BIND 9.2부터는 루트 힌트 내역을 코드에 내장하고 있다고 말할 수 있을 것 같습니다.

 

 

 

 

Comments