부엉이사장 2023. 10. 21. 15:07

# DNS란 무엇일까??

영어는 Domain Name Server이라고 하는데 예전에 난 도메인 구입해본 경험이 있다.

우리가 보통 naver.com이나, google.com을 들어갈때 브라우저에 이 주소를 입려하고 가는데 이게 바로 도메인이다.

사실 브라우저에서는 네트워크 호스트 주소를 입력하고 접속하는게 기본적인데 이게 사용자들한테는 어려우니 도메인이라는걸 사용하는것이다.

 

+ 예시 

구글의아이피 주소는 216.58.200.228이고 도메인은 google.com이다.

그렇다면 아이피 주소로 입력해도 구글에 접속이 되겠지?

브라우저 주소창에 저 아이피 주소를 붙여넣어보자

접속하면 구글로 이동하는 것을 알 수 있다.

 

 

# 도메인은 단순히 브라우저에서만 쓰이는게 아님

네트워크를 사용하는작업이면 모두 도메인설정을 할 수 있다.

예를들어 우리가 자주 사용 했던 핑을 던져볼까?

 

아까 구글아이피에 핑을 던져보자

뭐 당연히 구글 사이트가 접속되니 핑이 가는건 맞는거고. 

그럼 핑을 www.google.com 에 던져보자.

핑이 여전히 잘 간다. 그리고 구글의 아이피까지도 알려준다ㅋㅋㅋ 

나도 이걸로 아이피를 먼저 알아냈었다.

 

암튼 도메인은 아이피랑 짝꿍이라고 보면 되고, 아이피를 사람이 보기 편하게 문자로 쓰게 해주는거라고 보면 된다.

 

 

 

 

# 그럼 이 도메인과 아이피 정보는 어디 있을까?

우리가 VM을 만들때, 네트워크 설정에 DNS서버를 설정하는 곳이 있었다. 8.8.8.8을 입력했는데 이게 구글 도메인 서버이다. 떄문에 우리가 www.google.com에 들어가면 구글아이피로 연결이 되는것이다.

www.naver.com또한 마찬가지 이다.

 

하지만 우리 컴퓨터가 가장 먼저 hosts파일을 먼저 찾는다.

centos linux에서 호스트파일위치는 다음과 같다

vi /etc/hosts

막 리눅스를 깐 상태에서 이 파일을 뜯어보면

요렇게 생겼다. 127.0.0.1이라는 아이피는 localhost라는 도메인으로 접속 할 수 있다는 의미인데

vs코드로 웹프론트를 공부해본 사람들은 알거다. vs 코드에 live server익스텐션을 동작하면 

요러케 생겼고 내가 만들고 있는 웹사이트가 보여진다.

이 localhost라는 도메인은 127.0.0.1이라는 아이피에 연결되어있고 이 주소는 로컬호스트, 즉 컴터 자체를 가르킨다. IPv6에서는 ::1이 로컬호스트 주소이다. 

웹개발하고있었다면 127.0.0.1:80으로 연결이 된거다.

 

 

# 그럼 직접 다른 호스트에서 웹을 만들어본다면?

난 일단 muzzicom이라는 VM을 만들거고 여기서 http로 웹서버 역할을 해 볼 거다.

이 muzzicom VM은 아이피가 211.183.3.222이다.

이렇게 VM을 만들었다. 대충 원하는 그림을 보자면..

VM muzzicom에서 대충 웹서버를 동작시키자

yum -y install httpd

패키지 설치하고,,

vi /var/www/html/index.html

대충 index.html만들고 hello muzzi dot com 입력해놓고..

systemctl enable --now httpd

http를 데몬(백그라운드)에서 실행시켜주자.

 

 

# test

211.183.3.222로 접속하면 80포트에서 웹서버가 실행중이다.

211.183.3.0/24대역대는 이미 NAT대역대이므로 그냥 브라우저 켜서 접속하면

우리가 만든 index.html파일이 잘 보이게 된다.

 

 

# client VM에서 /etc/hosts파일을 수정해보자.

메인은 일단 도메인이기 때문에, 아이피가 아닌 도메인을 쳐서 저 hello muzzi dot com 사이트에 접속해볼거다.

client VM에서 hosts 파일을 수정하자.

vi /etc/hosts

요렇게 입력해놓고 저장하자.

그럼 muzzi.com으로 접속하려고할때 저 아이피로 요청을 보낸다는 의미이다.

그리고 client에서 curl요청을 보내보자.

 

아이피로 보내든,  muzzi.com으로 보내든 모두 같은곳으로 가졌다.

 

