docker를 이용한 openVPN 설정

컨테이너가 아닌 네이티브 설치는 다음 포스트를 참조
openVPN 서버구축 #1. 개요
openVPN 서버구축 #2. 서버 설치 및 설정

docker-compose.yaml 생성

version: '2'
services:
  openvpn:
    cap_add:
     - NET_ADMIN
    image: kylemanna/openvpn
    container_name: openvpn
    ports:
     - "1194:1194/udp" 
    restart: always
    volumes:
     - ./openvpn-data/conf:/etc/openvpn #.openvpn-data/conf 디렉토리를 생성해야 한다.

설정파일 및 인증서 초기화

docker-compose run --rm openvpn ovpn_genconfig -u udp://VPN.YOUR_HOST.NAME

# 아래는 수행 결과
reating network "vpn_default" with the default driver
Pulling openvpn (kylemanna/openvpn:)...
....중략....
Creating vpn_openvpn_run ... done
Processing PUSH Config: 'block-outside-dns'
Processing Route Config: '192.168.254.0/24'
Processing PUSH Config: 'dhcp-option DNS 8.8.8.8'
Processing PUSH Config: 'dhcp-option DNS 8.8.4.4'
Processing PUSH Config: 'comp-lzo no'
Successfully generated config
Cleaning up before Exit ...
docker-compose run --rm openvpn ovpn_initpki

# 아래는 수행 결과
Creating vpn_openvpn_run ... done

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/pki

Using SSL: openssl OpenSSL 1.1.1g  21 Apr 2020

