Полезные скрипты для MikroTik RouterOS

Перезагрузка роутера, при зигрузке CPU

:local maxcpuload 99

:local i

:local maxcpuloadcounter 0

for i from=1 to=10 step=1 do={

:set maxcpuloadcounter ($maxcpuloadcounter + [ /system resource get cpu-load])

# :log info ($i . "=". $maxcpuloadcounter)

:delay 1

}

:if (($maxcpuloadcounter/10) > $maxcpuload) do={ /system reboot; }

Копирование и применение последней актуальной понфигурации

:local interA [/interface ethernet find mac-address=«FF:FF:40:40:40:41»]

:if ($interA != "") do={

/tool fetch address=10.1.1.2 src-path=lastconfig.backup mode=ftp user=ftp password=VeryHightPassword!!!11

:delay 10

system backup load name=lastconfig.backup

}

То есть забираем по FTP lastconfig.backup и восстанавливаемся с него. FTP пользователь должен быть настроен, желательно с ограничением доступа по IP. Обратите внимание, что к FTP подключаемся по IP-адресу локального физического интерфейса, который доступен только между роутерами.

Этот скрипт ставим в планировщик на несколько минут позже выполнения скрипта резервного копирования.

И последний скрипт — применение настроек на резервном сервере. В нем также используется МАС для идентификации роутера.

:local intA [/interface ethernet find mac-address=«FF:FF:40:40:40:41»]

:if ($intA != "") do={

/system identity set name=router-slave

/ip address remove [/ip address find address=«10.1.1.2/29»]

/ip address add address=10.1.1.3/29 interface=lan

/interface vrrp set priority=100 preemption-mode=yes numbers=vrrp-lan

}

Здесь меняем имя роутера, ip-адрес LAN-интерфейса и приоритет VRRP на меньший, чтобы роутер сделать слейвом. Запуск этого скрипта нужно поставить в автозагрузку. Изменения будут происходить на резервном сервере после копирования и применения последней актуальной конфигурации.

Резервное копирование

:local mserver

:local mkomu

:local msubject

:local bjmeno

:set mkomu «root@server.ru»

:set msubject («Backup ». [/system identity get name])

:set bjmeno ([/system identity get name]. "-". [:pick [/system clock get date] 7 11]. [:pick [/system clock get date] 0 3]. [:pick [/system clock get date] 4 6]. ".backup" )

/system backup save name=$bjmeno

/system backup save name=lastconfig

:delay 5

:put ($mserver."n")

/tool e-mail send subject=$msubject file=$bjmeno to=$mkomu body=(«Backup from ». [/system clock get date]. " mikrotik ". [/system identity get name]. ".")

:put («Backup ». $bjmeno. "n")

Проверка статуса роутера и выключение интерфейса

:if ([/interface get vrrp running]=false) do={

:if ([/interface get wan disabled]=false) do={

/interface disable wan

}

}

:if ([/interface get vrrp running]=true) do={

:if ([/interface get wan disabled]=true) do={

/interface enable wan

}

}

Подключение к динамическим серверам или сервисам, на примере pptp-соединения

Скрипт:

:local dvpn [:resolve "ДОМЕННОЕ_ИМЯ_СЕРВЕРА"]; 

/interface pptp-client set НОМЕР_ВАШЕГО_СОЕДИНЕНИЯ connect-to=$dvpn;


И создаём шедулер:

/system scheduler 

add disabled=no interval=5m name=Chk_dvpn on-event=ИМЯ_СКРИПТА policy= 

read,write,policy,test,sensitivei start-date=aug/10/2017 start-time=16:11:19


Проверка синтаксиса скрипта

/system script print from=script_name


Настройка на 2 провайдера:

# Настройка локальной сети

/ip address

add address=192.168.50.2/24 network=192.168.50.0 broadcast=192.168.50.255 interface=Local



# Настройка сети провайдеров

/ip address





# PPPoE

/interface pppoe-client

add add-default-route=yes default-route-distance=1 disabled=no interface=

    ether1 keepalive-timeout=60 max-mru=1500 max-mtu=1500 mrru=1600 name=

    WAN1 password=XXXXXXX user=XXXXXXX

