반응형

 

작성일: 2024년 3월 25일

 

 

Bind9 Zone 파일의 Serial 값을 변경하는 Python Script

지금 급하게 DNS 서버(Bind9)의 Serial 값을 자동 갱신하도록하는 기능이 필요해서 작성해본 Python script이다.

동작 방식을 간단하게 설명하면 이렇다.

 

만약 오늘이 "2024년 03월 25일"이라고 가정하면,

  • 기존 Zone 파일의 Serial 값이 2024032501 이면, 2024032502 으로 끝자리면 1 증분시켜줌.
  • 기존 Zone 파일의 Serial 값이 2024032401 이면, 2024032500 으로 날짜를 오늘로 변경하고 끝 2자리는 00으로 설정

아래 Script를 복사해서 바로 실행하면 잘 동작할 것이다.

$ cat update_zone_serial.py


#!/usr/bin/python3

from datetime import datetime
import shutil


##
## File 내용 중에서 일부 문자열을 찾아서 바꿈.
##
def replace_in_file(file_path, old_str, new_str):
    # 파일 읽어들이기
    fr = open(file_path, 'r')
    lines = fr.readlines()
    fr.close()

    # old_str -> new_str 치환
    fw = open(file_path, 'w')
    for line in lines:
        fw.write(line.replace(old_str, new_str))
    fw.close()


##
## Zone file에 있는 Serial 값을 찾기
## NOTE: 주의할 점
##   Zone file 안에 Serial 값이 아래 포맷으로 저장되어 있어야 한다.
##
##   @ IN SOA mydomain.kr root.mydomain.kr (
##     2024032502    ; Serial
##     3600          ; Refresh
##     900           ; Update retry
##     604800        ; Expiry
##     600           ; TTL for cache name server (for 30 minutes)
##   )
##
def search_old_serial(file_path):
    fp = open(file_path)
    lines = fp.readlines()
    fp.close()

    for line in lines:
        if line.find('Serial') > 0:
            words = line.split(';')
            old_serial = words[0].strip()
    return old_serial



zone_file = '/var/cache/bind/mydomain.kr.zone'

old_serial = search_old_serial(zone_file)
curr_date = datetime.today().strftime("%Y%m%d")
bool_today = old_serial.startswith(curr_date)
if bool_today is True:
    ## Serial 값이 오늘 Update된 경우
    int_old_serial = int(old_serial)
    new_serial = str(int_old_serial + 1)
else:
    ## Serial 값이 며칠 전에 Update된 경우
    new_serial = f"{curr_date}00"

## copy file for backup
bkup_file = f"{zone_file}_{new_serial}"
shutil.copy(zone_file, bkup_file)

replace_in_file(zone_file, old_serial, new_serial)


## 실행 테스트
$ ./update_zone_serial.py

 

 

Bind9 Zone 파일의 Serial 값을 변경하는 Bash Script

만약, Python 인터프리터가 없는 경우라면 아래와 같이 bash 스크립트를 작성해서 실행해도 동일한 결과를 얻을 수 있다.

$ cat my-dns-zone-serial-increase.sh


#!/usr/bin/env bash

set -euo pipefail

: ${1?"Usage: $0 <zone file>"}

IFILE=$1

if [ ! -w "${IFILE}" ]; then
    echo "Error cannot write to ${IFILE}"
    exit
fi

if [ ! -w $(pwd) ]; then
    echo "Error, sed needs write permission for temp file, add w to current directory"
    exit
fi

PREV_SERIAL=$(grep -i Serial "${IFILE}" | awk '{print $1}')
echo "PREV_SERIAL: ${PREV_SERIAL}"
TODAY=$(date +%Y%m%d00)

if [ "$PREV_SERIAL" -ge "${TODAY}" ]; then
    NEW_SERIAL=$((PREV_SERIAL+1))
else
    NEW_SERIAL=${TODAY}
fi

echo "NEW_SERIAL: ${NEW_SERIAL}"

sed -i "s/${PREV_SERIAL}/${NEW_SERIAL}/" "${IFILE}"

printf "Zone: %s [%d -> %d]\n" "${IFILE}" "${PREV_SERIAL}" "${NEW_SERIAL}"


## 실행 테스트
$ ./my-dns-zone-serial-increase.sh  /var/cache/bind/mydomain.kr.zone

 

 

 

 

 

 

 


 

반응형

 

 


 

테스트한 날짜: 2024년 2월 15일
테스트 환경:  Ubuntu 22.04  /  Ubuntu 20.04  /  Ubuntu 18.04  (이 3개 버전 모두 잘 동작했다)

 


BIND 설치에 관해 참고하면 좋은 문서:
  https://www.hiroom2.com/2018/05/06/ubuntu-1804-bind-en/
BIND(DNS) 설정, 운영에 관해 참고하면 좋은 문서:   <-- 진짜 잘 만들어진 문서, 꼭 읽어볼 것 !!
  https://joungkyun.gitbook.io/annyung-3-user-guide/chapter5
    - BIND 기본 설정
    - 새 도메인 설정
    - Slave DNS 구성
    - Inverse domain 설정
    - DNSSEC 설정
    - GeoDNS 설정
    - Domain 위임
    - IDN

 

 

Install BIND pkg

 

##
## root 계정으로 아래 명령을 수행
##

$  apt  update

$  apt  install -y bind9

 

 

 

Configuration

 

파일명: /etc/bind/named.conf.options

options {
  directory "/var/cache/bind";
}

   참고: 원래 기본 설정이 위와 같기 때문에 수정할 내용은 없다.

 

파일명: /etc/bind/named.conf.local

zone "andrew.space" IN {
  type master;
  file "andrew.space.zone";
};

 

파일명: /var/cache/bind/andrew.space.zone

$TTL 86400

@ IN SOA andrew.space root.andrew.space (
  2021090500
  3600
  900
  604800
  86400
)

              A  10.10.9.11
              
@          IN NS ns1
           IN NS ns2

ns1        IN A  10.10.2.3
ns1        IN A  10.10.9.3

www        IN A  10.10.2.3
andrew     IN A  10.10.9.71

 

 

 

Validation (설정 값 유효성 확인)

 

$  named-checkzone  andrew.space  /var/cache/bind/andrew.space.zone
zone andrew.space/IN: loaded serial 2021090500
OK

 

 

 

Run BIND

 

$  sudo systemctl enable bind9
$  sudo systemctl restart bind9

 

 

Test

 

$  nslookup

##
## 방금 위에서 구성한 DNS 서버의 주소
##
> server 10.10.9.11
Default server: 10.10.9.11
Address: 10.10.9.11#53

##
## name zone db에 추가했던 domain name이 잘 resolution 되는 확인
##
> www.andrew.space
Server:		10.10.9.11
Address:	10.10.9.11#53

Name: www.andrew.space
Address: 10.10.2.3
>

 

 

'Ubuntu' 카테고리의 다른 글

추가 장착한 Disk Mount  (0) 2021.12.28
Root 계정의 SSH 로그인 허용  (0) 2021.12.28
openssl command example  (0) 2021.11.04
.bashrc 또는 .bash_profile 설정  (0) 2021.07.22
.vimrc 작성  (0) 2021.07.22

+ Recent posts