Tag Archives: failover

MikroTik Scripting: Failover Routing for Asterisk PBX

Hi guys,

This is my second article and I wanted to raise the difficulty level of my tutorials!

We work a lot with Asterisk PBX and MikroTik and we’ve encountered a problem when we have 2 internet connection with a MikroTik using WAN failover, our Asterisk PBX would stop working when the primary connections fail; we finally  figured out why.

In this case, the Asterisk connections would remain appended to the primary gateway, and Asterisk doesn’t understand the change of connection; so we came up with a solution using 2 MikroTik scripts.

First, the “Check Script” checks if the primary internet connection is working or not. If fails, use the secondary internet link and reboot the router. You are probably asking why we would do this…I know!

Because after the reboot I can run a “Restart Script” to check if primary connection is still out, or came back.

In this way, by rebooting the router, the asterisk pbx client loose for a moment the registration and reconnect with the new gateway so everything works.
Actually we’re testing other solutions to avoid the router reboot…when I’ve found that I’ll update this post and let you know!

Editors note: This could be achieved in a few ways, I’ll leave it as a test for our readers to see what improvements you can come up with!

Here are the scripts:

Check Script

:global strDate [/system clock get date]
:global strTime [/system clock get time]
:global strSystemName [/system identity get name]

:if ([/ping interface=pppoe-out1 count=5] = 0 && [/ping interface=pppoe-out1 count=5] = 0 && [/ip route get [find comment="Primary"] disabled]=false) do={
    :log info "Disabling Primary";
    /ip route set [find comment="Primary"] disabled=yes
    /tool e-mail send from="yyyyy@gmail.com" to="xxxx@gmail.com" subject="Route Failover - $strDate $strTime - $strSystemName" body="Failover to Telecom occurred at $strDate $strTime on $strSystemName"
    :delay 3
    /system reboot

} else= {
    :log info "No Failover Necessary";

Restart Script

:delay 10;
:if ([/ip route get [find comment="Primary"] disabled]=true) do={
    /interface ethernet set numbers=4 disabled=no

     /ip route set [find comment="Primary"] disabled=no
     /ip route set [find comment="Primary"] distance=3
    :delay 10
    :if ([/ping routing-table=Primary count=5] > 0 && [/ping routing-table=Primary count=5] > 0) do={

       /ip route set [find comment="Primary"] distance=1
       /system reboot
     else= {

        /ip route set [find comment="Primary"] distance=3

} else= {
    :log info "No Failover Necessary";

Written by Razorblade, edited by Omega-00

Improved Netwatch-style script.

There have been a number of improved netwatch scripts listed on the mikrotik wiki in the past however many of these are hard to understand, broken or both.

I had a request from an associate to assist them finding a solution to fall over VPN traffic from one link to another in the event of an outage; in a network configuration where it wasn’t possible to use the local upstream router as an indication of the VPNs status, so I took the opportunity to revise a netwatch script based loosely on the one located here: http://wiki.mikrotik.com/wiki/Improved_Netwatch_II

My rewrite of this allows both the “up” and “down” scripts to be called from the same place (preferably a scheduler entry) and to be extra nice I’ve commented the whole script so you’re all welcome to modify as you see fit.

Continue reading Improved Netwatch-style script.