FPs

監控所有NameServer的SOA 記錄的序列號

使用Bind DLZ或者其他方式搭建了權威DNS,爲了高可用的話,肯定會有多組NameServer。 除了常規的監控外,還需要監控所有SLave 的NS 的SOA 序列號(Serial Number)是否和Master 一致,如果落後的話需要報警,有時候也有可能Master NS生成的記錄有錯,無法同步到Slave NS,也有可能是權限方面出錯等等,總之,這個監控非常有必要。

關於SOA 記錄的介紹可以參考:DNS SOA 记录的结构

@   IN  SOA     nameserver.place.dom.  postmaster.place.dom. (
                           1            ; serial number
                           3600         ; refresh   [1h]
                           600          ; retry     [10m]
                           86400        ; expire    [1d]
                           3600 )       ; min TTL   [1h]

使用dig 命令向特定NameServer 查詢特定域名的SOA 記錄:

> dig @NS_IP domain soa
>>dig @114.114.114.114 google.com soa

> dig @NS_IP domain soa +short #返回簡短的結果
>> dig @8.8.8.8 google soa +short

dns_soa_serial_number

一個OpenFalcon 的監控腳本:

#!/usr/bin/env bash
#author: fangpsh
#check whether NSs have same SOA serial
DATE=`date +%s`
HOST=`cat /etc/hostname`
#your domain
DOMAIN=""
#master name server
MASTER_NS=""
#slave NSs, a space separated list
SLAVE_NS_SET=""

q_serial() {
dig @${1} ${DOMAIN}  soa +short |cut -d ' ' -f 3
}

dns_s=`q_serial '${MASTER_NS}'`


echo -n "[{\"metric\": \"NS_Serial\", \"endpoint\": \"${HOST}\", \"tags\": \"host=${MASTER_NS}\", "
echo -n "\"value\": 0,"
echo -n " \"timestamp\": $DATE, \"counterType\": \"GAUGE\", \"step\": 60}"

for ns in ${SLAVE_NS_SET};do
    ns_s=`q_serial ${ns}`
    echo -n ",{\"metric\": \"NS_Serial\", \"endpoint\": \"${HOST}\", \"tags\": \"host=${ns}\", "

    if [ ${dns_s} == ${ns_s} ];then
        echo -n "\"value\": 0," #ok
    else
        echo -n "\"value\": 1," #error
    fi

    echo -n  " \"timestamp\": $DATE, \"counterType\": \"GAUGE\", \"step\": 60}"
done

echo -n "]"
2016-07-31 dns monitoring