참고로 핑도된다. (index.html은 확인 못함)

 

 

 

 

 

# 근데 /etc/hosts에는 www.google.com이 없는데?

/etc/hosts는 로컬도메인이다. 여기에 www.google.com에 대한 아이피 정보가 없지만 아까 해봤듯이 ping www.google.com으로 핑을 치면 연결이 잘 된다. 분명 도메인 정보가 어디에 존재한다는 뜻인데.. 

컴퓨터는 로컬 도메인에 없으면 다른 도메인서버를 뒤져본다. 그게 바로  우리가 처음 만들때 설정했던 DNS서버이다.

8.8.8.8인 구글 도메인 서버 주소가 얘다.

로컬도메인에 원하는 도메인이 없으면 기본 도메인서버에 도메인을 요청하게 된다는 말임.

 

이 DNS서버 주소는 각각 파일에서 확인 할 수 있다.

vi /etc/resolv.conf

혹은 네트워크 인터페이스 파일을 보면..

vi /etc/sysconfig/network-scripts/ifcfg-ens32

(참고로 인터페이스 이름은 좀 다를 수 있음..)

이렇게 정해져있다. 

 

 

 

# 그럼 DNS서버를 직접 만들어볼까?

dns서버를 위한 VM을 dnserver이란 이름으로 만들어보겠다.

대충 그림은 이렇다.

 

 

 

일단 dnserver VM의 아이피를 211.183.3.53으로 바꿔줬다.

vi /etc/sysconfig/network-scripts/ifcfg-ens32

systemctl restart network

바꼈다.

 

이제 dns 서버 구축을 위한 패키지를 다운 받아보자

yum -y install bind

도메인 서버를 구축하기위해서는 bind만 있음된다.. 

bind가 오픈소스라이브러리라 걍 쓰는거고 이외에는 microsoft dns(window), unbound, powerdns, knot dns 등이 있다.

암튼 설치를 끝냈으면 아래파일을 수정하자

vi /etc/named.conf

options의 저 부분을 any로 다 바꿔주샘..

첫번째 listen-on port 53{any;}이라는건 포트 53번으로 들어오는 dns요청은 '모두'(any)한테 허용한다는 의미임.

그리고 마지막 allow-query any는 쿼리 허용한다는거다..

기본설정은 127.0.0.1에서만 허용한다고 한다. 즉 로컬호스트에서만 허용한다는 거였음.. dns의 의미가 없었다.

 

암튼 걍 모든 요청한테 받는다고 바꿔줬다..

 

+ 추가적으로 더 내려보면 logging이란곳도있는데 로그파일을 정리하는 곳이다.

난  아래 코드를 추가해볼거다.. (될지 모르겠음ㅋ)

  channel "query_log" {
    file "/var/log/named/query.log" versions 3 size 5m;
    severity info;
    print-time yes;
    print-severity yes;
    print-category yes;
  };

  category queries {
    "query_log";
  };

 

그리고 제일 아랫쪽으로 가서 zone영역을 정해줄거다.

zone "muzzi.com" IN {
        type master;
        file "muzzi.com.sex";
        allow-update { none; };
};

muzzi.com에 대한 도메인 안내는 muzzi.com.sex파일에 가서 받으라는 뜻.

이제 변경한 named.conf파일을 저장하자.

 

그리고 방금 위에 존 정해준 파일을 만들어줘야한다.

touch /var/named/muzzi.com.sex
vi /var/named/muzzi.com.sex

그리고 아래 내용을 붙여넣자.

$TTL 3H
@               SOA     @       root (
                                                0       ; serial
                                                1D      ; refresh
                                                1H      ; retry
                                                1W      ; expire
                                                3H )    ; minimum

                IN      NS      @
                IN      A       211.183.3.222

www             IN      A       211.183.3.222

TTL은 도메인 서버가 가지고 이 도메인 아이피 데이터를 가지고있을 캐싱해서 갖고있을 시간인데 사실 뭐 얘는 단독도메인서버라 딱히필요는 없는 옵션이다. 아래에 도메인 서버의 캐싱에 대해서 적을 예정이다.

 

그리고 중요한게 아래에 두줄이다.

도메인만 입력했을경우 211.183.3.222로 안내해준다는것이구

www.muzzi.com요청할경우 211.183.3.222로 요청을 보낸다는 것이다.

또한 추가적으로 ftp.muzzi.com으로 요청받을경우 ftp서버를 안내해준다거나.. 뭐 잡다한 하위도메인을 설정할수 있다.

