суббота, 30 мая 2015 г.

Список изменений.

Описание текущих изменений в новых версиях RouterOS(+rc)

RouterBOOT changelog (изменения в boot-версиях загрузчика RouterOS)

RouterOS ChangeLog

What’s new in 6.28 (2015-Apr-15 15:18):

*) email – increase server greeting timeout to 60s;
 *) lte – ZTE MF823 may loose configuration;
 *) userman – update paypal root certificate;
 *) timezone – updated timezone information to 2015b release;
 *) cm2 – fixed capsman v2 100% CPU and other stability improvements;
 *) route – using ldp could cause connected routes with
 invalid interface nexthop;
 *) added support for SiS 190/191 PCI Ethernet adapter;
 *) made metarouter work on boards with 802.11ac support or usb LTE;
 *) sstp server – allow ADH only when no certificate set;
 *) make fat32 disk formatting support disks bigger than 134GiB;
 *) fixed tunnels – could crash when clamp-tcp-mss was enabled;
 *) added basic counters for ipv4/bridge fast path, also show status wether fast
 path is active at all;
 *) trafflow: – fixed crash on disable;
 *) pppoe over eoip – fixed crash with large packets;
 *) tilegx – fixed memory leak when queue settings are changed;
 *) ar9888 – fixed crash when hw reports invalid rate;
 *) console – fixed “in” operator in console;
 *) console – make “/system package update print” work again.
 *) tile – rare situation when CCR devices failed to auto-negotiate ethernet link (introduced in v6.25);
 *) dhcpv4 client – it is now possible to unset default clientid and hostname options
 *) initial RoMon (Router Management Overlay Network) support added.

четверг, 21 мая 2015 г.

IT Config: Защита от DoS атак на роутерах Mikrotik и Router ...

IT Config: Защита от DoS атак на роутерах Mikrotik и Router ...: DoS (отказ в обслуживании) атаки могут привести к перегрузке маршрутизатора. Это означает, что загрузка процессора возрастает до 100%, а м...

четверг, 14 мая 2015 г.

Время на роутере после перезагрузки, без использования NTP.

Так как в роутерах Mikrotik по неизвестной причине не используются внутренние батарейки для поддержания часов, после выключения время сбрасывается на 1970 год. Если есть интернет и настроен NTP или Cloud то в течении 3 секунд после загрузки время синхронизируется и время восстанавливается. Но бывает что в этот момент интернет не доступен, тогда время показывается неправильно. Лично у меня не сработал скрипт, который настроен на срабатывания каждые 40 секунд, но после перезагрузки сбилось время и по неизвестной причине время следующего срабатывания установилось аж через несколько часов. Что бы этого избежать и последствия хоть как-то минимизировать можно использовать скрипты:
fixclock
/system clock set date=[/user get date comment]
/system clock set time=[/user get time comment]

setclockfix
:if ([:pick [/system clock get date] 7 30]>=[:pick [/user get date comment] 7 30]) do={
/user set date comment=[/system clock get date]
/user set time comment=[/system clock get time]}
/system scheduler
add comment="" disabled=no interval=0s name=fixclock on-event=fixclock policy=write,test start-time=startup
add comment="" disabled=no interval=10s name=setclockfix on-event=setclockfix policy=write,test start-date=jan/01/1970 start-time=00:00:00 
/user
add address=1.1.1.1/32 disabled=yes group=read name=date
add address=1.1.1.1/32 disabled=yes group=read name=time 
Изначально в комменты юзерам нужно поставить дату и время, что б скрипт сравнения сработал. Используем поле комментарий юзера из-за того, что глобальные переменные при перезагрузке тоже очищаются.

Офф. форум по этому вопросу.

Failover Mikrotik.

  Мой вариант Failover на Mikrotik проверенный временем. Для двух каналов интернет. IP от провайдеров получаем по DHCP. Канал velton считаем главный, dsl второстепенный. Маршруты (основной шлюз) прописываем ручками.
  Для начала на каждый канал нужно создать по два маршрута:
