DNS是網際網路上,很重要但是少人懂的服務。一般使用者可能只知道租用ISP線路,DNS要設哪組IP。進階一點可能知道DNS可以設 8.8.8.8 或 8.8.4.4,看起來不明覺厲的IP。網管攻城獅懂的,如果也是這樣就慘了!

最近公司碰到一個狀況,DNS服務異常,有些主機查得到,有些查不到。後來分析的結果,DNS是上古時期的32位元Windows server,開機一段時間之後,系統資源莫明原因耗盡。卡在某些古老應用無法升級,不能從根本上解決問題,只好山不轉路轉,想辦法監控DNS查詢。

監控程式是在Python 3.10寫的,要安裝dnspython套件,詳見程式內註解!

#!.\venv\Scripts\python.exe
# -*- coding: utf-8 -*-
#
# for Python version 3.10
# Author:William Huang
# Date:2022/10/06
# program:checkdns.py
# pip install dnspython
# Ref.
# https://pypi.org/project/dnspython/
# https://dnspython.readthedocs.io/en/stable/resolver-class.html

import dns.resolver
from time import sleep, ctime

# DNS查詢的網域名稱
dm = ".yourname.com"
# DNS查詢的主機名稱,加上網域名稱,即 FQDN
dnsa = ['www', 'eip', 'cms', 'erp']
# DNS伺服器IPs
nsl = ['dns-ip1', 'dns-ip2', 'dns-ip3', 'dns-ip4']
# 產生Resolver物件
resl = dns.resolver.Resolver(configure=False)
# 持續執行不中止
while True:
    # 逐一對DNS伺服器,查詢FQDN
    for ns in nsl:
        # 一次設定一個,用於查詢的DNS伺服器
        resl.nameservers = [ns]
        # 逐一查詢主機名稱
        for nm in dnsa:
            # 將主機名稱和網域名稱合併成FQDN
            tmp = nm + dm
            # 錯誤處理
            try:
                # 查FQDN的A記錄
                result = resl.resolve(tmp, 'A')  
                # 輸出查詢結果
                for ipval in result:
                    print(nm + "'s IP=", ipval.to_text())
            except Exception as e:
                # 列印錯誤訊息
                # 請自行增加:出現錯誤,發email alert功能
                print(e)
        # 輸出用於查詢的DNS伺服器與當下時間
        print('NS = ' + ns + " ---- " + ctime())
    # 休息60秒
    sleep(60)

No comments

Leave your comment

In reply to Some User