fangpsh's blog

监控所有NameServer的SOA 记录的序列号

Bind DLZ With MySQL 或者其他方式搭建了权威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 "]"