/ip route
add comment=Ukrtel_mark distance=1 gateway=X.X.X.X routing-mark=dsl
add comment=Velton_mark distance=1 gateway=Y.Y.Y.Y routing-mark=velton
add comment=Velton distance=1 gateway=Y.Y.Y.Y
add comment=Ukrtel distance=2 gateway=X.X.X.X
  Это нужно что б при отвале главного маршрута мы могли проверять доступность интернета на интерфейсе через промаркированный маршрут. Обращаем внимание на метрику!!! Этим определяется какой маршрут приоритетный. Теория такова, мы всегда проверяем только главный канал, если он не активный, то переключаем всех на резервный. Резервный на работоспособность не проверяем, т.к. если не работает не тот не тот, то смысла переключать нет. Пингуем 3 попытками 3 хоста: ya.ru, www.ua, 8.8.8.8, если два первых невозможно отрезольвить то подставляем другие айпи:  77.88.8.8, 208.67.222.222.
interface=ether1-velton можно не указывать, например тогда, когда у нас isp провайдер дает инет по pppoe и при отвале этого интерфейса микротик не может пингануть и скрипт вываливается в ошибку. В таком случаем используем строчку для пинга без указания интерфейса (interface=ether1-velton убрать с скрипта во всех повторениях). Так же в начале мы проверяем статус главного маршрута, это нужно для того, что б после того как инет на главном isp пропал скрипт, который первый раз уже переключил микротик на резервный канал не пытался сделать это заново и не засорял лог.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#   23q
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:local status [ip route get value-name=active [find comment=Velton]];
:local PingCount 3;
:local PingResult1;
:local PingResult2;
:local PingResult3;
# yandex dns
:local PingTarget1reserv 77.88.8.8;
:local PingTarget1serv false;
:local PingTarget1;
:set $PingTarget1 [:pick [:do {:resolve ya.ru} on-error={:set PingTarget1serv true}] 1];
# OpenDNS
:local PingTarget2reserv 208.67.222.222;
:local PingTarget2serv false;
:local PingTarget2;
:set $PingTarget2 [:pick [:do {:resolve www.ua} on-error={:set PingTarget2serv true}] 1];
# Google Public DNS
:local PingTarget3 8.8.8.8;
if ($PingTarget1serv =  true) do={:set PingResult1 [/ping $PingTarget1reserv count=$PingCount interface=ether1-velton routing-table=velton]} else={:set PingResult1 [/ping $PingTarget1 count=$PingCount interface=ether1-velton routing-table=velton]};
if ($PingTarget2serv =  true) do={:set PingResult2 [/ping $PingTarget2reserv count=$PingCount interface=ether1-velton routing-table=velton]} else={:set PingResult2 [/ping $PingTarget2 count=$PingCount interface=ether1-velton routing-table=velton]};
:set $PingResult3 [/ping $PingTarget3 count=$PingCount interface=ether1-velton routing-table=velton];
:if (($PingResult1 + $PingResult2 + $PingResult3) >= (2 * $PingCount)) do={ if ($status=true) do={} else={/ip route enable [find comment=Velton]}}  else={ if ($status=true) do={/ip route disable [find comment=Velton]} else={}}
   В скрипт между попытками можно добавить задержки. Так же при переключении можно сбрасывать коннекшены, как это сделать читайте тут. Ну и этот скрипт у меня отрабатываем каждый 40 секунд. Если добавляем задержки между попытками то корректируем время в Scheduler.

Очистить лог-журнал.

Иногда нужно очистить лог  Mikrotik. Напрямую это сделать нельзя, но можно выполнить команду очистки:
/system logging action set memory memory-lines=1;
/system logging action set memory memory-lines=1000;
Данные в скрипте подправить в зависимости куда пишется журнал (в оперативку или на диск), и какое количество строк в журнале. 

пятница, 8 мая 2015 г.

