2020年4月3日 星期五

RouterOS內動態確認DNS Server是否正常, 並切換設定


目的 : 如何動態確認DNS Server是否正常工作,
       如果DNS Server不正常工作的時候, 可以動態切換到另外一台DNS Server

場景 : 在架設Adguardhome(or Pi Hole)後, 如何預防Adguarhome server掛點
       社區網路 <> RouterOS <> 手機, 電腦, NAS, Adguardhome
       家中網路, 都使用Router當作DNS Server, 然後Router是使用Adguardhmoe來當作DNS Server
       所以一般裝置的DNS query是
          手機/電腦 > DNS query > Router > Adguardhome > Router > 手機/電腦
 
如何架設Adguardhome, PiHole, RouterOS可以參考
在Synology NAS docker上架設pi-hole來擋廣告(adblock) with RouterOS設定
        在Synology NAS docker上架設adguardhome (像是pihole)來擋廣告(adblock)
        RouterOS設定DNS Server

想法 : 目前我的Adguardhmoe是透過NAS上的docker來架設, 之後打算用Pi來架設
       如果Pi跑起來不穩, Adguardhome掛了, 那不就整個區網內的裝置都無法工作了
       所以想要能夠在Adguardhome掛掉的時候, 將Router設定的DNS 從Adguardhome改為用hinet的DNS

後來查了一下, 其實還算好寫
Ref : Mikrotik_Scripting
透過Scheduler來定期跑一段script
script中透過resolver去測試Adguardhome能否正常的將網址轉成ip
能正常轉換 : RouterOS DNS就設為Adguardhome
無法轉換 : RouterOS DNS就設為hinet DNS

Winbox > System > Scheduler, 新增一組
    name = dns-check
    Interval = 00:01:00, 我是設定1分鐘跑一次, 可以自行調整
    On Event = 把下面的Script貼進去
    DNSPrivate請改為自己架設Adguardhome的ip
    DNSPublic請改為自己網路供應商建議的DNS
    TestDomai, 目前是用google去當作測試
#### Script - dns-check START
:local DNSPrivate "192.168.0.88"; #### Adguardhome or PiHole
:local DNSPublic "168.95.1.1,8.8.8.8"; #### hinet
:local TestDomain "www.google.com"
:local DNSCurrent [/ip dns get servers];
:local bIsDNSPrivateOK true
:do {
:put [:resolve $TestDomain server $DNSPrivate];
:set bIsDNSPrivateOK true
#/log info message="resolver with Private DNS $DNSPrivate ok";
} on-error={
:put "resolver failed";
:set bIsDNSPrivateOK false
/log info message="resolver with Private DNS $DNSPrivate failed";
}
:if (true = $bIsDNSPrivateOK) do={
:if ($DNSCurrent != $DNSPrivate) do={
/ip dns set servers=$DNSPrivate;
/log info message="set DNS as DNSPrivate $DNSPrivate";
}
} else={
:if ($DNSCurrent = $DNSPrivate) do={
/ip dns set servers=$DNSPublic;
/log info message="set DNS as DNSPublic $DNSPublic";
}
}
#### Script - dns-check END

如何測試, 可以將scheduler的interval改短一點(10s)
然後去拔掉你的Adguardhome server的網路線
再去Winbox > log去看看有沒有印出"set DNS as DNSPublic $DNSPublic"
網路線插回去, 再看看log有沒有"set DNS as DNSPrivate $DNSPrivate"

沒有留言:

張貼留言

在Raspberry Pi 2B上跑Docker, AdguardHome, Bitwarden, RPi-Monitor

在Raspberry Pi 2B上跑Docker, AdguardHome, Bitwarden, RPi-Monitor 請先參考前置準備工作 安裝Raspberry Pi 2B 來跑docker 前置準備 安全性考量, 移除預設pi帳號 Ref :     h...