DNS(Domain Name System)는 도메인 이름을 IP 주소로 변환해주는 시스템이다.
전화번호를 일일히 외우지 않고 전화번호부에 등록을 해두면 스마트폰에서는 전화번호부에 등록된 이름만 입력하고 통화를 시도해도 자동으로 번호로 변환되어 연락이 가는 것처럼, 원래 서버가 가지고 있는 공인IP 대신 기억하기 쉬운 도메인 주소로 연결이 가능하도록 해주는 서버이다.
예를 들면, 구글에 접속하기 위해서는 142.250.76.142, 네이버에 접속하기 위해서는 223.130.200.104를 입력해야 하지만, google.com, naver.com을 입력하면 DNS에서 해당 도메인에 맞는 IP를 호출해준다.
국내에서 많이 사용되는 대표적인 DNS로는 SKT (219.250.36.130, 210.220.163.82), KT (168.126.63.1, 168.126.63.2), LG U+ (164.124.101.2, 203.248.252.2), Google (8.8.8.8, 8.8.4.4), Cloudflare (1.1.1.1, 1.0.0.1) 등이 있다.
공인IP를 사용하는 인터넷망 속에서는 각 인터넷 배급사에서 사용하는 통신사DNS나 google, cloudflare같은 DNS를 사용하면 전혀 문제가 없다.
그러나 내부장에서의 각 서버를 해당 서버에 부여된 사설IP가 아니라 별칭 도메인으로 접근하고 싶다면 사설 DNS를 생성해 사용할 수가 있다.
본 글은 도메인 네임 서버를 생성하는 방법을 작성한다.
Linux DNS
DNS 서버로 활용하기 위해서는 당연히 다른 장치들이 해당 서버를 참조하기 위한 고정주소가 필요하다.
CLI로 고정 IP 할당
192.168.1.138의 IP를 할당한 Rocky Linux 9이 설치된 서버를 DNS로 사용할 것이다.
리눅스는 DNS를 구축하기 위해 bind라는 툴이 필요하다.
bind, bind-chroot, bind-utils를 모두 설치해주어야 한다.
sudo yum -y install bind bind-chroot bind-utils
# 아래의 명령을 사용해도 모두 설치된다.
# sudo yum -y install bind*
bind 패키지 설치가 완료되면 named 설정 파일을 수정해준다.
/etc/named.conf에 위치한다.
sudo vi /etc/named.conf
vi편집기로 설정 파일을 열면 아래와 같이 나온다.
options {
listen-on port 53 { 127.0.0.1; }; // 127.0.0.1, 즉, DNS 서버 자기 스스로만 참조 가능.
listen-on-v6 port 53 { ::1; }; // ::1, 즉, DNS 서버 자기 스스로만 참조 가능.
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; }; // localhost 즉, DNS 서버 자체에서만 쿼리를 허용
53번 포트: DNS 접속 포트. DNS 일반 쿼리 등은 UDP 53번 포트를 사용하고, Zone-Transfer나 용량이 큰 응답 등은 TCP 53번 포트를 사용다.
127.0.0.1: IPv4의 루프백 주소
::1: IPv6의 루프백 주소
localhost: 서버 스스로 지칭
53번 포트가 루프백 IP주소만 설정이 되어있기 때문에 구성된 DNS에 서버 스스로만 접근이 가능하고
쿼리 허용도 localhost만 되어있기 때문에 서버 스스로만 DNS 응답을 받을 수 있는 상태임을 확인할 수 있다.
내부망의 DNS 서버로 동작하기 위해서는 IPv4 접근과 쿼리 접근 권한을 변경해주어야 한다.
'any' 값을 줌으로 모든 접근을 열어 줄 수 있다.
온전히 내부망만의 DNS로 사용하고자 한다면 IP 대역을 제한해줄 수 있다.
현재 DNS 서버가 위치한 망의 장비들은 192.168.1.XXX, 서브넷 255.255.255.0의 IP 대역을 사용중이기 때문에
'192.168.1.0/24' 값을 지정함으로 해당 대역의 IP만 접근을 허용할 수 있다.
DNS 쿼리에서 IPv6로 접근하는 경우는 드물기 때문에 수정하지 않아도 무방하다.
만약 내부망에서 IPv6 주소를 가지고 상호 통신한다면 해당 부분을 상황에 맞게 수정해주면 된다.
그 외 옵션 (필요에 따라 설정하되 하지 않아도 서버 동작과는 무관)
recursion yes / no;
// DNS에서 재귀적 조회(recursion)는 DNS 서버가 클라이언트의 요청에 대한 답변을 찾기 위해 다른 DNS 서버들에게 질문을 전달하는 과정을 의미한다. DNS 서버는 클라이언트의 요청에 대해 직접 답변할 수 있을 때까지 다른 DNS 서버들에게 질문을 전달한다. 이렇게 하면 클라이언트는 요청을 한 번만 보내면 되므로, 클라이언트의 작업이 간편해지지만, 반대로 DNS 서버는 클라이언트의 모든 요청에 대해 답변을 찾을 책임이 있기 때문에, 서버의 부하가 증가할 수 있다.
DNS가 완전히 폐회로 내부망에 존재하거나 외부 인터넷과 연결되어있더라도 퍼블릭한 DNS가 아니라면 크게 문제가 되지 않는다.
일반적으로는 no 옵션을 주어 재귀적 조회를 막아두는 것이 권장된다.
외부망과도 연결된 시스템에서 사설DNS에 등록되지 않은 인터넷 상의 도메인에 대한 접근도 필요하다면 recursion은 막아둔 채로 /etc/resolv.conf에서 사설DNS에서 조회를 실패했을 경우 다음 DNS를 조회하도록 설정할 수 있다.
recursion을 허용해야하는 경우, 내부망을 비롯한 특정 이용자만 허용하는 편이 좋다.
allow-recursion { IP; }; 옵션으로 줄 수 있다.
dnssec-enable yes / no;
dnssec-validation yes / no;
// DNSSEC(DNS Security Extensions): DNS 데이터 대상의 데이터 위조-변조 공격을 방지하기 위한 인터넷 표준기술. 공개키 암호화방식(Public Key Cryptography)의 전자서명 기술.
인터넷 상의 도메인에 대한 DNS 질의응답 절차 가운데 발생할 수 있는 DNS 데이터 위-변조 공격에 대응할 수 있는 보안기술인만큼 yes 옵션이 권장된다.
version "UNKNOWN";
//BIND9의 버전을 감추는 옵션
Master-Slave 서버 사용시 옵션
allow-update { any / none / 단일 IP주소 / CIDR; };
// Zone-Update 권한을 주는 옵션. Slave 서버에서도 DNS 수정 권한을 줄 때 사용. none이 권장된다.
allow-transfer { any / none / 단일 IP주소 / CIDR; };
// Zone-Transfer를 허용할지 정하는 옵션. /etc/named.rfc1912.zones 파일에서 zone별로 Zone-Transfer 설정을 할 수 있기 때문에 /etc/named.conf에서는 none이 권장된다.
notify yes / no / explicit / master-only;
also-notify { any / none / 단일 IP주소 / CIDR; };
// Zone의 NS 리스트에 있는 주소 + also-notify에 기재한 주소로 NOTIFY 메시지를 발송하는 옵션. SOA 레코드의 MNAME Field(주로 Primary Name Server)에 있는 주소로는 NOTIFY를 발송하지 않는다.
options {
listen-on port 53 { 192.168.1.0/24; }; //192.168.1.1~192.168.1.254에 속한 IP주소로부터의 요청을 수락
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 { 192.168.1.0/24; }; //192.168.1.1~192.168.1.254에 속한 IP주소로부터의 요청을 수락
allow-recursion { 192.168.1.0/24; }; //192.168.1.1~192.168.1.254에 속한 IP주소로부터의 재귀적 쿼리를 허용
recursion yes;
편집을 완료한 후 저장해준다.
설정 파일 편집 후, 혹시 설정 파일에 문법적 오류나 오타가 없는지 확인할 수 있다.
sudo named-checkconf /etc/named.conf
아무 값도 출력되지 않으면 정상이다.
오류가 있는 경우 오류 내역이 출력된다.
이제 DNS로 동작은 하는 상태가 되었으므로 DNS 정보를 작성하면 된다.
/etc/named.rfc1912.zones 파일을 편집기로 열어 정방향과 역방향 Zone File에 대한 설정을 등록한다.
[root@localhost named]# cat /etc/named.rfc1912.zones
// named.rfc1912.zones:
//
// Provided by Red Hat caching-nameserver package
//
// ISC BIND named zone configuration for zones recommended by
// RFC 1912 section 4.1 : localhost TLDs and address zones
// and https://tools.ietf.org/html/rfc6303
// (c)2007 R W Franks
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
// Note: empty-zones-enable yes; option is default.
// If private ranges should be forwarded, add
// disable-empty-zone "."; into options
//
zone "localhost.localdomain" IN {
type master;
file "named.localhost";
allow-update { none; };
};
zone "localhost" IN {
type master;
file "named.localhost";
allow-update { none; };
};
zone "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" IN {
type master;
file "named.loopback";
allow-update { none; };
};
zone "1.0.0.127.in-addr.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};
zone "0.in-addr.arpa" IN {
type master;
file "named.empty";
allow-update { none; };
};
현재는 로컬호스트와 루프백에 대한 zone만 등록되어있음을 알 수 있다.
각 zone에 대해 아래와 같은 형식으로 기재한다.
zone "도메인 / 역방향 PTR" IN {
옵션1;
옵션2;
옵션3;
};
역방향 PTR 주소는 'IP 역순.in-addr.arpa'로 작성한다.
예를들어 192.168.0.1의 역방향 주소는 '1.0.168.192.in-addr.arp'가 된다.
arpa는 Address and Routing Parameter Area의 약어로 역방향 DNS 조회를 위해 사용되는 특별한 도메인이다.
옵션은 대체로
첫번째 줄: type master / slave;
두번째 줄: file "zone 파일 이름";
순으로 작성한다.
그렇다고 순서가 달라진다 해서 권한이 꼬이거나 하는 문제가 발생하지는 않는다.
type: Master-Slave 구조의 DNS일 때에는 서버에 맞게 설정하면 되나 단일 서버 DNS에서는 master로 설정하면 된다. 필수 옵션으로 이 옵션이 생략되면, BIND는 해당 존 설정을 인식하지 못하고 오류를 반환한다.
file: /var/named/에 존대하는 zone 데이터를 저장하고 있는 파일을 지정. 이 파일이 없으면 해당 존의 DNS 레코드를 처리할 수 없어 해당 존에 대한 요청 처리에 실패하게 된다.
allow-update {}: 옵션을 미기재하면 none 값을 줬을때와 동일하게 동작하여 아무도 해당 존에 대한 DNS 레코드 업데이트를 수행할 수 없다. 일반적으로 none을 주기 때문에 생략해도 무방하다.
allow-transfer: 옵션을 미기재하면 none 값을 줬을때와 동일하게 동작하여 기본적으로 모든 호스트가 해당 존의 전체 레코드를 복사(zone transfer)할 수 있다. 이 옵션이 없으면 보안 문제가 발생할 수 있기 때문에 허용할 특정 IP로 대역을 제한하거나 none 옵션을 주는것이 권장된다.
DNS에는 IP로 접속 가능한 HTML GUI를 제공하는 내부망에 접속된 장비들을 등록해 줄 것이다.
내부망의 각 장치 및 서비스에 할당된 IP, 등록할 도메인은 아래와 같다.
장비 | IP Address | Domain |
R730 iDRAC | 192.168.1.30 | idrac730.test |
R730 ESXi | 192.168.1.31 | esxi730.test |
R730 vCenter | 192.168.1.32 | vcenter730.test |
R740 iDRAC | 192.168.1.194 | idrac740.test |
Unity 480F | 192.168.1.46 | unity480.test |
각 주소들에 대해 정방향과 역방향 zone을 하나씩 등록해주어야 한다.
아래의 내용은 각 주소에 대해 정방향과 역방향 zone과 기본 옵션을 등록한 것이다.
/etc/named.rfc1912.zones 파일 마지막에 추가해 준다.
zone "dns.test" IN {
type master;
file "dns.test.zone";
allow-update { none; };
};
zone "138.1.168.192.in-addr.arpa" IN {
type master;
file "dns.test.rev.zone";
allow-update { none; };
};
zone "idrac730.test" IN {
type master;
file "idrac730.test.zone";
allow-update { none; };
};
zone "30.1.168.192.in-addr.arpa" IN {
type master;
file "idrac730.test.rev.zone";
allow-update { none; };
};
zone "esxi730.test" IN {
type master;
file "esxi730.test.zone";
allow-update { none; };
};
zone "31.1.168.192.in-addr.arpa" IN {
type master;
file "esxi730.test.rev.zone";
allow-update { none; };
};
zone "vcenter730.test" IN {
type master;
file "vcenter730.test.zone";
allow-update { none; };
};
zone "32.1.168.192.in-addr.arpa" IN {
type master;
file "vcenter730.test.rev.zone";
allow-update { none; };
};
zone "idrac740.test" IN {
type master;
file "idrac740.test.zone";
allow-update { none; };
};
zone "194.1.168.192.in-addr.arpa" IN {
type master;
file "idrac740.test.rev.zone";
allow-update { none; };
};
zone "unity480.test" IN {
type master;
file "unity480.test.zone";
allow-update { none; };
};
zone "46.1.168.192.in-addr.arpa" IN {
type master;
file "unity480.test.rev.zone";
allow-update { none; };
};
서버 자신의 IP에 대해 zone 설정을 해주는 이유는 쿼리 발생시 서버를 확인하기 위함이다.
등록하지 않으면 DNS 동작은 정상적으로 수행하는데 서버 정보가 unkown으로 나오게 된다.
등록하지 않아도 문제는 없으나 차후 서버 관리를 위해 등록해두는 편이 권장된다.
이제 등록한 각 zone에 해당하는 zone 파일을 생성해야 한다.
정방향을 '.zone' 역방향을 '.rev.zone'으로 생성하였으나 정해진 규칙은 없어 원하는대로 생성하고 /etc/named.rfc1912.zones에 등록해도 된다.
'.db'와 '.rdb'도 많이 쓰이는 방식이다.
bind 설치시 기본으로 생성된 localhost와 loopback의 zone파일이 '-rw-r----- root named'로 권한과 소유자가 설정되어있음을 확인할 수 있다.
새로운 zone 파일 생성시에도 동일하게 권한을 주어야한다.
sudo vi /var/named/'파일명'
sudo chown root:named '파일명'
sudo chmod 0640 '파일명'
편의성을 위해 -p(preserve)옵션을 사용해서 zone 파일 내용 포멧이나 권한을 named 디폴트 zone 파일에서 가져와서 쓰는 방법도 있다.
sudo cp -p named.localhost '파일명'
sudo vi '파일명'
아래 명령으로 권한과 소유자가 설정된 zone 파일 생성 후 편집하여 내용을 작성한다.
sudo cp -p named.localhost dns.test.zone
sudo cp -p named.localhost dns.test.rev.zone
sudo cp -p named.localhost idrac730.test.zone
sudo cp -p named.localhost idrac730.test.rev.zone
sudo cp -p named.localhost esxi730.test.zone
sudo cp -p named.localhost esxi730.test.rev.zone
sudo cp -p named.localhost vcenter730.test.zone
sudo cp -p named.localhost vcenter730.test.rev.zone
sudo cp -p named.localhost idrac740.test.zone
sudo cp -p named.localhost idrac740.test.rev.zone
sudo cp -p named.localhost unity480.test.zone
sudo cp -p named.localhost unity480.test.rev.zone
zone 파일의 작성 방식은 아래와 같다.
;주석은 ';' 세미콜른
; S second / M minute / H hour / D day / W week / 아무것도 없이 숫자만 기입하면 초
; @는 zone 이름을 의미
; 관리자 이메일은 '@'를 '.'으로 대체
@ IN SOA 'zone 이름' '관리자 이메일' (
0 ; serial. zone파일 버전. 날짜를 사용하는것이 일반적
1D ; refresh. Master-Slave 구성시 슬레이브 DNS 서버가 존 정보를 새로 고침하는 빈도를 설정.
1H ; retry. Master-Slave 구성시 슬레이브 DNS 서버가 존 정보를 새로 고침하는 데 실패했을 경우 재시도하는 빈도를 설정
1W ; expire. Master-Slave 구성시 슬레이브 DNS 서버가 마스터 DNS 서버와 연결하지 못했을 때 존 정보를 유지하는 기간을 설정
3H ) ; minimum. 존재하지 않는 레코드에 대한 음수 결과를 캐시하는 기간을 설정
;NS 레코드 (Name Server): NS 레코드는 특정 도메인에 대한 DNS 서버를 지정. 이 레코드는 해당 도메인에 대한 모든 DNS 조회를 처리할 서버를 가리킵니다.
;A 레코드 (Address): A 레코드는 도메인 이름을 IPv4 주소로 변환. 가장 일반적인 도메인 레코드. 예를 들어, 웹 브라우저가 'www.example.com' 도메인을 찾을 때, A 레코드를 조회하여 해당 도메인이 어떤 IP 주소에 연결되어 있는지 파악한다.
;CNAME 레코드 (Canonical Name): CNAME 레코드는 한 도메인의 별칭을 다른 도메인에 매핑. 도메인 이름의 별칭을 관리하는 데 유용. 여러 서브도메인이 같은 IP 주소를 공유하는 경우, 각 서브도메인에 대한 A 레코드를 개별적으로 관리하는 대신, 한 개의 A 레코드와 여러 개의 CNAME 레코드를 사용하면 IP 주소가 변경될 때 A 레코드만 업데이트하면 된다.
IN NS example.test.
IN A 192.168.0.XXX
WWW IN A 192.168.0.XXX
;PTR 레코드 (Pointer): 특정 IP 주소가 가리키는 호스트 이름을 지정. IP 주소를 도메인 이름에 매핑. PTR 레코드를 정의할 때는 보통 IP 주소의 역순을 사용.
IN PTR example.test.
named-checkzone 명령으로 zone 파일의 문법적 오류를 확인할 수 있다.
sudo named-checkzone dns.test /var/named/dns.test.zone
sudo named-checkzone idrac730.test /var/named/idrac730.test.zone
sudo named-checkzone esxi730.test /var/named/esxi730.test.zone
sudo named-checkzone vcenter730.test /var/named/vcenter730.test.zone
sudo named-checkzone idrac740.test /var/named/idrac740.test.zone
sudo named-checkzone unity480.test /var/named/unity480.test.zone
/etc/resolv.conf에 DNS 정보를 기입해야 한다.
본인이 가지고 있는 DNS를 참조할 수 있도록 'nameserver 127.0.0.1'를 넣어준다.
서버의 IP 주소를 넣어주는 것도 가능하다.
자신의 DNS에서 도메인을 찾지 못했을 경우 다른 DNS도 조회하도록 설정이 가능하다.
아래로 계속 'nameserver [DNS IP]'를 추가하면 앞선 DNS에서 도메인을 찾지 못한경우 다음 DNS에 쿼리를 넘기게 된다.
현재 구축한 서버는 외부망과 연결되어있기 때문에 구글DNS서버인 8.8.8.8을 추가하여 내부망 장비의 도메인 뿐 아니라 일반적인 외부 인터넷 포털 도메인도 접소깅 가능하도록 설정해주었다.
내부망에서도 DNS 서버를 여러개 사용하는 경우 /etc/resolv.conf 설정 파일에서 추가해주면 된다.
해당과정을 진행하면 굳이 DNS에 접속한 개별 장치에서 보조 DNS를 설정해주지 않아도 자동으로 DNS 서버에서 설정해둔 대도 다음 DNS를 조회하게 된다.
# Generated by NetworkManager
nameserver 127.0.0.1
nameserver 8.8.8.8
모든 과정이 완료되었으면 DNS 데몬을 재실행해준다.
sudo service named restart
sudo systemctl enable named
다른 장치로부터의 쿼리를 수행하기 위해 53번 포트 방화벽을 열어주어야 한다.
sudo firewall-cmd --permanent --add-service=dns
sudo firewall-cmd --reload
이제 내부망의 장치에서 구축한 DNS의 IP(192.168.1.138)을 사용해서 내부망의 장비들을 IP가 아닌 도메인을 사용해 접근할 수 있다.
내부망에 연결된 컴퓨터에서 DNS를 '192.168.1.138'로 설정하고 nslookup 명령을 사용해 도메인을 제대로 찾을 수 있는지 확인할 수 있다.
Windows DNS
본문내용 삽입
DNS 설정
본문내용 삽입
'Server' 카테고리의 다른 글
iODD 아이오드 (0) | 2024.02.05 |
---|---|
MultiPath 멀티패스 (0) | 2024.01.16 |
NTP 서버와 클라이언트 (0) | 2024.01.04 |
CLI로 고정 IP 할당 (0) | 2023.12.27 |
DELL PowerEdge 서버 OS 설치 (feat. iDRAC) (1) | 2023.12.21 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!