Enter New CA Key Passphrase: CA_KEY의_Passphrase
Re-Enter New CA Key Passphrase: CA_KEY의_Passphrase
Generating RSA private key, 2048 bit long modulus (2 primes)
................................+++++
......................................................+++++
e is 65537 (0x010001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:vpn.haedongg.net

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/pki/ca.crt

Using SSL: openssl OpenSSL 1.1.1g  21 Apr 2020
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
..............................................................+...........................................+..........................................................
...중략...
........................................................+..+....................+................................................................+....+..++*++*++*++*

DH parameters of size 2048 created at /etc/openvpn/pki/dh.pem

Using SSL: openssl OpenSSL 1.1.1g  21 Apr 2020
Generating a RSA private key
.............+++++
............................+++++
writing new private key to '/etc/openvpn/pki/easy-rsa-74.akeLei/tmp.JBdIKe'
-----
Using configuration from /etc/openvpn/pki/easy-rsa-74.akeLei/tmp.BfJlok
Enter pass phrase for /etc/openvpn/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'vpn.haedongg.net'
Certificate is to be certified until Jul 30 00:51:51 2025 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Using SSL: openssl OpenSSL 1.1.1g  21 Apr 2020
Using configuration from /etc/openvpn/pki/easy-rsa-149.FPcifA/tmp.cjaMHC
Enter pass phrase for /etc/openvpn/pki/private/ca.key: 위_11_12_라인에서_입력했던_Passphrase

An updated CRL has been created.
CRL file: /etc/openvpn/pki/crl.pem

디렉토리 권한 변경

sudo chown -R $(whoami): ./openvpn-data

서버 프로세스 실행

docker-compose up -d openvpn

클라이언트 사용자 생성 및 인증서 생성

# 비밀번호화 함께 생성
docker-compose run --rm openvpn easyrsa build-client-full 사용자_이름

# 비밀번호 없이 생성
docker-compose run --rm openvpn easyrsa build-client-full 사용자_이름 nopass

# 인증서 파일 출력, 이 파일을 클라이언트 사용자에게 전달하면 된다.
docker-compose run --rm openvpn ovpn_getclient 사용자_이름 > 사용자_이름.ovpn

클라이언트 사용자 제거

# Keep the corresponding crt, key and req files.
docker-compose run --rm openvpn ovpn_revokeclient $CLIENTNAME

# Remove the corresponding crt, key and req files.
docker-compose run --rm openvpn ovpn_revokeclient $CLIENTNAME remove

HAproxy 를 이용한 로드밸런싱 고가용성 구성

개요

HAProxy는 여러 서버에 대해 요청을 확산시키는 TCP 및 HTTP 기반 애플리케이션들을 위해 고가용성 로드밸런서와 리버스 프록시를 제공하는 자유-오픈 소스 소프트웨어이다. C 프로그래밍 언어로 개발되어 있으며 빠르고 효율적인 것으로 유명하다.
공식 사이트 참조

설정에 따라 Server #A와 #B로 번갈아가며 연결해준다.

haproxy를 통해 부하를 분산하는 등의 용도로 서비스 효율을 높일 수 있다.

설치

여기에서 다운 받아도 되며, yum epel-release에 포함되어 있으므로 epel-release 리포지터리 추가 후 yum 이나 dnf 명령 등을 통해 설치할 수 있다.

sudo dnf install -y haproxy
마지막 메타자료 만료확인 7:58:42 이전인: 2022년 07월 28일 (목) 오전 12시 23분 23 초.
종속성이 해결되었습니다.
================================================================================
 꾸러미          구조           버전                    레포지터리         크기
================================================================================
설치 중:
 haproxy         x86_64         1.8.27-4.el8            appstream         1.4 M

연결 요약
================================================================================
설치  1 꾸러미

총계 내려받기 크기: 1.4 M
설치된 크기 : 4.2 M
...중략...
설치되었습니다:
  haproxy-1.8.27-4.el8.x86_64                                                                                                                   
완료되었습니다!

서비스가 구동 될 모든 서버에 설치해준다.
자동으로 서비스가 구동될 수있도록 서비스를 등록 해준다.

sudo systemctl enable haproxy.service
 또는
sudo service haproxy start

설정

기본적으로 /etc/haproxy/haproxy.cfg 가 존재한다.

global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

#---------------------------------------------------------------------
# status web 설정
# haproxy 서비스 상태, 백엔드 서비스의 상태 등을 웹을 통해 확인할 수 있다.
# 필수는 아니다.
#---------------------------------------------------------------------
listen hastats
    mode http
    bind *:8088
    stats enable
    stats show-legends
    stats uri /hastat
# 서버 주소가 192.168.0.1이라면  http://192.168.0.1/hastat으로 접속한다.
    stats auth admin:admin
#  hastats 웹에 접속 시 인증으로 제한하려면 계정과 패스워드를 지정한다.

#---------------------------------------------------------------------
# 프론트 엔드 설정
# 프론트 엔드에서 설정한 포트로 연결이 들어올 경우 백엔드로 보낸다
#---------------------------------------------------------------------
# 외부에서 haproxy를 통해 연결을 시도할 때 사용하는 포트
frontend  kubeproxy
    bind *:16443
    default_backend kubeproxy
    mode tcp

#---------------------------------------------------------------------
# 백엔드 설정
# 프론트엔드에서  defaultbackend 타겟으로 설정 된 백엔드 정보
#---------------------------------------------------------------------
backend kubeproxy
    balance     roundrobin
# Balance Option
# Roundrobin : 순차적으로 분배
# static-rr : 서버에 부여된 가중치에 따라서 분배
# leastconn : 접속수가 가장 적은 서버로 분배
# source : 운영중인 서버의 가중치를 나눠서 접속자 IP 해싱(hashing)해서 분배
# uri : 접속하는 URI를 해싱해서 운영중인 서버의 가중치를 나눠서 분배 (URI의 길이 또는 depth로 해싱)
# url_param : HTTP GET 요청에 대해서 특정 패턴이 있는지 여부 확인 후 조건에 맞는 서버로 분배 (조건 없는 경우 round_robin으로 처리)
# hdr : HTTP 헤더에서 hdr(<name>)으로 지정된 조건이 있는 경우에 대해서만 분배 (조건없는 경우 round robin 으로 처리)
# rdp-cookie : TCP 요청에 대한 RDP 쿠키에 따른 분배
    mode tcp
    option tcp-check
    option tcplog
# 외부에서 16443 포트로 연결을 시도하면 아래의 서버에 순차적으로 연결해준다.
    server  storage01 192.168.0.1:6443 check
    server  storage02 192.168.0.2:6443 check
    server  storage03 192.168.0.3:6443 check

frontend web-console
        bind *:18080
        default_backend web-console
        mode tcp
backend web-console
        balance roundrobin
        mode    tcp
        option  tcp-check
        option  tcplog
        server  storage01       192.168.1.1:8080       check
        server  storage02       192.168.1.2:8080       check
        server  storage03       192.168.1.3:8080       check

백엔드로 동작할 모든 서버에 동일한 설정 파일을 넣어준다.

확인

haproxy 웹 서비스를 통해 정보 확인이 가능한다.

백엔드 서비스에 문제가있다면 붉은색으로 표시된다.

Keepalive를 이용한 linux 로드밸런싱 고가용성 구현

개요

keepalive 참조
keepalive는 Linux 시스템 혹은 Linux 기반 인프라에서의 로드밸런싱 및 고가용성을 위한 기능을 제공한다.
단순하게 설명하면, 두 개 이상의 Linux 시스템이 존재할 경우, virtual IP 를 생성하고 시스템의 상태에 따라 해당 virtual IP를 할당해주는 기능을 한다.

설치

# CentOS (Redhat 계열)
$ sudo isntall -y keepalived

# Ubuntu (Devian 계열)
$ sudo apt-get install -y keepalived

설정

/etc/keepalived/keepalived.conf 를 환경에 맞도록 수정한다.

Master server

! Configuration File for keepalived Master

global_defs {
   router_id rtr_0           # Master와 Backup 구분
}

vrrp_instance VI_0 {          # Master와 Backup과 구분
    state MASTER              # 또는 BACKUP
    interface eth0            # 노드에서 실제 사용할 인터페이스 지정
    virtual_router_id 10      # Master와 Backup 모두 같은 값으로 설정.
    priority 200              # 우선순위, 값이 높은 쪽인 Master가 된다.
    advert_int 1
    authentication {
        auth_type PASS        # Master와 Backup 모두 같은 값으로 설정.
        auth_pass P@ssW0rd    # Master와 Backup 모두 같은 값으로 설정.
    }

    virtual_ipaddress {
        192.168.0.100      # Master와 Backup 동일하게 설정한 VIP
    }
}
# #으로 시작하는 내용은 모두 삭제한다.

Backuo(slave)

! Configuration File for keepalived

global_defs {
   router_id rtr_1           
}

vrrp_instance VI_1 { 
    state BACKUP                    # MASTER가 아니므로 수정              
    interface eth0            
    virtual_router_id 10      
    priority 100                    # 낮은 우선순위를 위해 수정
    advert_int 1
    authentication {
        auth_type PASS        
        auth_pass P@ssW0rd        
    }

    virtual_ipaddress {
        192.168.0.100      
    }
}

구동

각각의 서버에서 서비스를 구동한다.

 sudo systemctl enable keepalived --now
# BACKUP 서버들에서도 동일하게 서비스를 구동해준다. 

확인

ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 4e:be:1a:32:52:04 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.41/24 brd 192.168.1.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 192.168.1.40/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::4cbe:1aff:fe32:5204/64 scope link
       valid_lft forever preferred_lft forever

192.168.1.40/32가 virtual IP. backup 노드로 설정된 서버에는 해당 ip가 보이지 않는다.

다른 시스템에서 가상아이피를 이용하여 ssh 접속, 혹은 ping 명령등을 수행해서 확인하면 된다.

DHCP 서버 구축

동적 호스트 구성 프로토콜(Dynamic Host Configuration Protocol, DHCP)은 호스트 IP 구성 관리를 단순화하는 IP 표준이다. 동적 호스트 구성 프로토콜 표준에서는 DHCP 서버를 사용하여 IP 주소 및 관련된 기타 구성 세부 정보를 네트워크의 DHCP 사용 클라이언트에게 동적으로 할당하는 방법을 제공한다.1 위키백과에서 발췌

학교 WiFi나, 집의 공유기, 당신이 사용하는 LTE 휴대폰 등이 인터넷을 하기 위해서는 모든 장비들은 IP를 가지고 있어야 한다. 하지만 학교건, 집이건 지하철 WiFi건 내 노트북 IP는 뭐지? 혹은 내 휴대폰 IP는 몇 번이지? 하고 고민 해본 기억은 없을 것이다. 이렇게 네트워크에 연결된 장비들에 자동으로 IP주소를 할당 해주는 것이 동적 호스트 설정 프로토콜, DHCP이고 이 역할을 하는 것이 DHCP 서버이다.
이름은 거창한 듯 하지만 설치, 설정 과정은 매우 쉽다.

설치

haedong@haedong:~:]$ sudo yum install -y dhcp*
...중략...
Package 12:dhcp-common-4.2.5-82.el7.centos.x86_64 already installed and latest version
Package 12:dhcp-libs-4.2.5-82.el7.centos.x86_64 already installed and latest version
Resolving Dependencies
--> Running transaction check
...중략...
====================================================================================================================================
 Package                      Arch                    Version                                   Repository                     Size
