네임서버 강좌 ver 0.2 김병찬 홈페이지: www.linux.sarang.net V0.21, 1998년 7월 2일 몇번을 다시 적으려고 벼르고 벼르다 오늘에야 vi 를 실행 시켰습니다. 그동안 알짜 5.0 을 만든다는 핑계로 홈페이지 업데이트도 하지 않고 빈둥빈둥 놀다보니 이리 되었네요. 이번에는 욕안먹을 정도로 쓸수 있기를 빌어봅니다. 이 글에서는 도메인명이 무엇인지, 네임서버는 또 무엇인지 그리고 마지막으로 네임 서버를 어떻게 구축하고 테스트 할 수 있는지 정도를 적으려 합니다. 다시 O'Reilly 의 DNS & BIND 를 뒤적여야 할꺼 같군요. 이 글이 네임서버를 구축, 관리하시는 분들에게 도움이 되었으면 합니다. 무엇을 공부하든지 직접 해보는 것 이상은 없습니다. 잘못될 것을 두려워 하기 보단 먼저 일을 저지르고 보십시오. _______________________________________________________________________________ ------------------------------------------------------------------------------- [ 도메인 & 네임서버 ] ▶ 도메인명이란 무엇인가? 네임서버를 구축하기 전에 우선적으로 도메인명이 무엇인가 정도는 알아야 하지 않을까 생각합니다. 다들 너무나 잘 알고 있는 부분인가요? 도메인명이 별거 있겠습니까? 그냥 nownuri.net 이라든지 linux.sarang.net 같은 것이 도메인명이지요. 인터넷에서 어떠한 호스트로 접속을 하고 싶다면? (웹이건 텔넷이건) 그 호스트의 주소를 알아야 하겠지요. 인터넷에 물려 있는 모든 호스트는 자신만의 IP 주소를 가지고 있습니다. 이것이 바로 인터넷에서의 주소입니다. 저의 리눅스 박스인 linux.sarang.net 의 경우 IP 주소가 168.126.127.250 입니다. 세계에서 유일하게 저만이 가지고 있는 주소지요. ^^ (집주소가 똑같은게 두개 있는거 보셨습니까?) 그런데 사실 사람이란게 숫자의 연속을 잘 외우지 못하지요. 168.126.127.250, 203.238.128.51 이렇게 해서 몇개나 기억할수 있을까요? 좀 더 쉽게 살아가기 원하는것은 당연한 것이고 덕분에 도메인명이라는 것을 사용하게 되었다고 생각합니다. ^^ linux.sarang.net 과 168.126.127.250 중에 무엇이 더 외우기 쉬운지는 잘 아시리라 생각됩니다. 그런데 하나 생각하고 넘어갈 것은 도메인명은 (정확히 말해서 FQDN, A Fully Qualified Domain Name) 실제 인터넷의 주소가 아니란 것입니다. 실제적으로 접속할 수 있기 위해서는 IP 주소를 알아야 할 필요가 있는데 둘다 외우면 더 불편하지 편하겠습니까? 네임서버가 바로 도메인명을 IP 주소로 바꾸어 주는 역할을 (또는 그 반대로 IP 주소를 도메인명으로 바꾸어 주는 역할) 하게 됩니다. ▶ 네임서버의 역할 그럼 네임서버는 어떤식으로 도메인명 <-> IP 주소의 역할을 수행할 수 있을까요? 계속 이렇게 설명해 나가면 한도 끝도 없겠지만 그래도 꿋꿋이 GO! 아까부터 계속 예로 들었던 제 서버의 도메인명과 IP 주소를 가지고 설명을 하겠습니다. 네임 서버가 도메인명으로 IP 주소를 찾아내는 과정은 아주 질서 정연합니다. 하나 하나 차례대로 차근차근 찾아 나가는 것입니다. linux.sarang.net 의 IP 주소를 찾기 위해서 네임 서버가 어떤 행동을 하는지 살펴볼까요? ----- 도메인명 -> IP 주소의 과정 ---------------------------------------------- linux.sarang.net.┌──────────┐ ┌─────────〉│A.ROOT-SERVERS.NET. │ │NS ns.sarang.net └──────────┘ ┌────┐ │ │local │ │ linux.sarang.net.┌───────┐ │ name │〈─┼───────────〉│ns.sarang.net.│ │ server│ │ NS ns.linux.sarang.net.└───────┘ └────┘ │ ∧ │ linux.sarang.net.┌───────────┐ │ └─────────〉│ ns.linux.sarang.net. │ │ A 168.126.127.250 └───────────┘ ∨ ┌────────┐ A : IP 주소 │사용자(resolver)│ NS : 네임 서버 └────────┘ ------------------------------------------------------------------------------- linux.sarang.net 을 찾을 때 우선 네임서버는 자신이 가지고 있는 네임서버 루트 정보를 참조하여 최상위 도메인을 관리하는 네임서버에 sarang.net 도메인의 정보를 요청하게 됩니다. 그러면 루트 네임 서버는 sarang.net zone 을 관리하는 네임서버가 ns.sarang.net 이란것을 알려 줄것입니다. 그럼 다시 우리의 무적 네임서버는 ns.sarang.net 으로 linux.sarang.net 에 대한 정보를 달라고 요청합니다. ns.sarang.net 은 요청을 받고 linux.sarang.net zone 을 관리하는 네임서버가 ns.linux.sarang.net 이라는 것을 알려줄것이고, 마지막으로 ns.linux.sarang.net 에 정보를 요청하면 자신의 데이타베이스에서 linux.sarang.net 의 IP 주소가 168.126.127.250 이라는 것을 알려줄 것입니다. (상당히 간단하지요? 물론 저렇게 움직인다는것을 보여주지는 않겠지만 ^^) 상위도메인부터 ( "." 으로 구분해서 뒤쪽에 있을수록 상위도메인명입니다.) 순차적으로 질문을 수행해서 최종적인 결과를 얻는 것입니다. 마치 탐문수사하는것 같지요. ----- 외부에서도 도메인을 찾을려면? ------------------------------------------- 하나 짚고 넘어가야 할것이 있습니다. 많은 분들이 자신의 서버에 네임서버를 만들기만 하면 외부에서 지정한 도메인을 찾을수 있으리라는 생각을 하는것을 보았습니다. 위에서 설명한것처럼 도메인명을 IP 주소로 바꾸기 위해서 네임서버는 상위 네임서버로부터 차례대로 질문을 하고 정보를 얻는데 중간에 이빨이 빠져 있다면 과연 찾을수 있을까요? 자신의 서버에 네임서버가 돌고 있다고 해도 상위 네임서버에 어떤 zone 을 관리하는 네임서버로 지정이 되어 있지 않다면 그 곳까지는 질문도 들어오지 않을 것입니다. 절대로 건너뛰는 일은 없거든요. 누구나 네임서버를 만들면 도메인을 마음대로 만들어서 사용할 수 있다면 아마 인터넷은 지옥이 될껍니다. ^^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 위에서 간략하게 네임서버의 역할을 언급한적이 있는데 과연 이녀석이 무엇을 하는 존재일까 하는 존재의 가치를 생각해 보면서 조금 더 적을까요? 벌써 여러번 말했듯이 가장 큰 역할은 도메인명을 IP 주소로 전환해서 알려주고 또한 IP 주소를 도메인명으로 전환해줄 때 쓰입니다. 그리고 또 하나, 특정 지역(zone)에 대한 데이타를 가지고 외부에서 오는 질문에 대한 정보를 보내주게 됩니다. 질문만 하는것이 아니라 답변도 하는 것이지요. 네임서버의 구축이란것은 다름이 아니라 답변을 하기 위한 정보를 가질 수 있도록 해주는 것이겠지요. 질문만 수행하는 네임서버라면 구축이라는 말을 붙일 필요도 없을 정도로 간단합니다. (파일 하나 달랑 넣어 주면 끝이거든요. caching only name server 라고 합니다. 후에 설명할께요.) 네임서버가 가지는 정보를 이용해서 도메인명 <-> IP 주소의 역할을 해내는 것이지요. 자신이 정보를 가지고 있지 않다면? 위에서 말한 것처럼 정보를 찾아서 다른 네임서버들에게 질문을 하게 되는 것입니다. (그러고 보니 하는 일은 딱 한가지군요. 원하는 것을 찾아다 준다!^^) 슬슬 실제로 구축하는 예를 들어 볼까요? 이제 기본이니 뭐니 하는것도 지겨워질것 같은 생각이 듭니다. 실제로 만들어 가는 과정을 보면서 중간 중간에 부수적인 설명을 하도록 하지요. [ 네임서버 만들기 ] 이 글에서 네임서버 프로그램인 bind 를 컴파일하고 설치하고 하는것은 전혀 적지 않겠습니다. 요즘에야 워낙에 패키지들이 잘 나와서 굳이 컴파일 하지 않아도 기본적으로 다 동작하니까요. 끝까지 컴파일해서 쓰셔야 겠다면 ftp.isc.org 에서 bind 소스를 받아오셔서 그 안의 문서를 잘 읽어 보시고 스스로 해보시기 바랍니다. ▶ 초기화 파일의 설정 (named.boot) 네임서버의 기본 설정 파일은 하나입니다. 바로 /etc/named.boot 입니다. 그 외의 부분은 사용자가 설정하기 나름입니다. 네임서버가 시작할때 /etc/named.boot 의 내용을 읽어 들인후에 그 안에 설정한 대로 다른 정보를 포함하기도 하고 시키는대로 작동을 하게 됩니다. 아무래도 안을 들여다 보아야 겠지요? ----- /etc/named.boot 파일 내용 ----------------------------------------------- directory /var/named cache . named.root primary linux.sarang.net linux.zone primary 0.0.127.in-addr.arpa local.rev primary 127.126.168.in-addr.arpa linux.rev ------------------------------------------------------------------------------- 저의 시스템에 설정되어 있는것을 베껴다 넣었습니다. 간결하지요. 기본적으로 쓰이는 옵션? 태그?는 딱 3가지입니다. 그것만 쓰면 네임서버 하나를 뚝딱 해결할 수 있습니다. 괜히 복잡하게 꾸밀 생각은 하지도 말고 주지도 맙시다. (무슨 소리 하는거지?) directory, cache, primary 이렇게 3가지 입니다. 설명을 해보도록 하지요. - directory 네임서버의 정보를 가진 데이타 파일들이 위치할 디렉토리를 지정하는 것입니다. 다른 옵션에서 지정하는 파일들을 여기서 지정한 디렉토리 밑에서 찾게 되는 것입니다. 이게 이녀석이 하는 역할의 전부입니다. - cache 루트 네임서버들에 대한 정보를 가지고 있는 파일을 지정합니다. 흠 이 부분에서 또 하나 알고 넘어가야 할것이 생격군요. 보통 우리가 도메인명을 적을때 linux.sarang.net 이렇게 적지요. 사실 정확하게 적으려면 마지막에 "." 을 하나 더 붙여줘야 합니다. 그러니까 우리가 일반적으로 쓰는 것은 "." 이 생략되어 있는 것입니다. 그러니까 최상위 도메인은 "." 가 되는 것이지요. 역시 네임서버가 정보를 찾기 시작할때 가장 먼저 질문을 보내는 곳도 "." 를 관리하는 네임서버가 되겠지요. 왜 domain 을 적는 부분에 "." 이 적혀 있는지 이해가 되시는지요? 위에서 지정하는 cache 파일엔 "." 도메인을 관리하는 네임서버들에 대한 정보가 기록되어 있고 그 정보를 이용해서 정보를 찾게 되는겁니다. 아주 중요한 파일이겠지요? 어떤식으로 네임서버를 구성하든지 이 파일은 항상 존재해야 합니다. 파일 이름은 보통 named.root 라고 쓰는데 지정해 주기 나름입니다. 이 파일은 사용자가 만드는 것이 아니라 인터닉에서 배포하는 것을 받아서 쓰게 됩니다. ftp://ftp.rs.internic.net/domain 에서 named.root 파일을 받아서 사용하면 됩니다. bind 소스나 패키지에도 포함되어 있습니다. 파일 내용에 관해선 조금 후에 알아 보도록 하지요. - primary 이 서버가 관리하는 지역 도메인(zone)과 그 정보를 가진 파일을 지정합니다. 위에서 보면 domain 부분에 linux.sarang.net 이라고 적혀 있지요. 그러니까 네임서버로 문의(query)가 들어올때 linux.sarang.net 하의 도메인명에 대해서는 지정한 파일에서 정보를 찾아 오는 것입니다. linux.sarang.net 하의 도메인이라고 하면 좀 헷갈릴지도 모르겠습니다. 간단하게 하자면 *.linux.sarang.net 을 관리 하는 것입니다. ( * 이 무엇을 뜻하는지 아시리라 믿습니다.) 흠 하나 생각해볼까요? 여러개의 지역 도메인을 하나의 네임서버에서 관리 할 수 있는 것인지? 당연히 가능하겠지요? 그저 관리할 지역 도메인을 적어 주고 데이타를 가진 파일만 적어준다면? 열개든 백개든 정보를 가지지 못할 이유가 없겠지요? ----- IP -> 도메인명 찾기 ----------------------------------------------------- 흠 domain 부분에 적혀 있는 0.0.127.in-addr.arpa 는 도데체 무엇일까요? 다시 한번 존재의 가치를 생각해 봐야 겠군요. 네임서버에서 하는 역할중에 도메인명을 IP 주소로 바꾸는것과 IP 주소를 도메인명으로 바꾸는 것이 있다는것은 글을 잘 읽으셨으면 아시겠지요. in-addr.arpa 부분은 IP 를 도메인으로 바꾸기 위한 것입니다. 0.0.127.in-addr.arpa 가 뜻하는 것은 127.0.0.* 의 지역 IP 를 관리 한다는 것입니다. 좀 이상하지요? 우리가 보통 쓰는 방식이 아니라 역순이지요. IP 라고 해서 도메인과 틀릴께 전혀 없습니다. 한번 찾는 방법을 알아 볼까요? 역시 linux.sarang.net 을 가지고 해봐야 겠지요. 흠 IP 주소가 168.126.127.250 이니까 하나 하나 순차적으로 찾아가 봅시다. (흠 앞부분부터 찾아야 겠지요? named.boot 에 적는 형식으로 적어 보면 250.127.126.168.in-addr.arpa 이렇게 되네요. 도메인과 마찬가지로 뒤에서부터 찾게 되지요. 히힛) ----- IP 주소 -> 도메인명의 과정 ---------------------------------------------- 250.127.126.168.in-addr.arpa. ┌──────────┐ ┌─────────〉│A.ROOT-SERVERS.NET. │ │NS ns.kornet.nm.kr └──────────┘ ┌────┐ │ │local │ │ 203.127.126.168.in... ┌────────┐ │ name │〈─┴───────────〉│ns.kornet.nm.kr.│ │ server│ co-H1-250.kornet.nm.kr └────────┘ └────┘ ∧ NS : 네임 서버 │ ∨ ┌────────┐ │사용자(resolver)│ └────────┘ ------------------------------------------------------------------------------- 흑 제 IP 를 찾아보면 도메인명이 co-H1-250.kornet.nm.kr 로 나오는군요. 에궁, 어쨌든 찾는 순서를 얘기해 보도록 하지요. 도메인의 최상위가 "." 이었듯이 IP 주소의 최상위는 in-addr.arpa. 입니다. 역시 최상위 IP 를 관리하는 네임서버로 문의를 하겠지요. 그러면 최상위 서버에서 168.126.*.* 을 관리하는 네임서버가 ns.kornet.nm.kr 이라는 정보를 줍니다. (중간이 생략되었다구요? 168 까지는 최상위서버인 인터닉이 가지고 있어서 그렇습니다.) 그럼 ns.kornet.nm.kr 로 문의를 하게 되고 문의한 IP 에 맞는 도메인이 co-H1-250.kornet.nm.kr 이라는 것을 알려주지요. 여기서 보시면 한가지 미심쩍은것이 있을것입니다. 분명히 linux.sarang.net 의 IP 가 168.126.127.250 이었는데 IP 로부터 찾아보니 엉뚱한 도메인이 나오지요? IP 와 도메인 사이에 어떠한 상관관계가 없는 것인지? 상당히 헷갈리기 쉬운 부분입니다. 도메인을 IP 로 바꾸어 주는것은 그 지역 도메인을 관리하는 네임서버에서 담당합니다. IP 를 도메인으로 바꾸어 주는 것은 역시 그 지역 IP 를 관리하는 네임서버에서 해주게 됩니다. 서로 일치해야만 할까요? 전혀 아닙니다. 제가 203.251.92.* 라는 C 클래스의 IP 를 소유하고 sarang.net 이라는 도메인을 가지고 있다고 해볼까요? 168.126.127.250 이라는 IP 에 linux.sarang.net 이라는 도메인을 주고 싶습니다. 저희 지역 IP 가 아니지요? 불가능할까요? 아닙니다. 아무런 관계 없이 부여해줄수 있습니다. 관리하는 사람 마음입니다. nownuri.net 의 IP 인 203.238.128.51 에다가 slow.sarang.net 을 주고 그 도메인으로 접속해도 됩니다. (느려터진 나우누리 T_T) 그럼 IP 쪽은 어떨까요? nownuri.net 이라는 도메인을 203.251.92.250 에다가 주고 싶다면? 주면 됩니다. 아무런 문제가 없습니다. ^^ 다시 말해서 자신이 가진 도메인을 자신의 지역 IP 에만 부여해줄 수 있는 것도 자신이 가진 IP 에 자신의 지역 도메인만을 부여해줄수 있는 것도 아닙니다. 그냥 원하는대로 ^^ 물론 sarang.net 이라는 지역 도메인을 가지고 있는데 엉뚱하게 linux.net 이런것을 부여해줄수 있는 것은 아니지만요. 이해가 가실런지 모르겠습니다. 글 재주가 워낙에 없어서... ------------------------------------------------------------------------------- - secondary [backup-file] 이 서버가 관리하는 지역 도메인(zone)과 그 정보를 가져올 서버 그리고 저장될 파일을 지정합니다. 네임서버에는 두가지 타입이 있습니다. 위에서 설명했던 (다른 부분까지 곁들였지만 ) primary master 와 secondary master 입니다. (ide 하드 얘기 하는거 같군요.) 둘의 차이는 직접 데이타 파일을 만들어 주느냐 아니냐 하는 정도입니다. 모든 기능은 똑같습니다. primary 의 경우는 직접 모든 데이타 파일을 만들어 주어야 하지만 secondary 는 다른 서버로 부터 데이타를 받아와서 저장합니다. ip-address-list 부분에 정보를 가져올 서버의 ip 를 적게 됩니다. 그러면 지정한 지역 도메인에 대한 정보를 그 서버에서 가져오게 됩니다. 백업 서버로써 사용할 때 쓸수도 있을 것이고 심심할때 해봐도 될 것입니다. SOA 필드와 secondary 서버와 관계가 깊으니 그 부분에서 더 자세한 얘기를 해보도록 하지요. 대충 위의 예제에서 본 것들은 다 설명한것 같지요? 아직도 엄청나게 남아 있습니다. 모두를 설명할 수는 없겠지만 몇개는 설명해야겠지요. - forwarders 자신에게 오는 문의를 다른 서버로 떠넘기는 것을 지정합니다. ip-address-list 부분엔 여러개의 ip 를 적어도 됩니다. 앞에 적은 서버가 죽어 있으면 그 다음 그 다음 이런식으로 문의를 떠넘겨 버립니다. 자신의 서버에 오는 문의를 모두 168.126.127.250 IP 를 가진 서버로 넘기고 싶다면 이렇게 하면 됩니다. forwarders 168.126.127.250 - include 다른 파일의 내용을 포함시킵니다. 간단하지요? primary 따로 secondry 따로 지정하고 named.boot 에서 각 파일을 불러 오게 하면 관리가 편하겠지요. (과연 편할까?) - options 몇가지의 옵션이 있습니다. (윽 위에서 설명하는것들은 태그라구 해야 하나? 뭐라고 불러야 하는건지... 아시는분?) options