DNS 서버 구축

네임 서버(Name server)는 디렉터리 서비스 프로토콜을 실행하는 프로그램이나 서버를 통칭한다. 일반적으로, 인터넷에서 Domain Name Service (도메인 이름) 를 제공하는 서버를 말한다.1위키백과 에서 발췌

생각보다 단순한 서비스이다.
전제 조건은
1. 세상의 모든 네트워크에 연결된 장비는 숫자로 된 IP주소232bit: IPv4, 255.255.255.255 형식, 128bit: IPv6, FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF 로 식별된다.
즉, www.haedongg.net 같은 주소를 가지는 장비는 없다는 얘기다.
2. 하지만 이 숫자로 된 주소는 인간이 기억하기 쉽지 않다.
3. 그래서 www.haedongg.net : 000.0000.000.000 같은 주소 연결이 필요하다.
는 것이다.

동작 원리는 다음과 같다.
– DNS 서버라는 녀석이 존재한다.
– 도메인 이름과 IP주소를 연결할 수 있는 정보를 가지고 있다.
(www.haedongg.net = 000.000.000.000 같은 정보)
– 사용자가 사용하는 PC에 DNS서버 정보를 미리 입력 해둔다.
– 웹 브라우저 등에서 www.haedongg.net을 입력한다.
– 사용자 컴퓨터는 hosts 라는 파일 안에 www.haedongg.net 이라는 정보가 있는지 확인한다.
– 없다면 미리 등록해둔 DNS 서버에 가서 www.haedongg.net 의 IP주소를 물어본다.
– DNS서버는 www.haedongg.net에 해당하는 주소 000.000.000.000를 반환한다.
– 000.000.000.000으로 이동한다.

위 역할을 하는 서버 DNS를 많은 ISP업체 등에서 제공하고 있다.
1.1.1.1 : cloudflare
8.8.8.8 : google
168.126.63.1 : KT
210.220.163.82 : SK boradband
164.124.101.2 : LG U+
등이 있다.

DNS 서비스 설치

haedong@haedong:/home/:]$ sudo yum install bind
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.kakao.com
Resolving Dependencies
--> Running transaction check
---> Package bind.x86_64 32:9.11.4-26.P2.el7_9.5 will be installed
...중략...
---> Package setools-libs.x86_64 0:3.3.8-4.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=====================================================================================================================
 Package                             Arch               Version                            Repository           Size
=====================================================================================================================
Installing:
 bind                                x86_64             32:9.11.4-26.P2.el7_9.5            updates             2.3 M
Installing for dependencies:
 GeoIP                               x86_64             1.5.0-14.el7                       base                1.5 M
Transaction Summary
=====================================================================================================================
Install  1 Package (+13 Dependent packages)
Total download size: 6.9 M
Installed size: 18 M
Is this ok [y/d/N]: y
Downloading packages:
(1/14): bind-libs-lite-9.11.4-26.P2.el7_9.5.x86_64.rpm                                        | 1.1 MB  00:00:00
...중략...
(14/14): setools-libs-3.3.8-4.el7.x86_64.rpm                                                  | 620 kB  00:00:00
---------------------------------------------------------------------------------------------------------------------
Total                                                                                9.2 MB/s | 6.9 MB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : 32:bind-license-9.11.4-26.P2.el7_9.5.noarch                                                      1/14
...중략...
  Verifying  : setools-libs-3.3.8-4.el7.x86_64                                                                 14/14

Installed:
  bind.x86_64 32:9.11.4-26.P2.el7_9.5

Dependency Installed:
  GeoIP.x86_64 0:1.5.0-14.el7                       audit-libs-python.x86_64 0:2.8.5-4.el7                  
  bind-libs-lite.x86_64 32:9.11.4-26.P2.el7_9.5     bind-license.noarch 32:9.11.4-26.P2.el7_9.5            
  bind-libs.x86_64 32:9.11.4-26.P2.el7_9.5          libcgroup.x86_64 0:0.41-21.el7                         
  policycoreutils-python.x86_64 0:2.5-34.el7        python-IPy.noarch 0:0.75-6.el7                         
  setools-libs.x86_64 0:3.3.8-4.el7

