воскресенье, 19 апреля 2015 г.

Генератор паролей

Взято отсюда
# MikroTik Random Password Generator
# with random start offset delay for use with /System Scheduler
# Author: Bob Burley - April 25, 2011
#
:local minRtt
:local maxRtt
:local random 0
:local siteAddress
:local charStrNum 1
:local p1
:local var1
:local var2
:local var3
:local newPassword ""
# set password length here
:local newPassLength 8
# Total characters to choose from is 73
# Eliminated confusing characters
# '0' (zero) and Upper Case 'O'
# '1' (one) and Upper Case 'I' and Lower Case 'l' (L)
:local charStr1 "23456789ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghijkmnopqrstuvwxyz23456789"
:local charStr2 "cN47iKd2bLn8sQz4JAu2PD6Vm5RjTG4UrFY78XewHE3W9gMq62v7a9Z5yf5pC3k6xt9Bh8S3o"
:local charStr3 "uYswW92z6M5fJynQp6hGm5VSr4oR8k7A2bKq5U3FiZvc8gHP2tdL9E4jBT3X7xC6N4D8e7a93"
# google.ca (74.125.95.147) - google.com (74.125.95.99) - yahoo.ca (68.180.206.184) - yahoo.com (209.191.122.70)
:local arraySiteList [:toarray ("74.125.95.147","74.125.95.99","68.180.206.184","209.191.122.70")]
:foreach siteAddress in=($arraySiteList) do={
  /tool flood-ping $siteAddress count=4 do={
    :if ($sent=4) do={
      :set minRtt $"min-rtt"
      :set maxRtt $"max-rtt"
    }
    :set random ($random + minRtt)
    :while ($random > 59) do={
      :set random ($random -60)
    }
    :set random ($random + maxRtt)
    :while ($random > 59) do={
      :set random ($random -60)
    }
  }
}
:delay $random
:for char from=1 to=$newPassLength step=1 do={
#  Generate number between 0 and 72
  :set var1 ([:pick [/system clock get time] 6 8])
  :set p1 ([:len [/system resource get uptime]])
  :set var2 ([:pick [/system resource get uptime] ($p1-2) $p1])
  :set var3 (($var1 * $var2) / 48)
#  pick next character to add to the new password
  :if ($charStrNum=1) do={
    :set newPassword ($newPassword . [:pick $charStr1 $var3])
  }
  :if ($charStrNum=2) do={
    :set newPassword ($newPassword . [:pick $charStr2 $var3])
  }
  :if ($charStrNum=3) do={
    :set newPassword ($newPassword . [:pick $charStr3 $var3])
  }
  :set charStrNum ($charStrNum + 1)
  :if ($charStrNum = 4) do={
    :set charStrNum 1
  }
  :delay (($var1 + $var2 + $var3) / 5)
}
:log info $newPassword
Скрипт выполняется не сразу. IP можно заменить  на свои.

Проверка активности интерфейса. Тупой метод.

Много лет назад нарыгал два скрипта, рабочая но очень тупая проверка интерфейса(можно было обойтись одним.)
local status [ip route get value-name=active [find comment=EKSTROTEL]]
if ($status=true) do={/system script run e-mail_to_sms_off; /system scheduler disable mudrim_velton_off_bez_chapaeva; /system scheduler enable mudrim_velton_on_bez_chapaeva} else={}
local status [ip route get value-name=active [find comment=VELTON]]
if ($status=true) do={/system script run e-mail_to_sms_on; /system scheduler disable mudrim_velton_on_bez_chapaeva; /system scheduler enable mudrim_velton_off_bez_chapaeva} else={}
Проверяют активность интерфейса, в случае не активности главного маршрута отправляет смс и друг друга рекурсивно выключают, что б больше не выполнялся до переключения главного маршрута в active.  =) 

noip

Есть два маршрута на разные провайдеры, когда один активен(WAN1), второй нет.

