Базовая настройка MikroTik, firewall, планировщики и скрипты
Базовая настройка Mikrotik
Инструкция описывает базовую настройку нового Mikrotik, типовой firewall, дополнительные правила для VPN, а также скрипты и планировщики, которые используются в работе.
1. Подготовка
- Зайти на оборудование через WinBox. Заводские данные для входа:
adminбез пароля. - Выполнить сброс настроек без конфигурации по умолчанию:
system/reset configuration. - Отметить
no default configuration. - После сброса оборудование должно быть пустым, без каких-либо настроек.
- По возможности обновить прошивку.
- Если настройка производится в сети с действующим интернетом, временно включить DHCP-клиент на подключенном интерфейсе.
- Если интернета нет, обновление отложить до окончания настройки.
После сброса нужно убедиться, что на устройстве действительно нет стандартной конфигурации. Иначе дальше можно наслаивать правила на дефолтные настройки и получить непредсказуемый результат.
2. Базовая сетевая схема
- Определить WAN-интерфейс в разделе
interfaces/interface.- Если интернет приходит в
ether1, переименовать его вether1-wan.
- Если интернет приходит в
- Создать bridge для основной локальной сети.
- Для рабочей сети:
bridge-work - Для гостевой сети:
bridge-guest - Для видеосети:
bridge-video
- Для рабочей сети:
- Добавить нужные интерфейсы в bridge через
bridge/ports.- Обычно это все интерфейсы, кроме WAN.
- Создать списки интерфейсов
wanиlanвinterfaces/interface list. - Соотнести списки интерфейсов с реальными интерфейсами:
wan-> WAN-интерфейсlan-> рабочий bridge
Сразу использовать понятные имена интерфейсов и bridge. Это заметно упрощает дальнейшую работу с firewall, VPN, DHCP и диагностикой.
3. Подсеть и IP-адресация
- Использовать уже назначенную подсеть или определить новую в IPAM-системе (NetBox).
- Решить, нужно ли:
- менять сеть на новую;
- или использовать текущую сеть с дальнейшей подменой.
- Назначить IP-адрес для локальной сети в
ip/addressнаbridge-work.- Стандартно использовать
X.X.X.254/24.
- Стандартно использовать
4. Настройка DHCP
- Создать pool в
ip/pool.- Название:
pool-dhcp-work - Диапазон:
x.x.x.50-x.x.x.200
- Название:
- Создать DHCP-сервер в
ip/dhcp-server.- Название:
dhcp-work - Интерфейс: bridge, на котором будет работать DHCP
address-pool: созданный ранее pool
- Название:
- Настроить сеть DHCP в
ip/dhcp-server network.address-> подсетьgateway-> IP маршрутизатораdns-server-> IP маршрутизатора
После настройки DHCP клиент в локальной сети должен получать адрес, шлюз и DNS без ручной настройки.
5. Ограничение сервисов управления
В ip/service оставить активными только:
sshwinbox
Порт winbox изменить на 58291.
Не оставлять включёнными лишние сервисы управления. Чем меньше открытых сервисов, тем проще защищать устройство.
6. Пользователи
Создать пользователей:
adminuser— сгенерированный пароль, сохранить в менеджере паролей.backpass— сгенерированный пароль, сохранить в менеджере паролей.backup-user— отдельный пароль для системы резервного копирования, права толькоread.
/user add name=backup-user group=read password=<пароль>
После создания:
- Проверить вход под одним из новых пользователей.
- Удалить встроенного пользователя
admin.
Удалять встроенного
adminтолько после успешной проверки входа под новым пользователем.
7. Настройка приходящего интернета
- В
ip/addressназначить на WAN-интерфейс IP от провайдера. - В
ip/dns:- первым указать
8.8.8.8; - далее — DNS провайдера;
- включить
allow-remote-requests.
- первым указать
- В
ip/routeзадать маршрут по умолчанию0.0.0.0/0через gateway провайдера.
8. Имя устройства и NTP
- Задать имя устройству через
system/identityсогласно принятой схеме именования. - Включить NTP-клиент:
- Включить NTP-клиент:
/system ntp client
set servers=0.pool.ntp.org,1.pool.ntp.org
set enabled=yes
После завершения базовой настройки устройство должно:
- пинговать интернет;
- раздавать IP по DHCP;
- иметь корректное имя;
- синхронизировать время.
Firewall
Сначала применяются базовые address-list и filter-правила, затем raw и NAT. Дополнительные правила для VPN и изоляции сетей вынесены в отдельный раздел ниже.
1. Address list
/ip firewall address-list
add address=10.20.0.0/16 comment=ip-local-cloud list=mgmt-ips
add address=10.1.0.0/24 comment=ip-local-office list=mgmt-ips
add address=gate-01.example.com comment=ip-gate-cloud list=mgmt-ips
add address=gate-02.example.com comment=ip-gate-nat-2 list=mgmt-ips
add address=gate-03.example.com comment=ip-gate-bypass list=mgmt-ips
add address=files.example.com comment=ip-files list=mgmt-ips
add address=office-ip-1.example.com comment=ip-office list=mgmt-ips
add address=office-ip-2.example.com comment=ip-reserve list=mgmt-ips
add address=office-ip-3.example.com comment=ip-branch list=mgmt-ips
add address=office-ip-4.example.com comment=ip-reserve list=mgmt-ips
add address=office-ip-5.example.com comment=ip-reserve list=mgmt-ips
add address=office-ip-6.example.com comment=ip-reserve list=mgmt-ips
add address=office-ip-7.example.com comment=ip-reserve list=mgmt-ips
2. Filter rules
/ip firewall filter
add action=accept chain=forward comment="Allow Established/Related connections" connection-state=established,related
add action=drop chain=forward comment="Drop Invalid connections" connection-state=invalid
add action=accept chain=input comment="Allow Established/Related connections" connection-state=established,related
add action=accept chain=input comment="ICMP allow" protocol=icmp
add action=accept chain=input comment=Winbox dst-port=58291 in-interface-list=wan protocol=tcp src-address-list=mgmt-ips
add action=accept chain=input comment="accept ssh mgmt" dst-port=22 protocol=tcp src-address-list=mgmt-ips
add action=drop chain=input comment="Drop blocklist" dst-address-list=blocklist
add action=drop chain=forward comment="Drop forward" connection-nat-state=!dstnat in-interface-list=wan
add action=drop chain=forward comment="Drop blocklist" dst-address-list=blocklist
add action=drop chain=forward comment="dropping port scanners" src-address-list=port_scanners
add action=drop chain=input comment="Drop input" in-interface-list=wan
add action=add-src-to-address-list address-list=ssh_blacklist address-list-timeout=3d chain=input connection-state=new dst-port=22 protocol=tcp src-address-list=ssh_stage3
add action=add-src-to-address-list address-list=ssh_stage3 address-list-timeout=30m chain=input connection-state=new dst-port=22 protocol=tcp src-address-list=ssh_stage2
add action=add-src-to-address-list address-list=ssh_stage2 address-list-timeout=30m chain=input connection-state=new dst-port=22 protocol=tcp src-address-list=ssh_stage1
add action=add-src-to-address-list address-list=ssh_stage1 address-list-timeout=30m chain=input connection-state=new dst-port=22 protocol=tcp
add action=add-src-to-address-list address-list=port_scanners address-list-timeout=2w chain=input comment="Port scanners to list" protocol=tcp psd=21,3s,3,1
add action=add-src-to-address-list address-list=port_scanners address-list-timeout=2w chain=input comment="NMAP FIN Stealth scan" protocol=tcp tcp-flags=fin,!syn,!rst,!psh,!ack,!urg
add action=add-src-to-address-list address-list=port_scanners address-list-timeout=2w chain=input comment="SYN/FIN scan" protocol=tcp tcp-flags=fin,syn
add action=add-src-to-address-list address-list=port_scanners address-list-timeout=2w chain=input comment="SYN/RST scan" protocol=tcp tcp-flags=syn,rst
add action=add-src-to-address-list address-list=port_scanners address-list-timeout=2w chain=input comment="FIN/PSH/URG scan" protocol=tcp tcp-flags=fin,psh,urg,!syn,!rst,!ack
add action=add-src-to-address-list address-list=port_scanners address-list-timeout=2w chain=input comment="ALL/ALL scan" protocol=tcp tcp-flags=fin,syn,rst,psh,ack,urg
add action=add-src-to-address-list address-list=port_scanners address-list-timeout=2w chain=input comment="NMA scan" protocol=tcp tcp-flags=!fin,!syn,!rst,!psh,!ack,!urg
add action=drop chain=input comment="dropping port scanners" src-address-list=port_scanners
add action=drop chain=input comment="drop ssh brute forcers" dst-port=22 protocol=tcp src-address-list=ssh_blacklist
3. Raw rules
/ip firewall raw
add action=drop chain=prerouting dst-port=53 in-interface-list=wan protocol=tcp
add action=drop chain=prerouting dst-port=53 in-interface-list=wan protocol=udp
4. NAT
/ip firewall nat
add action=masquerade chain=srcnat out-interface-list=wan
Дополнительные правила для VPN-серверов и изоляции сетей нужно поднимать выше последних запрещающих правил, иначе они не сработают.
Дополнительная настройка
При настройке VPN обязательно прописывать маршруты.

