Tag Archives: asterisk

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