✔️ 들어가기 앞서
DNS 개념을 모른다면 아래글을 읽고 돌아오자 !
✔️ 리눅스 DNS 관련 파일
/etc/hosts
호스트 파일은 서버의 이름과 그에 해당하는 IP주소를 미리 저장해 놓아야만 사용할 수 있다.
특별한 경우가 아니라면 네임서버 쿼리보다 호스트 파일의 우선순위가 높다. (우선순위를 변경할 수 있다.)
매우 간단하게 설정할 수 있는 장점이 있지만 이 파일의 내용은 로컬 시스템에서만 유효하게 사용할 수 있다.
[root@dns ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
📌 첫번째 줄의 의미는 localhost라는 이름의 서버는 IP주소가 127.0.0.1 이라는 의미이다.
루프백(loop back) 주소로 불리는 이 IP주소는 자기자신의 IP주소로 사용되도록 미리 예약되어 있다.
루프백 주소로 미리 예약된 IP주소의 범위는 127.0.0.0 ~ 127.255.255.255이다. 두번째 줄의 ::1은 IPv6 표현이다.
/etc/resolv.conf
호스트가 사용할 DNS 서버의 주소를 설정하는 파일이다.
자신의 호스트가 DNS 서버라면 자신의 IP 주소를 적어줘야 한다.
[root@dns ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search kornet test.example.com
nameserver 168.126.63.1
nameserver 168.126.63.2
📌 search 구문에 명시된 도메인 이름은 호스트 이름을 서버로 보내기 전에 확장하는 데에 사용한다.
예를 들어 서브 도메인을 이용해서 linux.myserver.net과 story.myserver.net이라는 이름으로 텔넷 서버를 운영하고 있다면 telnet linux만 입력하더라도 linux.myserver.net에 접속되며, telnet story만 입력하더라도 story.myserver.net에 접속하게 된다.
* kornet은 KT의 DNS 서버이다.
✔️ 리눅스 DNS 실습
DNS 구성 과정
1. 패키지 설치
2. 서비스 설정(설정파일 3개, 호스트네임)
3. 서비스 활성화(named)
4. 방화벽 설정(dns)
✔️ 1. 패키지 설치
BIND(Berkeley Internet Name Domain)는 DNS를 구현한 소프트웨어의 하나이자 가장 오래된 도메인 서비스 시스템으로 유닉스(unix) 및 리눅스(linux), 윈도우 등 거의 모든 플랫폼을 지원하는 DNS의 모든 기능을 갖춘 소프트웨어이다.
BIND 설정파일
Package 이름 | 설명 |
bind-utils | DNS 쿼리를 위한 유틸리티 |
bind-libs | 라이브러리 |
bind-chroot | Chroot 런타임 환경 |
bind-devel | 헤더파일 및 라이브러리 |
bind | BIND 패키지 |
unbound | Cache 서버 구성 |
먼저 BIND가 설치되어 있는지 확인하고 설치해준다.
[root@server ~]# rpm -qa | grep bind
[root@server ~]# yum list installed | grep bind
[root@server ~]# yum -y install bind bind-utils
가상 머신 2개를 돌리고 서버와 클라이언트에 각각 설정해준다.
# 서버
[root@dns ~]# hostnamectl set-hostname dns.test.example.com
# 클라이언트
[root@client ~]# hostnamectl set-hostname client.test.example.com
✔️ 2. 서비스 설정
서버 설정
[root@dns ~]# nmcli con
NAME UUID TYPE DEVICE
enp0s3 3d6d0ae5-78a1-4dad-b92b-2ab0c67cc40d ethernet enp0s3
enp0s8 8eff3d00-cb32-4591-b471-4c46e2a0da4d ethernet enp0s8
static9 b0b7a09e-d4bb-4983-828d-9adfcb791be6 ethernet enp0s9
virbr0 21626a33-038b-4e83-9ea1-140d9fb56bd9 bridge virbr0
enp0s9 509b32f3-83fd-443a-b4eb-b5e32db2e3ae ethernet --
[root@dns ~]# nmcli con add con-name static3 ifname enp0s3 type ethernet
연결 'static3' (e4f9782b-f283-4d3c-9698-fd9b62aa1d47)이 성공적으로 추가되었습니다.
[root@dns ~]# nmcli con mod static3 ipv4.addresses 10.0.2.10/24 ipv4.gateway 10.0.2.2 ipv4.dns 10.0.2.10 ipv4.method manual
[root@dns ~]# nmcli con up static3
연결이 성공적으로 활성화되었습니다 (D-Bus 활성 경로: /org/freedesktop/NetworkManager/ActiveConnection/6)
[root@dns ~]# ip addr show enp0s3
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:02:7f:20 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.4/24 brd 10.0.2.255 scope global noprefixroute dynamic enp0s3
valid_lft 591sec preferred_lft 591sec
inet 10.0.2.10/24 brd 10.0.2.255 scope global secondary noprefixroute enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::2e8:ab22:b1c1:6f8e/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@dns ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search test.example.com
nameserver 10.0.2.10
/etc/named.conf
DNS 서버의 전반적인 환경 설정을 담당하는 파일이다.
서버에서 사용하는 zone파일 및 reverse zone 파일을 지정한다.
네임 서버 데이터 베이스, root zone파일 위치, root 파일, 키파일, 접근제어 등 가장 핵심적인 설정 파일이라고 볼 수 있다. 이후 DNS-SEC 구성을 하거나 여러가지 보안 설정을 할때에 대부분의 설정이 이 파일을 사용한다.
listen-on port 53 { 127.0.0.1; }; DNS port 53에 어떤 IP가 접근할 수 있는지 설정한다. 불특정 다수의 유저에게 서비스할 땐 listen-on port 53 {any;}; 로 설정하고 사설 DNS 서버로 사용할 때에는 서비스할 사설 IP대역만을 고정시켜 설정해야 보안이 상승한다. |
|
listen-on-v6 port 53 { ::1; }; IPv6 DNS port 53번에 대한 설정이다. |
|
directory "/var/named"; 실제로 서비스 할 DNS의 zone 파일 디렉토리 경로를 설정한다. |
|
dump-file "/var/named/data/cache_dump.db"; DNS cache dump 파일 생성 디렉토리 경로이다. |
|
statistics-file "/var/named/data/named_stats.txt"; 메모리 통계 파일 생성 디렉토리 경로이다. |
|
allow-query { localhost; }; 재귀 질의가 올 때 응답여부에 대한 설정이다. 보안상의 문제가 있을 경우 재귀 쿼리를 받을 IP대역만을 허용하며 일반적으로 allow-query { any; }; 를 사용한다. |
|
recursion yes; 반복 쿼리에 대한 요청(DNS Cache Server)에 대한 여부를 설정한다. 외부로 도메인을 접근할 수 없는 사설 DNS로 사용하는 경우가 아니면 yes로 설정한다. |
|
zone "." IN { type hint; file "named.ca"; }; 참조할 루트 힌트가 작성되어 있는 파일명을 가르킨다. 이 파일에는 전세계 루트 도메인(최상위 도메인)에 대한 정보가 들어 있다. 만약 이 파일에 대한 설정이 잘못 되었거나 해당 파일 내용이 모두 손실될 경우 루트 도메인에 대한 정보가 없어지므로 반복 질의를 수행할 수 없게된다. |
/etc/named.conf 를 설정해준다. (BIND 9.2 버전 이하는 /etc/named.conf 9.3 버전 이상은 /etc/named.caching-nameserver.conf 파일을 설정해준다.)
[root@dns ~]# vi /etc/named.conf
📌설정 팁
Ctrl + C -> :se nu (라인 넘버 설정) -> 54,58 co 58 (54번줄 부터 58번줄까지 복사 후 58번 줄부터 붙여넣기
✔️ 3. 서비스 활성화(named)
/var/named/
zone 파일을 구성하여 도메인에 대한 정보를 설정한다.
/var/named/로 이동하면 named.empty 라는 sample 파일이 있다. 위에서 설정한 zone 파일 명으로 복사하여 만든다.
[root@dns ~]# ls /var/named/
data dynamic named.ca named.empty named.localhost named.loopback slaves
[root@dns ~]# cd /var/named/
[root@dns named]# cp named.empty test.example.com.zone
[root@dns named]# vi test.example.com.zone
zone 파일을 복사, 생성 시에는 권한에 주의해야한다. 기본적으로 DNS 서버 패키지인 BIND는 프로세스가 실행될 때 named 계정으로 동작하기 때문에 named 계정이 zone 파일에 대한 권한을 가져야 한다.
zone 파일 설정 시에 도메인 명은 항상 (.) 또는 ORIGIN(@)으로 끝나야 한다.
만약 마침표 또는 ORIGIN이 없을 경우 /var/named/rfc~ 에서 설정했던 도메인 명을 불러온다.
zone 파일 구성
1. 정방향 조회 (이름 => 주소)
2. 역방향 조회 (주소 => 이름)
정방향 조회
[root@dns named]# vi test.example.com.zone
필드 | 설정 |
$TTL 3H | TTL은 Time To Live 약자로써 이 도메인의 정보를 받아간 DNS 서버에서 어느 시간동안 이 내용을 저장하고 보관할지에 대한 설정이다. 초단위로도 설정이 가능하고 굳이 TTL 값을 올려둘 필요가 없기 때문에 600초 정도로만 설정하셔도 무관하다. TTL값이 높을수록 후에 도메인 내용을 설정하거나 하게 되면 갱신이 늦어질 수 있다. |
@ | orgin 이라고 부르며, zone 이 가지는 기본 도메인을 의미한다. - @ 대신 naver.com. 을 사용해도 되며 도메인 뒤에는 항상 . 을 찍어 내용이 도메인이라는 사실 을 알려줘야 한다. |
IN | 설정을 시작한다. |
SOA | Start Of Authority의 약어로 기본적인 권한을 담당하는 서버 주소, 관리자 메일주소 등의 정보 유 효 기간을 지정하는 설정이 시작됨을 의미한다. |
@ | 이 부분에도 ORIGIN(@)이 오게된다. 이곳은 일반적으로 1차 네임서버를 정의하며 ns1.nirsa.com. 과 같이 사용할 네임서버의 도메인을 정의한다. |
rname.invalid. | 현재 데이터의 버전을 나타내는 시리얼 번호 |
0 ; serial | 현재 데이터의 버전을 나타내는 시리얼 번호 |
1D ; refresh | 2차 네임서버가 1차 네임서버로부터 재조회 할 시간 간격 |
1H ; retry | 2차 네임서버가 1차 네임서버를 조회 실패시 재시도할 시간 간격 |
1W : empiry | 2차 네임서버가 1차 네임서버를 재조회 했을 때 실패하여 retry 하였는데 그 기간이 1주일이 지 나면 2차 DNS의 정보를 파기 하겠다는 의미이다. |
3H ; minimum | Negative caching ttl을 의미하는 필드로서, 앞쪽에 있는 $TTL 은 4.X 버전에서는 같은 의미를 가 졌지만 8.X 버전 이후 버전에서는 조회한 도메인의 정보가 없을 시에 “NXDOMAIN (no-suchdomain)” 이란 응답을 받게 되는데 “NXDOMAIN” 정보를 캐시 할 시간이다. |
레코드 | 설명 |
NS | Name Server 지정 |
A | 작성한 도메인의 IP 지정 |
AAAA | 작성한 도메인의 IPv6 지정 |
CNAME | 작성한 도메인의 별칭을 지정 |
MX | 메일 서버를 지정 MX 레코드는 10, 20, 30과 같은 우선순위를 지정해주며 낮을수록 우선순위가 높다. |
TXT | 도메인에 대한 텍스트 정보를 지정 SPF, DKIM 등과 같은 레코드와 함께 사용되며 일반적으로 SPF와 함께 메일 스푸핑, 스팸을 방지하기 위해 사용 |
PTR | 역방향 DNS에 사용되는 레코드 IP주소로 도메인을 찾는데 사용된다. |
아래와 같이 설정을 마친다.
📌설정 팁
복사하려는 줄에 커서를 놓고 yy 붙여넣기 할 줄에 t를 누르면 복사 완료
저장 후 ls -l 명령을 입력하면 만들어 놓은 test.example.com.zone의 소유자가 root인 것을 확인할 수 있다.
사용 권한을 주기 위한 명령어를 입력해준다.
[root@dns named]# chmod 660 test.example.com.zone
[root@dns named]# chown :named test.example.com.zone
[root@dns named]# ls -l test.example.com.zone
-rw-rw----. 1 root named 269 3월 10 11:06 test.example.com.zone
네임서버의 구축이 끝났다면 방화벽 설정을 통해 53번 포트를 열어줘야한다.
[root@dns named]# firewall-cmd --add-service=dns --permanent
success
[root@dns named]# firewall-cmd --reload
success
[root@dns named]# systemctl start named
정상적으로 정방향 조회가 되는 것을 확인할 수 있다.
[root@dns named]# host www.test.example.com
www.test.example.com has address 10.0.2.20
[root@dns named]# host ftp.test.example.com
ftp.test.example.com has address 10.0.2.30
[root@dns named]# host mail.test.example.com
mail.test.example.com has address 10.0.2.40
역방향 조회
[root@dns named]# host -t PTR 10.0.2.30
Host 30.2.0.10.in-addr.arpa. not found: 3(NXDOMAIN)
[root@dns named]# vi /etc/named.conf
위와 같이 zone을 추가한다.
[root@dns named]# ls
data named.ca named.localhost slaves
dynamic named.empty named.loopback test.example.com.zone
[root@dns named]# cp -ap test.example.com.zone 10.0.2.0.zone
# ap는 권한을 모두 가져오는 옵션
[root@dns named]# ls -l 10.0.2.0.zone
-rw-rw----. 1 root named 269 3월 10 11:21 10.0.2.0.zone
[root@dns named]# vi 10.0.2.0.zone
위와 같이 수정해준다.
[root@dns named]# systemctl restart named
[root@dns named]# host -t PTR 10.0.2.10
10.2.0.10.in-addr.arpa domain name pointer dns.test.example.com.
[root@dns named]# host -t PTR 10.0.2.20
20.2.0.10.in-addr.arpa domain name pointer www.test.example.com.
[root@dns named]# host -t PTR 10.0.2.30
30.2.0.10.in-addr.arpa domain name pointer ftp.test.example.com.
역방향 조회가 이뤄지는 것을 확인할 수 있다.
nslookup 명령어
[root@dns named]# nslookup
> ftp.test.example.com
Server: 10.0.2.10
Address: 10.0.2.10#53
Name: ftp.test.example.com
Address: 10.0.2.30
> 10.0.2.40
40.2.0.10.in-addr.arpa name = mail.test.example.com.
클라이언트 머신 설정
[root@client ~]# host dns.test.example.com
Host dns.test.example.com not found: 3(NXDOMAIN)
[root@client ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search kornet test.example.com
nameserver 168.126.63.1
nameserver 168.126.63.2
[root@client ~]# nmcli con add con-name static3 ifname enp0s3 type ethernet
연결 'static3' (e6ca4424-55b8-4f52-8f7f-f6f60e2f679a)이 성공적으로 추가 되었습니다.
[root@client ~]# nmcli con mod static3 ipv4.addresses 10.0.2.200/24
[root@client ~]# nmcli con mod static3 ipv4.gateway 10.0.2.2
[root@client ~]# nmcli con mod static3 ipv4.method manual
[root@client ~]# nmcli con mod static3 ipv4.dns 10.0.2.10
[root@client ~]# nmcli con up static3
연결이 성공적으로 활성화되었습니다 (D-Bus 활성 경로: /org/freedesktop/NetworkManager/ActiveConnection/6)
[root@client ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search test.example.com
nameserver 10.0.2.10
[root@client ~]# host dns.test.example.com
dns.test.example.com has address 10.0.2.10
🔗 참고
'Linux' 카테고리의 다른 글
[Linux] traceroute 명령어 (0) | 2022.03.11 |
---|---|
[Linux] Master & Slave (1) | 2022.03.10 |
[Linux] 방화벽 (firewall) (0) | 2022.03.07 |
[Linux] SSH (Secure Shell) (0) | 2022.03.07 |
[Linux] 네트워크 관리 - NetworkManager (0) | 2022.03.04 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!