# The RB interface global ddnsinterface
local status [ip route get value-name=active [find comment=WAN1]]
if ($status=true) do={:global ddnsinterface "wan1"} else={:global ddnsinterface "wan2"}
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# EDIT YOUR DETAILS / CONFIGURATION HERE
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Define DDNS Accounts for RB Interfaces, one per interface.
# The RB interface
:global ddnsinterface
# The DDNS Provider (Choice of NOIP, DYNDNS or EVERYDNS)
:global ddnsprovider "NOIP"
# The Hostname to update.
:global ddnshost "1.sytes.net"
# Your Account Username
:global ddnsuser "user"
# Your Account Password
:global ddnspass "pass"

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# END OF USER DEFINED CONFIGURATION
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Define Global Variables
:global ddnssystem ("mt-" . [/system package get system version] )
:global ddnsip
:global ddnslastip
:if ([ :typeof $ddnslastip;] = "nil" ) do={ :set ddnslastip "0" }
:global ddnsprovname
:global str
:global ddnsprovaddress
:if ($ddnsprovider="NOIP") do={
  :set ddnsprovname "NoIP"
  :set str "/nic/update?hostname=$ddnshost&myip=$ddnsip"
  :set ddnsprovaddress "dynupdate.no-ip.com"
}
if ($ddnsprovider="DYNDNS") do={
  :set ddnsprovname "DynDNS"
  :set str "/nic/update?hostname=$ddnshost&myip=$ddnsip&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG"
  :set ddnsprovaddress "members.dyndns.org"
}
if ($ddnsprovider="EVERYDNS") do={
  :set ddnsprovname "EveryDNS"
  :set str "/index.php?ver=0.1&ip=$ddnsip&domain=$ddnshost"
  :set ddnsprovaddress "dyn.everydns.net"
}

# Grab the current IP address on that interface.
:global ddnsip2 [/ip address get [/ip address find interface=$ddnsinterface ] address];
:set ddnsip [:pick $ddnsip2 0 [:find $ddnsip2 "/"]];
# Did we get an IP address to compare?
:if ([ :typeof $ddnsip;] = "nil" ) do={
   :log info ("NoIP: No ip address present on " . $ddnsinterface . ", please check.")
} else={
  :if ($ddnsip != $ddnslastip) do={
        :log info "$ddnsprovname: Sending UPDATE!"
         /tool fetch address=$ddnsprovaddress src-path=$str mode=http user=$ddnsuser password=$ddnspass dst-path=("/DDNS-".$ddnsprovname.".".$ddnshost)
  }
  :delay 1
  :set str [/file find name="DDNS-$ddnsprovname.$ddnshost"];
  /file remove $str
  :set ddnslastip $ddnsip
}
#:log info "DDNS Update script executed successfully."

суббота, 18 апреля 2015 г.

Экспорт в файл, дописать в файл.

Экспорт в файл:
/ip dhcp-server lease export file=lease
 Дописать в файл:
ip dhcp-server lease print terse file="arp.txt" append

Сбрасываем connection.

ip firewall connection remove [find protocol=icmp]
Можно использовать при failover (при переключении сбрасывать установленные UDP-соединения):
:foreach i in=[/ip firewall connection find dst-address~":2227" protocol~"udp"] do={ /ip firewall connection remove $i }
 При ненадобности номер порта можно и не упоминать. 

backup RouterOS на e-mail