====================================================================================================================================
Installing:
 dhcp                         x86_64                  12:4.2.5-82.el7.centos                    local_centos                  515 k
 dhcp-devel                   x86_64                  12:4.2.5-82.el7.centos                    local_centos                  108 k
 dhcpd-pools                  x86_64                  3.1-1.el7                                 local-epel                     53 k
 dhcping                      x86_64                  1.2-13.el7                                local-epel                     18 k
Transaction Summary
====================================================================================================================================
Install  4 Packages
Total download size: 693 k
Installed size: 1.6 M
Downloading packages:
(1/4): dhcpd-pools-3.1-1.el7.x86_64.rpm                                                                      |  53 kB  00:00:00
...중략...
Installed:
  dhcp.x86_64 12:4.2.5-82.el7.centos         dhcp-devel.x86_64 12:4.2.5-82.el7.centos         dhcpd-pools.x86_64 0:3.1-1.el7
  dhcping.x86_64 0:1.2-13.el7
Complete!

설정
DHCP 서버 구성요소를 설치한 뒤 /etc/dhcp/dhcpd.conf 파일을 수정한다.

# 다음을 참고해서 수정 한다.
#subnet 사용할_IP_대역(netmask 범위에 따라 달라진다) netmask 사용할_netmask  {
#        range 동적으로_할당해_줄_IP_범위(클라이언트는_이_범위_안의_IP를_할당받는다);
#        option subnet-mask 클라이언트에서_설정하게_될_netmask ;
#        option routers 클라이언트에서_설정하게_될_gateway;
#        option broadcast-address 브로드캐스트_주소;
#        option domain-name-servers 첫_번째_DNS, 두_번째_DNS;
#        default-lease-time 기본_임대_시간(초);
#        max-lease-time 최대_임대_시간(초);
#}
subnet 192.168.0.0 netmask 255.255.255.0 {
        range 192.168.0.100 192.168.0.200;
        option subnet-mask 255.255.255.0;
        option routers 192.168.0.254;
        option broadcast-address 192.168.0.255;
        option domain-name-servers 8.8.8.8, 168.126.63.1;
        default-lease-time 7200;
        max-lease-time 36000;
}

