도메인에 SPF, DKIM, DMARC를 적용하기 포스트 작성 중 알게 되었습니다만, 현재 테스트 용으로 사용중인 무료 DNS 서비스 Freenom은, DKIM을 위한 TXT 레코드 작성이 안되는 것 같습니다.

따라서 튜토리얼이 진행이 안되므로, 이번 기회에 네임서버를 만들어 보기로 하였습니다.

Public Internet 환경으로 서비스를 하기 위해서는 아래 IP 주소 부분에 10.0.0.0/8, 172.16.0.0/16, 192.168.0.0/24 등의 사설네트워크 주소를 입력하시면 안됩니다.

NAT/PAT(포트포워딩), DMZ 등 Public IP를 이용하실 수 있는 환경을 먼저 만들어 주시기 바랍니다.

NAT/PAT(포트포워딩)의 경우, TCP/UDP 모두 53번으로 접속이 되어야 합니다.

1. 실행 환경

이번 포스트에서는, 1차 네임서버 및 2차 네임서버를 위해 2대의 Linux 환경이 필요합니다.

  도메인 FQDN IP주소
Master 서버 ns1.minibrary.com. 1.1.1.1
Slave 서버 ns2.minibrary.com. 2.2.2.2

2. Bind9 설치

DNS 서버용 소프트웨어는 여러가지가 있지만, 가장 널리 사용된다는 Bind를 사용하겠습니다.

각각의 Linux에 아래 명령어로 패키지를 설치합니다.

$ sudo apt install dig bind9 bind9-doc bind9utils

3. 호스트명 수정

먼저, 자신의 서버를 어떤 DNS주소로 설정할지 정합니다.

저는 2대의 서버를 각각 ns1.minibrary.comns2.minibrary.com 으로 설정 하겠습니다.

아래 명령어로 /etc/hostname 파일을 열어 호스트명 ns1 및 ns2 로 수정합니다.

$ sudo nano /etc/hostname

4. 호스트 파일 수정

호스트 파일에 127.0.1.1을 Linux 자신의 IP 주소(공인 IP 주소)로 바꾸고, 도메인 주소 및 호스트명을 추가해 줍니다.

호스트 파일은 /etc/hosts 입니다.

$ sudo nano /etc/hosts

Master 서버: ns1.minibrary.com

127.0.0.1       localhost
1.1.1.1  	ns1.minibrary.com ns2

Slave 서버: ns2.minibrary.com

127.0.0.1       localhost
2.2.2.2  	ns2.minibrary.com ns2

수정이 완료 되었으면, 재부팅을 해줍니다.

$ sudo init 6

5. Bind 기본설정

Bind의 기본 설정 파일 중 option 파일(/etc/bind/named.conf.options)에 아래 설정들을 추가하겠습니다.

적용서버: ns1.minibrary.com 및 ns2.minibrary.com

$ sudo nano /etc/bind/named.conf.options

options의 블럭 안에 아래 내용을 추가합니다.

recursion no;
allow-transfer { none; };

저장 후 종료합니다.

이제 누군가가 자신의 네임서버로 minibrary.com을 제외한 도메인들에 대한 질의를 하면 응답을 하지 않고 거절합니다.

6. Zone 설정

Bind의 기본 옵션들 이외에, 자신의 도메인에 대한 zone만 추가 하기 위해 다음 파일들을 설정 하여야 합니다.

/etc/bind/named.conf.local => zone에 대한 설정

/etc/bind/zones/db.minibrary.com => zone 파일 (zones폴더는 관리를 위해 임의로 생성)

그럼, 서버별로 설정을 해 보겠습니다.

Master 서버: ns1.minibrary.com

$ sudo nano /etc/bind/named.conf.local

가장 아래에, 다음의 내용을 추가합니다.

zone "minibrary.com" {
        type master;
        file "/etc/bind/zones/db.minibrary.com";
        allow-transfer { 2.2.2.2; };
};

위의 내용은

는 의미입니다.

이제 Zone File /etc/bind/zones/db.minibrary.com에 DNS 레코드를 작성합니다.

$ sudo mkdir /etc/bind/zones
$ sudo nano /etc/bind/zones/db.minibrary.com

아래는 임의로 만든 레코드입니다.

;
; BIND data file for minibrary.com
;
$TTL	600
@			IN	SOA		ns1.minibrary.com. admin.minibrary.com. (
							2016052101	; Serial
							21600		; Refresh
							1800		; Retry
							1209600		; Expire
							86400 )		; Negative Cache TTL
;

minibrary.com.	        IN	NS		ns1.minibrary.com.
minibrary.com.	        IN	NS		ns2.minibrary.com.
ns1			IN	A		1.1.1.1
ns2			IN	A		2.2.2.2
@			IN	AAAA	        ::1