Complete!

서비스 설정

haedong@haedong:/home:]$ sudo  vi /etc/named.conf
// named.conf
options {
//서비스 요청을 받을 IP를 지정한다. IPv4 any로 변경한다.
        listen-on port 53 {any; };
//서비스 요청을 받을 IP를 지정한다. IPv6. any로 변경한다.
        listen-on-v6 port 53 { any; };
        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; };
        recursion yes;
        dnssec-enable yes;
        dnssec-validation yes;
        bindkeys-file "/etc/named.root.key";
        managed-keys-directory "/var/named/dynamic";
        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
        type hint;
        file "named.ca";
};

// 서비스 할 도메인 정보를 기재하는 파일이다. 
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

도메인 추가

haedong@haedong:/home:]$ sudo vi /etc/named.rfc1912.zones
// named.rfc1912.zones:
zone "localhost.localdomain" IN {
        type master;
        file "named.localhost";
        allow-update { none; };
};
zone "localhost" IN {
        type master;
        file "named.localhost";
        allow-update { none; };
};
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
        type master;
        file "named.loopback";
        allow-update { none; };
};
zone "1.0.0.127.in-addr.arpa" IN {
        type master;
        file "named.loopback";
        allow-update { none; };
};
zone "0.in-addr.arpa" IN {
        type master;
        file "named.empty";
        allow-update { none; };
};

// 변환 해 줄 주소. 
// xxx.haedong.skk의 주소 정보. 즉, a.haedongg.skk haedong.haedongg.skk 등의 주소를 사용가능케 한다.
zone "haedong.skk" IN{
        type master;
// zone 파일 지정
        file "haedong.skk.zone";
        allow-update {none;};
        allow-transfer {none;};
};

zone 파일 설정

haedong@haedong:/home:]$ sudo vi /var/named/haedong.skk.zone
$TTL 1D
@       IN SOA  @ haedong.skk. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       127.0.0.1
        AAAA    ::1
// haedong.haedong.skk 를 질의하면 172.17.0.11 을 반환한다.
haedong  IN      A       172.17.0.11
// hello.haedong.skk 를 질의하면 192.168.0.1을 반환한다.
hello    IN      A       192.168.0.1
// bye.haedong.skk 를 질의하면 www.haedongg.net을 반환한다. 
bye      IN      CNAME   www.haedongg.net

※ 위의 // 주석은 적용되지 않는다. //로 시작하는 줄은 모두 삭제한다.

vi /etc/named.rfc1912.zones 파일에 zone 정보를 기재하고 기재된 주소에 해당하는 zone 파일을 생성하고 정보를 위 양식대로 넣어주면 된다.
(호스팅 서비스 업체에서 제공하는 DNS나 등은 GUI등을 통해 설정 할 수 있다.)
생성한 zone 파일은 named 그룹이 소유권을 가지도록 설정해야 한다.

haedong@haedong:/home:]$ sudo chown -R :named /var/named/haedong.skk.zone

서비스 구동 및 확인

haedong@haedong:/home:]$ sudo service named restart
Redirecting to /bin/systemctl restart named.service
haedong@haedong:/home:]$ ps -ef | grep named
named    158850      1  0 15:17 ?        00:00:00 /usr/sbin/named -u named -c /etc/named.conf
root     158901 150715  0 15:18 pts/3    00:00:00 grep --color=auto named
haedong@haedong:/home:]$   nslookup haedong.haedong.skk
Server:         10.240.29.37
Address:        10.240.29.37#53

Name:   haedong.haedong.skk
Address: 172.17.0.11

named 는 UDP 53 포트로 서비스한다.
방화벽(firewalld / iptables)등에서 UDP53번 포트를 허용하지 않으면 서비스 되지 않는다.

Linux(CentOS7) 가상 네트워크 인터페이스 추가