구동

haedong@haedong:~:]$ sudo chkconfig dhcpd on
알림: 'systemctl enable dhcpd.service'에 요청을 전송하고 있습니다.
Created symlink from /etc/systemd/system/multi-user.target.wants/dhcpd.service to /usr/lib/systemd/system/dhcpd.service.
haedong@haedong:~:]$ sudo service dhcpd start
Redirecting to /bin/systemctl start dhcpd.service

iptables 를 이용한 NAT gateway 서버 설정

네트워크 주소 변환(영어: network address translation, 줄여서 NAT)은 컴퓨터 네트워킹에서 쓰이는 용어로서, IP 패킷의 TCP/UDP 포트 숫자와 소스 및 목적지의 IP 주소 등을 재기록하면서 라우터를 통해 네트워크 트래픽을 주고 받는 기술을 말한다. 패킷에 변화가 생기기 때문에 IP나 TCP/UDP의 체크섬(checksum)도 다시 계산되어 재기록해야 한다. NAT를 이용하는 이유는 대개 사설 네트워크에 속한 여러 개의 호스트가 하나의 공인 IP 주소를 사용하여 인터넷에 접속하기 위함이다. 많은 네트워크 관리자들이 NAT를 편리한 기법이라고 보고 널리 사용하고 있다. NAT가 호스트 간의 통신에 있어서 복잡성을 증가시킬 수 있으므로 네트워크 성능에 영향을 줄 수 있는 것은 당연하다. 1위키백과에서 발췌

