bind9을 이용해서 사설 dns를 구축할때 리서치를 여기까지 하게 될줄은 생각도 못했다…
주로 퍼블릭 dns를 이용했었고, 사설 dns도 메인도메인은 하나만 설정해봐서 루트 도메인 충돌이 생길거라고는 생각을 못했다.
결론.
test. 루트 도메인을 사용하는 icurfer.test. 서브도메인과 demo.test. 서브 도메인이 있다면, 중앙관리하는 test. 설정을 먼저하고 icurfer.test.과 demo.test.의 NS레코드는 test. 을 사용하도록 설정하자.
에러 발생 시나리오
- 서브도메인을 통합관리하는 루트 도메인이 없다(에러의 원인).
zone 설정
테스트를 위해서 2개의 zone을 만들었다.
vim /etc/bind/named.conf.local
//zone "icurfer.dev" {
// type master;
// file "/etc/bind/zones/icurfer.dev";
//};
zone "icurfer.test" {
type master;
file "/etc/bind/zones/icurfer.test";
};
zone "demo.test" {
type master;
file "/etc/bind/zones/demo.test";
};
zone별 설정 파일 생성
icurfer.test의 설정 값
$TTL 60
@ IN SOA dns.icurfer.test. admin.icurfer.test. (
3 ; Serial
120 ; Refresh
60 ; Retry
2419200 ; Expire
60 ) ; Negative Cache TTL
@ IN NS dns.icurfer.test.
;dns IN A 172.17.128.100 ; NS도메인에 대응되는 주소
@ IN A 192.168.0.15 ; 도메인의 루트 주소 icurfer.test.
gpu IN A 192.168.0.201
demo.test의 설정 값
$TTL 60
@ IN SOA dns.icurfer.test. admin.icurfer.test. (
3 ; Serial
120 ; Refresh
60 ; Retry
2419200 ; Expire
60 ) ; Negative Cache TTL
;
@ IN NS dns.icurfer.test.
;dns IN A 172.17.128.100 ; NS도메인에 대응되는 주소
@ IN A 192.168.0.100
int-haproxy IN A 192.168.0.100
gpu IN A 192.168.0.201
에러 내용
에러를 발생시키게 된 이유는 두개의 설정을 해본 이유는 ‘test.demo.’ zone설정 파일의 정보에 NS레코드를 넣었는데 dns sub-domain의 A레코드 설정이 main-domain과 연관이 없다는 생각이 들었기 때문이다.
‘demo.test’ 의 설정에서 A레코드 값(아래 내용의 주석된 부분)을 삭제 하였고 gpu.demo.test.로 nslookup 쿼리가 정상으로 호출됨을 확인하였다.
;dns IN A 172.17.128.100 ; NS도메인에 대응되는 주소
‘icurfer.test’의 설정에서도 동일하게 삭제하였으나 쿼리가 되지 않았다. 이때부터 혼란이 시작되었다…’icurfer.test’의 A레코드 값이 영향을 미치는가??
결론은 영향을 미치지 않는다는 것이다.이미 named.conf.local에 개별 zone으로 설정하였기 때문에 둘다 쿼리가 되어야 원래는 맞는 것이다.
좀더 찾아볼 필요가 있긴하지만…gpt와 함께 확인해보다보니 아래와 같은 답변이 튀어나왔다.

일리가 있는 말 같다….
테스트 조건 변경 후 테스트.
icurfer.dev와 demo.test 도메인 테스트.
A레코드를 지워도 아무 문제없이 동작하는 것을 확인하였다.
원하는 설정
내가 원하는 건,
BIND9에서 test. 루트 도메인을 설정하고, 모든 서브도메인을 포함시킴.
각 서브도메인은 개별적으로 레코드를 관리하지만, NS 레코드는 ns.test.를 사용.
모든 도메인이 동일한 BIND9 서버에서 처리되므로 네임서버 위임(delegation)이 필요 없음.
따라서, ‘test.’를 루트 도메인으로 설정하고 ‘icurfer.test’와 ‘demo.test’는 서브도메인으로 사용하여 각각 레코드를 관리하고 중앙 ns설정이 필요하다.
테스트 진행
zone파일에 root도메인 설정
zone "test" {
type master;
file "/etc/bind/zones/root.test";
};
zone "icurfer.test" {
type master;
file "/etc/bind/zones/icurfer.test";
};
zone "demo.test" {
type master;
file "/etc/bind/zones/demo.test";
};
$TTL 60
@ IN SOA ns.test. admin.test. (
3 ; Serial
120 ; Refresh
60 ; Retry
2419200 ; Expire
60 ) ; Negative Cache TTL
;
@ IN NS ns.test.
ns IN A 172.17.128.100 ; test. 도메인을 관리할 네임서버의 IP
; 하위 도메인
demo IN NS ns.demo.test.
icurfer IN NS ns.icurfer.test.
icurfer.test 설정
$TTL 60
@ IN SOA ns.test. admin.icurfer.test. (
3 ; Serial
120 ; Refresh
60 ; Retry
2419200 ; Expire
60 ) ; Negative Cache TTL
@ IN NS ns.test.
@ IN A 192.168.0.15 ; 도메인의 루트 주소 icurfer.test.
;code IN CNAME icurfer.test.
gpu IN A 192.168.0.201
www IN CNAME icurfer.test.
demo.test 설정
$TTL 60
;@ IN SOA ns.test. admin.demo.test. (
@ IN SOA ns.icurfer.test. admin.icurfer.test. (
3 ; Serial
120 ; Refresh
60 ; Retry
2419200 ; Expire
60 ) ; Negative Cache TTL
;
@ IN NS ns.test.
@ IN A 192.168.0.100 ; 도메인의 루트 주소 test.
int-haproxy IN A 192.168.0.100
;* IN CNAME int-haproxy.demo.test.
gpu IN A 192.168.0.201
이제 gpu.demo.test.와 gpu.icurfer.test. 둘다 쿼리 응답을 하게 되었다…

사용하는 ns레코드 확인
$ dig @172.17.128.100 test. NS
;; ANSWER SECTION:
test. 60 IN NS ns.test.
$ dig @172.17.128.100 demo.test. NS
;; ANSWER SECTION:
demo.test. 60 IN NS ns.test.
$ dig @172.17.128.100 icurfer.test. NS
;; ANSWER SECTION:
icurfer.test. 60 IN NS ns.test.
후기
테스트 하면서 설명도 좀 작성하기도하고 내용이 좀 난잡해지긴했는데…같은 루트 도메인을 사용하는 경우 서브 도메인을 어떻게 설정해야되는지 고민을 많이 해보게 되었다.
끝.