1. L2TP server
Поднять правила выше последних запрещающих правил.
/ip firewall filter
add action=accept chain=input comment="allow l2tp (ipsec-esp)" protocol=ipsec-esp in-interface-list=wan
add action=accept chain=input comment="allow l2tp (500,4500,1701 udp)" protocol=udp dst-port=500,1701,4500 in-interface-list=wan
2. SSTP server
Поднять правило выше последних запрещающих правил.
/ip firewall filter
add action=accept chain=input comment="allow sstp" protocol=tcp dst-port=443 in-interface-list=wan
3. Блокировка IPsec из офисной сети до других объектов
Заменить IP-адреса на нужные и поднять правило в самый верх.
/ip firewall filter
add action=drop chain=forward comment="ipsec behind nat reject" dst-address=203.0.113.80 dst-port=500,4500 log=yes out-interface-list=wan protocol=udp src-address=192.168.92.0/24
4. Изоляция гостевой сети
/ip firewall filter
add action=drop chain=forward comment="bridge-guest isolation" in-interface=bridge-guest out-interface-list=!wan
add action=drop chain=forward comment="bridge-guest isolation" in-interface-list=!wan out-interface=bridge-guest
5. Изоляция видеосети
Изоляция видеорегистратора в основной подсети.
/ip firewall filter
add action=drop chain=forward comment=isolation-video in-interface=bridge-video out-interface=!l2tp-main
add action=drop chain=forward comment=isolation-video in-interface=!l2tp-main out-interface=bridge-video
Настройка сервисов мониторинга и управления
1. Установка SSH-ключа системы централизованного управления
:execute {/tool fetch url="https://files.example.com/files/ssh-keys/scm_rsa.pub" mode=https;}
:delay 3000ms;
/user group add name=ssh policy=api,ftp,password,read,sensitive,ssh,test,write,policy,reboot,romon,sniff
/user add name=scm-user password="<пароль>" group=ssh address=10.0.0.0/8
/user ssh-keys import public-key-file=scm_rsa.pub user=scm-user
/ip service set ssh disabled=no address=10.0.0.0/8
/file remove scm_rsa.pub
2. Включение SNMP для Zabbix
/snmp community add name=<snmp-community> addresses=10.20.0.0/16 read-access=yes write-access=no disabled=no
/snmp set enabled=yes trap-version=2 trap-community=<snmp-community>
3. Настройка удаленного логирования
/system logging action
add name=logstash remote=10.30.10.9 remote-port=5093 target=remote
/system logging
add action=logstash topics=critical
add action=logstash topics=error
add action=logstash topics=info
add action=logstash topics=warning
После этого устройство должно быть доступно для мониторинга и удалённого администрирования по принятой в компании схеме.
Планировщики и скрипты
1. Let's Encrypt + SSTP: первичный выпуск и автопродление
В ходе выполнения скрипта временно создаются доступы по
80порту и затем удаляются. Ничего заранее открывать не нужно.
Первичный выпуск сертификата
- Включить доступ по
80порту для проверки владения доменом:
/ip/service enable [find name="www"];
/ip/firewall/filter add action=accept chain=input comment=allow-80-letsencrypt disabled=no place-before=0 protocol=tcp port=80;
- Заменить
your.domain.nameна реальное доменное имя. - Выпустить сертификат:
/certificate enable-ssl-certificate dns-name="your.domain.name";
Версия для OS 7.22 и выше:
/certificate/add-acme \
directory-url=https://acme-v02.api.letsencrypt.org/directory \
domain-names=your.domain.name
Если выпуск не проходит, сначала проверить DNS и NAT на
80порту. Это две самые частые причины ошибки.
- После выпуска закрыть временный доступ по
80порту:
/ip/service disable [find name="www"];
/ip/firewall/filter remove [find comment="allow-80-letsencrypt"];
- В настройках SSTP выбрать новый сертификат.
Скрипт автопродления
После добавления скрипта заменить your.domain.name на нужное доменное имя (для версии OS 7.22 и выше скрипт ниже).
/system script add name=letsencrypt-renew policy=read,write source="\r:local dnsName \"your.domain.name\";\r
:local certName;\r
/ip/firewall/filter print without-paging;\r
/ip/service enable [find name=\"www\"];\r
/ip/firewall/filter add action=accept chain=input comment=allow-80-letsencrypt disabled=no place-before=0 protocol=tcp port=80;\r
/certificate remove [find subject-alt-name=\"DNS:\$dnsName\"];\r
:delay 2s;\r
/certificate enable-ssl-certificate dns-name=\$dnsName;\r
:delay 2s;\r
/ip/service disable [find name=\"www\"];\r
/ip/firewall/filter remove [find comment=\"allow-80-letsencrypt\"];\r
:set certName [/certificate get value-name=name [find subject-alt-name=\"DNS:\$dnsName\"]];\r
/interface/sstp-server/server/set certificate=\$certName;";
/system scheduler add interval=9w name=scheduled-letsencrypt-renew on-event=letsencrypt-renew policy=read,write start-time=05:00:00;
Если при перевыпуске мешают NAT-правила, добавить временное отключение по комментарию:
/ip/firewall/nat disable [find comment="комментарий_к_правилу"];
Пример итогового скрипта с отключением NAT-правил:
:local dnsName "your.domain.com";
:local certName;
/ip/firewall/filter print without-paging;
/ip/service enable [find name="www"];
/ip/firewall/nat disable [find comment="комментарий_к_правилу_1"];
/ip/firewall/nat disable [find comment="комментарий_к_правилу_2"];
/ip/firewall/filter add action=accept chain=input comment=allow-80-letsencrypt disabled=no place-before=0 protocol=tcp port=80;
/certificate remove [find subject-alt-name="DNS:$dnsName"];
:delay 2s;
/certificate enable-ssl-certificate dns-name=$dnsName;
:delay 2s;
/ip/service disable [find name="www"];
/ip/firewall/filter remove [find comment="allow-80-letsencrypt"];
:set certName [/certificate get value-name=name [find subject-alt-name="DNS:$dnsName"]];
/interface/sstp-server/server/set certificate=$certName;
/ip/firewall/nat enable [find comment="комментарий_к_правилу_1"];
/ip/firewall/nat enable [find comment="комментарий_к_правилу_2"];
Версия для OS 7.22 и выше:
За основу взят скрипт с предыдущей версии
Вариант тестовый, проверяйте корректную отработку
Имя и DNS сертификата должны отличаться
Скрипт:
/system/script/add name=renew-letsencrypt-cert policy=read,write,policy,test source="{\
:local dnsName \"DNS имя\"\
:local certName \"Имя сертификата\"\
:local keyFound false\
:local disabledRulesIds \"\"\
/ip/firewall/filter print without-paging;\
:if ([:len [/ip/firewall/nat/find where dst-port~\"(80|443)\" and disabled=no]] > 0) do={\
:set disabledRulesIds [/ip/firewall/nat find where dst-port~\"(80|443)\" and disabled=no]\
/ip/firewall/nat/ disable numbers=\$disabledRulesIds\
:log info \"Script disabled rules: \$disabledRulesIds\"\
}\
:delay 2s;\
:if ([/ip/service/get www disabled] = true) do={/ip/service/set www disabled=no}\
###\
/ip/firewall/filter add action=accept chain=input comment=allow-80-letsecrypt disabled=no place-before=0 protocol=tcp port=80;\
/certificate remove [find subject-alt-name=\"DNS:\$dnsName\"];\
:delay 2s;\
/certificate/add-acme domain=\$dnsName name=\$certName directory-url=https://acme-v02.api.letsencrypt.org/directory\
####\
:for i from=1 to=8 do={\
:local cert [/certificate find where common-name~\$dnsName]\
:if (([:len \$cert] > 0) && ([/certificate get \$cert private-key] = true)) do={\
:set keyFound true\
:log info \"Private key found\"\
:set certName [/certificate get value-name=name [find subject-alt-name=\"DNS:\$dnsName\"]];\
/interface/sstp-server/server/set certificate=\$certName;\
:break\
}\
:log info (\"No private key, retry \" . \$i . \"/8\")\
:delay 10s\
}\
:if (\$keyFound = false) do={\
:log info \"No private key after retries\"\
}\
:delay 1s;\
/ip/firewall/filter/ remove [find comment=\"allow-80-letsecrypt\"];\
:if ([:len \$disabledRulesIds] > 0) do={\
/ip/firewall/nat enable numbers=\$disabledRulesIds\
}\
/ip/service/ disable [find name=\"www\"];}"
Scheduler (перевыпуск раз в 30 дней):
/system/scheduler/add name=auto-renew-letsencrypt-sstp interval=30d start-time=03:00:00 \
policy=read,write,policy,test on-event="/system/script/run renew-letsencrypt-sstp"
Тестовый скрипт для версии 7.22:
/system/script/add name=renew-letsencrypt-sstp policy=read,write,policy,test source="\
:local dnsName \"vpn\\.example\\.com\";\
:local realDnsName \"vpn.example.com\";\
:local sanRegex \"\";\
:local certId \"\";\
:local certName \"\";\
:set sanRegex (\"(^|, *)DNS:\" . \$dnsName . \"(,|)\");\
/ip/service enable [find name=\"www\"];\
/ip/firewall/filter add action=accept chain=input comment=\"allow-80-letsencrypt\" disabled=no place-before=0 protocol=tcp dst-port=80;\
/interface/sstp-server/server set certificate=none;\
/certificate remove [find where subject-alt-name~\$sanRegex];\
:delay 2s;\
/certificate/add-acme directory-url=https://acme-v02.api.letsencrypt.org/directory domain-names=\$realDnsName;\
:for i from=1 to=36 do={\
:delay 5s;\
:set certId [/certificate find where subject-alt-name~\$sanRegex];\
:if ([:len \$certId] > 0) do={\
:set certName [/certificate get \$certId name];\
/certificate set \$certId trusted=yes;\
/interface/sstp-server/server set certificate=\$certName;\
:log info (\"LetsEncrypt certificate installed for SSTP: \" . \$certName);\
/ip/service disable [find name=\"www\"];\
/ip/firewall/filter remove [find comment=\"allow-80-letsencrypt\"];\
:return;\
};\
};\
:log error (\"LetsEncrypt certificate not found after ACME issue for \" . \$realDnsName);\
/ip/service disable [find name=\"www\"];\
/ip/firewall/filter remove [find comment=\"allow-80-letsencrypt\"];\
"
Версия с маской по комментарию:
:local dnsName "DNS имя";
:local certName;
:local ruleComment "комментарий";
/ip/firewall/filter print without-paging;
/ip/firewall/nat disable [find where comment~$ruleComment]
:delay 2s;
/ip/service enable [find name="www"];
/ip/firewall/filter add action=accept chain=input comment=allow-80-letsencrypt disabled=no place-before=0 protocol=tcp port=80;
/certificate remove [find subject-alt-name="DNS:$dnsName"];
:delay 2s;
/certificate enable-ssl-certificate dns-name=$dnsName;
:delay 2s;
/ip/service disable [find name="www"];
/ip/firewall/filter remove [find comment="allow-80-letsencrypt"];
:set certName [/certificate get value-name=name [find subject-alt-name="DNS:$dnsName"]];
/interface/sstp-server/server/set certificate=$certName;
:delay 2s;
/ip/firewall/nat enable [find where comment~$ruleComment]
2. Рекурсивное изменение комментариев
Полезно при портах и defconf.
set comment="" [find comment="defconf"]
3. Плановая перезагрузка
Плановая перезагрузка в 06:00, раз в неделю.
/system script add name=reboot policy=read,write source=":do { /system reboot }";
/system scheduler add interval=1w name=reboot on-event=reboot policy=read,write,reboot start-time=06:00:00;