NAT gateway라고 써서 이게 뭐야? 라고 생각할 수 있는데 특별한 것은 아니고 우리나라 사람들 각 가정에 1개 씩은 있는 공유기를 생각하면 된다.

포스트 이름에서 알 수 있듯이 iptables 가 설치되어있어야 한다.

다음 그림과 같은 경우를 예로 적용해보자.

갤러리-추가예정

설정
Gateway 역할을 할 서버를 설정하는 것이므로 ‘LINUX server’에 접속해서 작업을 수행하면 된다.

우선 packet forwarding을 사용할 수 있도록 설정을 변경한다.

haedong@haedong:~:]$ sudo vi /etc/sysctl.conf
# 아래 변수를 찾아서 값을 1로 변경하거나 파일의 끝에 아래 끝 라인을 추가한다.
# net.ipv4.ip_forward = 0
net.ipv4.ip_forward = 1

즉시 적용(재부팅 시 초기화 되는 값) 시. 특별히 메시지가 출력되지는 않는다.

haedong@haedong:~:]$ sudo echo "1" > /proc/sys/net/ipv4/ip_forward

Rule 추가.

# forward chain 초기화
haedong@haedong:~:]$ sudo iptables -F FORWARD

# forward 기본정책 drop으로 설정
haedong@haedong:~:]$ sudo iptables -P FORWARD DROP

# iptables -A FORWARD -o 내부_인터페이스 -j ACCEPT
haedong@haedong:~:]$ sudo iptables -AFORWARD -o eth1 -j ACCEPT

# iptables -A FORWARD -o 내부_인터페이스 -j ACCEPT
haedong@haedong:~:]$ sudo iptables -A FORWARD -o eth1 -j ACCEPT

# 외부 연결을 위한 Msquerade 지정. 즉, 내부 장비들이 외부로 나갈 때 사용하는 공인 인터페이스
# iptables -t nat -A POSTROUTING -o 외부_인터페이스 -j MASQUERADE
haedong@haedong:~:]$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

확인

NAT 대역의 PC나 서버 (그림의 L2 스위치 아래의 장비들)에서 10.11.12.13으로 연결을 시도해보거나 외부 대역(google 등의 사이트)에 접속을 시도해서 연결되면 정상 설정이 된 것이다.

정책 저장

root@haedong:~:]# iptables-save > /etc/rules
root@haedong:~:]# cat /etc/roules
# Generated by iptables-save v1.4.21 on Sun Aug 15 11:11:11 2021
*nat
:PREROUTING ACCEPT [2427731:347878517]
:INPUT ACCEPT [311986:31601222]
:OUTPUT ACCEPT [397981:25498698]
:POSTROUTING ACCEPT [10937:657389]
-A POSTROUTING -o eth1 -j MASQUERADE
COMMIT
# Completed on Sun Aug 15 11:11:11 2021
# Generated by iptables-save v1.4.21 on Sun Aug 18 11:11:11 2021
*filter
:INPUT ACCEPT [16876214:11177798996]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [8626880:21607026946]
-A FORWARD -o eth0 -j ACCEPT
-A FORWARD -o eth1 -j ACCEPT
COMMIT
# Completed on Sun Aug 15 11:11:11 2021

정책 재적용

root@haedong:~:]# /sbin/iptables-restore < /etc/rules

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번 포트를 허용하지 않으면 서비스 되지 않는다.