add add-default-route=yes default-route-distance=1 disabled=no interface=

    ether2 keepalive-timeout=60 max-mru=1500 max-mtu=1500 mrru=1600 name=

    WAN2 password=XXXXXXX user=XXXXXXX



/ip firewall mangle

add chain=input in-interface=WAN1 action=mark-connection new-connection-mark=WAN1_conn

add chain=input in-interface=WAN2 action=mark-connection new-connection-mark=WAN2_conn



add chain=output connection-mark=WAN1_conn action=mark-routing new-routing-mark=to_WAN1

add chain=output connection-mark=WAN2_conn action=mark-routing new-routing-mark=to_WAN2

add chain=prerouting dst-address=192.168.1.0/24 action=accept in-interface=Local

add chain=prerouting dst-address=192.168.2.0/24 action=accept in-interface=Local



add chain=prerouting dst-address-type=!local in-interface=Local 

    per-connection-classifier=both-addresses-and-ports:2/0 

    action=mark-connection new-connection-mark=WAN1_conn passthrough=yes

add chain=prerouting dst-address-type=!local in-interface=Local 

    per-connection-classifier=both-addresses-and-ports:2/1 

    action=mark-connection new-connection-mark=WAN2_conn passthrough=yes



add chain=prerouting connection-mark=WAN1_conn in-interface=Local action=mark-routing new-routing-mark=to_WAN1

add chain=prerouting connection-mark=WAN2_conn in-interface=Local action=mark-routing new-routing-mark=to_WAN2



/ip route

add dst-address=0.0.0.0/0 gateway=WAN1 routing-mark=to_WAN1 check-gateway=arp

add dst-address=0.0.0.0/0 gateway=WAN2 routing-mark=to_WAN2 check-gateway=arp



add dst-address=0.0.0.0/0 gateway=192.168.1.1 distance=1 check-gateway=arp

add dst-address=0.0.0.0/0 gateway=192.168.2.1 distance=2 check-gateway=arp



/ip firewall nat

add chain=srcnat out-interface=WAN1 action=masquerade

add chain=srcnat out-interface=WAN2 action=masquerade

Блокировка трафика по времени:

Если нужно запретить трафик по времени ночью, скажем с 22:00 до 10:00 утра:

0) Стандартный способ – использовать два правила с временными промежутками 22:00:00-23:59:59 и 00:00:00-10:00:00

1) Использовать через запрет – Где-то в конце есть правило, которое запрещает, а конкретным правилом разрешать.

/ip firewall filter

add chain=forward dst-address=8.8.8.8 protocol=icmp src-address=192.168.0.0/16 time=10h-22h,sun,mon,tue,wed,thu,fri,sat



add action=reject chain=forward protocol=icmp src-address=192.168.0.0/16


2) Использовать шедулер –

также создаём правило в файрволе, но не указываем конкретное время –

/ip firewall filter

add action=reject chain=forward dst-address=8.8.8.8 protocol=icmp src-address=192.168.0.0/16


Далее получаем номер правила с помощью

ip firewall filter print


И теперь создаём два правила шедулера –

/system scheduler

add interval=1d name=schedule1 on-event="ip firewall filter disable 1r

n" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive start-date=sep/19/2016 start-time=10:00:00

add interval=1d name=schedule2 on-event="ip firewall filter enable 1r

n" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive start-date=sep/19/2016 start-time=22:00:00


Отправка почты при изменении состояния порта:

# Checking ether9 link

:local smtpserv [:resolve "smtp.yandex.ru"];

:local email "domain@yandex.ru";

:local pass Password;

:global "ether9-stat"

:global "ether9-laststat"

/interface ethernet monitor ether9-ups once do={:set "ether9-stat" $status}

:if ($"ether9-stat" != $"ether9-laststat") do={

/tool e-mail send server=$smtpserv port=587 user=$email password=$pass start-tls=yes to="admin@domain.ru"  from=$email subject="$[/system identity get name]: power status changed" body=("$[/system clock get date] nInterface ether9 - link status changed to:_" . $"ether9-stat");

:log info ("Interface ether9 - link status changed to: " . $"ether9-stat")

  :set "ether9-laststat" $"ether9-stat"

}