:len считаем количество символов.

:put [:len "length=8"];
 :if ($lenPass = 8) do={}

четверг, 7 мая 2015 г.

Вычисляем размер файла, если превышает 3000 байт выполняем действие.

:global size;
:set $size [/file get value-name=size [find name=hotusers.txt]];
if ($size > 3000) do={log info 1} 

If если.

:if ($"current-vpn-ip" != $"new-vpn-ip") do={ /interface l2tp-client set [find name=$"vpn-interface-name"] connect-to=$"new-vpn-ip"}

Find поиск.

/ip f a remove [find comment=ntp];

Edit редактирование.

из терминала:
/system script edit awesome_script source

из скрипта:
/system script set awesome_script source="#### Blah\rblah blah"

Export, import всех параметров.

export compact
export compact file=1
Команда  export compact с 6 ветки ОС соответствует команде export. Что-бы сделать полный экспорт всех настроек (и дефолтных) можно воспользоваться командой export verbose.

Print выводит значения (в терминал или в файл).

in et  print

Set присваивает значение.

/system ntp client set primary-ntp=[:resolve "0.ua.pool.ntp.org"]; 

Enable, disable включение, отключение.

in et en ether5 

Remove удаление.

/ip f a remove [find comment=ntp];

Вывести значение параметра в переменную.

Выводим размер файла
:global 23 [/file get value-name=size [find name=hotusers.txt]];

Выводим все команды в переменную 23 применимые для данного файла:
:global 23 [/file get [find name=hotusers.txt]];
Еще примеры:
:global dnsDyndns [/ip dns static get value-name=address [find name=checkip.dyndns.org]];
:local status [ip route get value-name=active [find comment=Optinet]] 

Записываем в переменную текст с кавычками.

Должно получится:
 > put $1
WshShell.SendKeys "{ENTER}"
WScript.Sleep 500
WshShell.SendKeys "reboot"
WshShell.SendKeys "{ENTER}"
WScript.Sleep 2000
WshShell.SendKeys "exit"
Если выполнить
global 1 WshShell.SendKeys "{ENTER}" WScript.Sleep 500 WshShell.SendKeys "reboot" WshShell.SendKeys "{ENTER}" WScript.Sleep 2000 WshShell.SendKeys "exit"
Кавычки будут мешать записать переменную, нужно писать так:
:global 1 "WshShell.SendKeys \"{ENTER}\" \r\nWScript.Sleep 500 \r\nWshShell.SendKeys \"reboot\" \r\nWshShell.SendKeys \"{ENTER}\" \r\nWScript.Sleep 2000 \r\nWshShell.SendKeys \"exit\""
Вот некоторые примеры:
 \" Insert double quote
\\ Insert backslash
\n Insert newline
\r Insert carriage return
\t Insert horizontal tab
\$ Output $ character. Otherwise $ is used to link variable.
\? Output ? character. Otherwise ? is used to print "help" in console.
\_  - space
\a  - BEL (0x07)
\b  - backspace (0x08)
\f  - form feed (0xFF)
\v Insert vertical tab
\xx Print character from hex value. Hex number should use capital letters.
Источник: http://wiki.mikrotik.com/wiki/Manual:Scripting

Add создает значение.

/ip f a a list=ntp address=$pntp comment=ntp; 

Get присвает значение переменной.

:local "pntp" [system ntp client get primary-ntp]

Вывести значение на экран(в терминал).

:put [:resolve "0.ua.pool.ntp.org"] 

Записываем IP без маски.

:global ip;
global ip2 [/ip address get value-name=address [find interface=Lancity]];
:set ip [:pick $ip2 0 [:find $ip2 "/"]]; 

В зависимости от заданного промежутка времени в часах выполняем действие.

:local hour [: pick [/system clock get time] 0 2]
:if ($hour >= 8 and $hour <= 21)  do={} else={}

MAC-адрес с ARP.

/ip arp get [/ip arp find address=$ip] mac-address 

