MikroTik
Добавлено: 28 апр 2024, 13:21
Базовая настройка MikroTik
https://www.youtube.com/watch?v=tJNP7gXUvKQ
MikroTik RouterOS v7 dual DHCP WAN recursive failover w/ PCC load-balancing; and recursive ECMP
https://gist.github.com/marfillaster/7a136ea826815ac22f2849e099a1c6a1
dual wan
https://pastebin.com/H1Wp5REv
system/script/run ISP
Проверять доступность оператора связи, используя протокол динамической маршрутизации, который работает внутри локальной сети
https://www.youtube.com/watch?v=tJNP7gXUvKQ
MikroTik RouterOS v7 dual DHCP WAN recursive failover w/ PCC load-balancing; and recursive ECMP
https://gist.github.com/marfillaster/7a136ea826815ac22f2849e099a1c6a1
dual wan
https://pastebin.com/H1Wp5REv
system/script/run ISP
Код: Выделить всё
#Main interface name
:global MainIf ether2
#Failover interface name
:global RsrvIf ether1
#Minimall RTT for ping
:local MinRtt "00:00:00.200"
#Minimal ping cout for routeros 7 - 3
:local PingCount 3
#Ping targets
:local PingTargets {1.1.1.1; 8.8.4.4; 9.9.9.9; 77.88.8.8}
:global ClientName "Example LLC";
:global MainEmail support@ISP1.ru
:global MainCN 12345
:global ReservEmail support@ISP2.ru
:global ReservCN 12345
:local host
:local MainIfInetOk false
:local RsrvIfInetOk false
:local MainPings 0
:local RsrvPings 0
:local MainPingRtt 0
:local RsrvPingRtt 0
:local MainPingRtt 0
:local MainPingRttSumm 0
:local RsrvPingRtt 0
:local RsrvPingRttSumm 0
:local MainPingCont 0
:local RsrvPingCont 0
:local MainPingProblemNum 0
:local RsrvPingProblemNum 0
foreach host in=$PingTargets do={
:local res [/ping $host count=$PingCount interface=$MainIf]
:set MainPings ($MainPings + $res)
#:put $MainPings
:local MainPingRttTest [/ping $host count=$PingCount interface=$MainIf as-value]
:foreach try in=$MainPingRttTest do={:set MainPingRtt ($MainPingRtt + ($try->"time"))}
:set MainPingRtt ($MainPingRtt / [:len $MainPingRttTest])
:if (($MainPingRtt < $MinRtt)) do={:set $MainPingRtt 1} else={:set MainPingRtt 0}
#:put $MainPingRtt
:set $MainPingRttSumm ($MainPingRttSumm + $MainPingRtt)
:set $MainPingRtt 0
:set $MainPingCont ($MainPingCont + 1)
:local res [/ping $host count=$PingCount interface=$RsrvIf]
:set RsrvPings ($RsrvPings + $res)
#:put $RsrvPings
:local RsrvPingRttTest [/ping $host count=$PingCount interface=$RsrvIf as-value]
:foreach try in=$RsrvPingRttTest do={:set RsrvPingRtt ($RsrvPingRtt + ($try->"time"))}
:set RsrvPingRtt ($RsrvPingRtt / [:len $RsrvPingRttTest])
:if (($RsrvPingRtt < $MinRtt)) do={:set $RsrvPingRtt 1} else={:set $RsrvPingRtt 0}
#:put $RsrvPingRtt
:set $RsrvPingRttSumm ($RsrvPingRttSumm + $RsrvPingRtt)
:set $RsrvPingRtt 0
:set $RsrvPingCont ($RsrvPingCont + 1)
}
#:put ($MainPings + $MainPingRttSumm)
#:put $MainPingCont
#:put $PingCount
#:put $MainPingRttSumm
:set $MainPingProblemNum (($MainPingCont * $PingCount + $MainPingCont))
#:put $MainPingProblemNum
:set MainIfInetOk (($MainPings + $MainPingRttSumm) >= ($MainPingProblemNum - $MainPingCont))
#:put ($RsrvPings + $RsrvPingRttSumm)
:set $RsrvPingProblemNum (($RsrvPingCont * $PingCount + $RsrvPingCont))
#:put $RsrvPingProblemNum
:set RsrvIfInetOk (($RsrvPings + $RsrvPingRttSumm) >= ($RsrvPingProblemNum - $RsrvPingCont))
:put "MainIfInetOk=$MainIfInetOk"
:put "RsrvIfInetOk=$RsrvIfInetOk"
if (!$MainIfInetOk) do={
/log error "Main gateway down"
}
if (!$RsrvIfInetOk) do={
/log error "Reserve gateway error"
}
:local MainGWDistance [/ip route get [find comment="MainGW"] distance]
:local RsrvGWDistance [/ip route get [find comment="RsrvGW"] distance]
:put "MainGWDistance=$MainGWDistance"
:put "RsrvGWDistance=$RsrvGWDistance"
if ($MainIfInetOk && ($MainGWDistance >= $RsrvGWDistance)) do={
/ip route set [find comment="MainGW"] distance=1
/ip route set [find comment="RsrvGW"] distance=2
# Clear VoIP connections
/ip firewall connection remove [ find dst-address ~ ".*:5060" ]
/ip firewall connection remove [ find src-address ~ ".*:5060" ]
/log info "switched to main internet connection"
}
if (!$MainIfInetOk && $RsrvIfInetOk && ($MainGWDistance <= $RsrvGWDistance)) do={
/ip route set [find comment="MainGW"] distance=2
/ip route set [find comment="RsrvGW"] distance=1
# Clear VoIP connections
/ip firewall connection remove [ find dst-address ~ ".*:5060" ]
/ip firewall connection remove [ find src-address ~ ".*:5060" ]
/log info "switched to reserve internet connection"
/tool e-mail send from="mikrotik@example.ru" to=team@examlpe.ru server=mail.example.ru port=587 user=mikrotik@example.ru password=PassWord123 tls=starttls body="$ClientName on reserve ISP" subject="$ClientName MainGW Down ReservGW OK"
#/tool e-mail send from="mikrotik@example.ru" to=$MainEmail server=mail.example.ru port=587 user=mikrotik@example.ru password=PassWord123 tls=starttls body="We're have problem with internet connection. Contract number $MainCN. Best regards $ClientName." subject="$ClientName $MainCN problem with internet connection."
}
Проверять доступность оператора связи, используя протокол динамической маршрутизации, который работает внутри локальной сети