TTL은 다음 레코드 변경사항이 적용될 때까지 걸리는 시간(초)을 결정하는 DNS 레코드 값입니다. MX 레코드, CNAME 레코드 등 도메인의 각 DNS 레코드는 TTL 값을 가지고 있습니다. 레코드의 현재 TTL은 변경사항이 적용될 때까지 걸리는 시간을 결정합니다. 예를 들어 TTL 값이 86400초인 레코드에 대한 변경사항은 적용될 때까지 24시간이 소요됩니다. 레코드의 TTL을 변경하면 향후의 변경사항이 적용되는 시간에 영향을 미친다는 점을 참고하세요. 인터넷상의 서버가 레코드의 업데이트 사항을 매시간 확인하도록 TTL 값을 3600으로 설정할 것을 권장합니다. 이렇게 하면 향후 레코드를 업데이트할 경우 변경사항이 적용될 때까지 한 시간이 소요됩니다. 변경사항을 신속하게 되돌릴 필요에 대비하는 등 다음 변경사항이 더욱 빠르게 적용되도록 하려면 TTL을 300초(5분)와 같이 더 짧게 설정할 수도 있습니다. (참고: Google)

저는 $TTL 600으로, 기본적으로 모든 레코드에 대해 변경시 10분 후 적용 되도록 설정 하였습니다. 구글의 추천 사항은 3600초(1시간)이네요.

DNS의 FQDN 표기법으로 주소의 끝은 .을 찍어야 합니다.

첫 줄은 SOA 레코드로, Start of [a zone of] authority record 라는 의미이며, 해당 도메인(zone)이 시작하는 곳 입니다.

호스트 @ (@는 minibrary.com 자신을 뜻합니다.) minibrary.com은 ns1.minibrary.com. 으로부터 시작합니다.

admin.minibrary.com. 은 admin@minibrary.com 이란 의미로, 해당 도메인의 관리자 이메일을 표기합니다.

2016052101 시리얼 번호로, zone file에 변경사항이 있을 경우, 반드시 현재의 숫자보다 더 높은 숫자를 입력해야 slave 네임서버로 파일을 전송합니다. 보통 년월일,번호 등으로 많이 사용합니다.

Refresh, Retry, Expire는 slave 서버로의 zone record를 복사/전송하는 간격에 대한 설정입니다.

일반적으로 위의 값이 적절하다고 합니다.

그 아래는 NS 레코드로, minibrary.com의 네임 서버의 위치를 정의합니다.

ns1.minibrary.com. 과 ns2.minibrary.com. 의 레코드를 입력했습니다.

각각의 주소는 그 아래 A레코드로 1.1.1.1 및 2.2.2.2를 가르키고 있습니다.

본인의 도메인에 맞는 설정을 입력 하시기 바랍니다.

설정 완료 후 저장 및 종료합니다.

Master 서버: ns1.minibrary.com 설정검사

설정이 제대로 되었는지, 아래 명령어를 실행합니다.

$ sudo named-checkconf

만약 아무런 메세지가 나오지 않는다면, 설정에 이상이 없는 것입니다.

다음, 아래 명령어로 zone file을 검사합니다.

$ sudo named-checkzone minibrary.com /etc/bind/zones/db.minibrary.com

아래와 같은 메세지가 나오면 정상적으로 설정 된 것입니다.

db.minibrary.com
zone minibrary.com/IN: loaded serial 2016052101
OK

에러 메세지가 나타날 경우, 해당 에러를 처리합시다.

설정이 잘 되었으면, 2번 서버 설정을 시작합니다.

Slave 서버: ns2.minibrary.com

자신이 관리할 zone을 지정합니다.

$ sudo nano /etc/bind/named.conf.local

가장 아래에, 다음의 내용을 추가합니다.

zone "minibrary.com" {
        type slave;
        file "db.minibrary.com";
        master { 1.1.1.1; };
};

위의 내용은

이라는 의미입니다.

Slave 서버는 이렇게 설정하면 끝입니다.

Slave 서버: ns2.minibrary.com 설정검사

Master 서버와 마찬가지로 설정 파일을 검사합니다.

$ sudo named-checkconf

아무 메세지가 없으면 설정 완료 입니다.

7. Bind 재시작 및 Zone File Transfer 확인

먼저 Slave Server의 Bind를 재시작 합니다.

$ sudo systemctl restart bind9

그리고, Slave Server의 시스템로그를 tail로 열어둡니다.

$ sudo tail -f /var/log/syslog

이제 Master Server의 Bind를 재시작 합니다.

재시작을 하면, 바로 Slave Server로 Zone File이 정송되어 syslog에 표시 될 것입니다.

$ sudo systemctl restart bind9

전송이 되었으면 이제 자신의 도메인에 대한 Zone File을 자유롭게 관리하실 수 있습니다.

각각의 서버에서 아래 명령어들로, 설정한 Zone File을 확인해 봅시다.

dig @localhost minibrary.com ANY
dig @1.1.1.1 minibrary.com ANY
dig @2.2.2.2 minibrary.com ANY

전송이 되지 않는다면, TCP/UDP 53번 포트 확인, 혹은 journal-ctl 등을 확인해 보시기 바랍니다.

참고로, ISP 업체에서 UDP53번을 막아두는 경우가 있는 것 같습니다.

이럴 경우에는 고정IP를 구매하여 사용하시거나, Public 네임서버는 포기하셔야 합니다.

8. Zone File 수정

Zone File에 새로운 레코드를 추가하는 등의 수정 내용이 발생할 경우 “반드시” Serial Number를 기존 숫자보다 높은 숫자로 변경하시기 바랍니다.

변경 후 아래 명령어로 설정을 다시 불러옵니다.

$ sudo rndc reload

이상으로 Bind를 이용하여 DNS서버/네임서버를 만들어 보았습니다.