반응형
DNS(Domain Name System) 란?
- DNS는 호스트의 도메인 이름을 호스트의 네트워크 주소로 바꾸거나 그 반대의 변환을 수행할 수 있도록 하기 위해 개발되었습니다.
- 특정 컴퓨터(또는 네트워크로 연결된 임의의 장치)의 주소를 찾기 위해, 사람이 이해하기 쉬운 도메인 이름을 숫자로 된 식별 번호(IP 주소)로 변환해 줍니다.
- e.g. 브라우져에 "www.naver.com" 을 입력하면 자동으로 Naver 서버의 IP를 찾아 접속하게 됩니다.
- i.e. "www.naver.com" 도메인을 DNS 서버에서 조회하여 IP를 받아오게 되는 것입니다.
- e.g. 브라우져에 "www.naver.com" 을 입력하면 자동으로 Naver 서버의 IP를 찾아 접속하게 됩니다.
조회 순서는 다음과 같습니다.
- 로컬 캐시 조회
- /etc/hosts 조회: /etc/hosts
- DNS 서버 조회: /etc/resolve.conf
1. 로컬네임서버(/etc/hosts)
DNS가 없던 아주 옛날에는 모든 서버의 /etc/hosts 파일에는 아래와 같은 형식으로 domain과 IP주소의 짝을 직접 등록하여 도메인에 대한 IP주소를 찾아가도록 하였다. 이는 파일을 일일이 매번 수정하여야 하는 고된노동이였기에 지금은 bind를 이용한 DNS서버를 구축하여 사용합니다. 물론 일종의 트릭으로 원하는 IP와 도메인명을 /etc/hosts에 등록하고 사용할 수도 있기에 알아두면 도움이 됩니다.
$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
일반적으로 아래와 같이 설정합니다.
<IP> (탭) <호스트명> (탭) <Alias>
192.168.0.1 www.uzuro.com uzuro
192.168.0.2 ftp.uzuro.com ftp
- DNS서버를 운영할때 기본값으로 /etc/hosts 파일을 먼저 읽어 들입니다. 요청받은 도메인이 이 곳에 등록되어 있다면, DNS요청을 네임서버에 보내지않고 이 곳에 등록되어 있는 주소로 연결이 됩니다.
- 뭔가 따로 재시작할 필요 없이 hosts 파일에 넣으면 바로 반영되는 것을 알 수 있으며, 한 번 해당 도메인으로 접속했을 시 브라우져 캐시에 해당 내용이 저장됩니다.
- 따라서 이미 도메인에 접속한 이력이 있을 경우, hosts 를 변경하더라도 등록한 ip 대신 캐시에 저장된 IP로 이동하게 되므로 주의해야 합니다.
- 해결(캐싱 쿠키 삭제): 이때는 브라우저 히스토리를 clear하여 캐싱 쿠키 지우고 진행하면 해결할 수 있습니다.
- 따라서 이미 도메인에 접속한 이력이 있을 경우, hosts 를 변경하더라도 등록한 ip 대신 캐시에 저장된 IP로 이동하게 되므로 주의해야 합니다.
2. DNS 서버 생성하기
1. 네트워크 연결 확인
// Google의 DNS 서버
$ ping 8.8.8.8
// 위 ping이 안될 경우 시도해보자
$ systemctl retstart network
// restart 안 될 경우는
$ systemctl stop NetworkManager
$ systemctl retstart network
2. 방화벽 해제
// 방화벽 해제 추가
$ firewall-cmd --permanent --zone=public --add-port=53/udp
$ firewall-cmd --permanent --zone=public --add-port=8994/tcp
$ firewall-cmd --permanent --add-service=dns
// 방화벽 적용
$ firewall-cmd --reload
// 방화벽 확인
$ firewall-cmd --get-zones
$ firewall-cmd --permanent --list-all --zone=public
- $ firewall-config 라고 치면 UI로 방화벽 control 할 수 있습니다.
3. 패키지 설치
- 배포판 리눅스는 DNS 로 bind 패키지를 사용한다
// chroot: root를 숨기고 디렉토리 접근을 컨트롤하는 기능(ftp에 사용)
$ yum -y install bind bind-chroot
// 설치 확인
$ rpm -qa | grep chroot
$ rpm -qa | grep bind
4. DNS 설정 파일
DNS 설정을 위해서, 다음 3개의 파일을 살펴보고 수정합니다.
- /etc/named.conf
- /etc/named.rfc1912.zones
- /var/named/linux.com.zone
1) /etc/named.conf
- 네임서버 데이터베이스 및 zone 파일의 위치, 접근제어 등의 보안설정을 할 수 있는 메인 설정 파일.
- 보면 zone 파일의 directory가 /var/named로 설정되어 있다.
- listen-on port 53
- 네임서버의 포트번호(53)와 접근할 수 있는 IP 설정.
- 외부에서 접근가능해야 하므로 any로 변경
- listen-on-v6 port 53
- IPv6 설정은 ::1 를 none으로 바꿈 (optional)
- allow-query
- 네임서버 쿼리를 허용할 ip.
- 네임서버에 설정된 도메인에 대해 모두 응답할 수 있도록 any로 변경.
- 59번째 줄을 보면 named.conf에서 named.rfc1912.zones를 include하여 정보를 참조하고 있습니다.
다음으로 이를 수정하도록 합시다.
2) /etc/named.rfc1912.zones
- 네임서버에 쿼리 요청 시에 사용할 도메인 정보 (정방향 영역과 역방향 영역)가 저장됩니다.
- 아래가 기본적인 zone 의 정의
zone "localhost" IN {
type master;
file "named.localhost";
allow-update { none; };
};
- 위 형식을 참고하여 'linuxtest.com' 을 위한 zone을 생성하여 추가해줍니다. (정방향)
zone "linuxtest.com" IN {
type master; // master로 설정된 내용들을 가장 먼저 찾아감 (master or slave)
file "linuxtest.com.zone"; // 이 zone파일에 내용을 넣어두겠다
allow-update { none; }; // 동기화할 slave 서버의 IP (없으면 none)
};
- 원래 정석은 IP -> linuxtest.com 으로도 접속이 가능하도록(역방향) reversing 파일을 만들어 추가해줘야 합니다. (zone을 2개 추가하는 것이 보통)
- 이제 여기서 정의한 linuxtest.com.zone 파일을 생성합시다.
3) /var/named/[도메인].zone
- 네임서버 설정 시 가장 중요한 도메인 정보 파일로 도메인을 IP 주소로 변환해 주는 역할
- 네임서버 가동하면 zone 파일을 읽어 네임서버 서비스가 가동됩니다
- 샘플 파일 ("/var/named/named.empty") 을 복사해 생성한다.
$ cd /var/named
$ cp named.entity linuxtest.com.zone
3-1) named.empty
$TTL 3H
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
A ::1
- TTL : linuxtest.com에 대한 정보를 얼마나 보관하고 있게 할 지 (기본: 3H)
- @ : 오리지널 도메인 (named.conf 에 정의된 (= "linuxtest.com")
- @ 대신 linuxtest.com 을 써도 똑같다.
- SOA : " 위 도메인에 대한 설정들을 로컬 네임서버가 갖고 있다" 고 선언
- rname. : URL 루트 네임
- serial : Secondary nameserver(보조 DNS 서버) <-> Primary nameserver(기본 DNS 서버)
- 시리얼 번호를 기준으로 2차-프라임 네임서버의 연동 여부 결정 (Serial 값이 커지면 2차 네임서버 기준으로 zone 파일 갱신)
- refresh : 1차 네임서버의 변경된 값을 확인하여 자신의 zone 파일 갱신할 간격. (기본: 하루마다 확인)
- retry : Secondary nameserver -> Primary nameserver
- 2차에서 prime으로 접속이 불가할 때 재시도하는 간격
- expire : Retry 를 반복적으로 시도하다가 1W 후 linuxtest.com 정보를 파기
- minimum : TTL(Time To Live)
- 내 도메인 정보를 다른 서버가 요청해서 가져갔을 때 그 기록을 얼마나 남겨둘 지.
- NS : Name Server (1차 네임서버) 지정
- A : URL (=@) 의 실제 IP 주소
- AAAA : IPv6 변환
3-2) linux.com.zone
$TTL 3H
@ IN SOA ns.linuxtest.com. root.linuxtest.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
IN NS ns.linuxtest.com.
ns IN A 192.168.229.128
www IN A 192.168.229.128
5. 설정 파일 확인 및 서비스 반영
// 파일에 named도 접근할 수 있게 권한 주기
$ chown root:named /var/named/linuxtest.com.zone
// 파일이 제대로 작성되었는지 체크
// -> 결과가 OK가 나오면 됨. 나오지 않으면 파일 내 tab , 띄어쓰기 등을 확인해볼 것(:se list)
$ named-checkconf -z /etc/named.conf //-> linuxtest.com이 뜨는지
$ named-checkzone ns.linuxtest.com.zone /var/named/linuxtest.com.zone
서비스 재시작
$ systemctl restart named
6. (클라이언트) DNS 서버 등록
- 생성한 DNS 서버가 제대로 작동하는 지 확인하기 위해
- 클라이언트 PC 에서 Primary NS 의 IP 주소 등록을 해준다.
/etc/resolver.conf: DNS 서버 주소 = 192.168.229.128
7. (클라이언트) 도메인의 IP 주소 확인하기
1) nslookup, dig 명령어 이용
// dig 은 bind-utils 패키지가 설치되어 있으면 사용할 수 있는 명령
$ dig "Domain"
$ dig www.linuxtest.com
// -> 어떤 DNS서버를 통하여 어떤 IP의 대답을 주는지 확인
// +short +trace 등의 옵션을 사용할 수 있다.
// 특정 DNS 를 명시하여 test (명시하지 않으면 resolve.conf에 지정된 서버를 찾아간다)
$ dig @"DNS_IP" "Domain"
$ dig @192.168.229.128 www.linuxtest.com
// nslookup 명령어
$ nslookup "Domain"
$ nslookup www.linuxtest.com
// 특정 DNS 명시하여 조회
$ nslookup "Domain" "DNS_IP"
$ nslookup www.linuxtest.com 192.168.229.128
다음과 같이 등록한 IP가 나오면 성공!
2) 브라우져에 테스트하기
브라우져에서 내 IP 로 접속했을 때 웹문서(hello!!)가 출력되게 하기 위해 index.html을 작성하고 http(아파치)를 실행합니다.
$ vi /var/www/html/index.html
$ systemctl restart httpd
8. DNS 서버 종료
더이상 DNS 서버로 쓰지 않으려면 다음과 같이 해주자.
8-1) DNS 서버단
$ nano /etc/firewalld/zones/public.xml // dns 서비스, 53 포트 라인 삭제
$ firewall-cmd --reload
$ systemctl stop named
8-2) 클라이언트단
$ nano /etc/resolve.conf // -> 등록한 DNS 서버 IP 삭제
참고
- 리눅스 로컬네임서버(/etc/hosts) 설정: https://webdir.tistory.com/162
- [리눅스] DNS 서버 만들기: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=rufgksdb&logNo=221484166452
반응형
'Study: ComputerScience(CS) > CS: Linux' 카테고리의 다른 글
[Linux] Graceful Shutdown이란? (feat. SIGINT/SIGTERM/SIGKILL + signal handler) (0) | 2022.08.05 |
---|---|
[Linux] 프로세스 종류 및 특징 (feat. Demon과 Background Process의 차이) (0) | 2022.07.31 |
[Linux] 리눅스 파일 시스템(File System) (0) | 2022.07.25 |
[Linux] 리눅스 디렉토리(폴더) 구조: /home, /bin, /etc, /usr... (0) | 2022.07.25 |
[Linux] 리눅스 *.so.* 파일 경로: 동적 라이브러리 링킹하는 방법 (feat. 정적(static) vs 동적(dynamic)) (2) | 2022.07.23 |