암튼 저장하고 나오자.

 

도메인 파일 잘 설정했는지 확인을 해보자

named-checkzone muzzi.com /var/named/muzzi.com.sex

문제 없다고 뜬다.

그럼 이제 도메인서버를 구동시키자.

systemctl enable --now named

앗! 근데 오류걸렸다..

아까 로그파일 설정해주는거 넣었는데 

journalctl -xe쳐보니 /var/log/named/query.log 요 경로가 없단다.

아래명령어로 만들어주자.

mkdir /var/log/named

touch /var/log/named/query.log

chmod 777 -R /var/lo/named/query.log

권한설정도 따로 열어줘야하드라..

암튼 다시 systemctl enable --now named를 실행시키면 동작하기 시작한다.

 

 

 

 


# 클라이언트에서 이 도메인서버를 메인으로 정해보자.

클라이언트VM은 211.183.3.111호스트이다.

vi /etc/sysconfig/network-scripts/ifcfg-ens32

네트워크 설정파일로 간뒤, 

dns서버주소를 바꿔주샘

그리고 네트워크를 재시작해주자

systemctl restart network

그러면

cat /etc/resolv.conf

요 파일도 수정이 잘 되어있다.

 

++ 참고로 우리는 아까 로컬도메인을 테스트하면서 아래 파일을 설정했었다.

vi /etc/hosts

저 아래 211.183.3.222~~~를 지워주자.

아래에 쓰긴 하겠지만 도메인을 로컬도메인부터 탐색하기 때문이다.

 

 

# 테스트 결과는?

된다잉~
그럼 dns서버의 로그를 보러 가보자.

cat /var/log/named/query.log

client (211.183.3.111)이 요청했다고 로그가 남아있다.

만약 로컬도메인으로 찾아간거면 이 dns서버에서는 기록이 남아있지 않을것이다. 

시간은 한국시간 아닌듯..

 

 

 

 

 

 

 

<추가적인 정보>

 

 

 

# 도메인 하나에 여러 아이피가 매칭될 수 있다. 경우1

$TTL 3H
@               SOA     @       root (
                                                0       ; serial
                                                1D      ; refresh
                                                1H      ; retry
                                                1W      ; expire
                                                3H )    ; minimum

                IN      NS      @
                IN      A       211.183.3.222

www             IN      A       211.183.3.222

이파일을 보면.. 우리는 웹만 해줬지만 만약 ftp.muzzi.com으로 요청을 하게될때

211.183.3.20의 호스트로 요청을 하게 할 수도 있고 그렇다.

난 위에 도메인과 아이피가 쌍이라고 했지만 사실 일대일 구조가 아니라 일대다 구조가 될 수 있다.

 

 

# 도메인 하나에 여러 아이피가 매칭되는 경우2 => 라운드로빈(Round-Robin)

예를들어 똥컴 여러대가 있는데 이걸로 웹서버를 돌릴거다. 근데 이 똥컴 한대로 웹서버를 돌릴경우 트래픽이 조금만 더 몰리더라도 터져버린다. 이런경우 라운드로빈 방식으로 트래픽을 분산할 수 있다. 이걸 라운드로빈 DNS이라고 한다.

아래 포스팅을 참고했다

https://m.blog.naver.com/techtrip/221691155719

 

라운드 로빈(Round Robin) DNS를 활용한 로드 밸런싱(Load Balancing)

라운드 로빈 DNS는 별도의 소프트웨어 혹은 하드웨어 로드밸런싱 장비를 사용하지 않고, DNS만을 이...

blog.naver.com

근데 얘는 저 똥컴중 하나가 터져도 알방법이 없다고한다. 걍 죽은 똥컴한테도 트래픽 계속 보낸다는 뜻임..

암튼 부하분산방식중하나며, DNS서버뿐 아니라 cpu의 프로세스 부하분산방식으로도 쓰인다.

 

 

# 도메인 하나에 여러 아이피가 매칭되는 경우3 => 로드벨런서 (Load Balancer)

로드벨런서는 부하분산방식이긴 하지만 저 Round Robin방식의 단점이 없다. 즉 터진 똥컴한테는 트래픽을 안보낸다는 것이다. health체크가 된다는거임..  aws에서도 서비스하고 있다.

 

 

 

 

 

# 패키지 설치에서 왜 DNS서버가 이상하면 설치가 안될까?

난 이것때메 패키지명이 도메인인줄 알았다.. 하지만 아니었다.

yum install -y nfs-utils

간단한 패키지를 다운 받으면..

