Tag Archives: router OS

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="[email protected]" to="[email protected]" 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

Simple RouterOS http load/bandwidth tester

Disclaimer: I am not responsible for what you choose to do with this script and/or what damage you incur. It uses features of RouterOS in ways I have to assume they were not intended so user beware.

I wrote a little script today that allows very simple load/bandwidth testing.

Some suggested uses:
– basic testing of apache http servers on a VPS
– bandwidth testing when you’re not onsite and don’t have a remote mikrotik with enough bandwidth test to.

I recommend you don’t exceed 500 iterations on an RB1000 however if you’re using it for a bandwidth test then you should only need 4 threads or so.

If you do exceed this number, or manage to crash the console anyway,  login via winbox and run the clear script a couple of times to remove the created scheduler entries.

Server is the server you wish to connect and
File is the file you wish to download (this is not saved).
Time is how long you want to run the test for (so you can see the average bandwidth or monitor the server you’re checking against).

For example: http://www.example.tld

Server would be www.example.tld

File would be index.php or index.html or index.asp etc etc

For a bandwidth test you’d do better to look around for a reasonably sized file you can download (a linux iso on an ISP mirror would work).

#HTTP testing implementation v3
#Written By Omega-00 - December 2010

#user editable values
:local server "server.tld"
:local file "index.php"
#Recommend not running any more than 500 for RB1000/1100/800
:local iterations 500
#amount of time to run script for in seconds
:local time 60

### End of user editable values ###
:local counter

:for counter from=1 to=$iterations do={
/system scheduler add interval=1s start-time=startup name="load-test-$counter" on-event="/tool fetch keep-result=no mode=http address=$server host=$server src-path=\"$file\"; /tool fetch keep-result=no mode=http address=$server host=$server src-path=\"$file\";"

#wait $time seconds for threads to run
:delay $time
:foreach counter in=[/system scheduler find] do={
:if ([:find [/system scheduler get $counter name] "load-test-"] !="") do={/system scheduler remove $counter}

And a cleanup script in case you crash the console from setting the iterations value too high.

#Script for clearing entries in the event of script crash 

:foreach counter in=[/system scheduler find] do={
:if ([:find [/system scheduler get $counter name] "load-test-"] !="") do={/system scheduler remove $counter}

If there’s interest in this I might make another version of the script that can spider through a website and load multiple pages at once (increasing the effectiveness of using this as a server load tester and avoiding caching from the host machine).

Update: Version 4 of the script (uses :execute command instead of scheduler to run parallel processes)

#HTTP testing implementation v4
#Written By Omega-00 - Jan 2011

#user editable values

#Recommend not running any more than 500 for RB1000/1100/800
:local iterations 500

:local runcmd "/tool fetch keep-result=no url=\"http://example.tld/index.php\""
:local time "60"

### End of user editable values ###
:local counter
:local counter2

:log info "Run Command: $runcmd"

:for counter2 from=1 to=$time do={
:for counter from=1 to=$iterations do={
:execute $runcmd
:delay 1

Using PCC to load balance across multiple non bonded links.

This is my ongoing work at using multiple ADSL services and the Mikrotik PCC rules along with some inbound mangling to allow a single router to load balance traffic across as many non bonded links as required.

Updated: 7th Jan 2010 – notes: added static routing marks for inbound traffic as inbound should never fall over to backup routes, while outbound should go over whatever is available. Also cleaned up routing order so it’s easier to read.

Note that none of this config requires the use of IP addresses at all, as it simply uses the pppoe-client interfaces and your lan interface to mark traffic. In my example wan1-pppoe,wan2-pppoe,wan3-pppoe are used and lan

3-PCC-Mikrotik Continue reading Using PCC to load balance across multiple non bonded links.

Consultant for hire

I am the user known as omega-00 on the mikrotik forums (see here) and as always am happy to be of assistance in all mikrotik related matters.

I can be contacted via the email address listed in my forum profile or alternatively send an email to: admin at this domain dot com

(if you can’t work that out then you’re probably going to need a highly paid consultant sorry :-P)

I will eventually be putting up some useful information on this site, as soon as I figure out what isn’t already covered by other sites or mikrotik themselves 🙂