OS/Linux

DNS - bind

엔지니어1 2024. 4. 26. 15:30

이전 게시글에서 windwos server에서 DNS 서버를 구축해 보았습니다.

2024.04.25 - [OS/Windows] - DNS 서버 구성

 

DNS 서버 구성

windows server 2022에서 dns 서버를 구성해보겠습니다.dns에 대한 설명은 이전 게시글을 참고해주세요!2024.04.25 - [Network] - DNS DNSDNS란?DNS(Domain Name System)는 인터넷에서 도메인 이름을 IP 주소로 변환하고

engineer1.tistory.com

 

이번 게시글은 bind를 사용하여 Linux에 DNS 서버를 구축해 보겠습니다.

BIND(Berkeley Internet Name Domain)는 DNS 서버를 구성하기 위해 사용하는 상용화된 소프트웨어입니다.

BIND의 주요 기능과 특징으로는 DSN의 쿼리 처리, 캐싱, 도메인 관리, 보안 등 여러 가지 기능이 있고, Linux에서 주로 사용하지만, 다양한 플랫폼에서도 동작할 수 있습니다.

 

BIND를 사용하여 windows server에서 했던 것처럼 정방향 조회 영역과 역방향 조회영역, 레코드 등록 방법에 대해 알아보겠습니다.

 

DNS서버 구성환경은 centos7에서 진행하겠습니다. 구성 환경에 따라 dns의 udp와 tcp의 53번 포트를 열어주시면 됩니다.

일반적으로 udp를 사용하지만 로드가 많은 경우(메시지의 크기가 크거나 마스터와 슬레이브 간의 동기화 작용(zone-transfer) 시) tcp를 사용합니다.

 

1. BIND 설치

bind를 패키지로 설치합니다.

yum install -y bind*

 

bind의 dns서비스는 named로 동작합니다. -v옵션으로 버전을 확인하겠습니다.

# named -v
BIND 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.15 (Extended Support Version) <id:>

 

2. DNS 설정

2-1) named.conf 설정

vi /etc/named.conf

 

named.conf파일은 네임서버의 접근 IP와 포트를 지정할 수 있고, DNS의 zone파일 위치, 캐시정보, 통계파일 등의 경로를 지정하거나 DNS의 구성을 지정하는 파일입니다.

DNS의 동작 방식을 이해하기 위해 테스트를 진행하는 단계이므로 바꿀 설정을 최소화하여 진행하겠습니다.

options {
        listen-on port 53 { 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;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.root.key";

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

ipv4와 ipv6의 접근가능 ip를 모든 ip라고 지정하고, 테스트를 위해 dns에 쿼리를 허용하도록 합니다.

recursion 옵션은 AUTHORITATIVE DNS 서버에서 다른 DNS 서버들에게 요청된 도메인에 대한 정확한 정보를 제공하기 위한 옵션입니다.

DNS서버를 구현하고자 하는 목적에 따라 해당 옵션을 yes 또는 no로 지정해 주시면 되고, 테스트를 하기 위해서는 정확한 정보를 받아야 하기 때문에 yes로 지정하여 진행하겠습니다.

DNSSEC은 본적인 DNS 프로토콜은 데이터 전송 시 보안을 제공하지 않기 때문에 DNS 쿼리 및 응답이 조작될 가능성이 있어 보안적인 측면을 강화하기 위해 사용됩니다.

DNSSEC을 사용하기 위해서는 도메인 등록 서비스 제공업체(Registrar)가 DNSSEC을 지원해야 하고, 도메인 소유자 또한 DNSSEC 서명을 생성하고 관리할 수 있어야 합니다.

 

이제 zone파일을 설정하겠습니다.

2-2) named.rfc1912.zones 설정

vi /etc/named.rfc1912.zones

기본적으로 로컬 호스트 도메인, ipv6에 대한 루프백, 로컬 호스트의 루프백 인버스 도메인, 제로 호스트에 대한 루프백 설정등이 있습니다.

 

DNS서버에 추가할 zone을 해당 설정 아랫줄에 추가해 줍니다.

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

zone "249.xx.115.in-addr.arpa" IN {
        type master;
        file "domain.com.rev";
        allow-update { none; };
};

file의 기본 디렉터리는 /var/named입니다. 지정된 위치에 file의 이름으로 zone의 설정을 불러오도록 설정합니다.

type의 설정으로 하나의 네임 서버에 단일(master 1개) 또는 master, slave DNS를 지정할 수 있습니다.

 

slave와 master dns는 아래와 같이 설정합니다.

zone "domain.com" IN {
        type master;
        file "domain.com.zone";
        allow-transfer { 10.0.0.0/8; } # DNS의 존 파일을 전송(동기화) 할 때
        allow-update { 10.0.0.0/8; }; # slave 서버 ip, DNS의 존 파일을 업데이트 할 때
};

zone "domain.com" IN {
        type slave;
        file "domain.com.zone";
        masters { 115.x.249.x; } # master 서버의 ip
};

transfer과 update는 DNS의 보안을 위해 사용에 주의하셔야 합니다.

 

2-3) .zone, .rev 파일 생성

BIND의 named는 .zone파일과 .rev파일의 group 권한이 named가 되어야 합니다.

그렇기 때문에 기본적인 설정 틀과 권한 이슈를 최소화하기 위해 cp명령어로 다른 파일들을 복사하는 것이 좋습니다.

