Друзья, поздравляю Вас с наступающим Новым Годом!
Новогодняя песенка для моделей у которых есть beeper:
system routerboard settings set force-backup-booter=yesС обновлением RouterOS периодически прилетают обновления загрузчика на разные модели маршрутизаторов. При чем по-умолчанию они не устанавливаются, обновлять нужно вручную через меню, нажав "Upgrade".
COM-порт CCR1009-8G-1S-1S+PC. |
RJ45 type serial port RB2011UAS-2HnD |
/system script job remove [find script=script25]Более правильный вариант, с обработчиком ошибок:
Хотя первый скрипт срабатываем отлично, и не валится в ошибку если в "system script job" script25 нет, я бы рекомендовал использовать второй вариант, особенно, если данная часть кода входит в длинный скрипт. В этом случае, работает или нет в данный момент скрипт с именем "script25", выполнения кода продолжится, и в лог напишет "33".
:do {/system script job remove [find script=script25]} on-error={}
log info 33
Стандартный редактор скриптов RouterOS. |
Редактор Sublime Text + Package MikrotikScript. |
Android 76.60%Итак, для того, что-бы скачать и установить Tik App нужно подать заявку на тестирование. Это можно сделать по ссылке:
iOS 19.70%
Windows phone 2.80%
Blackberry 0.40%
Symbian 0.00%
Ubuntu 0.00%
Others 0.50%
global market share in percent, IDC, 2014 Q4
Коммутация через Master Port. |
/tool romon |
123.com@192.168.0.2Настраиваем наш прокси-сервер:
abc.com@192.168.0.3
456.com@192.168.0.4
/ip web-proxy
set enabled=yes src-address=0.0.0.0 port=8080 hostname="your.proxy" \
transparent-proxy=yes parent-proxy=0.0.0.0:0 \
cache-administrator="webmaster" max-object-size=4096KiB cache-drive=system \
max-cache-size=unlimited max-ram-cache-size=unlimited
/ip web-proxy access
add dst-port=23-25 action=deny comment="block telnet & spam e-mail relaying" \
disabled=no
add dst-port=80 action=allow comment="Enable Http Connection" disabled=no
TTL Операционная система
54 FreeBSD / BSD
64 Linux
128 Windows
255 Cisco / Solaris
В IPv4 TTL представляет собой восьмиразрядное поле IP-заголовка.
Определяет максимальное количество хопов (hop, то есть прыжок, участок между маршрутизаторами), которые пакет может пройти. Наличие этого параметра не позволяет пакету бесконечно ходить по сети. Каждый маршрутизатор, при маршрутизации должен уменьшать значение TTL на единицу, но некоторые шлюзы можно настроить, чтобы игнорировать это. Пакеты, не достигшие адресата, но время жизни которых стало равно нулю, уничтожаются, а отправителю посылается сообщение ICMP Time Exceeded. Если требуется, чтобы пакет не был маршрутизирован (то есть принят только в своём сегменте), то выставляется TTL=1. На отправке пакетов с разным временем жизни основана трассировка их пути прохождения (traceroute). Максимальное значение TTL=255. Обычное начальное значение TTL=64 (зависит от ОС).
/ip firewall mangle add action=change-ttl chain=prerouting new-ttl=increment:1 passthrough=yes
option dhcp-client-identifier 43:4c:49:45:54:2d:46:4f:4f;Параметр является строкой NVT ASCII, заключенной в двойные кавычки(option dhcp-client-identifier "CLIET-FOO"), или последовательность октетов в шестнадцатеричном формате, разделенных двоеточиями. Нам подходит второй вариант. В любом HEX-переводчике переводим нужный нам идентификатор, например CLIET-FOO - 43 4c 49 45 54 2d 46 4f 4f, и записывает значение через двоеточие.
Ctrl+Tab - переключение между вкладками в окне, между окнами которые не имеют вкладок;
Ctrl+F6 - переключение между вкладками вперед;
Ctrl+Shift+F6 переключение между вкладками назад;
SHIFT+INSERT = Ctrl+V - вставить (в полях ввода текста);
CTRL+INSERT = Ctrl+C - копировать (в полях ввода текста);
SHIFT+DELETE = Ctrl + X - вырезать (в полях ввода текста);
Ctrl+M - добавить комментарий;
Ins - создать;
Del - удалить;
Ctrl+F - поиск(сочетание работает с любого места экрана, ставит курсор в поле поиска активной вкладки);
Ctrl+G - поиск далее;
Tab, стрелка вверх, стрелка вправо, стрелка влево, стрелка вниз - перемещение между элементами в окне;
Ctrl+A - выбрать все;
Ctrl+E - включить;
Ctrl+D - выключить.
add action=mark-routing chain=prerouting comment="9 na wan2" disabled=yes \С перенаправлением в указанный маршрут
new-routing-mark=markName src-address=192.168.0.12
/ip route
add comment=wan2_mark distance=1 gateway=1.1.1.1 routing-mark=markName
/ip route add gateway=1.1.1.1 routing-mark=markNameвоспользуемся route rule:
/ip route rule add src-address=192.168.0.12 action=lookup-only-in-table table=markNmae
[admin@mikrotik] /ip firewall mangle> printПравило 0
Flags: X - disabled, I - invalid, D - dynamic
0 chain=input action=mark-connection new-connection-mark=ISP 1 -> Input passthrough=no dst-address=172.25.25.247 in-interface=ether1
1 chain=output action=mark-routing new-routing-mark=ISP 1 passthrough=no connection-mark=ISP 1 -> Input
2 chain=input action=mark-connection new-connection-mark=ISP 2 -> Input passthrough=no dst-address=192.168.99.2 in-interface=ether2
3 chain=output action=mark-routing new-routing-mark=ISP 2 passthrough=no connection-mark=ISP 2 -> Input
4 chain=input action=mark-connection new-connection-mark=ISP 3 -> Input passthrough=no dst-address=192.168.100.2 in-interface=ether3
5 chain=output action=mark-routing new-routing-mark=ISP 3 passthrough=no connection-mark=ISP 3 -> Input
add comment=ISP1_mark distance=1 gateway=192.168.111.1 routing-mark=ISP 1где gateway - шлюз по-умолчанию вашего провайдера.
add comment=ISP2_mark distance=1 gateway=82.117.240.1 routing-mark=ISP 2
Есть микротик, в нем 2 бриджа и один ван:Это нужно для того, что бы разделить общественную(192.168.36.0/24) и домашнюю сеть(192.168.25.0/24) в небольшой локальной домовой сети. Но так как администратор сети сидит в 192.168.25.0/24 он должен иметь возможность подключатся к общественной сети, в то же время люди с общественной сети не должны получать доступ к домашним устройствам администратора.
1 бридж: 2 и 3 порт (192.168.25.0/24)
2 бридж: 4 и 5 порт (192.168.36.0/24)
ван 1 порт.
У одной сети и у второй есть инет через ван. Нужно сделать что б доступ с 192.168.25.0/24 на 192.168.36.0/24 был, а наоборот не был. Типа так, как будто к микротику во второй бридж подключил роутер и на нем за натом спрятал подсеть.
/ip firewall natДля общественной сети натятся пакеты только на ван интерфейс. Для локальной - на все интерфейсы.
add action=masquerade chain=srcnat out-interface=ether1 src-address=192.168.36.0/24
add action=masquerade chain=srcnat src-address=192.168.25.0/24
/ip firewall mangleпомечаем пакеты с общественной подсети
chain=prerouting action=mark-connection new-connection-mark=36
passthrough=yes dst-address=192.168.25.0/24 in-interface=bridge2 log=no
log-prefix=""
/ip firewall filterи баним их. И второй вариант проще:
chain=forward action=drop connection-mark=36 log=no log-prefix=""
/ip firewall filterПросто баним все новые пакеты, которые идут с общественной подсети, пакеты установившиеся пропускаем, а все пакеты с домашней подсети считаются установившимися так как прошли через правило ната.
add action=drop chain=forward connection-state=new dst-address=192.168.25.0/24 src-address=192.168.36.0/24
Каждое из сетевых соединений Mikrotik относит к одному из 4 состояний:спасибо форуму.
New – Новое соединение. Пакет, открывающий новое соединение, никак не связанное с уже имеющимися сетевыми соединениями, обрабатываемыми в данный момент маршрутизатором.
Established – Существующее соединение. Пакет относится у уже установленному соединению, обрабатываемому в данный момент маршрутизатором.
Related – Связанное соединение. Пакет, который связан с существующим соединением, но не является его частью. Например, пакет, который начинает соединение передачи данных в FTP-сессии (он будет связан с управляющим соединением FTP), или пакет ICMP, содержащий ошибку, отправляемый в ответ на другое соединение.
Invalid – Маршрутизатор не может соотнести пакет ни с одним из вышеперечисленных состояний соединения.
:put [/ip firewall address-list get value-name=list [find address=192.168.x.x]]
:global nameADR23;Создаются две глобальные переменные. Потом проверяется наличие некого списка адресов в address-list, если его нет, он создается с нужным вам таймаутом(в примере 1 минута). При следующем запуске скрипта, он проверит наличие этого адрес-листа, если он еще есть(время не прошло), просто запишет в переменную nameADR23 имя адрес-листа(timer23), но если время истечет, адрес-лист удалится, извлечь имя его мы не сможем, и если это будет не первый запуск(который непосредственно создает адрес лист) то мы считаем что 1 минута прошла, и выполняем действие log info 146, и очищаем наши переменные(set $perviy23 ""; set $nameADR23 ""). Вот такой работоспособный скрипт (версия 6.18).
:global perviy23;
:do {:global nameADR23 [/ip firewall address-list get value-name=list [find address=12.12.12.12]]} on-error={:if ($perviy23=true) do={set $perviy23 ""; set $nameADR23 ""; log info 146} else={:set nameADR23 ""; /ip firewall address-list add dynamic=yes address=12.12.12.12 list=timer23 timeout=0:01:00; set $perviy23 true}};
/system script> print from=<your script name>которая подсветит ваши ошибки скрипта в терминале.
*) winbox - allow to specify dns name in all the tunnels;Можно указывать днс-имя mail-сервера. Долой резольв в скриптах!
*) winbox - allow to enter dns name in email server;
*) email - allow server to be specified as fqdn which is resolved on each send;
*) ppp - added on-up & on-down scripts to ppp profile
:local fnArray;Все скрипты которые у вас есть и начинаются с "Function." появятся в виде глобальный переменных с тем же названием. Дальше их можно использовать как функции.
:foreach f in=[/system script find where name~"^Function.*"] do={:set fnArray ($fnArray.",".[/system script get $f name])};
:set fnArray [:toarray $fnArray];
:foreach f in=$fnArray do={:exec script=":global \"$f\" [:parse [/system script get $f source]]"; /log info ("Defined function ".$f);};
:put $Function.1
Output:
log info 1
#define function and run itТаким образом можно сократить количество строк в коде. Например функцию можно использовать в таком куске кода:
:global myFunc do={:put "hello from function"}
$myFunc
output:
hello from function
:if ($lenPass = 8) do={:log warning "WiFi password s random.org: $newPassword"; $myFunc}Он выполнит запись в лог, а потом все команды которые записаны в функции $myFunc.
:global myFunc do={ :return ($a + $b)}Так же можно передать существующий скрипт в функцию:
:put [$myFunc a=6 b=2]
output:
8
#add script
/system script add name=myScript source=":put \"Hello $myVar !\""
:global myFunc [:parse [/system script get myScript source]]
$myFunc myVar=world
output:
Hello world !
/tool fetch url="https://www.random.org/passwords/\?num=1&len=8&format=plain&rnd=new" keep-result=yes dst-path="pass.txt";Если по какой-то причине www.random.org будет недоступен, то скрипт не продолжит работу, а завершится с ошибкой. Что-бы он продолжил работу нужно добавить обработчик:
log info 1;
:do {/tool fetch url="https://www.random.org/passwords/\?num=1&len=8&format=plain&rnd=new" keep-result=yes dst-path="pass.txt"} on-error={:log warning "random.org not generator"};В таком случае скрипт продолжит работу.
log info 1;
:do {http://wiki.mikrotik.com/wiki/Manual:Scripting
:put [:resolve www.example.com];
} on-error={ :put "resolver failed"};
:put "lala"
output:
resolver failed
lala
foreach i in=[/ip dhcp-server lease find] do={
:if ([:len [/ip dhcp-server lease get $i host-name]] = 0) do={
/ip dhcp-server lease remove $i;
}
}
:global RandomOrg "";Данный скрипт записывает сгенерированный пароль и 8 символов в переменную, если сервис не доступен - переменная будет пустая.
/tool fetch url="https://www.random.org/passwords/\?num=1&len=8&format=plain&rnd=new" keep-result=yes dst-path="pass.txt";
delay 3;
:global RandomOrg [/file get pass.txt contents];
/file remove pass.txt;
:local firmware [ /system routerboard get current-firmware ];
:local routeros [ /system resource get version ];
:local routername [ /system identity get name ];
:local licenselevel [ /system license get nlevel ];
:local architecture [ /system resource get architecture-name ];
:local boardname [ /system resource get board-name ];
/tool e-mail send to=email@here subject="Current RouterOs" body=("Router name: $routername\nFirmware: $firmware\nRouterOS: $routeros\nLicence level: $licenselevel\nBoard name: $boardname\nArchitecture: $architecture\n\n " );
:global inter;
/interface ppp-client monitor ppp-intertelekom once do={:set inter $"local-address"};
/file remove [find name=inter.txt];
delay 2;
/file print file=inter.txt;
delay 2;
/file set inter.txt contents=":global interNaVYB $inter";
delay 1;
/tool fetch mode=ftp upload=yes address=1.1.1.1 port=30 user=admin password=admin ascii=no src-path=inter.txt dst-path=inter.auto.rsc
/tool fetch address=127.0.0.1 src-path=someDummyFile user=admin password=admin mode=ftp dst-path=newDir/newFileName;Для того что-бы это работало нужно что б сервис ftp работал, если в скрипте не указывать порт, то он должен быть стандартным. Пользователь должен иметь доступ к ftp. newDir - название новой пустой диретории.
:local $ip "1.1.1.1/32"и покороче
:for i from=([:len $ip] - 1) to=0 do={
:if ([:pick $ip $i] = "/" ) do={
:set ip [:pick $ip 0 $i]
}
}
:local s "1.1.1.1/24";
:put [:pick $s 0 [:find $s "/"]]
:if ([:len [system script job find script ="script23"]] > 1) do={} else={log info svoboden}Этот скрипт называется "script23". При запуске он проверяет выполняется ли он в данный момент(проверяет по своему имени). Если выполняется-то он ничего не делает и завершается, если не выполняется, то выполняет действие "log info svoboden". Этот оборот используется например в данном скрипте. Для чего это нужно. Например скрипт может входить в бесконечный цикл(например пока не подключится к нужной сети wifi), но запускается он по шедуллеру, что б не было дубликатов нужна такая проверка. В таком случае ставим время повторения в шедуллере 1 минута, и пока не завершится скрипт, он заново не стартанет.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 23q RouterOS v.6.18-6.28
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 0) kidaem v sheduller na 1 minutu
# 1) proverit' nazvanie scripta "wifi_connect"
# 2) proverit' vremja dozvona na glavnuy tochku "TimeProverkaGlav" 3600
# 3) proverit' nazvanie wlan interfeisa - "wlan1"
# 4) proverit' nastroiki wlan i schifrovaniya
# 5) proverit' nastroiki dhcp-client na wlan
:if ([:len [system script job find script ="wifi_connect"]] > 1) do={} else={
# SSID glavnogo ineta
:local SSIDglav 52;
# Pass glavnogo ineta
#:local SSIDglavpass 2323wifi;
# SSID rezervnogo ineta
:local SSIDrezerv 3G;
# Pass rezervnogo ineta
:local SSIDrezervpass 12345678;
# Zaderchka mechdu popitkami pereklucheniya na glavniy inet
:local TimeProverkaGlav 3600;
:local SSID [/interface wireless get value-name=ssid number=0];
:local PingCount 3;
# YandexDNS
:local PingTarget1 77.88.8.8;
# OpenDNS
:local PingTarget2 208.67.222.222;
# GoogleDNS
:local PingTarget3 8.8.8.8;
:if ($SSID=$SSIDglav) do={
:local PingResult1 [/ping $PingTarget1 count=$PingCount];
:local PingResult2 [/ping $PingTarget2 count=$PingCount];
:local PingResult3 [/ping $PingTarget3 count=$PingCount];
:if (($PingResult1 + $PingResult2 + $PingResult3) >= (2 * $PingCount)) do={} else={
/interface wireless set [ find default-name=wlan1 ] band=2ghz-b/g/n disabled=no distance=indoors l2mtu=2290 ssid=$SSIDrezerv wireless-protocol=802.11;
/interface wireless security-profiles set [ find default=yes ] authentication-types=wpa2-psk eap-methods="" mode=dynamic-keys supplicant-identity=MikroTik wpa-pre-shared-key=$SSIDrezervpass wpa2-pre-shared-key=$SSIDrezervpass; :delay 7;
/ip dhcp-client disable [find interface=wlan1];
:delay 3;
/ip dhcp-client enable [find interface=wlan1];
:delay 10;
:local PingResult11 [/ping $PingTarget1 count=$PingCount];
:local PingResult21 [/ping $PingTarget2 count=$PingCount];
:local PingResult31 [/ping $PingTarget3 count=$PingCount];
:if (($PingResult11 + $PingResult21 + $PingResult31) >= (2 * $PingCount)) do={:log info "WiFi $SSIDrezerv active"} else={
:local GLAVworking false;
:local REZERVworking false;
:while ($GLAVworking!=true and $REZERVworking!=true) do={
/interface wireless set [ find default-name=wlan1 ] band=2ghz-b/g/n disabled=no distance=indoors frequency=2462 l2mtu=2290 ssid=$SSIDglav wireless-protocol=802.11;
/interface wireless security-profiles set [ find default=yes ] mode=none;
:delay 7;
/ip dhcp-client disable [find interface=wlan1];
:delay 3;
/ip dhcp-client enable [find interface=wlan1];
:delay 10;
:local PingResultzikl1 [/ping $PingTarget1 count=$PingCount];
:local PingResultzikl2 [/ping $PingTarget2 count=$PingCount];
:local PingResultzikl3 [/ping $PingTarget3 count=$PingCount];
:if (($PingResultzikl1 + $PingResultzikl2 + $PingResultzikl3) >= 6) do={:set GLAVworking true};
/interface wireless set [ find default-name=wlan1 ] band=2ghz-b/g/n disabled=no distance=indoors l2mtu=2290 ssid=$SSIDrezerv wireless-protocol=802.11;
/interface wireless security-profiles set [ find default=yes ] authentication-types=wpa2-psk eap-methods="" mode=dynamic-keys supplicant-identity=MikroTik wpa-pre-shared-key=$SSIDrezervpass wpa2-pre-shared-key=$SSIDrezervpass;
:delay 7;
/ip dhcp-client disable [find interface=wlan1];
:delay 3;
/ip dhcp-client enable [find interface=wlan1];
:delay 10;
:local PingResultzikl11 [/ping $PingTarget1 count=$PingCount];
:local PingResultzikl22 [/ping $PingTarget2 count=$PingCount];
:local PingResultzikl33 [/ping $PingTarget3 count=$PingCount];
:if (($PingResultzikl11 + $PingResultzikl22 + $PingResultzikl33) >= 6) do={:set REZERVworking true}};
if ($GLAVworking=true) do={
/interface wireless set [ find default-name=wlan1 ] band=2ghz-b/g/n disabled=no distance=indoors frequency=2462 l2mtu=2290 ssid=$SSIDglav wireless-protocol=802.11;
/interface wireless security-profiles set [ find default=yes ] mode=none;
:delay 7;
/ip dhcp-client disable [find interface=wlan1];
:delay 3;
/ip dhcp-client enable [find interface=wlan1]} else={:log info "WiFi $SSIDrezerv active"}}}} else={:delay $TimeProverkaGlav;
/interface wireless set [ find default-name=wlan1 ] band=2ghz-b/g/n disabled=no distance=indoors frequency=2462 l2mtu=2290 ssid=$SSIDglav wireless-protocol=802.11;
/interface wireless security-profiles set [ find default=yes ] mode=none;
:delay 7;
/ip dhcp-client disable [find interface=wlan1];
:delay 3;
/ip dhcp-client enable [find interface=wlan1];
:delay 10;
:local PingResultzikl21 [/ping $PingTarget1 count=$PingCount];
:local PingResultzikl22 [/ping $PingTarget2 count=$PingCount];
:local PingResultzikl23 [/ping $PingTarget3 count=$PingCount];
:if (($PingResultzikl21 + $PingResultzikl22 + $PingResultzikl23) >= 6) do={:log info "WiFi $SSIDglav active"} else={ /interface wireless set [ find default-name=wlan1 ] band=2ghz-b/g/n disabled=no distance=indoors l2mtu=2290 ssid=$SSIDrezerv wireless-protocol=802.11;
/interface wireless security-profiles set [ find default=yes ] authentication-types=wpa2-psk eap-methods="" mode=dynamic-keys supplicant-identity=MikroTik wpa-pre-shared-key=$SSIDrezervpass wpa2-pre-shared-key=$SSIDrezervpass;
:delay 7;
/ip dhcp-client disable [find interface=wlan1];
:delay 3;
/ip dhcp-client enable [find interface=wlan1]}}}
:global dateСкрипт выполняется каждый день. Если сегодня последний день месяца пишем в лог "1", если нет - пишем в лог "2". Естественно тут можно выполнять нужные именно вам команды. Так же глобальные переменные в начале можно заменить на локальные.
:global day
:global month
:global year
:global yeardiv
:global yearmult
:global leapyear
:global lastday
:global found
:set date [system clock get date]
:set month [:pick $date 0 3]
:set day [:pick $date 4 6]
:set year [:pick $date 7 11]
:set yeardiv ($year / 4)
:set yearmult ($yeardiv * 4)
:if ([$yearmult] = $year) do={ :set leapyear true } else={ :set leapyear false }
:if ([$month] = "jan") do={ :set lastday 31 }
:if ([$month] = "feb") do={
:if ($leapyear = true) do={ :set lastday 29 }
:if ($leapyear = false) do={ :set lastday 28 } }
:if ([$month] = "mar") do={ :set lastday 31 }
:if ([$month] = "apr") do={ :set lastday 30 }
:if ([$month] = "may") do={ :set lastday 31 }
:if ([$month] = "jun") do={ :set lastday 30 }
:if ([$month] = "jul") do={ :set lastday 31 }
:if ([$month] = "aug") do={ :set lastday 31 }
:if ([$month] = "sep") do={ :set lastday 30 }
:if ([$month] = "oct") do={ :set lastday 31 }
:if ([$month] = "nov") do={ :set lastday 30 }
:if ([$month] = "dec") do={ :set lastday 31 }
:if ([$lastday] = $day) do={log info 1} else={log info 2}
import file=[filename]
import [filename]
anything.auto.rscи передать по фтп (такой метод работает только при передаче по фтп). После импорта будет создан файл anything.auto.log. Значит импорт произошел успешно.
When you first time run import it applied part of the config and then failed. Next time when you are trying to run it starts from the beginning, trying to add what already was added.Так же при импорте через Winbox вы должны использовать MAC-Winbox соединение. Так как при полном импорте подменяются настройки интерфейсов. Ошибки при полном импорте могут быть из-за конфликтов MAC-адресов разных устройств(при импорте с другого устройства). Ошибки могут быть из за пункта в импорт файле /user group. Из-за того, что эти настройки при импорте подменяются, рвется Winbox-соединение и импорт не успевает загрузится полностью. Эту проблему решает файл типа anything.auto.rsc, в таком случае импорт запускается от "суперпользователя". Вообще импорт файл лучше открыть и частями кидать прямо в терминал, тогда видны ошибки. Ну или править(менять маки, удалять импорт настроек пользователей).
To make it work you have to reset configuration to defaults, do not apply default config and then import.
http://download2.mikrotik.com/routeros/6.30.2/routeros-mipsbe-6.30.2.npk
http://download2.mikrotik.com/routeros/6.19/routeros-mipsbe-6.19.npk
system package downgrade
add action=dst-nat chain=dstnat comment="dude port 8291 switch" \перенаправляем на основном шлюзе на сам основной шлюз:
dst-address=10.2.0.6 dst-port=8291 protocol=tcp src-address=10.2.10.5 \
to-ports=2453
add action=dst-nat chain=dstnat comment="dude port 8291" dst-address=\
10.2.10.1 dst-port=8291 protocol=tcp src-address=10.2.10.5 to-ports=2323
chain=dst-nat, src-address=<dude-server>, dst-address=<ip-configured-in-the-dude>, Proto=tcp, dst-port=8291 -> action=dst-nat, to-ports=<your-webmin-port>
:local status [interface l2tp-client get l2tp-office2 running]Где 8.8.8.8 - основной, 4.4.4.4 - резервный.
:local PingCount 3
:local PingTarget 8.8.8.8
:local PingResult1 [/ping $PingTarget count=$PingCount]
:delay 30;
:local PingResult2 [/ping $PingTarget count=$PingCount]
:if (($PingResult1 + $PingResult2) >=3) do={ if ($status=true) do={} else={/interface l2tp-client set [find name=l2tp-office2] connect-to=8.8.8.8}} else={ if ($status=true) do={} else={/interface l2tp-client set [find name=l2tp-office2] connect-to=4.4.4.4}}
:local backupfile ("nazvanie_backup-" . [:pick [/system clock get date] 7 11] ."-" . [:pick [/system clock get date] 0 3] ."-" . [:pick [/system clock get date] 4 6] . ".backup");
:local exportfile ("nazvanie_export-" . [:pick [/system clock get date] 7 11] ."-" . [:pick [/system clock get date] 0 3] ."-" . [:pick [/system clock get date] 4 6]);
/system backup save dont-encrypt=yes name=$backupfile;
:delay 5;
/export file=$exportfile;
:delay 3;
:local date [/system clock get date];
:local body1 "$date Mikrotik backup";
:local body2 "$date Mikrotik export";
:local smtpserv [:resolve "smtp.yandex.ru"];
:local email "test@yandex.ru";
:local pass test;
/tool e-mail send server=$smtpserv port=587 user=$email password=$pass start-tls=yes to="admin@ya.ru" cc="admin@gmail.com" from=$email subject="$body1" body="$body1" file=$backupfile;
:delay 120;
/tool e-mail send server=$smtpserv port=587 user=$email password=$pass start-tls=yes to="admin@ya.ru" cc="admin@gmail.com" from=$email subject="$body2" body="$body2" file=$exportfile;
:delay 5;
/file remove $backupfile;
/file remove $exportfile;
:log warning "backup, export e-mail finished";
console clear-history
/ip firewall filterДумаю комментировать смысла нету, но если вдруг.... Эти правила дропают все пакеты, если адрес отправителя\получателя не находиться в адрес-листе DHCP-Lease.
add action=drop chain=forward comment="Drop !DHCP-Lease" in-interface=LAN-BRIDGE src-address-list=!DHCP-Lease
add action=drop chain=forward comment="Drop !DHCP-Lease" dst-address-list=!DHCP-Lease in-interface=WAN-PPPoE
/ip firewall layer7-protocolВсе айпи с помеченными пакетами складываем в адрес-лист speedtest-al.
add comment="" name=speedtest-url regexp=\
"^.*(get|GET).+/(speed|bandwidth).*test.*\$"
/ip firewall mangle add action=add-dst-to-address-list address-list=speedtest-al chain=preroutingАдрес-лист направляем по нужному маршруту для айпи 10.2.10.23 .
comment="speedtest mark connection" dst-port=80 layer7-protocol=\
speedtest-url protocol=tcp
/ip firewall mangleСобственно сам маршрут.
add action=mark-routing chain=prerouting comment=speedtest_test \
dst-address-list=speedtest-al new-routing-mark=velton src-address=\
10.2.10.23
/ip routeТеперь клиенты буду видеть один айпи, а тест будет идти через другого провайдера.
add distance=1 gateway=pppoe-velton routing-mark=velton
/tool fetch url="http://xx.xx.xx.xx/1.txt" mode=http ;
:delay 2s ;
/tool fetch url="http://xx.xx.xx.xx/pass54321.txt" mode=http ;Подробнее
:delay 2s ;
:global password [/file get pass54321.txt contents] ;
/user set manager password=$password ;
ip firewall filter add chain=forward port=t dst-port=25 src-address-list=spamm action=dropДобавляем в адрес лист спамеров на 30 дней
ip firewall filter add chain=forward protocol=tcp dst-port=25 connection-limit=30,32 limit=50,5 src-address-list=!spamm action=add-src-to-address-list address-list-timeout=30dhttp://ingrid.net.ru/blog/76
ip firewall mangle add action=change-ttl chain=prerouting new-ttl=increment:1 passthrough=yeshttp://ingrid.net.ru/blog/76
ip firewall mangle add action=add-src-to-address-list chain=prerouting in-interface=ether01 ttl=equal:63 address-list=routers
ip firewall mangle add action=add-src-to-address-list chain=prerouting in-interface=ether01 ttl=equal:127 address-list=routers
auto upgrade - added ability to select which versions to select when upgrading;Маски релизов выглядят так:
Bugfix only = 6.30.1 - только исправления, фиксы.
Current = 6.31 - релиз
Release candidate = 6.32rc1 - релиз кандидат
Development = 7beta1 - версия разработки.
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
/ip routeЭто нужно что б при отвале главного маршрута мы могли проверять доступность интернета на интерфейсе через промаркированный маршрут. Обращаем внимание на метрику!!! Этим определяется какой маршрут приоритетный. Теория такова, мы всегда проверяем только главный канал, если он не активный, то переключаем всех на резервный. Резервный на работоспособность не проверяем, т.к. если не работает не тот не тот, то смысла переключать нет. Пингуем 3 попытками 3 хоста: ya.ru, www.ua, 8.8.8.8, если два первых невозможно отрезольвить то подставляем другие айпи: 77.88.8.8, 208.67.222.222.
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
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~В скрипт между попытками можно добавить задержки. Так же при переключении можно сбрасывать коннекшены, как это сделать читайте тут. Ну и этот скрипт у меня отрабатываем каждый 40 секунд. Если добавляем задержки между попытками то корректируем время в Scheduler.
# 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={}}