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를 유지하도록 제공한다.
$ sudo apt install bind 9
$ sudo apt install dnsutils
- caching name server로 구성된 경우 BIND9는 name queries에서 답을 찾고 다시 쿼리될 때 답을 다시 찾는다
- primary server로서 BIND9는 호스트의 파일에서 zone을 읽고 해당 zone에 대한 권한이 있다
- secondary server로서 BIND9는 영역에 권한이 있는 다른 name server에서 영역 데이터를 가져온다.
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를 제공할 수 있다.
주석을 제거한 다음 /etc/bind/named.conf.options에서 ISP DNS 서버의 IP 주소를 입력한다.
forwarders {
1.2.3.4;
5.6.7.8;
};
새 configuration을 활성화하려면 DNS 서버를 재시작한다.
sudo systemctl restart bind9.service
BIND9는 example.com의 primary server로 구성된다. example.com을 FQDN으로 단순히 교체할것
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
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를 재시작한다
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에서도 구성된다
DNS와 BIND9 구성의 문제를 진단하는 섹션이다
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 주소를 클라이언트 구성에 추가해야한다
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 이후 발전이 있어야 합니다
응용 프로그램이 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
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
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)
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에 쿼리 정보가 저장된다.
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
업스트림 BIND9 문서https://bind9.readthedocs.io/en/latest/
DNS와 BIND / IPv6
| 우분투 클램쉘 모드 사용 / 22.04 LTS (0) | 2023.01.16 |
|---|---|
| ts 파일이 text/vnd.trolltech.linguist 에러 | ubuntu (0) | 2023.01.05 |
| 우분투 22.04/24.04 LTS 한컴오피스2022 설치 (2025.9.17 기준) (2) | 2022.12.02 |
| 우분투 처음 설정 (나만 볼거임) (0) | 2022.11.04 |
| ubuntu libreoffice koreanpkg (0) | 2022.09.19 |
댓글 영역