cd /var/named
cp -ar named.localhost domain.store.zone
cp -ar named.loopback domain.store.rev

 

2-4) record 생성

zone은 정방향, rev는 역방향을 지정하는 파일입니다.

먼저 정방향 조회 영역을 설정하겠습니다.

vi /var/named/domain.com.zone

$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       127.0.0.1
        AAAA    ::2
필드 설명
$TTL 1D
  • $TTL은 DNS 레코드의 TTL(Time to Live)을 설정합니다.
  • TTL은 DNS 레코드가 캐시에서 유효한 시간을 나타냅니다. 이 값은 초 단위로 지정됩니다.
  • 예제에서는 TTL을 1일(1D)로 설정했으므로, DNS 레코드가 캐시에서 1일 동안 유효합니다.
@
  • @는 도메인의 루트를 나타냅니다.
IN
  • IN은 레코드의 클래스를 나타냅니다. 여기서는 인터넷(IN) 클래스를 사용합니다.
SOA
  • SOA는 Start of Authority의 약자로서, DNS 존 파일의 시작을 나타냅니다.
@
  • 이 부분에도 ORIGIN(@)이 오게 됩니다. 이곳은 일반적으로 1차 네임서버를 정의하며 ns1.domain.com. 과 같이 사용할 네임서버의 도메인을 정의 합니다.
rname.unvalid.
  • 관리자 메일 주소를 설정 합니다. 일반적으로 root.domain.com. 과 같이 도메인명 앞에 root. 를 입력 합니다.
0;serial
  • zone 파일의 버전을 의미합니다.
1D;refresh
  • Master & Slave 구성시 Slave 서버가 주기적으로 zone 파일을 체크하는 시간을 의미합니다.
1H;retry
  • Master & Slave 구성시 refresh에서 zone파일 체크를 실패할 경우 재시도할 시간을 의미합니다.
1W;expire
  • Master & Slave 구성시 Master 서버에서 가져온 Slave 서버의 Zone 파일 내용의 신용을 체크하는 시간입니다.
3H;minimum
  • TTL값입니다.

 

이후 DNS 레코드에 대한 설정으로 이어집니다.

[FQDN] tab [IN] tab [record] tab [priority] tab [domain or ip]

# 서브도메인이 www인 A레코드를 지정된 주소로 설정하는 예시입니다.
www	IN	A	115.x.249.x

FQDN(Fully Qualified Domain Name) : subdomain을 의미합니다. (호스트명 www + 도메인명 domain.com)

 

레코드 설명
NS Name Server를 지정합니다.
A FQDN에 작성한 도메인의 IP를 지정합니다.
AAAA FQDN에 작성한 도메인의 IPv6를 지정합니다.
CNAME 좌측에 작성한 도메인의 별칭을 지정합니다. 만약 좌측에 *을 적고 www.domain.com.을 작성하면 모든 서브도메인을 www.domain.com으로 이동 됩니다.
MX 메일 서버를 지정합니다.
TXT 도메인에 대한 텍스트 정보를 지정합니다.
PTR 역방향 영역 존에 사용되는 레코드입니다. IP주소로 도메인을 찾습니다.

 

아래는 예시 zone 파일입니다.

$TTL 10M
@       IN SOA  ns.fu-bao.store. admin.fu-bao.store. (
                                        0       ; serial
                                        10M     ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        IN NS   ns.fu-bao.store.

ns      IN A    115.x.249.y
www     IN A    115.x.249.y
eee     IN A    115.x.249.y
fff     IN A    115.x.249.y

 

다음은 rev 파일입니다.

$TTL 1D
@       IN SOA  ns.domain.com. admin.domain.com. (
                                        0       ; serial
                                        10M     ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        IN NS   ns.domain.com.

y       IN PTR  ns.domain.com.
y       IN PTR  www.domain.com.
y       IN PTR  eee.domain.com.
y       IN PTR  fff.domain.com.

 

저는 vhost를 사용하여 직관적으로 알아보기 위해 위와 같이 설정하였습니다. vhost를 하는 방법은

2024.04.15 - [OS/Linux] - apache vhost 설정하기

 

apache vhost 설정하기

vhost는 virtual host로 웹 서버의 다른 디렉터리로 요청을 라우팅 하여하나의 IP 주소에서 여러 개의 도메인을 처리하는 데 사용합니다. 사용할 수 있는 도메인이 하나이므로 서브도메인을 www, eee로

engineer1.tistory.com

에서 확인 가능합니다.

 

2-5) 서비스 재시작

변경 설정을 저장하고 적용합니다.

systemctl restart named

 

설정파일을 테스트하는 방법은

# 출력되는것이 없어야 합니다.
named-checkconf /etc/named.rfc1912.zones
named-checkconf /etc/named.conf

# OK가 출력됩니다.
named-checkzone domain.com /var/named/domain.com.zone

 

이후 nslookup명령어로 DNS 적용을 확인합니다.

nslookup www.domain.com 115.x.249.x

도메인 뒤의 ip는 해당 ip의 dns 서버에서 바로 찾겠다는 의미입니다.

 

이런 없애고 싶으시면 resolv.conf파일에 nameserver 115.x.249.x를 제일 아랫줄에 추가하면 됩니다.

vi /etc/resolv.conf

# 아랫줄 추가
nameserver 115.x.249.x

 

nslookup www.domain.com

 

 

이상 BIND의 named를 이용하여 DNS서버를 구현하는 방법을 알아봤습니다.

감사합니다.