Ай Лайн
Связаться
Отдел продаж +7 (812) 385-74-84
Время работы пн-пт с 9:00 до 18:00

Базовая настройка MikroTik, firewall, планировщики и скрипты

Базовая настройка Mikrotik

Инструкция описывает базовую настройку нового Mikrotik, типовой firewall, дополнительные правила для VPN, а также скрипты и планировщики, которые используются в работе.

1. Подготовка

  1. Зайти на оборудование через WinBox. Заводские данные для входа: admin без пароля.
  2. Выполнить сброс настроек без конфигурации по умолчанию: system/reset configuration.
  3. Отметить no default configuration.
  4. После сброса оборудование должно быть пустым, без каких-либо настроек.
  5. По возможности обновить прошивку.
    • Если настройка производится в сети с действующим интернетом, временно включить DHCP-клиент на подключенном интерфейсе.
    • Если интернета нет, обновление отложить до окончания настройки.

После сброса нужно убедиться, что на устройстве действительно нет стандартной конфигурации. Иначе дальше можно наслаивать правила на дефолтные настройки и получить непредсказуемый результат.

2. Базовая сетевая схема

  1. Определить WAN-интерфейс в разделе interfaces/interface.
    • Если интернет приходит в ether1, переименовать его в ether1-wan.
  2. Создать bridge для основной локальной сети.
    • Для рабочей сети: bridge-work
    • Для гостевой сети: bridge-guest
    • Для видеосети: bridge-video
  3. Добавить нужные интерфейсы в bridge через bridge/ports.
    • Обычно это все интерфейсы, кроме WAN.
  4. Создать списки интерфейсов wan и lan в interfaces/interface list.
  5. Соотнести списки интерфейсов с реальными интерфейсами:
    • wan -> WAN-интерфейс
    • lan -> рабочий bridge

Сразу использовать понятные имена интерфейсов и bridge. Это заметно упрощает дальнейшую работу с firewall, VPN, DHCP и диагностикой.

3. Подсеть и IP-адресация

  1. Использовать уже назначенную подсеть или определить новую в IPAM-системе (NetBox).
  2. Решить, нужно ли:
    • менять сеть на новую;
    • или использовать текущую сеть с дальнейшей подменой.
  3. Назначить IP-адрес для локальной сети в ip/address на bridge-work.
    • Стандартно использовать X.X.X.254/24.

4. Настройка DHCP

  1. Создать pool в ip/pool.
    • Название: pool-dhcp-work
    • Диапазон: x.x.x.50-x.x.x.200
  2. Создать DHCP-сервер в ip/dhcp-server.
    • Название: dhcp-work
    • Интерфейс: bridge, на котором будет работать DHCP
    • address-pool: созданный ранее pool
  3. Настроить сеть DHCP в ip/dhcp-server network.
    • address -> подсеть
    • gateway -> IP маршрутизатора
    • dns-server -> IP маршрутизатора

После настройки DHCP клиент в локальной сети должен получать адрес, шлюз и DNS без ручной настройки.

5. Ограничение сервисов управления

В ip/service оставить активными только:

  • ssh
  • winbox

Порт winbox изменить на 58291.

Не оставлять включёнными лишние сервисы управления. Чем меньше открытых сервисов, тем проще защищать устройство.

6. Пользователи

Создать пользователей:

  1. adminuser — сгенерированный пароль, сохранить в менеджере паролей.
  2. backpass — сгенерированный пароль, сохранить в менеджере паролей.
  3. backup-user — отдельный пароль для системы резервного копирования, права только read.
/user add name=backup-user group=read password=<пароль>

После создания:

  1. Проверить вход под одним из новых пользователей.
  2. Удалить встроенного пользователя admin.

Удалять встроенного admin только после успешной проверки входа под новым пользователем.

7. Настройка приходящего интернета

  1. В ip/address назначить на WAN-интерфейс IP от провайдера.
  2. В ip/dns:
    • первым указать 8.8.8.8;
    • далее — DNS провайдера;
    • включить allow-remote-requests.
  3. В ip/route задать маршрут по умолчанию 0.0.0.0/0 через gateway провайдера.

8. Имя устройства и NTP

  1. Задать имя устройству через system/identity согласно принятой схеме именования.
  2. Включить 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 обязательно прописывать маршруты.

Схема сети: WAN, bridge и 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 порту и затем удаляются. Ничего заранее открывать не нужно.

Первичный выпуск сертификата

  1. Включить доступ по 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;
  1. Заменить your.domain.name на реальное доменное имя.
  2. Выпустить сертификат:
/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 порту. Это две самые частые причины ошибки.

  1. После выпуска закрыть временный доступ по 80 порту:
/ip/service disable [find name="www"];
/ip/firewall/filter remove [find comment="allow-80-letsencrypt"];
  1. В настройках 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;
Оставить заявку