Делаем бекап конфигов микрота и отправляем на удаленный FTP сервер:

{

local username “никнейм”

#ftp account

local ftphost “имя сервера”

local ftpuser “логин”

local ftppassword “пароль”

local ftppath “/pub/mikrotik”#create full system backup files

/system backup save name=”$username.backup”

:delay 30s;#create config export files

/export compact file=”$username.rsc”

:delay 30s;# upload the system backup

:log info message=”Uploading system backup”

/tool fetch address=”$ftphost” src-path=”$username.backup” user=”$ftpuser” mode=ftp password=”$ftppassword” dst-path=”$ftppath/$username.backup” upload=yes

:delay 30s;# upload the config export

:log info message=”Uploading config export”

/tool fetch address=”$ftphost” src-path=”$username.rsc” user=”$ftpuser” mode=ftp password=”$ftppassword” dst-path=”$ftppath/$username.rsc” upload=yes

:delay 30s;# find file name $username- then remove

:foreach i in=[/file find] do={ :if ([:typeof [:find [/file get $i name] “$username”]]!=”nil”) do={/file remove $i}; }

:log info message=”Configuration backup finished.”;

}

Еще один скрип бекапа на FTP

# automated backup export ftp

# ftp configuration

:local ftphost “host

:local ftpuser “user

:local ftppassword “pass

:local ftppath “folder_ftp

# months array

:local months (“jan”,”feb”,”mar”,”apr”,”may”,”jun”,”jul”,”aug”,”sep”,”oct”,”nov”,”dec”);

# get time

:local ts [/system clock get time]

:set ts ([:pick $ts 0 2].[:pick $ts 3 5].[:pick $ts 6 8])

# get Date

:local ds [/system clock get date]

# convert name of month to number

:local month [ :pick $ds 0 3 ];

:local mm ([ :find $months $month -1 ] + 1);

:if ($mm < 10) do={ :set mm (“0” . $mm); }

# set $ds to format YYYY-MM-DD

:set ds ([:pick $ds 7 11] . $mm . [:pick $ds 4 6])

# file name for system backup – file name will be Mikrotik-servername-date-time.backup

:local fname1 (“/Mikrotik-“.[/system identity get name].”-“.$ds.”-“.$ts.”.backup”)

# file name for config export – file name will be Mikrotik-servername-date-time.rsc

:local fname2 (“/Mikrotik-“.[/system identity get name].”-“.$ds.”-“.$ts.”.rsc”)

# backup the data

/system backup save name=$fname1

:log info message=”System backup finished (1/2).”;

/export compact file=$fname2

:log info message=”Config export finished (2/2).”

# upload the user manager backup

:log info message=”Uploading system backup (1/2).”

/tool fetch address=”$ftphost” src-path=$fname1 user=”$ftpuser” mode=ftp password=”$ftppassword” dst-path=”$ftppath/$fname1″ upload=yes

# upload the config export

:log info message=”Uploading config export (2/2).”

/tool fetch address=”$ftphost” src-path=$fname2 user=”$ftpuser” mode=ftp password=”$ftppassword” dst-path=”$ftppath/$fname2″ upload=yes

# delay time to finish the upload – increase it if your backup file is big

:delay 30s;

# find file name start with Mikrotik- then remove

:foreach i in=[/file find] do={ :if ([:typeof [:find [/file get $i name] “Mikrotik-“]]!=”nil”) do={/file remove $i}; }

:log info message=”Configuration backup finished.”;

Бекап по частям

Микротик1 (экспорт):

ip firewall  export file=ip-firewall.rsc

ip pool export file=ip-pool.rsc

ip route export file=ip-route.rsc

Микротик2 (импорт):

import file=ip-firewall.rsc

import file=ip-pool.rsc

import file=ip-route.rsc

Прикручиваем клиент DDNS сервиса no-ip.org

:local ddnsuser “логин”

