본문 바로가기

네임서버

BIND DNS 서버의 recursive client 관리 및 장애 대응 방법

반응형

BIND DNS 서버의 recursive client 관리 및 장애 대응 방법

BIND DNS recursive clients 모니터링 및 장애 대응

BIND(named) DNS 서버에서 recursive clients는 현재 재귀 질의(recursive query) 를 처리 중인 클라이언트 수를 의미합니다. 이 값이 과도하게 증가하면 서버의 리소스를 소모하여 외부 도메인 질의 실패 또는 DNS 응답 지연 현상이 발생할 수 있습니다.

1. Recursive Clients 확인

현재 DNS 서버의 재귀 클라이언트 상태를 확인합니다.

rndc status | grep recursive
$ rndc status | grep recursive
recursive clients: 0/900/1000
  • 0 현재 활성(Active) 재귀 클라이언트 수
  • 900 최근 사용(Used) 최대값
  • 1000 최대 허용치 (recursive-clients 설정값)

recursive clients 수가 급격히 증가(예: 200 이상 지속 증가)하면 DNS 서버가 재귀 요청을 감당하지 못해 외부 통신 불가 또는 응답 지연이 발생할 수 있습니다.

2. 재귀 질의 상세 로그 확인

현재 어떤 도메인에 대한 재귀 요청이 누적되고 있는지 확인합니다.

rndc recursing
  • /var/named/data/named.recursing 파일을 생성 또는 갱신합니다.

로그 파일 확인(recursing queries 로그 확인)

vim /var/named/data/named.recursing
;
; Recursing Queries
;
;
; Active fetch domains [view: _default]
;
;
; Active fetch domains [view: _bind]
;
; Dump complete

여기서 "Active fetch domains" 아래에 과도한 특정 도메인이 반복된다면 해당 도메인이 재귀 폭주(recursive flood) 를 유발하고 있을 가능성이 높습니다.

3. 원인 분석 및 대응

가능한 원인

  • 외부에서 재귀 요청 남용(Recursive Abuse) 발생
  • 내부 클라이언트의 잘못된 DNS 캐시 질의 반복
  • 봇넷 또는 DDoS 공격에 의한 재귀 Flooding

4. 대응 방안 - blackhole에 IP 등록

문제가 되는 IP를 blackhole 옵션에 등록하여 해당 IP의 질의를 무시하도록 설정합니다.

설정 파일 수정

vim /etc/named.conf
options {
        blackhole {131.123.123.19;};
};

blackhole에 등록된 IP의 요청은 DNS 서버가 아예 응답하지 않습니다. 공격 또는 비정상 질의가 감지된 클라이언트를 차단하는 효과적 방법입니다.

5. 설정 반영

변경된 설정을 BIND에 적용합니다.

rndc relocad
728x90

BIND Recursive Clients 자동 모니터링 설정

주기적으로 recursive client 수를 체크하고 임계값 초과 시 알림을 주는 간단한 스크립트를 구성할 수 있습니다.

sudo vim ~/scripts/check_recursive_clients.sh
#!/bin/bash
# check_recursive_clients.sh
# BIND DNS Recursive Client 수 모니터링 스크립트

# 설정값
THRESHOLD=200             # 경고 임계값
MAIL_TO="admin@example.com"  # 알림 받을 이메일
DATE=$(date '+%Y-%m-%d %H:%M:%S')

# 현재 recursive clients 수 확인
CURRENT=$(rndc status | grep "recursive clients" | awk -F'[:/]' '{print $2}' | xargs)

# 로그 경로 설정
LOGFILE="/var/log/recursive_check.log"

# 로그 출력
echo "[$DATE] recursive clients = $CURRENT" >> $LOGFILE

# 임계치 초과 시 경고
if [ "$CURRENT" -ge "$THRESHOLD" ]; then
    echo "[$DATE] ⚠ Warning: recursive clients = $CURRENT (threshold: $THRESHOLD)" >> $LOGFILE
    echo "Warning: recursive clients = $CURRENT (threshold: $THRESHOLD)" \
        | mail -s "[DNS Alert] Recursive client overload" $MAIL_TO
fi
더보기

---

#!/bin/bash
# recursive client 모니터링 스크립트

THRESHOLD=200
CURRENT=$(rndc status | grep "recursive clients" | awk -F'[:/]' '{print $2}')

if [ "$CURRENT" -ge "$THRESHOLD" ]; then
    echo "⚠ Warning: recursive clients = $CURRENT (threshold: $THRESHOLD)" | mail -s "DNS Load Alert" admin@example.com
fi

---

실행 권한 부여

sudo chmod +x ~/scripts/check_recursive_clients.sh

수동 테스트

bash ~/scripts/check_recursive_clients.sh

Cron 등록

sudo crontab -e
# 매 5분마다 recursive clients 상태 점검
*/5 * * * * ~/scripts/check_recursive_clients.sh >/dev/null 2>&1

로그 확인

tail -f /var/log/recursive_check.log
[2025-10-14 23:10:02] recursive clients = 87
[2025-10-14 23:15:02] recursive clients = 243
[2025-10-14 23:15:02] ⚠ Warning: recursive clients = 243 (threshold: 200)

 

728x90
반응형