네임서버(DNS - Domain Name System) 구축 방법
1. 네임서버란 무엇인가?
Domain Name System이란 이름과 IP 주소를 맵핑하여 주는 거대한 분산 네이밍 시스템이다. 인터넷에서 사용되는 IP(Internet Protocol), 그리고 IP의 상위에서 동작하는 넷스케이프 같은 응용프로그램들은 210.105.79.103 과 같이 표현되는 IP 주소만을 인식하게 되는데, 이러한 IP 주소는 기계입장에선 해석하기 수월하지만 기억하기가 어렵고, IP 주소만으로는 서비스 유형을 예측하기 힘들다는 단점이 있다. 인터넷의 도입 시절인 ARPANET 시절부터 IP Address를 이름으로 명명하여 사용하고자 하는 노력이 시도되었고, 많은 시행착오는 지금의 DNS 메커니즘으로 발전하였다.
ARPANET 시절에는 호스트의 수가 많지 않았기에 NIC(Network Information Center)으로부터 일정 주기마다 호스트 명단 파일(HOSTS.TXT)을 받아 리눅스에서는 /etc/hosts에 저장하여 사용하였다. 그러나 점차 인터넷의 규모와 호스트 수가 증가함에 따라 새로운 이름 명명 체제의 필요성이 대두되었고, 1983년 Paul Mockapetris가 RFC882, RFC883(현재는 RFC1034로 대체됨)에 새로운 명명 체제에 대한 구현을 공식 발표하며, 크게 네임스페이스의 계층 구조, 분산 데이터베이스, Email 라우팅 개선을 주안점으로 DNS가 탄생하였다.
네임서버는 Primary, Secondary, Cache only server로 구분된다.
Primary server는 해당 도메인을 관리하는 주 네임서버이고, Secondary server는 특정 도메인에 대한 back-up copy를 유지하는 서버이다. Secondary는 Primary가 비정상 운행될 때와 부하를 분산시키기 위해 운용하며, 다수가 존재할 수 있다.
보통 도메인을 관리하기 위해서는 Primary, Secondary 서버가 필요하게 되며, Secondary는 원칙적으론 외부 네트웍에 위치시켜 정전 등의 사태로 Primary가 다운되었을 때를 대비한다. 따라서, 도메인을 운영하기 위해서는 최소 2대(Primary * 1, Secondary * n) 이상의 네임서버가 요구된다. Resolver의 입장에서는 Primary와 Secondary가 구분되지 않기에 Primary 만으로도 운영은 가능하나 권고되진 않는다
Cache only server는 도메인에 대한 데이터를 관리하지는 않고, resolving만을 처리해 준다. 만약, 본교와 분교가 있고 이 학교의 Primary, Secondary Name server가 모두 본교에 위치한다고 할 때, 분교에 위치한 네트워크의 사용자들은 Local DNS server가 없게 된다. 이럴 경우 도메인 resolving이 요구될 때마다 다른 네트워크(본교)로 접속을 시도하게 되므로 약간의 딜레이가 생기게 되며, 본교 네트워크가 단절되었을 시 분교도 실질적으로 인터넷 사용이 불가능한 단점이 있다. 이럴 때 분교에 Cache only server를 운용하면 효과적으로 문제를 해결할 수 있다.
2. 구축환경
서버의 구축은 사람들마다 환경이 다를 수 있으므로 지금부터 이야기하는 내용은 다음과 같은 시스템을 기준으로 설명한다. 나의 DNS 서버는 다음과 같은 환경에 구축되어 있다.
가. PentiumⅢ(500MHz), RAM - 256M, HDD - 40G
나. 운영체제 : Redhat Linux 7.3(Valhalla)
다. 커널버젼 : Kernel 2.4.20 - 28.7
※ 특징 : 웹서버, 메일서버, FTP서버, DHCP서버가 모두 설치되어 동작되고 있으며 IP매스커레이딩과 이름기반의 가상호스트까지 한 개의 서버에서 동작되고 있으며 여기에 네임서버를 구축하는 것임.
물론, 단독 네임서버의 구축도 아래과정을 거치면 됨
3. 구축절차
네임서버를 구축하기 위해서는 크게 나눠서 다음과 같은 두 과정을 거쳐야 한다.
첫째, 도메인을 획득하고 이 도메인을 네임도메인으로 등록해야 한다
둘째, 네임도메인과 연결된 ip(공인)를 가진 네임서버를 구축해야 한다
그럼 먼저 네임도메인을 등록하는 방법부터 알아보자
가. 네임도메인 등록
다들 아는 사실인지는 몰라도 도메인 획득과 이 도메인을 네임 도메인으로 등록하는 방법은 대행업체를 통하면 간단히 해결된다.
나는 닷네임을 통해서 이 작업을 했다(비용이 제일 싼 것 같음). 어떤 업체를 통해도 무관하다. 방법은 대동소이하니까!!
닷네임(http://dotname.co.kr)에 접속해 등록하고자 하는 도메인이 이미 등록이 되어 있는지 아닌지 검색했다.
등록하고자 하는 도메인을 aaa.net 이라고 하자
그리고 여기에 연결될 공인 ip가 192.168.100.100 라고 하자. 모두가 아는 사실이겠지만 이 ip는 사설로 사용되는 ip이다. 예를 들기 위해 이것을 쓰는 것으로 한다.
aaa.net 이 등록이 안된 도메인이면 등록을 하자. 등록비가 조금 들어갈 것이다
등록이 되었다고 도메인이 바로 사용되어 지는 것은 아니다.
이 도메인과 대응되는 ip를 가진 서버를 구성해야 하고 네임서버에 도메인과 대응되는 ip를 알려주어 네임서버에 그 내용이 기록되어야만 도메인을 사용할 수 있는 것이다
닷네임 메뉴의 무료 부가서비스 중 DNS서버란 메뉴가 이러한 일을 하는 것이다
물론 다른 네임서버를 사용할 수도 있다. 각자 도메인을 등록한 곳의 서비스를 이용하면 간단히 해결될 문제이다.
이것이 일반적인 도메인등록과 그 도메인에 대응되는 ip를 가진 서버를 운영하는 방법이다
그러나, 네임서버는 이 과정을 거치는 것이 아니라 다른 과정을 거친다
등록된 도메인을 네임도메인으로 등록(전세계에 있는 13개의 루트 네임서버)에 해야 하기 때문에 닷네임의 메뉴중 정보변경 > 네임서버생성 메뉴에 가서 신규 호스트 등록을 한다.
등록된 도메인 명이 aaa.net 이니까 앞에 ns를 붙여 ns.aaa.net 이라고 호스트명을 써주고 이것과 대응될 앞으로 구축할 네임서버의 공인 ip를 기록해서 호스트 등록을 하면 된다.
그런 다음 정보변경 > 네임서버변경으로 가서 등록한 도메인 aaa.net 의 네임서버를 자신이 구축하려는 네임서버의 호스트명 ns.aaa.net으로 변경하고 네임서버의 공인 ip를 기록해 준다
이 과정은 자신의 도메인 aaa.net 에 대한 맵핑(도메인과 IP를 대응시키는 작업)을 앞으로 만들어질 자신의 네임서버(ns.aaa.net)에서 하겠다는 의미이다 - 업체에서 운영하는 네임서버에 하는 것이 아니라.
업체에서 운영하는 네임서버에 등록하려면 뭐하러 네임서버를 만드는 수고를 하는가!!
이제 루트네임서버에 내 네임도메인이 등록되기를 기다리면 된다.
통상 하루~이틀정도 걸리는 것 같다.
나. openssl 업데이트 및 설정사항 확인
이제 나의 네임도메인이 루트네임서버에 등록되어지는 동안 네임서버를 구축해 보자.
나는 레드햇 리눅스 7.3 배포판으로 서버를 구축했다.
네임서버 구축을 시작하기 전에 openssl의 버전과 ipchains의 사용여부를 점검해 보라.
ipchains은 ntsysv 명령을 실행해서 보았을 때 체크가 되어 있지 않으면 된다.
대신 iptables 는 체크가 되어 있어야 한다
openssl은 7.3에 깔려있는 버전으로는 네임서버 설치 시 에러가 발생하기 때문에 업그레이드를 실시해 주어야 한다
방법은 여러 가지가 있겠지만 이 방법이 가장 편리하고 다른 패키지들의 업데이트를 위해서도 좋은 방법인 것 같다.
바로 윈도우의 자동업데이트 방법과 같은 방법인데 다음과 같은 과정을 거치면 된다.
먼저 Linux7.3용 원격업데이트를 위한 RPM파일을 설치한다.
각 버전마다 파일들이 다 다르다. Linux 7.3용 파일은 내 홈페이지(http://wizle.net)의 리눅스 자료실에 있으니 다운받아 사용하면 될 것이다. 그 외의 버전은 https://rhn.redhat.com에서 다운받아 사용하면 된다.
설치방법은 rpm -Uvh up2date_2.8.40_3.7.3.i386.rpm 이다.
다음으로 https://rhn.redhat.com에 접속하여 회원가입을 한다. 회원가입이 완료되었으면 서버에서 다음과 같은 과정을 거치면 된다.
서버에서 rhn_register --nox 를 실행하면 소개화면이 뜨는데 여기서 엔터치고 다음화면부터는 계속 next로만 진행하면 된다.
User명이 나오면 https://rhn.redhat.com에 접속하여 회원가입을 할 때의 계정ID를 넣고 패스워드가 나오면 계정의 패스워드를 넣는다.
메일은 계정 생성 시 등록하였던 메일주소를 입력하여 주면 된다.
여기까지 하면 원격업데이트를 할 수 있는 준비가 완료된 것이다
이제 up2date -u 라는 명령을 주면 rpm 패키지명들이 나오면서 원격 업데이트가 실시된다.
만약 update하기 싫은 패키지가 있다면 etc/sysconfig/rhn/up2date 라는 환경 파일을 수정하면 된다.
이 파일을 열어보면
removeSkipList=kernel*;
pkgSkipList=kernel*;
이 두 부분이 보이는데 이 부분을 수정해 주면 된다.
예를 들면 아파치를 update하기가 싫다면
removeSkipList=kernel*;apache*;
pkgSkipList=kernel*;apache*;
이렇게 추가해 주면 된다.
기본은 kernel 업데이트를 안 하는 것으로 되어 있지만 커널까지 업데이트 하려면 다음과 같이 하면 된다.
removeSkipList=
pkgSkipList=
다. BIND 9 설치
이제 네임데몬인 BIND 9를 설치해 보자.
bind-9.2.3.tar.gz 를 /usr/local/src 디렉토리에 올리고 압축을 풀어 설치를 한다
# tar xvfz bind-9.2.3.tar.gz
# cd bind-9.2.3
configure전에 소스화일에서 pid폴더를 변경해줘야 된다.
디폴트로 /var/run/named.pid이나 퍼미션 에러로 생성이 안된다.
/var/run/named/named.pid로 변경해주자.
# vi bin/named/include/named/globals.h
run/named.pid/ -> /run/named/named.pid
run/lwresd.pid -> /run/named/lwresd.pid
#./configure --prefix=/usr/local/bind --sysconfdir=/etc --localstatedir=/var --mandir=/usr/share/man --with-openssl --with-libtool --disable-ipv6
# make
# make install
여기까지 하면 BIND 9 설치는 완료된 것이다. 너무나 간단하다.
프로그램은 /usr/local/bind 에 깔린다
라. Caching Nameserver 설치
caching nameserver란 사용자들의 요구에 대해 적절한 대응(도메인↔ IP)을 하는 네임서버의 역할을 수행할 수 있도록 하는 환경설정파일이라고 보면 될 것 같다.
caching역할을 수행하는데 필요한 설정 파일들은 RPM패키지로 되어 있기 때문에 그냥 RPM 패키지파일을 사용하면 된다. 물론 직접 작성해서 사용해도 상관은 없다.
설정 파일들을 RPM으로 설치하려면 다음과 같이 입력하면 된다.
rpm -Uvh --nodeps caching-nameserver-7.2-1.noarch.rpm
설치 시 의존성에 걸리기 때문에 --nodeps 옵션으로 설치한다.
설치되는 파일들은 다음과 같은 것이다.
/etc/named.conf
/var/named/localhost.zone
/var/named/named.ca
/var/named/named.local
다음에 나올 네임서버의 환경설정은 이 파일들의 조작이라고 보면 될 것이다.
위의 파일들은 직접 작성해 사용해도 작동하는데 아무런 문제가 없다.
마. 환경설정
이제 네임서버의 환경설정 작업을 해보자.
먼저 /etc 디렉토리에 rndc.conf 와 rndc.key 파일을 생성한다.
방법은 # /usr/local/bind/sbin/rndc-confgen > /etc/rndc.conf 이다
rndc.conf 파일의 내용을 보면 다음과 같다.
# Start of rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "9u7Sa90MocLXdaEjssKrBw==(다른 값일 수 있음)";
};
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf
# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndc-key" {
# algorithm hmac-md5;
# secret "9u7Sa90MocLXdaEjssKrBw==(다른 값일 수 있음)";
# };
#
# controls {
# inet 127.0.0.1 port 953
# allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf
뒷부분의 주석 처리된 부분의 내용을 읽어보면 알겠지만 주석 처리된 부분의 내용을 복사해서 named.conf 파일에 삽입하도록 되어 있다.
그런데 /etc/named.conf 파일을 보면 하단 끝에
include "/etc/rndc.key";
라는 내용이 있기 때문에 /etc 에
# vi rndc.key
명령으로 rndc.key 라는 파일을 생성해 주고 rndc.conf 파일내의 아래와 같은 부분의 내용을 복사해 넣으면 된다.
key "rndc-key" {
algorithm hmac-md5;
secret "9u7Sa90MocLXdaEjssKrBw==(다른 값일 수 있음)";
};
다음으로 rndc.conf 파일의 뒷부분 아래와 같은 내용의 주석처리(#)된 부분을 복사하여 /etc/named.conf 파일에 붙여 넣는다.
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
그러면 이제 /etc 밑에 rndc.conf, rndc.key, named.conf 파일이 있고 그들의 내용을 살펴보면 다음과 같다
rndc.conf 의 내용은 # cat rndc.conf 하면
# Start of rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "9u7Sa90MocLXdaEjssKrBw==";
};
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf
# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndc-key" {
# algorithm hmac-md5;
# secret "9u7Sa90MocLXdaEjssKrBw==";
# };
#
# controls {
# inet 127.0.0.1 port 953
# allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf
rndc.key 의 내용은 # cat rndc.key 하면
key "rndc-key" {
algorithm hmac-md5;
secret "9u7Sa90MocLXdaEjssKrBw==";
};
named.conf 의 내용은 # cat named.conf 하면
// generated by named-bootconf.pl
options {
directory "/var/named";
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
};
//
// a caching only nameserver config
//
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
zone "." IN {
type hint;
file "named.ca";
};
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
include "/etc/rndc.key";
이다.
이제 실제로 도메인 세팅을 해보자.
앞에서 전술했지만 나의 네임 도메인은 ns.aaa.net 이고 이것은 루트네임서버에 192.168.100.100 이라는 IP와 대응되도록 등록되어 있다.
따라서 aaa.net 이라는 도메인명이 붙어 있으면 어느 곳에서든지 내 네임서버로 찾아오게 되는 것이다.
내 네임서버로 온 사용자의 요청을 어떻게 처리할 것인지에 대한 내용이 /etc/named.conf 파일에 기록되어 있어야 하는데 다음과 같은 내용을 named.conf 파일에 기록해 주면 된다.
zone "aaa.net" IN {
type master;
file "aaa.zone";
allow-update { key "rndc-key"; };
};
zone "100.168.192.in-addr.arpa" IN {
type master;
file "aaa.rev";
allow-update { key "rndc-key"; };
};
위의 내용은 aaa.net 이라는 도메인명이나 호스트명.aaa.net 으로 사용자 요청이 있었을 때는 aaa.zone 파일에 기록되어 있는 내용대로 사용자의 요청을 처리하라는 내용이고
아래 내용은 도메인에 대응되는 IP 192.168.100.X 로 사용자의 요청이 왔을 때는 aaa.rev 파일에 기록되어 있는 내용대로 사용자의 요청을 처리하라는 내용이다.
IP는 거꾸로 쓰여있어야 한다는 것에 유의하라.(잘못 적은 것이 아니다)
내가 구축하는 방법은 네임서버와 웹서버, FTP, 메일서버가 동일한 서버에 구축되는 것이니까 도메인에 대응되는 IP가 네임서버의 IP와 같은 IP를 가지게 되었다.
이제 /etc/named.conf 파일의 내용을 살펴보면 다음과 같다.
// generated by named-bootconf.pl
options {
directory "/var/named";
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
};
//
// a caching only nameserver config
//
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
zone "." IN {
type hint;
file "named.ca";
};
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
zone "aaa.net" IN {
type master;
file "aaa.zone";
allow-update { key "rndc-key"; };
};
zone "100.168.192.in-addr.arpa" IN {
type master;
file "aaa.rev";
allow-update { key "rndc-key"; };
};
include "/etc/rndc.key";
/etc/named.conf 파일의 최상단을 보면 option 부분에 aaa.zone 과 aaa.rev 파일이 위치할 디렉토리가 /var/named 라고 되어 있다.
이 디렉토리에 aaa.zone 과 aaa.rev 파일을 만들어 주면 된다. 이 디렉토리에는 기본적으로 세 개의 파일(localhost.zone, named.ca, named.local)이 이미 들어있다. 이들은 그대로 두면 된다.
localhost 설정과 루트네임서버에 대한 정보이니까 건드릴 필요 없다
aaa.zone 파일의 내용은 다음과 같이 작성하면 된다.
파일들을 작성할 때 기본원칙은 다음과 같은 것들이다
첫째, 띄어쓰기는 TAB 을 이용해서 하도록 한다.
둘째, 모든 공백라인은 ";" 문자를 이용하여 주석 처리를 하도록 한다.
$TTL86400
@INSOAns.aaa.net. root.ns.aaa.net. (
1997022700 ; Serial
28800 ; RefresH
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
INNSns.aaa.net.
INMX10mail.aaa.net.
nsINA192.168.100.100
aaa.net.INA192.168.100.100
mailINA192.168.100.100
wwwINA192.168.100.100
ftpINA192.168.100.100
앞에서도 얘기했지만 내가 구축하는 방법은 네임서버와 웹서버, FTP, 메일서버가 동일한 서버에 구축되는 것이니까 도메인에 대응되는 IP가 네임서버의 IP와 같은 IP를 가지게 되었다.
다음으로 aaa.rev 파일은 다음과 같이 작성하면 된다
$TTL86400
@INSOAns.aaa.net. root.ns.aaa.net. (
2004062716 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
INNSns.aaa.net.
100INPTRns
100INPTRmail
100INPTRwww
100INPTRftp
이제 네임서버가 구축되었다.
위의 두 파일의 내용만 적절히 수정하고 호스트명만 달리 하면 무수히 많은 서버를 만들어 낼 수 있을 것이다
예를들어 test.aaa.net 도메인을 192.168.100.1에 대응시켜 서버를 만들고자 한다면 aaa.zone 파일의 끝 부분에 다음 내용을 마지막에 추가하고
testINA192.168.100.1
aaa.rev 파일의 끝 부분에 다음 내용을 추가하고 네임데몬을 다시 구동하면 된다
100INPTRftp
위의 작업이 완벽해 지려면 네임기반의 버츄얼 호스트 구축하는 방법에 대해서 알아야 하겠지요!!!
마지막으로 구축된 네임서버가 참조해야 할 네임서버의 목록에 자기 자신도 포함시켜두자
방법은 /etc/resolv.conf 파일을 열어 아래 내용을 맨 위에 추가하면 된다
search aaa.net(자신의 도메인)
nameserver 192.168.100.100(자신의 네임서버 ip)
바. BIND 9 의 시작과 종료
BIND 9 는 named 계정으로 동작되기 때문에 named 계정을 생성해 주고 네임서버와 관계된 파일들의 소유권을 named 계정으로 변경해 주어야 한다
named 계정은 다음 방법으로 생성한다
# useradd -s /bin/false -d /var/named named
이제 파일들의 권한과 소유권을 변경해 준다. 변경할 파일과 방법은 다음과 같다.
# chmod 640 /etc/rndc.key
# chmod 640 /etc/rndc.conf
# chmod 640 /etc/named.conf
# chown root.named /etc/rndc.key
# chown root.named /etc/rndc.conf
# chown root.named /etc/named.conf
# chmod 700 /var/named
# chmod 600 /var/named/*
# chown -R named.named /var/named
# mkdir /var/run/named
# chown named.named /var/run/named
이제 네임데몬을 구동시켜보자. 방법은 다음과 같다.
# /usr/local/bind/sbin/named -u named
네임 데몬이 구동되었으면 nslookup 명령으로 정상 동작하는지 살피면 된다
# nslookup
Note: nslookup is deprecated and may be removed from future releases.
Consider using the `dig' or `host' programs instead. Run nslookup with
the `-sil[ent]' option to prevent this message from appearing.
> aaa.net
Server: 192.168.100.100
Address: 192.168.100.100#53
Name: aaa.net
Address: 192.168.100.100
위와 같이 나오면 네임서버는 정상동작하고 있는 것이다.
이것으로 네임서버 구축방법에 대한 소개를 마친다.
물론 더 자세한 부분들이 있겠지만 그 내용은 각자가 필요할 때 적절히 찾아서 공부하면 될 것이다.
'메모' 카테고리의 다른 글
mysql character set 세션값, global value...펌 (0) | 2013.11.21 |
---|---|
db, 브라우저 utf8...펌 (0) | 2013.11.21 |
MySQL에서 character_set_system 의미? 펌 (0) | 2013.11.21 |
mysql characet set euckr 지정하기...펌 (0) | 2013.11.21 |
http, https 프로토콜...펌 (0) | 2013.11.21 |