상세 컨텐츠

본문 제목

Domain Name Service (DNS) | Ubuntu

세팅(나만볼거임)

by state 2022. 9. 30. 00:48

본문

https://ubuntu.com/server/docs/service-domain-name-service-dns

 

DNS 는 IP 주소와 FQDN(fully quialified domain name)을 맵핑하는 인터넷 서비스를 의미한다. DNS는 IP 주소를 기억해야할 필요를 없애준다. DNS를 실행하는 컴퓨터를 name server라고 한다. 우분투에서는 BIND를 사용하여 리눅스에서 name server를 유지하도록 제공한다.

INSTALLATION

$ sudo apt install bind 9

$ sudo apt install dnsutils

 

CONFIGURATION

- caching name server로 구성된 경우 BIND9는 name queries에서 답을 찾고 다시 쿼리될 때 답을 다시 찾는다

- primary server로서 BIND9는 호스트의 파일에서 zone을 읽고 해당 zone에 대한 권한이 있다

- secondary server로서 BIND9는 영역에 권한이 있는 다른 name server에서 영역 데이터를 가져온다.

 

OVERVIEW

DNS 구성 파일은 /etc/bind 에 저장된다. 기본 구성 파일은 /etc/bind/named.conf에서 다음의 파일을 포함한다

- /etc/bind/named.conf.options : Global DNS options

- /etc/bind/named.conf.local : 사용자의 zone

- /etc/bind/named.conf.default-zones : localhost나 그의 역이나 root hints

 

/etc/bind/db.root는 패키지 /usr/share/dns/root.hints에 의해 대신 제공되고 dns-root-data 패키지에 포함되어 있으며 named.confg.default-zones에 참조되어 있다

 동일한 서버를 caching name server, primary, secondary 서버로 구성할 수 있으며 제공하는 zone에 따라 다르다. 서버는 한 zone에 대해서 Start of Authority, SOA가 될 수 있으며 caching service를 local LAN에 제공하면서 다른 zone에 대해 secondary service를 제공할 수 있다.

 

CACHING NAME SERVER

주석을 제거한 다음 /etc/bind/named.conf.options에서 ISP DNS 서버의 IP 주소를 입력한다.

forwarders {
    1.2.3.4;
    5.6.7.8;
};

새 configuration을 활성화하려면 DNS 서버를 재시작한다.

sudo systemctl restart bind9.service

 

Primary Server

BIND9는 example.com의 primary server로 구성된다. example.com을 FQDN으로 단순히 교체할것

 

FORWARD ZONE FILE

BIND9에 DNS zone을 추가하려면 BIND9를 primary server로 등록한다. /etc/bind/named.conf.local에서

zone "example.com" {
    type master;
    file "/etc/bind/db.example.com";
};

NOTE : bind가 DDNS에서 자동으로 업데이트를 받을 것이라면 /var/lib/bind/db.example.com 을 사용하라

 

기존의 zone file을 복사하여 /etc/bind/db.example.com 파일을 만든다

sudo cp /etc/bind/db.local /etc/bind/db.example.com

/etc/bind/db.example.com 을 편집하고 localhost를 서버의 FQDN으로 변경한다. 끝에 마침표는 남겨둔다. 127.0.0.1을 name server의 IP 주소로 변경하고 root.localhost를 유효한 이메일 주소로 @을 마침표로 변경한다.

 base domain, example.com을 위한 A 레코드를 생성한다. A 레코드를 ns.example.com의 name server에 대해서도 만들어준다.

;
; BIND data file for example.com
;
$TTL    604800
@       IN      SOA     example.com. root.example.com. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL

@       IN      NS      ns.example.com.
@       IN      A       192.168.1.10
@       IN      AAAA    ::1
ns      IN      A       192.168.1.10

zone file을 변경할 때 마다 Serial Number을 증가시켜야한다. BIND9를 시작하기 전에 여러번 수정했다면 단순하게 한번만 추가하면 된다.

 DNS 레코드를 zone file의 아래에 추가한다. 대게 serial of zone은 편집된 날짜의 yyyymmddss이다.

영역파일을 수정한 후 BIND9를 재시작

sudo systemctl restart bind9.service

 

Reverse Zone File

DNS가 Ip 주소를 이름으로 확인할 수 있게 역으로도 설정해주자.

/etc/bind/named.conf.local 을 열어서 다음을 추가하자

zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/db.192";
};

| 1.168.192를 사용중인 네트워크의 처음 3개의 octet으로 교체한다. 또 zone file을 /etc/bind/db.192 와 같이 네트워크의 처음 octet과 동일하게 맞춰야 한다.

/etc/bind/db.192 파일을 생성한다

sudo cp /etc/bind/db.127 /etc/bind/db.192

