안녕하세요! 잼니크입니다!
오늘은 레드햇 계열 리눅스에서 BIND 9을 이용해서 사설 DNS(Domain Name System)서버를 구축하려고 합니다.
(DNS는 도메인 네임 서비스입니다! 마지막 S는 서버가 아니에요)
DNS서버, 도메인 이름 서버 혹은 네임서버는 인터넷에서 IP주소를 알기 쉬운 도메인 이름으로 바꿔서 알려줍니다. 보통 우리가 인터넷을 사용할 때 따로 세팅하지 않는 이유는 인터넷에 연결할 때 DHCP(Dynamic Host Configuration Protocol)를 통해 네트워크 접속을 위한 정보를 주고 받는데, 이때 IP주소와 DNS의 정보도 같이 받습니다.
보통은 SKT나 KT같은 통신사나 ISP(Internet Service Provider, 인터넷 서비스 제공자가 제공하는 DNS 서버를 사용하지만, 인터넷 속도를 높이기 위해 (정확하게는 DNS의 응답 속도를 높여서 빠르게 접속하기 위해) Google의 DNS를 사용하거나(8.8.8.8), 인터넷이 연결되지 않는 분리망 안에서 사용하기 위해 사설로 구축하는 경우가 있습니다.
이번 글에서는 BIND 9을 통해 사설 DNS 서버를 구축하려고 합니다.
RHEL의 클론인 Rocky 9 리눅스를 사용합니다.
그럼 시작하겠습니다!
1. Bind 설치 하기
간단하게 아래 명령을 실행하면 됩니다!
# 쉘에서 실행
sudo dnf install bind bind-utils
설치하는 패키지는 bind와 bind-utils 입니다. bind는 DNS를 구성하는 서버이고, bind-utils는 DNS 구성을 위한 설정파일을 작성하는데, 설정파일의 문법에 오류가 없는지 확인하는데 사용하는 프로그램을 설치하기 위해 사용합니다.
사실 설치를 하는건 어렵지 않습니다만... BIND 설정이 좀 답답해서... bind-utils에서 제공하는 도구들을 사용하면 문제를 파악하는데 많은 도움이 됩니다.
2. BIND 설정하기
BIND 설정에 앞서 설정할 것을 먼저 설명 드리겠습니다. 저는 jmlim 이라는 도메인을 사용할 예정입니다. DNS 서버는 ns.jmlim을 사용하려고 합니다. 집 안에 테스트 환경을 만들 예정이고 테스트 머신은 192.168.0.1/16 에 할당 될 예정입니다.
가장 먼저 BIND 9 설정 파일을 편집하겠습니다.
# 쉘에서 실행
vi /etc/named.conf
여기서 필요한 부분만 수정하겠습니다.
처음상태의 설정 파일은 localhost에서만 접근할 수 있었는데, 설정을 편집해서 제가 쓸 IP 대역에서 온 요청만 받도록 설정을 수정했습니다.
//
// 수정한 내용은 이렇게 주석으로 표시함
//
options {
// listen-on port 53 { 127.0.0.1; }; localhost만 listen
// listen-on port 53 { any; }; 모든 호스트를 listen
listen-on port 53 { 192.168.0.0/16; 127.0.0.1; };
// listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
secroots-file "/var/named/data/named.secroots";
recursing-file "/var/named/data/named.recursing";
// allow-query { localhost; };
allow-query { any; };
// recursion yes;
recursion no;
dnssec-validation yes;
managed-keys-directory "/var/named/dynamic";
geoip-directory "/usr/share/GeoIP";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
include "/etc/crypto-policies/back-ends/bind.config";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
방금 설정 파일의 문법에 문제가 있는지 확인하기 위해 아래와 같이 명령을 내려줍니다
# 쉘에서 실행
named-checkconf /etc/named.conf
만약 문법에 문제가 없다면 아무런 메시지가 없이 끝나지만 문제가 있으면 아래와 같이 문제가 있는 메시지가 뜹니다.
그 다음은, rfc1921.zone 파일을 수정합니다.
이 파일은 DNS가 서비스할 도메인에 대한 정보를 담고 있습니다.
jmlim 도메인과, 역방향 DNS(리버스 또는 인버스 DNS)도 위해 파일에 아래와 같은 내용을 추가 합니다.
내용을 자세히 보면 file 이라는 항목이 있는데 이 파일은 위에 있는 named.conf에서 directory 에 있는 경로에 있는 파일을 참고한다는 뜻입니다.
// jmlim
zone "jmlim" IN {
type master;
file "named.jmlim";
allow-update { none; };
};
zone "100.168.192.in-addr.arpa" IN {
type master;
file "named.jmlim";
allow-update { none; };
};
그 다음은 방금 수정한 rfc1921.zone에서 가르키는 파일인 named.jmlim 파일을 만들어야합니다!
# 쉘에서 실행
cd /var/named/
vi ./named.jmlim
; 아래와 같이 작성
; 세미콜론은 주석입니다!
; 그리고 반드시 도메인 마지막에는 .(닷)이 붙어야 합니다!
$TTL 3H
@ IN SOA @ ns.jmlim. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ); minimum
NS ns.jmlim.
ns A 192.168.100.1
;
1 PTR ns.jmlim.
그 다음에는 이번에 만든 zone 파일의 문제가 있는지를 확인합니다.
# 쉘에서 실행
# named-checkzone [도메인 이름] [zone 파일경로]
named-checkzone jmlim /var/named/named.jmlim
동일하게 문제가 있다면 오류 메시지를, 오류가 없다면 아래와 같이 OK 메시지를 보게 됩니다.
# 쉘에서 다음과 같이 실행
systemctl restart named
systemctl status named
위 그림과 같이 active (running) 이라고 뜨면 일단은 네임서버가 기동 되었습니다.
정상적으로 기동 되었는지 기동 로그를 체크해 보겠습니다
# 쉘에서 실행
journalctl -u named
앗... zone 파일을 읽는데 권한 문제가 있었군요 실수~ ㅋㅋㅋ
제가 root 계정으로 zone 파일을 만들어서 발생하는문제였습니다. 해결 방법은 파일의 그룹을 다른 zone 파일과 같이 named 그룹으로 바꿔서 해결했습니다! 다음으로 넘어가겠습니다 ㅋㅋ
이제 이 네임서버를 통해 조회가 되는지를 체크해 보겠습니다.
아까 옵션에 localhost에서 조회할 수 있도록 해 놨습니다.
# 쉘에서 실행
# nslookup [조회할 도메인] [도메인서버]
# 로컬호스트로 조회
nslookup ns.jmlim 127.0.0.1
# NIC 주소로 조회
nslookup ns.jmlim 192.168.100.1
위 그림을 통해 방금 구축한 DNS를 통해 ns.jmlim의 IP가 192.168.100.1이라는 것을 알 수가 있습니다.
만약 ** server can't find ...... NXDOMAIN 이렇게 뜬다면 조회를 못한것입니다.
그럼 이제 역방향도 조회해 보겠습니다.
# 쉘에서 실행
nslookup 192.168.100.1 127.0.0.1
역방향도 조회가 잘 되네요!
내부용 DNS 서버 구축이 완료 되었습니다!
하지만 추가적인 설정을 해야할 경우가 있습니다.
현재 DNS는 자기가 가지고있는 zone 파일에 기록된 도메인 주소만 응답합니다.
즉, DNS 자기가 가지지 못한 도메인을 질의 하면 REFUSED 로 응답이 옵니다.
이 경우 위에서 수정한 /etc/named.conf 에 있는 recursion 옵션을 yes로 다시 바꿔주면 됩니다.
단, 이때 DNS를 이용한 공격에 악용될 수 있기 때문에 공부를 충분히 하신 다음 필요할 경우에만 하는것이 좋습니다.
이것에 대한 내용은 아래 링크에 있는 클라우드플레어 사이트에서 확인할 수 있습니다.
https://www.cloudflare.com/ko-kr/learning/dns/what-is-recursive-dns/
질문 있으시면 답글로 알려주세요
고생하셨습니다!
'IT > Linux' 카테고리의 다른 글
Gentoo 리눅스설치(2): 시작이 반입니다! (2) | 2024.04.25 |
---|---|
Gentoo 리눅스 설치(1): Gentoo리눅스 설치를 위한 각오! (0) | 2024.04.25 |
리눅스 JDK 설치 방법을 정리해 봅시다! (계속 업데이트중) (4) | 2024.04.20 |
Ubuntu 22.04 서버 버전 설치 (0) | 2023.07.02 |
Ubuntu 서버를 설치할 때 과정을 유심히 봐야 하는 이유 (0) | 2023.07.02 |