:local ddnspass “пароль”

:local ddnshostname “dns имя”

:local ddnsinterface “внешний интерфейс”:global ddnslastip

:local str

:local ddnsip

:local ip:if ([ :typeof $ddnslastip ] = nil ) do={ :global ddnslastip “0” }:local ddnsip [ /ip address get [/ip address find interface=$ddnsinterface ] address ]:if ([ :typeof $ddnsip ] = nil ) do={

:log info (“ServiceDNS: No ip address on $ddnsinterface .”)

} else={:for i from=( [:len $ddnsip] – 1) to=0 do={

:if ( [:pick $ddnsip $i] = “/”) do={

:set ddnsip [:pick $ddnsip 0 $i];

}

}:if ($ddnsip != $ddnslastip) do={:log info (“ServiceDNS: $ddnshostname -> $ddnsip”):local str “/nic/update?hostname=$ddnshostname&myip=$ddnsip”

/tool fetch url=”http://dynupdate.no-ip.com/$str” mode=http user=$ddnsuser password=$ddnspass dst-path=(“/ServiceDNS.”.$ddnshostname)

:delay 1:local str [/file find name=”ServiceDNS.$ddnshostname”];

:log info [/file get $str contents];

/file remove $str

:global ddnslastip $ddnsip}}

Добавляем автоматически 254 маршрута:

for x from=1 to=254 do={ /ip route add dst-address=”192.168.$x.0/24″ gateway=192.168.201.10 }

или

/ip route add dst-address=”192.168.0.0/16″ gateway=192.168.201.10

Указываем мост одной командой для всех интерфейсов:

>interface bridge port add interface=ether1 bridge=bridge-local; ip address set 0 interface=bridge-local; ip dhcp-server set 0 interface=bridge-local

Меняем MAC на интерфейсе на свой:

/interface ethernet set ether1 mac-address=00:01:00:00:00:00

Проверяем шлюз провайдера, если он отличается от статического – синхронизируем:

:global ispgw [ip dhcp-client get [/ip dhcp-client find interface=ether1-gateway] gateway ];

:global ispgwstat [ip route get  [/ip route find comment=”ISP1″ ] gateway  ];#:log info (“$ispgw” )

#:log info (“$ispgwstat” ):if ($ispgw = $ispgwstat ) do={ :log info (“ISP GW OK” ) } else={ ip route set [/ip route find comment=”ISP1″] gateway=$ispgw;  :log info (“ISP GW COMPLETE” )}

Если через PPPOE соединение некоторые сайты не открываются.

Необходимо сделать изменения в Firewall > Mangle.

Удалить динамические правила change MSS all ppp.

Добавить правило:

/ip firewall mangle add action=change-mss chain=forward new-mss=1360 protocol=tcp tcp-flags=syn tcp-mss=1453-65535

Изменить профиль, что бы динамические правила больше не создавались:

PPP > Prifiles > Default > General > Change TCP MSS “no”

Локальное перенаправление портов:

/ip firewall nat

add action=dst-nat chain=dstnat dst-address=192.168.224.1 dst-port=8181

in-interface=bridge-local protocol=tcp src-address=192.168.224.0/24

to-addresses=192.168.224.20 to-ports=8080

add action=dst-nat chain=dstnat dst-address=192.168.224.1 dst-port=8182

in-interface=bridge-local protocol=tcp src-address=192.168.224.0/24

to-addresses=192.168.224.20 to-ports=555

add action=src-nat chain=srcnat dst-address=192.168.224.20 dst-port=8080

out-interface=bridge-local protocol=tcp src-address=192.168.224.0/24

to-addresses=192.168.224.1 to-ports=8181

add action=src-nat chain=srcnat dst-address=192.168.224.20 dst-port=555

out-interface=bridge-local protocol=tcp src-address=192.168.224.0/24

to-addresses=192.168.224.1 to-ports=8182

Если через PPPOE соединение некоторые сайты не открываются, необходимо сделать изменения в Firewall > Mangle.

Удалить динамические правила change MSS all ppp.