/etc/vind/db.192를 /etc/bind/db.example.com과 같은 항목으로 편집하라

;
; BIND reverse data file for local 192.168.1.XXX net
;
$TTL    604800
@       IN      SOA     ns.example.com. root.example.com. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ns.
10      IN      PTR     ns.example.com.

reverse zone에서의 serial number도 /etc/bind/db.example.com 와 같이 증가해야 하는데 다른 주소 /etc/bind/db.192에서 PTR 레코드를 생성해야 한다.

BIND9를 재시작한다

 

Secondary Server

primary server가 사용할 수 없는 경우를 대비하여 Secondary 서버를 구성하는 것이 좋다

 

먼저, primary server에서의 zone transfer가 허용되어야 한다. allow-transfer 항목을 /etc/bind/named.conf.local 에 forward와 reverse zone 정의에 추가한다

zone "example.com" {
    type master;
    file "/etc/bind/db.example.com";
    allow-transfer { 192.168.1.11; };
};
    
zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/db.192";
    allow-transfer { 192.168.1.11; };
};

| 192.168.1.11 은 secondary name server의 ip 주소로 대체

 

primary server에서 bind9 를 재시작한다

 

Secondary server에서 primary와 같이 bind9 패키지를 설치하고 /etc/bind/named.conf.local을 편집하고 다음의 정의를 forward와 reverse zone에 추가한다

zone "example.com" {
    type secondary;
    file "db.example.com";
    masters { 192.168.1.10; };
};        
          
zone "1.168.192.in-addr.arpa" {
    type secondary;
    file "db.192";
    masters { 192.168.1.10; };
};

| 192.168.1.10 은 primary name server의 ip 주소로 대체한다

 

BIND9를 재시작한다

 

/var/log/syslog에서 다음과 비슷한 내용이 표시되면 정상이다. 일부 행은 문서의 형식에 맞게 분할되었다.

client 192.168.1.10#39448: received notify for zone '1.168.192.in-addr.arpa'
zone 1.168.192.in-addr.arpa/IN: Transfer started.
transfer of '100.18.172.in-addr.arpa/IN' from 192.168.1.10#53:
 connected using 192.168.1.11#37531
zone 1.168.192.in-addr.arpa/IN: transferred serial 5
transfer of '100.18.172.in-addr.arpa/IN' from 192.168.1.10#53:
 Transfer completed: 1 messages, 
6 records, 212 bytes, 0.002 secs (106000 bytes/sec)
zone 1.168.192.in-addr.arpa/IN: sending notifies (serial 5)

client 192.168.1.10#20329: received notify for zone 'example.com'
zone example.com/IN: Transfer started.
transfer of 'example.com/IN' from 192.168.1.10#53: connected using 192.168.1.11#38577
zone example.com/IN: transferred serial 5
transfer of 'example.com/IN' from 192.168.1.10#53: Transfer completed: 1 messages, 
8 records, 225 bytes, 0.002 secs (112500 bytes/sec)

| zone은 primary의 serial number가 secondary 보다 클 때만 전송된다. primary DNS가 secondary DNS서버의 zone 변경을 알게 하려면 also-notify { ipaddress; }; 를 /etc/bind/named.conf.local를 다음과 같이 추가한다

zone "example.com" {
    type master;
    file "/etc/bind/db.example.com";
    allow-transfer { 192.168.1.11; };
    also-notify { 192.168.1.11; }; 
};

zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/db.192";
    allow-transfer { 192.168.1.11; };
    also-notify { 192.168.1.11; }; 
};

non-authoritative zone의 기본 디렉토리는 /var/cache/vind/이다. 이 디렉토리는 AppArmor에서도 구성된다

 

Troubleshooting

DNS와 BIND9 구성의 문제를 진단하는 섹션이다

 

Testing

resolv.conf 는 BIND9 테스트의 시작이다. name server의 ip 주소를 hosts resolver에 추가하는 것이다. primary name server는 다른 호스트에서와 마찬가지고 구성되어야한다. /etc/resolv.conf 의 nameserver 라인의 끝은 127.0.0.53dmf 가리키고 있어야 하고 domain에 search parameter가 있어야 한다. 예시로

nameserver  127.0.0.53
search example.com

무슨 DNS서버를 local resolver가 사용하는 지 확인하기 위해

systemd-resolve --status를 사용한다

 

| primary서버를 사용할 수 없는 경우를 위해 Secondary name server의 ip 주소를 클라이언트 구성에 추가해야한다

 

dig

dnsutils 패키지를 설치한 후 DNS lookup utility digf로 설정을 테스트할 수 있다

BIND9를 설치한 후 port 53에서 listening하고 있는지 loopback interfafce를 사용한다

dig -x 127.0.0.1

다음과 같은 command가 출력되어야 한다