:local backupfile ("router-" . [: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 dont-encrypt=yes name=$backupfile;
:delay 5;
:local date [/system clock get date];
:local body "$date ROUTER backup";
:local smtpserv [:resolve "smtp.yandex.ru"];
:local email "23@yandex.ru";
:local pass 23;
/tool e-mail send server=$smtpserv port=587 user=$email password=$pass start-tls=yes to="admin@23.ua"  from=$email subject="$body" body="$body" file=$backupfile;
:delay 5;
/file remove $backupfile;
:log info "backup e-mail finished";

Заглушка для клиентов при пропадании интернета.

Создаем правило:
add action=redirect chain=dstnat comment=zagluchka disabled=yes protocol=tcp \
    src-address=192.168.23.0/24 to-ports=8080

Включаем на порту 8080 web-proxy.
/ip proxy access
add action=deny

Узнаем внешний реальный IP при работе Mikrotik за NAT.

Узнаем через сервис checkip.dyndns.org/dyndns.checkip.html
# get the current IP address from the internet (in case of double-nat)
/tool fetch mode=http address="checkip.dyndns.org" src-path="/" dst-path="/dyndns.checkip.html"
:local result [/file get dyndns.checkip.html contents]
# parse the current IP result
:local resultLen [:len $result]
:local startLoc [:find $result ": " -1]
:set startLoc ($startLoc + 2)
:local endLoc [:find $result "</body>" -1]
:global currentIP [:pick $result $startLoc $endLoc]
Результат будет записан в переменную currentIP.

Сохраняем html страницу в файл

/tool fetch url="http://bgp.he.net/dns/vk.com#_ipinfo" mode=http dst-path=block.txt

Ускоритель действий =)

Задача: Arp лист закрыт. Нужно согласно ip из dhcp-server добавить arp с нужным коментом(берется из dhcp-server) и queue simple:
:local ip "192.168.0.108"
:local mac [ /ip dhcp-server lease get [/ip dhcp-server lease find address=$ip ] mac ]
:local comment [ /ip dhcp-server lease get [/ip dhcp-server lease find address=$ip ] comment ]
/ip arp add address=$ip comment="$comment"   disabled=no interface=bridge-1 mac-address=$mac
/queue simple add burst-limit=0/0 burst-threshold=0/0 burst-time=0s/0s direction=both \
    disabled=no interface=all limit-at=0/0 max-limit=0/0 name=$comment \
    packet-marks="" parent=none priority=8 queue=default/default \
    target-addresses=$ip total-queue=default

Узнаем день недели в RouterOS.

Скрипт не мой, нашел в Scripting Examples:
#
#   $RCSfile: function-date.rsc,v $
#   $Revision: 1.1 $
#   $Date: 2011/05/27 19:47:46 $
#   $Author: reesejb $, iNet Specialists. Copyright, (C)2007-2011, All Rights Reserved
#
#   Calculates day of the week (number of month, etc.) for a givien date
#
#   Expanded from "day of week" script at:
#      http://wiki.mikrotik.com/wiki/Script_to_find_the_day_of_the_week
#
#   Month: jan,feb,..nov,dec   (must be lower-case)
#   Day: 01-31
#   Year: 1900-2999
#   mmm/dd/yyyy   same format as [/system clock get date]
#   (ex. jul/22/2009)
:local date [/ system clock get date]
# Variables
:global weekday ""
:global monthord ""
:local months [:toarray "jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec"]
:local monthval [:toarray "01,02,03,04,05,06,07,08,09,10,11,12"]
:local monthtbl [:toarray "0,3,3,6,1,4,6,2,5,0,3,5"]
:local daytbl [:toarray "sun,mon,tue,wed,thu,fri,sat"]
:global monthshort [:pick $date 0 3]
:global day [:pick $date 4 6]
:local daysum $day
:local dayc [:pick $date 5 6]
:global century [:pick $date 7 9]
:global year [:pick $date 9 11]
:local yearsum $year
:local yearc [:pick $date 10 11]
# if the first digit of the day or year is a 0 (zero),
# only use the last digit, otherwise the script will fail
:if ([:pick $date 4 5] = 0) do={ :set daysum ($dayc)}
:if ([:pick $date 9 10] = 0) do=[:set yearsum ($yearc)]
# Calculate "sum" to determine which "day of week" (from daytbl) to use
:local sum 0
:set sum ($sum + (2 * (3 - ($century - (($century / 4) * 4)))))
:set sum ($sum + ($yearsum / 4))
:set sum ($sum + $yearsum + $daysum)
:for mindex from=0 to=[:len $months] do={ \
   :if ([:pick $months $mindex] = $monthshort) do={ \
      :set sum ($sum + [:pick $monthtbl $mindex])
      :set monthord [:pick $monthval $mindex]
      } \
   }
:set sum ($sum - (($sum / 7) * 7))
:set weekday [:pick $daytbl $sum]
# Log the result for troubleshooting purposes
:log info "Today is $weekday, $monthshort $day, $century$year ($monthord/$day/$century$year)"


Update 24.01.16
  В какой-то момент скрипт перестал работать, melboyscout предложил скрипт, который есть на официальном форуме, он отрабатывает корректно. Спасибо.
# Calculates day of the week for a givien date
# Month: jan,feb ... nov,dec (must be lower-case)
# Day: 1 - 31
# Year: 1583 - ...
# mmm/dd/yyyy same format as [/system clock get date]
# (ex. feb/19/2012)
# by melboyscout (melboyscout [at] gmail.com)
:local date [/system clock get date]
# Math Calculation here
:local result ""
:local months [:toarray "jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec"]
:local daytbl [:toarray "sun,mon,tue,wed,thu,fri,sat"]
:local month [:pick $date 0 3]
:local day [:pick $date 4 6]
:local dayc [:pick $date 5 6]
:local year [:pick $date 7 11]
# if the first char is a 0 (zero) only read last char, else script fails
:if ([:pick $date 4 5] = 0) do={ :set day ($dayc)}
:local sum 0
:local aaa 0
:local yyy 0
:local mmm 0
:local nmonth 1
:for mindex from=0 to=[:len $months] do={
:if ([:pick $months $mindex] = $month) do={:set nmonth ($mindex + 1) }
}
:set aaa ((14 - $nmonth) / 12)
:set yyy ($year - $aaa)
:set mmm ($nmonth + 12 * $aaa - 2)
:set sum (7000 + $day + $yyy + ($yyy / 4) - ($yyy / 100) + ($yyy / 400) + ((31 * $mmm) / 12))
:set sum ($sum - (($sum / 7) * 7))
:set result [:pick $daytbl $sum]
:log info "Today is $result"

Проверка смены ip по dns-имени для VPN (актуально для старых версий RouterOS).

:global "vpn-interface-name" "l2tp-v"
:global "vpn-dns-name" "domain.ru"
:global "new-vpn-ip" [:resolve $"vpn-dns-name"]
:global "current-vpn-ip" [/interface l2tp-client get $"vpn-interface-name" connect-to]
:if ($"current-vpn-ip" != $"new-vpn-ip") do={ /interface l2tp-client set [find name=$"vpn-interface-name"] connect-to=$"new-vpn-ip"}

В данном случае domain.ru имя, которые привязано к дин-днс где периодически изменяются IP. Из-за того что RouterOS до 6.0 не умеет подключатся по vpn по днс-имени нужен данный скрипт.

Resolve NTP, создание адрес-листа для разрешающего правила.

Раньше в Микротиках нельзя было ввести домен в primary-ntp и secondary-ntp, а только ip. Задача стояла обновлять адреса согласно домену и выгружать их в адрес-лист для разрешающего правила в фаерволе:
/system ntp client set primary-ntp=[:resolve "0.ua.pool.ntp.org"];
/system ntp client set secondary-ntp=[:resolve "1.ua.pool.ntp.org"];
/ip f a remove [find comment=ntp];
:local "pntp" [system ntp client get primary-ntp];
:local "sntp" [system ntp client get secondary-ntp];
/ip f a a list=ntp address=$pntp comment=ntp;
/ip f a a list=ntp address=$sntp comment=ntp

Отслеживание нагрузки на CPU и оповещение по e-mail.

Скрипт:
:global cpu1 [/system resource get cpu-load];
:delay 120;
:global cpu2 [/system resource get cpu-load];
:local time1 [/system clock get time];
:local body1 "$time1 Mikrotik over 91% CPU";
if ((($cpu1) >= 91) and (($cpu2) >= (91))) do={/tool e-mail send server=[:resolve "smtp.yandex.ru"] port=587 user=any@i.ua password=pass start-tls=yes to="any@i.net.ua" from=any@net.ua subject="Mikrotik" body="$body1"; /system scheduler disable schedule_cpu} else={}

Можно отправлять одному и тому же адресату(отправитель=получатель), можно отправлять на услугу "смс с e-mail".
 Скрипт при удачном выполнении сам себя выключает, включить его можно вручную или другим скриптом.

Traffic Monitor не зависящий от пиковых нагрузок.

# Watch interface
:local interface "WAN"
/interface monitor [/interface find name=$interface] once do={
:global txbps1 $("tx-bits-per-second");
:global rxbps1 $("rx-bits-per-second");
}
:delay 60
/interface monitor [/interface find name=$interface] once do={
:global txbps2 $("tx-bits-per-second");
:global rxbps2 $("rx-bits-per-second");
}
:global rxbps1
:global rxbps2
if ((($rxbps1) >= 10000000) and (($rxbps2) >= (10000000))) do={/system script run mario} else={:log info "vse ok"}
:delay 60 - задержка в секундах между попытками
10000000 maximum response script( bits per second), другими словами 10 мегабит!

script to the scheduler for 10 seconds 

Проверка активности маршрута

Проверка активности маршрута, если активен включаем другой маршрут, не активен - выключаем:
{local status [ip route get value-name=active [find comment=cerez_velton]]if ($status=true) do={/ip route enable [find comment=MainGW]} else={/ip route disable [find comment=MainGW]}}

пятница, 17 апреля 2015 г.

Удаляем ip-адрес, пишем в log.

Удаляем ip:
/ip address remove [find network=23.23.23.23]
Пишем в лог:
BLACK
 log info "blah blah this log is in black"
BLUE 
 log warning "blah blah this log is in blue"
RED
 log error "blah blah this log is in red"

Передаем адрес-лист с одного Mikrotik на другой.

Создаем на своем ПК пустой файл list.txt. Перетаскиваем его в свой микротик.(это нужно сделать единоразово). Потом запускаешь скрипт:
:global iplist;
 :foreach i in=[/ip firewall address-list find where list=test] do={ :set iplist ($iplist . "\r\n" . [/ip firewall address-list get  $i address])};
 /file set [/file find name=list.txt] contents="$iplist";
 delay 4;
 /tool fetch mode=ftp upload=yes address=0.0.0.0 port=2121 user=admin password=admin ascii=yes src-path=list.txt dst-path=list.txt
 delay 6;
 :set iplist;
 /file remove list.txt;
 /file print file=list.txt;
 delay 6;
 /file set list.txt contents=""
  Вместо  :global iplist; можно использовать локальную переменную, тогда очищать ее каждый раз не надо, строчка :set iplist; не нужна!
  Его в шедуллер! Этот скрипт  передаст файл на другой микротик с нужными данными(в нужном формате!), очистит переменную, перезапишет файл list.txt с пустым значением(т.е. все подготовит для следующего выполнения).

  На принимающей стороне:
:if ( [/file get [/file find name=list.txt] size] > 0 ) do={
     /ip firewall address-list remove [/ip firewall address-list find list=suspendedaccts]
     :local content [/file get [/file find name=list.txt] contents] ;
     :local contentLen [ :len $content ] ;
     :put ( "=>" . $content . "<=" )
     :local lineEnd 1
     :local line ""
     :local lastEnd [ :tonum 1 ]


     :do {
       :set line [ :pick $content $lastEnd [ :find $content "\r\n" $lastEnd ] ]
       :set lineEnd [:find $content "\n" $lastEnd ] ;
       :put "lineEnd=$lineEnd< - lastEnd=$lastEnd - line=$line<"
     :if ( [ :len $content ] = 0 ) do={
       :put "UNIX"
       :set line [ :pick $content $lastEnd [ :find $content "\r\n" $lastEnd ] ]
        :set lineEnd [:find $content "\n" $lastEnd ] ;
     }
       :set lastEnd ( $lineEnd + 1 ) ;

       :if ( [:pick $line 0 1] != "\n" ) do={
       :put ">$line<"
         :if ( [:len $line ] > 0 ) do={ /ip firewall address-list add list=suspendedaccts address=$line }
       }
     } while ($lineEnd < $contentLen)
   }
 :local lineEnd 1 и  :local lastEnd [ :tonum 1 ] ставим 1, потому-как файл  list.txt с первой пустой строчкой. Такой файл получается после отработки первого скрипта.
  

Копируем лог

  Скопировать можно только в терминале:
/log print. 
Так же можно вывести в файл, для этого используйте команду:
/log print file=log

Удаляем global variable.

Удаляем global variable:
:set backupfile;

Starting with v6.2 you can unset global variables:

Code: Select all
[admin@pe0] /system> :global aa 1
[admin@pe0] /system> :environment print
aa=1
[admin@pe0] /system> :set aa
[admin@pe0] /system> :environment print
[admin@pe0] /system>