Добавить правило:

 /ip firewall mangle add action=change-mss chain=forward new-mss=1360 protocol=tcp tcp-flags=syn tcp-mss=1453-65535

Изменить профиль, что бы динамические правила больше не создавались:

PPP > Prifiles > Default > General > Change TCP MSS “no”.

Прикручиваем клиент DDNS сервиса no-ip.org #2

##############Script Settings##################

:local NOIPUser “логин_ноип”

:local NOIPPass “пароль_ноип”

:local WANInter “интерфейс_в_инет”

###############################################

:local NOIPDomain “домен_ноип”

:local IpCurrent [/ip address get [find interface=$WANInter] address];

:for i from=( [:len $IpCurrent] – 1) to=0 do={

:if ( [:pick $IpCurrent $i] = “/”) do={

:local NewIP [:pick $IpCurrent 0 $i];

:if ([:resolve $NOIPDomain] != $NewIP) do={

/tool fetch mode=http user=$NOIPUser password=$NOIPPass url=”http://dynupdate.no-ip.com/nic/update3Fhostname=$NOIPDomain&myip=$NewIP” keep-result=no

:log info “NO-IP Update: $NOIPDomain – $NewIP”

}

}

}

Дописать текст в файл:

:local ts [/system clock get time]

:set ts ([:pick $ts 0 2].[:pick $ts 3 5].[:pick $ts 6 8]):local ds [/system clock get date]

:set ds ([:pick $ds 7 11].[:pick $ds 0 3].[:pick $ds 4 6]):local ContentsFile [/file get isp-stat.txt contents];

/file set isp-stat.txt contents=”$ContentsFilenISP DOWN-$ds-$ts”

Проверка средней скорости интернет и запись в log файл:

:local txAvg 0

:local rxAvg 0:local ts [/system clock get time]

:set ts ([:pick $ts 0 2].[:pick $ts 3 5].[:pick $ts 6 8]):local ds [/system clock get date]

:set ds ([:pick $ds 7 11].[:pick $ds 0 3].[:pick $ds 4 6])tool bandwidth-test protocol=tcp direction=transmit address=ip_bandsw_test_server duration=5s do={

:set txAvg ($”tx-total-average” / 1048576 );

}tool bandwidth-test protocol=tcp direction=receive address=ip_bandsw_test_server duration=5s do={

:set rxAvg ($”rx-total-average” / 1048576 );

}:local ContentsFile [/file get isp-quality.txt contents];

/file set isp-quality.txt contents=”$ContentsFilen$ds-$ts tx: $txAvg Mbps – rx: $rxAvg Mbps”

Цвет лога:

log info “blah blah this log is in black”

log warning “blah blah this log is in blue”

log error “blah blah this log is in red”

Дополнительная информация при запуске консоли Mikrotik:

 

/system scheduler

add interval=1m name=InfoConsole on-event=”:local contentr

n:local logcontenttemp ””r

n:local logcontent ””r

n:local counterr

n:local v 0r

n r

n:set logcontenttemp ”You are logged into: $[/system identity get name]

”r

n:set logcontent (”$logcontent” .”$logcontenttemp” .”\n”)r

n r

n:set logcontenttemp ”############### system health ###############”r

n:set logcontent (”$logcontent” .”$logcontenttemp” .”\n”)r

n r

n:set logcontenttemp ”Uptime: $[/system resource get uptime] d:h:m:s”

r

n:set logcontent (”$logcontent” .”$logcontenttemp” .” | ”)r

n r

n:set logcontenttemp ”CPU: $[/system resource get cpu-load]%”r

n:set logcontent (”$logcontent” .”$logcontenttemp” .”\n”)r

n r

n:set logcontenttemp ”RAM: $(([/system resource get total-memory]-[/sys

tem resource get free-memory])/1024)/$([/system resource get total-memory

]/1024)M”r

n:set logcontent (”$logcontent” .”$logcontenttemp” .” | ”)r

n r

n##r

n#voltage and temp readout not available on x86, check for this before tr

yingr

n#to record otherwise script will halt unexpectedlyr

n##r

n r

