나의 IT일지
도메인 네임 시스템(DNS) 본문
서버는 네트워크를 통해 정보나 서비스를 제공하는 컴퓨터 프로그램으로, 이러한 서비스를 제공받는 프로그램을 클라이언트라고 한다. 쉽게 말하면, 서비스를 제공하는 프로그램이 설치되어 있는 운영체제는 서버, 서비스를 제공받는 프로그램이 설치되어 있는 운영체제를 클라이언트라고 한다.
- web: apache, IIS(windows에서만 사용)
- mail : sendmail, postfix, qmail
- name : BIND
- FTP: vsftpd, proftp, wu_ftp
- telnet: telnet
- SSH : ssh
- DB : MySQL, MariaDB
- etc : NFS, SAMBA ....
위의 리스트는 서버 프로그램을 기능별로 구분한 것으로, 해당 프로그램을 개별적으로 운영체제에 다운로드해야 하며, 설치하면 클라이언트에게 해당 기능을 제공할 수 있다.
서버 관련 명령어들 |
yum -y install 프로그램 : 프로그램을 설치하는 명령어 systemctl [ start / stop / restart ] [데몬] : 프로그램을 실행, 정지, 재시작하는 명령어 systemctl [ enable / disable] [데몬] : 운영체제를 부팅할 때, 프로그램 활성화, 비활성화 하는 명령어 setenforce [ 0 / 1 ] : SELinux(linux의 자체적으로 가지고 있는 커널기반 방화벽)을 비활성화 / 활성화하는 명령어 |
DNS
DNS란 "google.com","daum.net"과 같이 사람이 읽을 수 있는 도메인 이름을 IP주소로 변환하는 시스템으로, 외우기 어려운 IP주소를 대신해서 서버에 접속하기 위해서 사용한다.
DNS는 도메인의 데이터를 분산해서 저장하는 분산데이터구조로, 계층으로 구분이 되어져 있다. 예를 들면, "google.com"의 경우, ".com"과 ".google"계층으로 나눠지며, ".com"이 탑레벨 도메인으로 DNS를 사용할 때, 제일 먼저 받아오는 도메인이다.
클라이언트에서 도메인을 이용한 URL을 통해 서버에 접속할려고 시도할 경우, DNS는 다음과 같이 실행 되며, 해당 번호에 도메인에 대한 IP주소가 없을 경우 다음 번호로 넘어간다.
- DNS Cache, 클라이언트 cookie를 확인
- 운영체제 host파일(Windows : C:\windows\system32\drivers\etc\hosts, Linux: /etc/hosts)에서 해당 도메인의 IP주소 확인
- 클라이언트는 로컬 네임서버에 접근 후, 서버에 해당 도메인의 IP주소를 확인
- root네임서버(rootDNS)에 접근해서 해당 탑 레벨 도메인(국내 탑 레벨 도메인 : .kr .jp .ch,국제 탑 도메인 : .com .net)의 서버 IP주소 확인, 그 후 rootDNS에서 받은 IP주소를 통해, 탑 레벨 네임서버(DNS)에 접속 후 다음 레벨의 네임서버의 IP주소 확인
이때, 로컬 DNS서버(로컬 네임서버)는 다른 클라이언트에게는 일반 네임서버가 되며, 해당 네임서버의 이름은 설정으로 설정 할 수 있다.
DNS 프로그램의 데몬, 환경설정파일
- 데몬 : named
- 홈디렉토리 : /etc/named
- 환경설정 파일 : /etc/named.conf
- 도메인 등록파일 : /etc/named.rfc1912.zones
- 해당 도메인의 정보(레코드)파일 : /var/named/[도메인].zone
프로그램 설치
- yum -y install bind* : DNS 서버 프로그램을 설치하는 명령어
환경설정 파일 수정
options {
listen-on port 53 { any; };
// 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";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; };
DNS는 클라이언트가 접속해서, 해당 도메인을 IP주소로 변환하기 위해 사용한다. 그래서 서버에 접근할 수 있는 IP주소의 범위(listen-on)를 "127.0.0.1"에서 전 범위인 "any"로 변경해야 하며, 요청을 했을 경우 응답할 수 있는 클라이언트 IP주소의 범위(allow-query)를 "localhost"에서 전 범위인 "any"로 변경해야 한다.
도메인 등록
DNS에 도메인을 IP주소로 변환하기 위해서는 DNS에 도메인이 등록되어 있어야 한다.
zone "test.co.kr" IN {
type master;
file "test.co.kr.zone";
allow-update { none; };
};
위의 내용은 도메인 등록파일(/etc/named.rfc1912.zones)에 도메인을 등록하는 내용으로, "test.co.kr"이라는 도메인을 추가하며, 해당 도메인의 정보는 "test.co.kr.zone"파일에 저장되어 있다는 것을 나타낸다.
- zone "test.co.kr" IN : test.co.kr이라는 도메인 추가
- type master; : 해당 도메인의 타입은 master형
- file "test.co.kr.zone"; : 해당 도메인의 정보 파일은 "test.co.kr.zone"에 저장
- allow-update { none; }; : 타 서버에 해당 도메인이 slave형으로 추가할 때, 해당 서버로 도메인 정보 파일의 복사 허용 유무
도메인 레코드(정보) 등록
도메인을 IP주소로 반환하기 위해서는 DNS에 도메인에 대한 정보가 필요하며, "/var/named/"디렉토리에 해당 도메인을 등록할 때 작성했던 도메인 정보 파일(test.co.kr.zone)을 생성, 내용 작성하면 된다. 이때, 내용을 작성할 때 띄어쓰기는 "Tab"키로 해야 한다.
$TTL 0
@ IN SOA test.co.kr. admin.test.co.kr. (
20230326 ; Serial
1D ; Refresh
1H ; Retry
1W ; Expire
1W ; Minimum TTL
)
IN NS test.co.kr.
IN A 192.168.158.128
www IN A 192.168.158.128
server IN CNAME www
- $TTL : 도메인의 정보를 캐시에 가져온 뒤에 어느정도 보관될지 지정하는 시간
- @ : 호스트명(서브 서버명)
- IN : 인터넷
- SOA : 레코드 등록
- NS : 해당 도메인에서 고정적으로 사용 할 네임서버의 이름을 지정하는 레코드
- A : 좌측의 도메인에 대한 IP주소를 지정하는 레코드
- CNAME : 좌측의 도메인의 별칭 레코드으로, 좌측 호스트명으로 접속 시 우측 호스트명을 통해 접근
- PTR : IP주소에 대한 도메인을 지정하는 레코드
[root@localhost ~]# host test.co.kr
test.co.kr has address 192.168.158.128
[root@localhost ~]#
[root@localhost ~]# host www.test.co.kr
www.test.co.kr has address 192.168.158.128
[root@localhost ~]#
[root@localhost ~]# host server.test.co.kr
server.test.co.kr is an alias for www.test.co.kr.
www.test.co.kr has address 192.168.158.128
- admin.test.co.kr. : 관리자 메일 주소
- Serial : 파일의 수정여부를 알 수 있는 옵션
- Refresh : Slave서버가 Master서버의 Zone파일을 체크하는 시간
- Retry : Zone 파일 체크를 실패할 경우 재시도할 시간
- Expire : Master서버가 다운될 경우, Slave서버가 가져간 Zone파일을 사용할 수 있는 시간
- Minimum TTL : 최소 TTL값
해당 IP주소("192.168.158.128")는 "test.co.kr"인 "도메인"과 "www.test.co.kr"인 "호스트명+도메인"을 통해 호출된다. 즉, 호스트명란에 호스트명을 작성하면, "호스트명+도메인"구조로 해당 IP를 호출할 수 있다.
이때 호스트명이란 서비스를 구분하기 위해 사용하는 이름으로, 도메인의 이름은 같아야하지만, 서로 다른 서비스나 사이트를 제공하는 경우(서로 IP주소가 다를경우)에 사용한다.
클라이언트에서 로컬 DNS 변경
Linux 클라이언트가 해당 DNS에 접근하기 위해서는 "/etc/resolv.conf"파일에서 DNS의 IP주소를 접근할 IP주소로 변경해야 한다.
Generated by NetworkManager
search localdomain
nameserver 192.168.158.120
Windows클라이언트는 해당 DNS에 접근하기 위해서 "설정 -> 네트워크 -> 이더넷 -> 어뎁터 옵션변경"으로 들어가서 다음과 같이 들어가서 DNS IP주소를 설정하면 된다. 그리고 "ipconfig /all"명령어를 통해 DNS서버가 변경되어 있는지 확인해 보자.
이때, 자동으로 DNS서버 주소받기를 사용할 경우, DHCP서버에 설정되어 있는 DNS서버를 사용하게 된다.
방화벽 해제
"DNS"를 통해 도메인을 IP주소로 변환해서 클라이언트가 사용하기 위해서는 클라이언트가 DNS서버에 접근해야 하는데, 접근하기 위해선 서버 운영체제의 방화벽을 해제할 필요가 있다. 만약 방화벽이 설정 되어있으면, 방화벽에 DNS 포트가 설정되어 있지 않아서 해당 포트로 서버에 접근이 불가능하게 된다.
- systemctl stop firewalld : 방화벽을 정지시키는 명령어
- setenforce 0 : SELinux(linux의 자체적으로 가지고 있는 커널기반 방화벽)을 비활성화하는 명령어
DNS 실행
DNS의 파일에 내용 추가,수정을 했을 경우, 해당 파일의 내용을 적용하기 위해서, 서버를 재실행 해야 한다.
- systemctl restart named : DNS 서버 프로그램을 실행하는 명령어
DNS 서버 프로그램을 실행하고, "host [도메인]"을 쉘에 입력하면, 해당 도메인의 IP주소가 출력된다.
[root@localhost etc]# host test.co.kr
test.co.kr has address 192.168.158.128
이제, 도메인을 이용하여 클라이언트에서 해당 IP주소의 telnet서버에 접속을 해보자.
[root@localhost etc]# telnet test.co.kr
Trying 192.168.158.128...
Connected to test.co.kr.
Escape character is '^]'.
localhost login: test
Password:
Last failed login: Sun Apr 2 05:52:19 KST 2023 from ::ffff:192.168.158.150 on pts/1
There was 1 failed login attempt since the last successful login.
Last login: Sun Feb 19 03:04:00 on :0
[test@localhost ~]$
master서버와 slave서버
모든사이트는 서버가 다운될 경우에도, 해당서비스를 사용할 수 있도록 서버 2개 이상을 만든다. 특히 DNS서버는 도메인 형태의 주소를 IP 주소로 변환시키기 때문에 해당 서버가 다운되면, 도메인으로 운영되는 서버는 사용할 수 없게 된다.
이렇게 DNS는 하나의 서버가 다운되어도 다른 서버에서 도메인을 IP주소로 변환할 수 있도록 해야 한다. 이럴때 사용하는 기능이 master서버(메인서버),slave서버(보조서버)로, master서버에 있는 도메인 정보 파일을 slave서버에 복사함으로써, 둘 중에 하나의 서버가 다운되어도 다른 서버를 통해 도메인을 IP주소로 전환하는 것이다.
master서버와 slave서버 구축하기 위해서는 master서버와 slave서버의 도메인 등록 파일을 다음과 같이 수정,추가한다.
master 서버 (192.168.158.120) | slave서버 (192.168.158.129) |
위처럼 각각 서버의 도메인 등록파일을 수정하고, 각각 DNS를 실행하면, master 서버의 도메인 "test.co.kr"의 정보파일인 "test.co.kr.zone"파일이 slave서버의 "/var/named/slaves"디렉토리에 추가 되는 것을 확인 할 수 있다.
[root@localhost etc]# cd /var/named/slaves
[root@localhost slaves]# ll
합계 4
-rw-r--r--. 1 named named 192 4월 2 06:49 test.co.kr.zone
즉, slave서버에서도 도메인 "test.co.kr"의 IP주소를 반환할 수 있게 된다. 만약 master서버가 다운된다면, slave서버를 통해 "test.co.kr"를 해당 IP주소로 전환 할 수 있는 것이다.
이렇게 하나의 도메인를 두개의 DNS에 저장하면 하나의 DNS가 다운되어도 해당 IP주소를 찾을 수 있게 된다. 추가적으로 2개의 DNS에 저장을 하면 사용자가 많을 경우, 2개로 나눠서 제공하기에 1개로 제공하는 것보다 DNS의 처리속도가 빨라지게 된다.
'운영체제 > Linux - CentOs' 카테고리의 다른 글
데이터 베이스 관리 서버(DBMS) (0) | 2023.04.09 |
---|---|
WEB 서버(HTTP) (0) | 2023.04.03 |
동적 IP 할당 서버(DHCP) (0) | 2023.03.27 |
파일 전송 시스템(FTP) (0) | 2023.03.26 |
파일 공유 시스템(NFS, Samba) (0) | 2023.03.20 |