NAT 구성 등을 위한 가상 인터페이스를 추가하는 방법을 설명알아보자.

인터페이스 정보 확인

[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.192.252  netmask 255.255.255.0  broadcast 192.168.192.255
        inet6 fe80::6d05:37d3:fb10:5b25  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:67:a4:a6  txqueuelen 1000  (Ethernet)
        RX packets 411  bytes 36267 (35.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 329  bytes 31013 (30.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 96  bytes 8376 (8.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 96  bytes 8376 (8.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

가상 인터페이스 생성
물리 인터페이스를 공유할 인터페이스 생성
ens33의 물리 NIC를 사용할 경우 ens33:0으로 생성한다.

[root@localhost ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33:0              
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33:0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
# 인터페이스 명과 장치명이 겹치지 않도록 수정한다.
NAME=ens33:0
DEVICE=ens33:0
ONBOOT=yes

# 사용하고 싶은 IP로 변경한다.
IPADDR=192.168.192.253
PERFIX=24
GATEWAY=192.168.192.254

확인

[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.192.252  netmask 255.255.255.0  broadcast 192.168.192.255
        inet6 fe80::6d05:37d3:fb10:5b25  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:67:a4:a6  txqueuelen 1000  (Ethernet)
        RX packets 1046  bytes 93843 (91.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 703  bytes 78865 (77.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.192.253  netmask 255.255.255.0  broadcast 192.168.192.255
        ether 00:0c:29:67:a4:a6  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 104  bytes 9080 (8.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 104  bytes 9080 (8.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

인터페이스 정보를 확인하고 연결이 되는지 확인한다.

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Users\haedong> ssh haedong@192.168.192.253
The authenticity of host '192.168.192.253 (192.168.192.253)' can't be established.
ECDSA key fingerprint is SHA256:en-----------------------0s3gUedMt8.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

Openstack #2-1 개념 아키텍쳐

Openstack #1 개요
Openstack #1-1 선행작업
Openstack #1-2 MariaDB(MySQL) 설치
Openstack #1-3 Chrony 설정
Openstack #1-4 MessageQueue(RabbitMQ)
Openstack #1-5 Memcached
Openstack #1-6 Etcd

openstack 모듈간 architecture 는 그림처럼 이해하면 쉽다.

하나의 가상 머신이 생성된다고 하면
– Novas는 Hypervisor로써 coumpute 노드로 설정된 노드들의 CPU와 RAM에 연결된다.
– Neutron은 네트워크 노드로 설정된 노드들의 네트워크 인터페이스와 연결된다.
– Cinder는 블록스토리지로 스토리지 노드들의 HDD(SSD 등)과 연결된다.
기본적으로 이 세 개의 모듈이 노드들의 자원을 획득하고 하나의 가상머신에 자원이 된다.

Glance와 Swift는 가상머신과 직접 연결되지 않는 것을 알 수 있는데 이는 Cinder와 달리 두 서비스는 가상머신에 가상디바이스를 직접 제공하지 않기 때문이다.

Horizon은 사용자가 openstack과 소통하기 위한 창구다. 웹 UI와 CLI를 제공한다.
Keystone은 사용자와 모듈을 식별한다.

Openstack #1-6 Etcd

Openstack #1 개요
Openstack #1-1 선행작업
Openstack #1-2 MariaDB(MySQL) 설치
Openstack #1-3 Chrony 설정
Openstack #1-4 MessageQueue(RabbitMQ)
Openstack #1-5 Memcached
Openstack #1-6 Etcd

etcd(잇시디)는 머신의 분산된 시스템 또는 클러스터의 설정 공유, 서비스 검색 및 스케줄러 조정을 위한 일관된 오픈소스, 분산형 키-값(key-value) 저장소이다.

컨트롤러 노드에서 수행한다.

패키지 설치

[root@openstack1:~]#yum install -y etcd
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.kakao.com
updates                                                                                                                                                                                                                     | 2.9 kB  00:00:00
Package etcd-3.3.11-2.el7.centos.x86_64 already installed and latest version
Nothing to do

설정

[root@openstack1:~]#vi /etc/etcd/etcd.conf
 # 모두 지우고 아래 내용을 붙여넣는다.
 # IP 주소는 각자 상황에 맞게 변경 해줘야 한다.
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
 # peer 연결을 받을 IP
ETCD_LISTEN_PEER_URLS="http://192.168.103.146:2380"
 # 클라이언트 연결을 받을 IP
ETCD_LISTEN_CLIENT_URLS="http://192.168.103.146:2379"
ETCD_NAME="controller"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.103.146:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.103.146:2379"
ETCD_INITIAL_CLUSTER="controller=http://192.168.103.146:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-01"
ETCD_INITIAL_CLUSTER_STATE="new"

서비스 등록 및 시작

[root@openstack1:~]#systemctl enable etcd
[root@openstack1:~]#systemctl start etcd

Openstack #1-5 Memcached

Openstack #1 개요
Openstack #1-1 선행작업
Openstack #1-2 MariaDB(MySQL) 설치
Openstack #1-3 Chrony 설정
Openstack #1-4 MessageQueue(RabbitMQ)
Openstack #1-5 Memcached
Openstack #1-6 Etcd

Memcached (멤캐시디, 멤캐시트)는 범용 분산 캐시 시스템이다. 외부 데이터 소스(예: 데이터베이스나 API)의 읽기 횟수를 줄이기 위해 데이터와 객체들을 RAM에 캐시 처리함으로써 동적 데이터베이스 드리븐 웹사이트의 속도를 높이기 위해 종종 사용된다. Memcached는 BSD 허가서로 라이선스되는 자유-오픈 소스 소프트웨어이다.

controller 노드에서 수행한다.

패키지 설치

[root@openstack1:~]#yum -y install memcached python-memcached
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.kakao.com
Package memcached-1.5.6-1.el7.x86_64 already installed and latest version
Package python-memcached-1.58-1.el7.noarch already installed and latest version
Nothing to do

설정 변경

# /etc/sysconfig/memcached
 # OPTIONS="-l 127.0.0.1,::1" 부분을 수정한다.
OPTIONS="-l 127.0.0.1,::1,controller" 

서비스 등록 및 시작

[root@openstack1:~]#systemctl enable memcached.service
[root@openstack1:~]#systemctl start memcached.service

Openstack #1-4 MessageQueue(RabbitMQ)

Openstack #1 개요
Openstack #1-1 선행작업
Openstack #1-2 MariaDB(MySQL) 설치
Openstack #1-3 Chrony 설정
Openstack #1-4 MessageQueue(RabbitMQ)
Openstack #1-5 Memcached
Openstack #1-6 Etcd

RabbitMQ는 오픈 소스 메시지 브로커 소프트웨어(메시지 지향 미들웨어)로서, AMQP를 구현하였으며 그 이후로 STOMP ,MQTT 등의 프로토콜을 지원하기 위해 플러그인 구조와 함께 확장되고 있다. 메시지를 생산하는 생산자(Producer)가 메시지를 큐에 저장해 두면, 메시지를 수신하는 소비자(Consumer)가 메시지를 가져와 처리하는 Publish/Subscribe 방식의 메시지 전달 브로커이다.

rabbitmq 서버는 controller 노드에만 설치한다.

패키지 설치

[root@openstack1:~]#yum -y install rabbitmq-server
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.kakao.com
Package rabbitmq-server-3.6.16-1.el7.noarch already installed and latest version
Nothing to do

서비스 등록 및 구동

[root@openstack1:~]#systemctl enable rabbitmq-server.service
[root@openstack1:~]#systemctl start rabbitmq-server.service
 # 또는
[root@openstack1:~]#chkconfig rabbitmq-server on
알림: 'systemctl enable rabbitmq-server.service'에 요청을 전송하고 있습니다.
[root@openstack1:~]#service rabbitmq-server start
Redirecting to /bin/systemctl start rabbitmq-server.service

사용자(계정) 생성

# rabbitmqctl add_user ACCOUNT PASSWORD
[root@openstack1:~]# rabbitmqctl add_user openstack openstack
Creating user "openstack"
 # 기존 사용자를 삭제하려면 add_user 대신 delete_user명령을 사용하면 된다.

권한 부여

[root@openstack1:~]#rabbitmqctl set_permissions openstack ".*" ".*" ".*"
Setting permissions for user "openstack" in vhost "/"

Openstack #1-3 Chrony 설정

Openstack #1 개요
Openstack #1-1 선행작업
Openstack #1-2 MariaDB(MySQL) 설치
Openstack #1-3 Chrony 설정
Openstack #1-4 MessageQueue(RabbitMQ)
Openstack #1-5 Memcached
Openstack #1-6 Etcd

Chrony는 NTP(Network Time Protocol) 을 구현한 server/client 로 기존 리눅스의 ntpd 를 대체로 CentOS 8부터는 NTP가 아니라 chrony가 기본으로 동작한다.

노드간 시간을 동일하게 맞추기 위한 설정이다. 1 hadoop eco system 등 여러 노드를 하나로 묶어 클러스터링 하는 경우 시간이 다를 경우 예기치 못한 문제가 발생할 수있다. 2특히 Apache kudu 의 경우는 ntp 설정이 돼있지 않으면 아예 동작하지 않는다. 기존 NTP서버를 이용하면 된다.

패키지는 모든 노드에 설치 해야 하되 서버가 될 서버와 클라이언트의 설정을 다르게 해줘야 한다.

패키지 설치

[root@openstack1:~]#  yum -y install chrony
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.kakao.com
Package chrony-3.4-1.el7.x86_64 already installed and latest version
Nothing to do

설정

서버와 클라이언트 모두 같은 패키지지만 설정 내용으로 구분된다.

서버 설정

[root@openstack1:~]#  vi /etc/chrony.conf

 # 모두 지우고 아래 내용을 붙여넣기 한다.
 # NTP 서버 주소를 확인한다.
server 192.168.4.254 iburst
server 3.centos.pool.ntp.org iburst

driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync

 # NTP서버가 될 노드는 반드시 allow 로 바꿔줘야 한다.
allow 192.168.0.0/16

logdir /var/log/chrony

클라이언트 설정

[root@openstack1:~]#  vi /etc/chrony.conf

 # 모두 지우고 아래 내용을 붙여넣기 한다.
 # NTP 서버 주소를 확인한다. chrony 서버 주소를 추가한다.
server openstack1 iburst
server 3.centos.pool.ntp.org iburst

driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync

 # NTP서버가 아니므로 주석처리 한다.
#allow 192.168.0.0/16

logdir /var/log/chrony

서비스 등록 및 구동

모든 노드에서 수행한다. 서버 시작 후 클라이언트 노드도 서비스를 시작한다.

[root@openstack1:~]#  service chronyd restart
Redirecting to /bin/systemctl restart chronyd.service
[root@openstack1:~]#chkconfig chronyd on
알림: 'systemctl enable chronyd.service'에 요청을 전송하고 있습니다.

구동 확인

 # 서버에서 수행한 결과
[root@openstack1:~]#  chronyc sources
210 Number of sources = 2
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* 192.168.4.254                 4   6    37    32  +7332ns[  -24ms] +/-   13ms
^? ec2-13-209-84-50.ap-nort>     0   7     0     -     +0ns[   +0ns] +/-    0ns

 # 클라이언트에서 수행한 결과
 # chrony 서버 IP가 출력 되는 것을 확인할 수 있다. 
 # ^* 호스트(IP)가 출력되면 된다.
[root@openstack2:~]#chronyc sources
210 Number of sources = 2
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^+ openstack1                    5   6   377    31    -37ms[  -33ms] +/-   55ms
^* 192.168.4.254                 4   6   377    50    -59ms[  -54ms] +/-   12ms