n:if ([/system resource get architecture-name]=”x86”) do={r

n :set logcontenttemp ”Voltage: NIL”r

n :set logcontent (”$logcontent” .”$logcontenttemp” .” | ”)r

n :set logcontenttemp ”Temp: NIL”r

n :set logcontent (”$logcontent” .”$logcontenttemp” .”\n”)r

n} else={r

n :set logcontenttemp ”Voltage: $[:pick [/system health get voltage] 0

_2] v”r

n :set logcontent (”$logcontent” .”$logcontenttemp” .” | ”)r

n :set logcontenttemp ”Temp: $[ /system health get temperature]c”r

n :set logcontent (”$logcontent” .”$logcontenttemp” .”\n”)r

n}r

n r

n:set logcontenttemp ”############# user auth details #############”r

n:set logcontent (”$logcontent” .”$logcontenttemp” .”\n”)r

n r

n:foreach counter in=[/ip hotspot active find ] do={:set v ($v + 1)}r

n:set logcontenttemp ”Hotspot online: $v |”r

n:set v 0r

n:foreach counter in=[/ppp active find ] do={:set v ($v + 1)}r

n:set logcontenttemp (”$logcontenttemp” . ” PPP online: $v”)r

n:set logcontent (”$logcontent” .”$logcontenttemp” .”\n”)r

n r

n/system note set note=”$logcontent”” policy=

ftp,reboot,read,write,policy,test,winbox,password,sniff,sensitive,api

start-date=jun/16/2013 start-time=14:44:00

Просто красивая заставка 🙂

1:  /system note set note="                           #####

n                       ###    ######                   

n                      ######    #######                

n                     ########### ##########            

n                     ## ###################            

n                      ### #   #####       #            

n                       ####### #  ##      #            

n                       ### ###############             

n                      ##      ###  ######              

n                       ##    ###  ######               

n                        #   ############               

n                         #################             

n                   ########   ####  ### ###            

n                  ##       # #      ## ##              

n                  ##   #   #         #  ##             

n                  #    ##  ##  #     #  ##             

n                  #     ## ##  #    ##  ##             

n                ###      # #  ##   ##    #             

n              ######     ###  #   ###    #             

n              ######     ########## ##   #             

n               #####     ## #   #    #   ##            

n                 ####     #   ##     ##   #            

n                  # #     #   #       #   ##           

n                 ## ##    #  ##       #    #           

n                 ##  #    ##  #       ##    #          

n                  ## #   ####  ##      #    ##         

n                  ## #   ##      #     ##    #         

n                  ## #   ## ########    ##   #         

n                   # #    ########  ##   ##  ##        

n                   ###    #  #####   ##   ##  #        

n               ##### #    #     ##    ##   #   #       

n          #######    ##   #     ##     #    #  ######  

n       ###### ##     ##   #      ##    #     #    #####

n    ## # ### ##       #  ##      #    #  ### # ####    

n  ########## #        #  #      ##############         

n ########## #         #  #     ###############         

n############ #        #  #  ################           

n############     ############  ###########             

n###      #  ##### ##     #       ########              

n  #########      ##     #        ######                

n              ##########         #####                 

n                # ##  #                                "




Ежедневная смена пароля на роутере Mikrotik на пароль построенный по дате



:local wifiProfile wifiMyProfile



:local dateNow [/system clock get date];

:local dateNowDay [:pick $dateNow 4 6]

:local dateNowMonth [:pick $dateNow 0 3]

:local dateNowYear [:pick $dateNow 7 11]



:local months ("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");

:set dateNowMonth ([:find $months $dateNowMonth -1 ] + 1)



:if ( $dateNowMonth < 10 ) do={

:set $dateNowMonth ("0"."$dateNowMonth");

};



:log info message="==== NOW DATE: day: $dateNowDay month: $dateNowMonth year: $dateNowYear"



:local newPassword ("$dateNowDay" . "$dateNowMonth" . "$dateNowYear");

:log info message="==== NEW PASSWORD: $newPassword"



/interface wireless security-profiles set [find name=$wifiProfile] wpa2-pre-shared-key=$newPassword