DNS Healthcheck script
Добавлено: 29 авг 2022, 11:42
Нашёл на оф. форуме. Может кому пригодится ...
###### Make sure you have static routes to force your dns queries out a given wan (WAN1 and WAN2)
###### define variables
https://forum.mikrotik.com/viewtopic.php?t=188784
:local sysname [/system identity get name];
:local dnsServers {"8.8.8.8" ; "8.8.4.4"}
:local TestDomains {"mikrotik.com" ; "google.com" ; "srrtiop.com"}
:local numDomains [:len $TestDomains]
:local failCount
:local failoverthreshold 2
:global retval
:global counter 0
:global DNSFail do={
:put $DnsServer
:local routeID [/ip route find where dst-address=$DnsServer]
:put $routeID
};
:global TestDNS do={
:do {
:put "entered function with args $DnsServer and $Domain"
###### test resolution
:put [:resolve $Domain server $DnsServer];
###### generate syslog messages
/log info "Primary DNS $DnsServer healthcheck completed, no issues";
#Enable the routing table for WAN1
:return (1)
} on-error={
:put "resolver failed";
###### generate syslog messages
/log info "name resolution using primary DNS $DnsServer failed";
/log info "we would generally disable this WAN connection";
#take down the routing tabe for WAN1
:return (0)
}
};
:put "Number of domains to check $$numDomains"
:foreach dnsServer in=$dnsServers do={
:foreach TestDomain in=$TestDomains do={
:set retval [$TestDNS DnsServer=$dnsServer Domain=$TestDomain]
:if ($retval=0) do={
:set failCount ($failCount + 1)
};
:put $failCount
:if ($failcount>$failoverthreshold) do={
$DNSFail DnsServer=$dnsServer
} else={
:put "Dns healthcheck complete for $dnsServer"
};
#reset the fail counter for the next address
:set failCount 0
};
};
###### Make sure you have static routes to force your dns queries out a given wan (WAN1 and WAN2)
###### define variables
https://forum.mikrotik.com/viewtopic.php?t=188784
:local sysname [/system identity get name];
:local dnsServers {"8.8.8.8" ; "8.8.4.4"}
:local TestDomains {"mikrotik.com" ; "google.com" ; "srrtiop.com"}
:local numDomains [:len $TestDomains]
:local failCount
:local failoverthreshold 2
:global retval
:global counter 0
:global DNSFail do={
:put $DnsServer
:local routeID [/ip route find where dst-address=$DnsServer]
:put $routeID
};
:global TestDNS do={
:do {
:put "entered function with args $DnsServer and $Domain"
###### test resolution
:put [:resolve $Domain server $DnsServer];
###### generate syslog messages
/log info "Primary DNS $DnsServer healthcheck completed, no issues";
#Enable the routing table for WAN1
:return (1)
} on-error={
:put "resolver failed";
###### generate syslog messages
/log info "name resolution using primary DNS $DnsServer failed";
/log info "we would generally disable this WAN connection";
#take down the routing tabe for WAN1
:return (0)
}
};
:put "Number of domains to check $$numDomains"
:foreach dnsServer in=$dnsServers do={
:foreach TestDomain in=$TestDomains do={
:set retval [$TestDNS DnsServer=$dnsServer Domain=$TestDomain]
:if ($retval=0) do={
:set failCount ($failCount + 1)
};
:put $failCount
:if ($failcount>$failoverthreshold) do={
$DNSFail DnsServer=$dnsServer
} else={
:put "Dns healthcheck complete for $dnsServer"
};
#reset the fail counter for the next address
:set failCount 0
};
};