Ограничиваем клиента по трафику в зависимости от скачанных байт.

:if ([/queue simple get bocea total-bytes]>1000000000) do=[/queue simple set bocea max-limit=12000000/18000000] else=[/queue simple set bocea max-limit=12000000/18000000]  

Вывести pass c ppp в терминал.

:put [ppp secret get number=0 password] 

Отправка самовыполняющегося скрипта.

/tool fetch mode=ftp upload=yes address=1.1.1.1 port=21 user=1 password=1 ascii=yes src-path=1.txt dst-path=1.auto.rsc

Всем в queue simple поставить 60M/60M.

:local name; :local all ([/queue simple print count-only] -1); :for y from=0 to=$all do={:set name [/que s get number=$y name]; /queue simple set [find name="$name"] max-limit=”60M/60M”

Проверка существования файла по имени.

:global file [file find name=console-dump.txt]
:if ($file != "") do={
 log info TRUE;
} else={
log info FALSE;
}
http://forummikrotik.ru/viewtopic.php?f=1&t=4698 

среда, 6 мая 2015 г.

Выводим параметры беспроводного интерфейса в файл, если файл больше 4096 байт записываем данные в следующий файл (wireless-interface1, wireless-interface2, etc...)

# Do not include '.rsc', it is appended automatically
:local filename "wireless-interface"
# Internal processing below...
# ----------------------------------
:local line
:local contents
:local fileindex 1
:local findindex
:local property
:local value
/interface wireless {
   :set contents "/interface wireless\n"
# loop through wireless interfaces, getting their advanced (plus basic) settings
   :foreach r in=[print advanced as-value] do={
      :set line ""
      :foreach i in=[:toarray $r] do={
         :set findindex [:find [:tostr $i] "="]
         :set property [:pick [:tostr $i] 0 $findindex]
         :set value [:pick [:tostr $i] ($findindex + 1) [:len [:tostr $i]]]
#      do not include '.id' property, it will be different on other routers
#      do not include interface-'type' property, it is read-only
         :if ([:tostr $property] = ".id" || \
               [:tostr $property] = "interface-type") do={
            :set property ""
            :set value ""
         }
#      put quotes around comment property
#      put quotes around value if it contains spaces
         :if ([:tostr $property] = "comment" || \
               [:len [:find [:tostr $value] " "]] > 0) do={
            :set value ("\"" . $value . "\"")
         }
#      append property=value to line
         :if ([:len $property] > 0 && [:len $value] > 0) do={
#         use [find] with mac-address (easier import to other routers)
            :if ([:tostr $property] = "mac-address") do={
               :set line ("[find mac-address=\"" . $value . "\"]" . " " . [:tostr $line])
            } else={
               :set line ([:tostr $line] . $property . "=" . $value . " ")
            }
         }
#   end foreach i
      }
      :set line ("set " . [:tostr $line] . "\n")
#   if contents + line is over filesize limit, write out to file
      :if (([:len [:tostr $contents]] + [:len [:tostr $line]]) > 4096) do={
         /system identity export file=($filename . $fileindex)
#      wait for file to appear (this is needed)
         :while ([:len [/file find name=($filename . $fileindex . ".rsc")]] = 0) do={}
         /file set ($filename . $fileindex . ".rsc") contents=[:tostr $contents]
         :set contents "/interface wireless\n"
         :set fileindex ($fileindex + 1)
      }
#   append line to contents
      :set contents ([:tostr $contents] . [:tostr $line])
   }
# write remaining contents
   :if ([:len $contents] > 0) do={
      /system identity export file=($filename . $fileindex)
#   wait for file to appear (this is needed)
      :while ([:len [/file find name=($filename . $fileindex . ".rsc")]] = 0) do={}
      /file set ($filename . $fileindex . ".rsc") contents=[:tostr $contents]
   }
# /interface wireless
}
Взято с http://forum.mikrotik.com/viewtopic.php?t=40830