;; Query time: 1 msec
;; SERVER: 192.168.1.10#53(192.168.1.10)

BIND9를 caching name server로 구성한 경우 외부 도메인을 쿼리 시간을 체크하기 위해 dig 합니다

dig ubuntu.com

;;Query time: 48 msec 처럼 출력이 끝날 때 쿼리 시간을 확인합니다

;;Query time : 1 msec 처럼 두번째 dig 이후 발전이 있어야 합니다

 

ping

응용 프로그램이 DNS를 사용하여 호스트 이름을 확인하기 위해서 ping utility를 사용하여 ICMP 에코 요청을 보낸다

ping example.com

이는 name server가 ns.example.com의 ip 주소를 읽을 수 있는지 테스트한다. 출력은 다음과 비슷해야 한다

PING ns.example.com (192.168.1.10) 56(84) bytes of data.
64 bytes from 192.168.1.10: icmp_seq=1 ttl=64 time=0.800 ms
64 bytes from 192.168.1.10: icmp_seq=2 ttl=64 time=0.813 ms

 

named-checkzone

zone 파일을 확인하는 가장 좋은 방법은 bind9의  named-checkzone 유틸리티를 사용하는 것이다. 이는 BIND9를 사용하기 이전에 수정이 정확한지 알 수 있다

Forward zone 파일을 테스트하기 위해서 다음 명령을 입력한다

named-checkzone example.com /etc/bind/db.example.com

모든 것이 올바를 경우 다음과 비슷하게 출력되어야 한다

zone example.com/IN: loaded serial 6
OK

Reverse zone 파일을 확인하기 위해서

named-checkzone 1.168.192.in-addr.arpa /etc/bind/db.192
zone 1.168.192.in-addr.arpa/IN: loaded serial 3
OK

 

Quick temporary query logging

rndc 툴을 사용하여 구성 파일을 변경하지 않고 쿼리를 로깅하거나 끌 수 있다.

sudo rndc querylog on
sudo rndc querylog off

syslog로 로그들이 전송되고 /var/log/syslog에 기본적으로 다음과 같이 표기된다

Jan 20 19:40:50 new-n1 named[816]: received control channel command 'querylog on'
Jan 20 19:40:50 new-n1 named[816]: query logging is now on
Jan 20 19:40:57 new-n1 named[816]: client @0x7f48ec101480 192.168.1.10#36139 (ubuntu.com): query: ubuntu.com IN A +E(0)K (192.168.1.10)

 

Logging

BIND9은 다양한 로깅 구성 항목들이 있지만 두가지 주요 항목은 channel과 category이다.

어떠한 로깅 항목도 구성되어 있지 않다면 기본 구성은

logging {
     category default { default_syslog; default_debug; };
     category unmatched { null; };
};

DNS 쿼리와 관련된 debug 메시지를 별도의 파일로 보내도록 구성해보면 메시지를 보낼 파일과 category를 지정하는 channel을 구성해야 한다. 다음과 같은 예는 category는 모든 쿼리를 로그한다. /etc/bind/named.conf.local을 편집하여 다음을 추가한다:

logging {
    channel query.log {
        file "/var/log/named/query.log";
        severity debug 3;
    };
    category queries { query.log; };
};

| debug 옵션은 1부터 3까지 지정할 수 있으며 default 값은 1이다

named daemon 은 vind로 실행되므로 사용자는 /var/log/named 디렉토리를 생성하고 ownership을 변경해야 한다

sudo mkdir /var/log/named
sudo chown bind:bind /var/log/named

BIND9을 재시작한다

 

/var/log/named/query.log에 쿼리 정보가 저장된다.

 

Reference

Common Record Types

A 레코드 : Ip주소를 hostname에 매핑한다.

www      IN    A      192.168.1.12

CNAME 레코드 : A 레코드에 대한 alias를 생성한다. 다른 CNAME레코드를 지정하는 CNAME 레코드를 생성할 수 없다.

web     IN    CNAME  www

MX 레코드 : 이메일을 전송하는 위치를 정의한다. CNAME 레코드가 아닌 A 레코드를 가리켜야 한다

@       IN    MX  1   mail.example.com.
mail    IN    A       192.168.1.13

NS 레코드 : zone 파일의 복사본을 제공하는 데 사용된다 CNAME이 아닌 A 레코드를 가리켜야 한다. 이곳에서 primary 와 secondary server가 정의된다

@       IN    NS     ns.example.com.
@       IN    NS     ns2.example.com.
ns      IN    A      192.168.1.10
ns2     IN    A      192.168.1.11

 

MORE

업스트림 BIND9 문서https://bind9.readthedocs.io/en/latest/

DNS와 BIND / IPv6

 

관련글 더보기

댓글 영역