요렇게 명령어가 뜨면서 패키지 다운이 시작된다. (나같은경우는 nothing to do 가 뜨는데 이미 설치되어있어서..)

자세히보면 도메인들이 있다. 네이버 뭐시기..등등

이 도메인에 가야 파일 정보들이 있는거다. 

이 미러페이지 정보가 저장되는곳이 아래파일이다. 

cat /etc/yum.repos.d/CentOS-Base.repo

조~온나 복잡하다..

암튼 패키지다운받는데 그런 레포지토리 주소가 필요한데 그런정보들얻으려고 할떄 저런 사이트들의 도메인이 필요하다.

그리고 미러페이지라는건 한 레포지토리에서 전세계가 요청을 하면 빡시기때문에 똑같은 레포지토리를 여러개 만들어놓은것..

여기까지만 알아보자.

 

 

 

 

# 도메인 서버 메커니즘 www.muzzi.co.kr  

위에서 실습한건 내가 직접 도메인 서버를 만든것이다. 때문에 다른사람이 www.muzzi.com으로 접속할경우 이사람이 요청하는 도메인서버는 내가 만든 dnserver VM이 아니기때문에 내가 만든 사이트가 보이지 않는다.

 

만약 내가 직접 웹사이트를 만들어 배포하고, 이 웹사이트에 대한 도메인을 www.muzzi.co.kr을 구매하여 설정을 해줬다면 다른사람들은 www.muzzi.co.kr접속하여 내가 만든 웹사이트를 볼 수 있을것이다.

그럼 우리가 간단하게 만든 도메인서버가 아닌 '실제' 도메인 서버는 어떻게 이루어 질까? 

www.muzzi.co.kr이란 도메인을 가지고 실제 도메인 서버들이 어떻게 작동하는지 알아보자

 

실제 도메인은 www.muzzi.co.kr.으로 마지막에 '쩜'이 하나 더 붙는다. 이게 루트도메인인데

실제로 핑도 동일한곳으로 간다.

모든 도메인은 쩜단위로 오른쪽일수록 상위도메인이며, 왼쪽으로 갈 수록 하위도메인이다. 

따라서 위의 그림처럼 각각 도메인이 나뉘어져 있고, 이 도메인마다 도메인서버가 따로 존재한다.

 

 

뭐 이런식으로 서버가 여러개 있는데 만약 클라이언트가 구글 도메인서버에 도메인 정보 요청을 보내면 이렇게 요청이 처리된다.

걍 순서대로 루트도메인서버부터 정보를 하위도메인 순으로 물어보면서 정보를 요청할 도메인 서버를 찾게된다.

그리고 최종적으로 도메인과 일치하는 아이피정보를 클라이언트가 받게되어 웹사이트에 접속이 되게 되는것이다.

아래 트리구조로봐도 된다.

 

 

 

이 과정이 복잡하고 여러 도메인 네임서버에 요청이 가게되므로 매번 웹사이트를 수억의 클라이언트가 접속할때마다 이 과정을 반복하는건 비효율적이기때문에 위에위에 그림의 검은색 구글 도메인서버가 해당 도메인에대한 요청을 한번받고 작업을 수행하였으면 그 이후에는 그 도메인과 아이피정보를 캐시처리해둔다. 

때문에 두번째 클라이언트가 같은 도메인에대한 요청을 하게되면 저장해둔 정보를 보내준다.

 

우리가 실습할때도 TTL이라는 부분이 잠깐보였는데

$TTL 3H
@               SOA     @       root (
                                                0       ; serial
                                                1D      ; refresh
                                                1H      ; retry
                                                1W      ; expire
                                                3H )    ; minimum

                IN      NS      @
                IN      A       211.183.3.222

www             IN      A       211.183.3.222

여기서 3시간동안 정보를 저장해둔다는 뜻같음.. time to live 라는 뜻이다.

암튼 도메인서버는 캐시처리를 해둔다.

 

 

 

 

# 참고로 사설 도메인을 구입할때..

도메인 등록방법은 여러가지가 있는데,

만약 도메인을 구입하고 원하는 인스턴스와 연결할때, 네임서버를 등록하게 된다.

예를들어

이런식으로 네임서버 도메인이나, 아이피를 주고 클라우드업체에 등록을 하게되는데 이게 위에서 말한 네임서버의 주소들이다.

 

 

 

 

 

 

궁금증

# 도메인 네트워크파일이랑 /etc/resolv.conf파일 다바꿔줬는데 패키지가 다운받아짐. 왜?