Настройка MikroTik RB951G-2HnD с нуля: готовый скрипт PPPoE и Wi-Fi

Базовая настройка MikroTik RB951G-2HnD одним .rsc-скриптом: PPPoE на ether1, мост из ether2–5 и Wi-Fi, файрвол с FastTrack, порядок запуска и отладка.

Дмитрий Мещеряков
Дмитрий Мещеряков
📅 4 октября 2026 г.📖 22 мин чтения

Чтобы настроить MikroTik под PPPoE через Winbox, нужно пройти дюжину разделов меню: мост, порты моста, Wi-Fi, профиль безопасности, адрес, пул, DHCP-сервер, PPP-профиль, PPPoE-клиент, файрвол, NAT, сервисы. Каждый раздел — несколько полей, и в каждом можно ошибиться так, что роутер будет работать, но либо медленно, либо с открытым в интернет DNS-резолвером. Повторить ту же настройку через полгода, после сброса, уже не получится: никто не помнит, что именно было выставлено.

Скрипт решает обе проблемы. Это один текстовый файл, где каждая настройка записана явно, и вторая установка занимает две минуты вместо получаса. Ниже — готовый скрипт для MikroTik RB951G-2HnD: PPPoE на первом порту, порты со второго по пятый и Wi-Fi в одном мосту, файрвол с FastTrack, чтобы трафик между LAN и интернетом шёл без потерь скорости.

Главное здесь не набор команд — их можно найти в документации. Важны три вещи, которых в типовых инструкциях обычно нет: почему скрипт запускается только на пустой конфигурации, почему интернет он включает последним и где именно он ломается.

Что такое скрипт настройки RouterOS

Скрипт настройки RouterOS — это текстовый файл .rsc с командами консоли, которые роутер выполняет командой /import так же, как если бы их набрали в терминале руками. Это не конфигурационный файл в привычном смысле: роутер не «применяет состояние», а выполняет инструкции по очереди. Отсюда и главное свойство: импорт не транзакционный. Если команда в середине файла упала, всё, что было выполнено до неё, остаётся в конфигурации.

Поэтому скрипт ниже устроен как один блок { … } с проверками в начале. Всё, что может пойти не так до первого изменения — не заданы пароли, не та длина ключа Wi-Fi, конфигурация не пустая, нет беспроводного интерфейса, — проверяется до первой команды add и прерывает выполнение через :error.

Что получится после настройки

Скрипт рассчитан на RB951G-2HnD: процессор AR9344 на 600 МГц, 128 МБ памяти, пять гигабитных портов на коммутаторе AR8327 и Wi-Fi 2,4 ГГц 802.11n с двумя антеннами по 2,5 dBi. Модель снята с производства, но работает на RouterOS 6.49 и на RouterOS 7, и таких роутеров в квартирах и небольших офисах ещё много.

text
Провайдер
    │  PPPoE: логин и пароль
 ether1 ──► pppoe-out1 ──► файрвол + NAT (masquerade)
                                  │
                           bridge-lan 192.168.88.1/24
                           DHCP: 192.168.88.100–250, DNS через роутер
                                  │
              ┌──────────┬────────┴─┬──────────┬──────────┐
           ether2     ether3     ether4     ether5      wlan1
           └──── коммутатор AR8327, без CPU ────┘   через CPU
ПортРольЧто на нём
ether1WANPPPoE-клиент, MTU 1492, маршрут по умолчанию
ether2–ether5LANМост с аппаратной коммутацией
wlan1LANТочка доступа WPA2, в том же мосту

Устройства в проводной сети и в Wi-Fi видят друг друга напрямую: принтер по кабелю доступен с ноутбука по Wi-Fi без дополнительных правил. Из интернета на роутер и в локальную сеть входящие соединения не проходят.

Почему сброс с no-defaults, а не правка заводской конфигурации

Заводская конфигурация MikroTik (defconf) уже содержит мост, адрес 192.168.88.1, DHCP-сервер, списки интерфейсов и правила файрвола. Кажется логичным взять её и поменять DHCP-клиент на PPPoE. На практике получаются две проблемы.

Первая — дубликаты. Скрипт, написанный под пустую конфигурацию, на defconf создаст второй мост, второй адрес из той же сети и второй набор правил. Роутер начнёт вести себя непредсказуемо: адрес висит на двух интерфейсах, DHCP-серверы конкурируют за одни и те же порты.

Вторая — неизвестное состояние. Defconf отличается между версиями RouterOS и между моделями, и если роутер уже кто-то настраивал, вы не знаете, что в нём осталось. Скрипт, применённый к неизвестному состоянию, даёт неизвестный результат.

Поэтому скрипт проверяет, что на роутере нет ни одного моста, IP-адреса и правила файрвола, и отказывается работать, если что-то есть. Сброс выполняется так:

bash
# Терминал RouterOS: сброс без заводской конфигурации
/system reset-configuration no-defaults=yes skip-backup=yes keep-users=yes

no-defaults=yes оставляет роутер пустым, keep-users=yes сохраняет пользователей и их пароли. После перезагрузки на роутере нет ни одного IP-адреса, и подключаться к нему придётся по MAC-адресу.

⚠️ Важно

Сброс стирает всю конфигурацию. Если роутер уже работает, сначала сохраните её: /export file=before-reset даёт читаемый скрипт, /system backup save name=before-reset — бинарную копию для восстановления на этом же устройстве. Оба файла скачайте с роутера до сброса.

Как запустить скрипт: пошагово

  1. Подставить свои данные. В начале скрипта четыре переменные: логин и пароль PPPoE от провайдера, имя и пароль Wi-Fi. Пароль Wi-Fi — от 8 до 63 символов, иначе скрипт остановится. Руками их можно не править: генератор на bash или PowerShell спросит данные и соберёт готовый rb951g-setup.rsc.
  2. Сбросить роутер командой выше. Кабель провайдера из ether1 на время настройки вынуть.
  3. Подключиться по MAC. Ноутбук — кабелем в ether2. В Winbox на вкладке Neighbors появится роутер; подключаться нужно по MAC-адресу, а не по IP.
  4. Загрузить скрипт. Перетащить файл rb951g-setup.rsc в окно Files.
  5. Выполнить импорт в New Terminal:
bash
# Терминал RouterOS: импорт скрипта
/import file-name=rb951g-setup.rsc
  1. Подключить провайдера. После строки Setup complete вставить кабель провайдера в ether1. Ноутбук получит адрес из диапазона 192.168.88.100–250, роутер будет доступен по 192.168.88.1.
  2. Удалить скрипт с роутера. Файл остаётся во флеш-памяти, и пароли в нём лежат открытым текстом: /file remove rb951g-setup.rsc.
⚠️ Важно

Не запускайте этот скрипт с verbose=yes. В режиме verbose RouterOS читает файл и выполняет его построчно, а весь скрипт — один многострочный блок с локальными переменными. Построчное выполнение разорвёт блок, переменные $pppoeUser и остальные окажутся пустыми. По той же причине здесь не сработает и dry-run — он доступен только вместе с verbose.

Отдельная ловушка — спецсимволы в паролях. Внутри строк в кавычках RouterOS интерпретирует $ как начало имени переменной, поэтому пароль pa$$word превратится в pa и пустые переменные. Знак доллара, двойную кавычку и обратный слеш нужно экранировать: "pa\$\$word". Если пароль PPPoE содержит $ и записан без экранирования, провайдер будет отклонять авторизацию, а в логах вы увидите только authentication failed без единой подсказки. Генератор ниже экранирует эти символы сам.

Как объединить порты MikroTik в мост вместе с Wi-Fi

bash
# rb951g-setup.rsc — мост LAN
/interface bridge add name=bridge-lan protocol-mode=rstp vlan-filtering=no
/interface bridge port add bridge=bridge-lan interface=ether2 hw=yes
/interface bridge port add bridge=bridge-lan interface=ether3 hw=yes
/interface bridge port add bridge=bridge-lan interface=ether4 hw=yes
/interface bridge port add bridge=bridge-lan interface=ether5 hw=yes
/interface bridge port add bridge=bridge-lan interface=wlan1
/interface bridge settings set use-ip-firewall=no

hw=yes передаёт коммутацию между проводными портами чипу AR8327: кадры между ether2 и ether5 ходят на скорости порта и процессор их не видит. В выводе /interface bridge port print у таких портов стоит флаг H. Wi-Fi в аппаратную коммутацию не входит — трафик между кабелем и беспроводной сетью проходит через процессор, и это нормально для 2,4 ГГц.

vlan-filtering=no здесь не случайная настройка. По документации MikroTik, AR8327 не поддерживает фильтрацию VLAN на мосту в аппаратном режиме: включите vlan-filtering=yes — и весь трафик между проводными портами пойдёт через процессор 600 МГц. Роутер продолжит работать, но вы потеряете гигабит между компьютерами в локальной сети и не увидите ни одной ошибки.

use-ip-firewall=no — значение по умолчанию, но оно записано явно: если трафик моста отправить через IP-файрвол, отключается bridge FastPath, а вместе с ним и FastTrack.

Список интерфейсов LAN с одним мостом внутри используется дальше в правилах файрвола и для ограничения служебных сервисов. Если позже добавите в локальную сеть ещё один интерфейс, достаточно включить его в список — правила менять не придётся.

Какие настройки Wi-Fi выбрать для России

bash
# rb951g-setup.rsc — Wi-Fi (фрагмент, параметры на одной строке в полном скрипте)
/interface wireless security-profiles add name=wifi-home mode=dynamic-keys \
    authentication-types=wpa2-psk unicast-ciphers=aes-ccm group-ciphers=aes-ccm \
    wpa2-pre-shared-key=$wifiPass
/interface wireless set [find default-name=wlan1] mode=ap-bridge band=2ghz-g/n \
    channel-width=20mhz frequency=auto scan-list=2412,2437,2462 \
    country=russia frequency-mode=regulatory-domain antenna-gain=3 \
    installation=indoor wps-mode=disabled ssid=$wifiSSID security-profile=wifi-home

Каждый параметр здесь отвечает на конкретный вопрос.

country=russia и frequency-mode=regulatory-domain — роутер сам ограничивает каналы и мощность по российским правилам. Решение ГКРЧ № 07-20-03-001 разрешает в полосе 2400–2483,5 МГц эквивалентную изотропно излучаемую мощность не более 100 мВт, то есть 20 dBm. Передатчик RB951G-2HnD способен на 25–30 dBm, и без режима регуляторного домена роутер будет превышать лимит. Пользы от этого нет: телефон отвечает роутеру с мощностью порядка 15 dBm, и связь всё равно ограничена самым слабым направлением.

antenna-gain=3 — параметр, по которому роутер считает мощность на выходе. Антенна RB951G-2HnD — 2,5 dBi, а поле принимает целые числа, поэтому значение округлено вверх, в сторону меньшей мощности.

band=2ghz-g/n — без 802.11b. Один старый клиент 802.11b заставляет точку доступа включать защитные механизмы, которые снижают скорость для всех. Устройств, которые умеют только 802.11b, в обычной квартире нет.

channel-width=20mhz и scan-list=2412,2437,2462 — каналы 1, 6 и 11. В России разрешены каналы с 1 по 13, но 20-мегагерцовых каналов, которые не пересекаются друг с другом, в полосе 2,4 ГГц только три. Каналы 12 и 13 не видят устройства, настроенные под американский регион, — в первую очередь ноутбуки и смарт-ТВ, купленные за границей. Канал 40 МГц занимает две трети полосы и в многоквартирном доме гарантированно пересекается с соседями. Максимум на 20 МГц для 802.11n с двумя потоками — 144 Мбит/с канальной скорости, реальный TCP заметно ниже.

frequency=auto выбирает наименее загруженный канал из списка при включении интерфейса, а не постоянно. Если соседи сменили каналы, точка доступа об этом не узнает до перезапуска wlan1.

wps-mode=disabled, WPA2-PSK и AES — без TKIP и без WPS. WPA3 legacy-драйвер wireless в RouterOS не поддерживает, поэтому WPA2 с длинным паролем здесь максимум.

💡 Совет

RouterOS 7.13 и новее: драйвер Wi-Fi — отдельный пакет. Начиная с 7.13, драйвер для старых беспроводных чипов, к которым относится RB951G-2HnD, вынесен из основного пакета в пакет wireless. При обновлении через 7.12 он ставится автоматически; при ручном обновлении или netinstall его нужно загрузить вместе с основным пакетом. Без него интерфейса wlan1 нет, и скрипт остановится на проверке с сообщением wlan1 missing.

Как настроить PPPoE на MikroTik

bash
# rb951g-setup.rsc — PPPoE-клиент
/ppp profile add name=pppoe-home change-tcp-mss=yes use-ipv6=no use-mpls=no
/interface pppoe-client add name=pppoe-out1 interface=ether1 \
    user=$pppoeUser password=$pppoePass profile=pppoe-home \
    add-default-route=yes default-route-distance=1 use-peer-dns=yes \
    max-mtu=1492 max-mru=1492 dial-on-demand=no disabled=yes

MTU 1492 — это 1500 байт кадра Ethernet минус 8 байт заголовка PPPoE. change-tcp-mss=yes подгоняет размер TCP-сегментов под этот MTU. Без него большие пакеты не пролезают в туннель, и симптом выглядит странно: сайты открываются, но не до конца, письма с вложениями не отправляются, а ping при этом работает.

add-default-route=yes создаёт маршрут по умолчанию через туннель после подключения, use-peer-dns=yes берёт DNS-серверы провайдера. Роутер раздаёт себя клиентам как DNS-сервер и пересылает запросы провайдеру — так работает кэш, а адреса DNS не нужно менять на каждом устройстве при смене провайдера.

Обратите внимание на disabled=yes: клиент создаётся выключенным. Это главная деталь скрипта.

Почему интернет включается последним

Беспроводной интерфейс и PPPoE-клиент создаются выключенными и включаются последними двумя командами — после файрвола, NAT и ограничения сервисов. Если сделать наоборот и импорт упадёт где-то посередине, роутер окажется в интернете с публичным адресом, без правил файрвола и с включённым allow-remote-requests для DNS.

Это не теоретический риск. Открытый DNS-резолвер обнаруживают сканеры за часы и используют в DDoS-атаках с усилением: маленький запрос с поддельным адресом жертвы, большой ответ — жертве. Обычно о том, что ваш роутер в этом участвует, вы узнаёте от провайдера, который блокирует абонента или порт 53.

С этой же целью стоит вынуть кабель провайдера на время настройки: пока скрипт не отработал, роутеру нечего делать в интернете.

Файрвол и FastTrack: как не потерять скорость

bash
# rb951g-setup.rsc — цепочка forward
/ip firewall filter add chain=forward action=fasttrack-connection connection-state=established,related
/ip firewall filter add chain=forward action=accept connection-state=established,related
/ip firewall filter add chain=forward action=drop connection-state=invalid
/ip firewall filter add chain=forward action=accept in-interface-list=LAN out-interface=pppoe-out1
/ip firewall filter add chain=forward action=drop
/ip firewall nat add chain=srcnat action=masquerade src-address=192.168.88.0/24 out-interface=pppoe-out1

FastTrack — это механизм RouterOS, который после установления соединения отправляет его пакеты в обход файрвола, очередей и маршрутизации по упрощённому пути (FastPath). Первые пакеты соединения проходят все правила, а когда соединение стало established, остальные идут напрямую. С RouterOS 6.35 FastPath поддерживает PPPoE-интерфейсы, поэтому схема работает и с таким подключением.

Зачем это нужно, видно по тестам самой MikroTik для RB951G-2HnD. Маршрутизация пакетов 512 байт без правил — 860 Мбит/с, с 25 правилами фильтра — 244 Мбит/с, разница в 3,5 раза. Пакеты на 1518 байт с 25 правилами — 690 Мбит/с вместо 984. Процессору на 600 МГц каждое правило обходится дорого, а FastTrack возвращает основной трафик в сценарий «без правил».

Цепочка input, которая защищает сам роутер, устроена так же: принять установленные соединения, отбросить некорректные, принять ICMP, принять всё из LAN, остальное отбросить. ICMP разрешён намеренно — сообщения «fragmentation needed» нужны для определения MTU пути, и без них PPPoE с MTU 1492 работает хуже.

Конфигурация рассчитана только на IPv4: IPv6 в PPP-профиле выключен, а если пакет IPv6 в системе активен, в его файрвол добавлены два запрещающих правила. Без них после того, как провайдер начнёт выдавать IPv6, устройства локальной сети стали бы доступны из интернета напрямую: в пустой конфигурации IPv6-файрвол ничего не фильтрует.

Что закрывает скрипт на самом роутере

Последний блок перед включением интернета ограничивает служебные сервисы:

  • MAC-Winbox, MAC-Telnet и обнаружение соседей — только из списка LAN;
  • Telnet, FTP, API и API-SSL выключены;
  • Winbox, SSH и веб-интерфейс принимают подключения только из 192.168.88.0/24;
  • bandwidth-server выключен.

Файрвол и так не пускает к роутеру ничего снаружи, но ограничение на уровне сервиса работает, даже если правило файрвола когда-нибудь удалят по ошибке. Тот же принцип, что для сервера с сайтом: открыто только то, что нужно, и только тем, кому нужно, — подробнее для VPS в статье про деплой Next.js на свой сервер.

Что скрипт не делает

Скрипт настраивает сеть и сознательно не трогает остальное. После импорта стоит сделать ещё три вещи.

Задать пароль администратора. keep-users=yes сохраняет пользователей как есть, а у ранних экземпляров RB951G пароль admin по умолчанию пустой. Пароль задаётся в терминале или через System → Users:

bash
# Терминал RouterOS: пароль администратора
/user set [find name=admin] password="длинный-пароль-не-от-wifi"

Пароль администратора не должен совпадать ни с паролем Wi-Fi, ни с паролем PPPoE: пароль Wi-Fi знают все, кто был у вас в гостях.

Обновить RouterOS и прошивку. Сначала /system package update check-for-updates и установка, затем /system routerboard upgrade и перезагрузка — загрузчик обновляется отдельно от системы.

Настроить время. Без синхронизации часов в логах будет 1970 год, а разбирать проблемы по таким логам неудобно. Синтаксис NTP-клиента в RouterOS 6 и 7 отличается, поэтому в скрипт он не включён — настройте через System → SNTP Client или NTP Client в своей версии.

Что ломается после импорта

PPPoE не поднимается. Проверка: /interface pppoe-client monitor pppoe-out1 и /log print where topics~"pppoe". Если в логе authentication failed — неверный логин или пароль, первым делом проверьте неэкранированный $. Если статус зависает на connecting без ответа сервера — провайдер может привязывать абонента к MAC-адресу старого роутера; адрес клонируется командой /interface ethernet set [find default-name=ether1] mac-address=AA:BB:CC:DD:EE:FF. У части провайдеров PPPoE идёт в теге VLAN — тогда клиент вешается на VLAN-интерфейс поверх ether1, номер VLAN знает поддержка провайдера.

Сайты открываются не до конца. Причина — MTU. С компьютера в локальной сети: ping -f -l 1464 ya.ru в Windows или ping -M do -s 1464 ya.ru в Linux. 1464 байта данных плюс 28 байт заголовков дают 1492. Если такой пакет не проходит, а меньший проходит — проверьте, что change-tcp-mss=yes стоит в профиле, который реально назначен клиенту.

Скорость ниже тарифа. Команда /ip firewall filter print stats — счётчик байт у правила fasttrack-connection должен расти вместе с трафиком. Если не растёт, FastTrack не работает: включены очереди с parent=global, запущен torch или sniffer, у моста включён use-ip-firewall. Если по кабелю скорость нормальная, а по Wi-Fi нет — упираетесь в радио, а не в роутер.

Wi-Fi не виден. Проверка: /interface wireless print — интерфейс должен быть без флага X. Если в списке пусто — нет пакета wireless, смотрите /system package print. Если сеть видна, но слабо — посмотрите, что вокруг: /interface wireless scan wlan1 покажет соседние сети по каналам. Во время сканирования точка доступа отключает клиентов, поэтому запускайте его не через Wi-Fi.

Пропал доступ к роутеру. Если ноутбук во время настройки был подключён в ether1, после импорта роутер перестанет отвечать на этом порту: MAC-Winbox разрешён только из LAN. Переключитесь в ether2–ether5.

Клиенты не получают адрес. /ip dhcp-server lease print — есть ли там устройства. Если записей нет, проверьте, что DHCP-сервер привязан к bridge-lan, а не к отдельному порту, и что устройство подключено к порту из моста.

Скрипт целиком

Комментарии внутри скрипта оставлены латиницей: так они одинаково читаются в консоли RouterOS 6 и 7 и в Winbox. Это шаблон: сохраните его как rb951g-template.rsc и соберите из него рабочий файл генератором из следующего раздела — или скопируйте в rb951g-setup.rsc и замените значения четырёх переменных вручную. С заглушками CHANGE_ME скрипт не запустится.

bash
# rb951g-template.rsc
# RB951G-2HnD: RouterOS 6.49.x / 7.x with legacy wireless.
# Import ONCE after reset with no-defaults=yes. Disconnect ether1 during setup.
# Existing router users/passwords are preserved with keep-users=yes.
# This config provides IPv4 Internet; routed IPv6 is blocked.
# In quoted strings escape dollar, quote, backslash (\$  \"  \\).

{
    :local pppoeUser "CHANGE_ME_PPPOE_LOGIN"
    :local pppoePass "CHANGE_ME_PPPOE_PASSWORD"
    :local wifiSSID "MikroTik-Home"
    :local wifiPass "CHANGE_ME_WIFI_PASSWORD"

    :if (($pppoeUser = "CHANGE_ME_PPPOE_LOGIN") || ($pppoePass = "CHANGE_ME_PPPOE_PASSWORD") || ($wifiPass = "CHANGE_ME_WIFI_PASSWORD")) do={
        :error "Set PPPoE login/password and Wi-Fi password first"
    }
    :if (([:len $wifiPass] < 8) || ([:len $wifiPass] > 63)) do={
        :error "Wi-Fi passphrase must contain 8-63 ASCII characters"
    }
    :if (([:len [/interface bridge find]] > 0) || ([:len [/ip address find]] > 0) || ([:len [/ip firewall filter find]] > 0)) do={
        :error "Use an empty configuration after no-defaults=yes reset"
    }
    :if ([:len [/interface wireless find where default-name="wlan1"]] != 1) do={
        :error "wlan1 missing: check the legacy wireless package"
    }

    /interface bridge add name=bridge-lan protocol-mode=rstp vlan-filtering=no
    /interface bridge port add bridge=bridge-lan interface=ether2 hw=yes
    /interface bridge port add bridge=bridge-lan interface=ether3 hw=yes
    /interface bridge port add bridge=bridge-lan interface=ether4 hw=yes
    /interface bridge port add bridge=bridge-lan interface=ether5 hw=yes
    /interface bridge port add bridge=bridge-lan interface=wlan1
    /interface bridge settings set use-ip-firewall=no

    /interface list add name=LAN
    /interface list member add list=LAN interface=bridge-lan

    /interface wireless security-profiles add name=wifi-home mode=dynamic-keys authentication-types=wpa2-psk unicast-ciphers=aes-ccm group-ciphers=aes-ccm wpa2-pre-shared-key=$wifiPass
    /interface wireless set [find default-name=wlan1] mode=ap-bridge band=2ghz-g/n wireless-protocol=802.11 channel-width=20mhz frequency=auto scan-list=2412,2437,2462 country=russia frequency-mode=regulatory-domain antenna-gain=3 installation=indoor distance=indoors tx-power-mode=default tx-chains=0,1 rx-chains=0,1 wmm-support=enabled wps-mode=disabled default-authentication=yes default-forwarding=yes ssid=$wifiSSID security-profile=wifi-home disabled=yes

    /ip address add address=192.168.88.1/24 interface=bridge-lan
    /ip pool add name=pool-lan ranges=192.168.88.100-192.168.88.250
    /ip dhcp-server add name=dhcp-lan interface=bridge-lan address-pool=pool-lan lease-time=1d disabled=no
    /ip dhcp-server network add address=192.168.88.0/24 gateway=192.168.88.1 dns-server=192.168.88.1
    /ip dns set allow-remote-requests=yes
    /ip settings set ip-forward=yes

    /ppp profile add name=pppoe-home change-tcp-mss=yes use-ipv6=no use-mpls=no
    /interface pppoe-client add name=pppoe-out1 interface=ether1 user=$pppoeUser password=$pppoePass profile=pppoe-home add-default-route=yes default-route-distance=1 use-peer-dns=yes max-mtu=1492 max-mru=1492 dial-on-demand=no disabled=yes

    /ip firewall filter add chain=input action=accept connection-state=established,related comment="Accept established and related"
    /ip firewall filter add chain=input action=drop connection-state=invalid comment="Drop invalid"
    /ip firewall filter add chain=input action=accept protocol=icmp comment="Allow ICMP and PMTU discovery"
    /ip firewall filter add chain=input action=accept in-interface-list=LAN comment="Allow LAN access to router"
    /ip firewall filter add chain=input action=drop comment="Block other access to router"

    /ip firewall filter add chain=forward action=fasttrack-connection connection-state=established,related comment="FastTrack IPv4 connections"
    /ip firewall filter add chain=forward action=accept connection-state=established,related comment="Accept established and related"
    /ip firewall filter add chain=forward action=drop connection-state=invalid comment="Drop invalid"
    /ip firewall filter add chain=forward action=accept in-interface-list=LAN out-interface=pppoe-out1 comment="Allow LAN to Internet"
    /ip firewall filter add chain=forward action=drop comment="Block other routed traffic"

    /ip firewall nat add chain=srcnat action=masquerade src-address=192.168.88.0/24 out-interface=pppoe-out1 comment="NAT LAN to PPPoE"

    # RouterOS 7 has built-in IPv6; RouterOS 6 may have its optional package disabled.
    :local rosVersion [/system resource get version]
    :if (([:pick $rosVersion 0 1] = "7") || ([:len [/system package find where name="ipv6" disabled=no]] > 0)) do={
        /ipv6 firewall filter add chain=input action=drop comment="IPv4-only setup"
        /ipv6 firewall filter add chain=forward action=drop comment="IPv4-only setup"
    }

    /ip neighbor discovery-settings set discover-interface-list=LAN
    /tool mac-server set allowed-interface-list=LAN
    /tool mac-server mac-winbox set allowed-interface-list=LAN
    /tool bandwidth-server set enabled=no
    /ip service disable [find name=telnet]
    /ip service disable [find name=ftp]
    /ip service disable [find name=api]
    /ip service disable [find name=api-ssl]
    /ip service set [find name=winbox] address=192.168.88.0/24
    /ip service set [find name=ssh] address=192.168.88.0/24
    /ip service set [find name=www] address=192.168.88.0/24
    /ip service set [find name=www-ssl] address=192.168.88.0/24

    /interface wireless enable [find default-name=wlan1]
    /interface pppoe-client enable [find name=pppoe-out1]
    :put "Setup complete. LAN IP: 192.168.88.1. Connect ISP cable to ether1."
}

Сам файл не стоит хранить рядом с проектами в репозитории после того, как вы подставили в него пароли: логин и пароль PPPoE — это доступ к вашему договору с провайдером. Принцип тот же, что с .env на сайте: файл с паролями в репозитории рано или поздно оказывается там, где его не ждали, — например, в каталоге .git, который забыли закрыть на веб-сервере. Этот пункт есть в чеклисте аудита безопасности.

Как сгенерировать скрипт со своими данными

Править переменные руками — значит каждый раз помнить про экранирование $, " и \, длину ключа Wi-Fi и то, что пароль не должен остаться в истории терминала. Генератор делает это за вас: спрашивает четыре значения, проверяет их и собирает rb951g-setup.rsc из шаблона. Шаблон он не меняет, поэтому один и тот же rb951g-template.rsc годится для любого количества роутеров.

Что генератор проверяет и делает:

  • пароли вводятся без отображения на экране и не попадают в историю команд;
  • длина: пароль Wi-Fi — 8–63 символа, как требует WPA2, имя сети — до 32;
  • только печатные ASCII-символы: кириллица в SSID и паролях отклоняется сразу, а не на роутере;
  • \, ", $ и ? экранируются обратным слешем под синтаксис строк RouterOS;
  • в шаблоне должны найтись все четыре строки :local — иначе файл не создаётся;
  • результат пишется в ASCII с переводами строк LF и правами только для владельца.

Bash: Linux и macOS

bash
#!/usr/bin/env bash
# make-rsc.sh — подставляет данные PPPoE и Wi-Fi в шаблон rb951g-template.rsc
set -euo pipefail
export LC_ALL=C   # длина в байтах, [[:print:]] — только ASCII

tpl=${1:-rb951g-template.rsc}
out=${2:-rb951g-setup.rsc}
[[ -f $tpl ]] || { echo "Нет шаблона: $tpl" >&2; exit 1; }

# ask <переменная> <подсказка> <мин. длина> <макс. длина> [secret]
ask() {
  local v
  if [[ ${5:-} == secret ]]; then read -rsp "$2: " v; echo >&2; else read -rp "$2: " v; fi
  (( ${#v} >= $3 && ${#v} <= $4 )) || { echo "$2: длина от $3 до $4 символов" >&2; exit 1; }
  [[ $v =~ ^[[:print:]]+$ ]] || { echo "$2: только ASCII — латиница, цифры, знаки" >&2; exit 1; }
  # Экранирование для строки RouterOS: \ " $ ?
  printf -v "$1" '%s' "$(printf '%s' "$v" | sed 's/[\\"$?]/\\&/g')"
}

ask user  "Логин PPPoE"    1 64
ask pass  "Пароль PPPoE"   1 64 secret
ask ssid  "Имя сети Wi-Fi" 1 32
ask wpass "Пароль Wi-Fi"   8 63 secret

umask 077   # в файле пароли: читать может только владелец
n=0
while IFS= read -r line || [[ -n $line ]]; do
  line=${line%$'\r'}   # шаблон, сохранённый в Windows, приходит с CRLF
  case $line in
    *':local pppoeUser '*) line="    :local pppoeUser \"$user\"";  n=$((n + 1)) ;;
    *':local pppoePass '*) line="    :local pppoePass \"$pass\"";  n=$((n + 1)) ;;
    *':local wifiSSID '*)  line="    :local wifiSSID \"$ssid\"";   n=$((n + 1)) ;;
    *':local wifiPass '*)  line="    :local wifiPass \"$wpass\"";  n=$((n + 1)) ;;
  esac
  printf '%s\n' "$line"
done < "$tpl" > "$out"

(( n == 4 )) || { rm -f "$out"; echo "В шаблоне найдено $n переменных из 4" >&2; exit 1; }
echo "Готово: $out" >&2

Запуск — из папки, где лежит шаблон:

bash
chmod +x make-rsc.sh
./make-rsc.sh                             # rb951g-template.rsc → rb951g-setup.rsc
./make-rsc.sh rb951g-template.rsc office.rsc   # свои имена файлов

LC_ALL=C в начале — не формальность. В UTF-8-локали ${#v} считает символы, а [[:print:]] пропускает кириллицу, и SSID «Дом» прошёл бы проверку. В локали C обе проверки работают с байтами, и всё, что не ASCII, отсекается.

PowerShell: Windows

powershell
# make-rsc.ps1 — подставляет данные PPPoE и Wi-Fi в шаблон rb951g-template.rsc
param(
    [string]$Template = 'rb951g-template.rsc',
    [string]$Out = 'rb951g-setup.rsc'
)
$ErrorActionPreference = 'Stop'

function Ask([string]$Prompt, [int]$Min, [int]$Max, [switch]$Secret) {
    if ($Secret) {
        $bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR((Read-Host $Prompt -AsSecureString))
        try { $v = [Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr) }
        finally { [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr) }
    } else { $v = Read-Host $Prompt }
    if ($v.Length -lt $Min -or $v.Length -gt $Max) { throw "${Prompt}: длина от $Min до $Max символов" }
    if ($v -cnotmatch '^[\x20-\x7E]+$') { throw "${Prompt}: только ASCII — латиница, цифры, знаки" }
    # Экранирование для строки RouterOS: \ " $ ?
    return ($v -replace '([\\"$?])', '\$1')
}

$vals = @{
    pppoeUser = Ask 'Логин PPPoE' 1 64
    pppoePass = Ask 'Пароль PPPoE' 1 64 -Secret
    wifiSSID  = Ask 'Имя сети Wi-Fi' 1 32
    wifiPass  = Ask 'Пароль Wi-Fi' 8 63 -Secret
}

$n = 0
$lines = foreach ($line in [IO.File]::ReadAllLines((Resolve-Path $Template).Path)) {
    if ($line -cmatch '^\s*:local (pppoeUser|pppoePass|wifiSSID|wifiPass) ') {
        $n++
        '    :local {0} "{1}"' -f $Matches[1], $vals[$Matches[1]]
    } else { $line }
}
if ($n -ne 4) { throw "В шаблоне найдено $n переменных из 4" }

# ASCII без BOM и переводы строк LF — так файл выглядит так же, как из bash-версии
$path = Join-Path (Get-Location).Path $Out
[IO.File]::WriteAllText($path, ($lines -join "`n") + "`n", [Text.Encoding]::ASCII)
Write-Host "Готово: $path"
powershell
powershell -ExecutionPolicy Bypass -File .\make-rsc.ps1

Кодировка самого .ps1 важна. Windows PowerShell 5.1 читает файл скрипта без BOM в кодировке ANSI — на русской Windows это cp1251, и кириллица в подсказках превращается в кракозябры. Сохраните make-rsc.ps1 в UTF-8 с BOM; в PowerShell 7 это не нужно, но и не мешает. Результат генератор, наоборот, пишет в ASCII без BOM: RouterOS ждёт в первой строке команду или комментарий, а не служебные байты.

Готовый rb951g-setup.rsc содержит пароли открытым текстом. После импорта удалите его и с роутера, и с компьютера — на роутере он больше не нужен, а шаблон, из которого его можно собрать заново, у вас остаётся.

Когда этот скрипт не подходит

  • Провайдер выдаёт адрес по DHCP или статикой. PPPoE-клиент не нужен, правила с out-interface=pppoe-out1 нужно переписать на ether1, а change-tcp-mss и MTU 1492 становятся лишними.
  • Нужны VLAN. На RB951G-2HnD фильтрация VLAN на мосту отключает аппаратную коммутацию. Сегментацию на этой модели делают через настройки коммутатора в /interface ethernet switch, а это уже другой скрипт.
  • Нужны гостевая сеть, IPv6 или проброс портов. Скрипт сознательно их не делает: каждая из этих функций требует собственных правил файрвола, и добавлять их «на всякий случай» — способ открыть то, что открывать не собирались.
  • Роутер уже работает. Скрипт рассчитан на пустую конфигурацию и откажется запускаться, если найдёт мост, адрес или правило файрвола. Переносить на работающий роутер нужно отдельные блоки вручную, сверяясь с /export.
  • Роутеров больше одного. Для нескольких точек доступа правильнее централизованное управление Wi-Fi через CAPsMAN, а не копия скрипта на каждом устройстве.

Итоги

  • Скрипт подходит для одного сценария: RB951G-2HnD или похожий MikroTik с legacy wireless, PPPoE-провайдер, пустая конфигурация после сброса.
  • Проверки в начале важнее команд: импорт не транзакционный, и всё, что может упасть, должно упасть до первого изменения.
  • Интернет включается последним — после файрвола, NAT и ограничения сервисов.
  • FastTrack — обязательная часть конфигурации на процессоре 600 МГц: без него 25 правил режут маршрутизацию в 3,5 раза.
  • vlan-filtering=no на этой модели — условие гигабитной коммутации между портами.

Ценность скрипта не в первой настройке — её можно один раз и прокликать. Она во второй: после сброса, замены роутера или неудачного эксперимента вы за две минуты возвращаете ровно ту конфигурацию, которая работала, а не ту, которую удалось вспомнить.

Частые вопросы

Как настроить PPPoE на MikroTik через терминал?

Создать PPP-профиль с change-tcp-mss=yes и клиент командой /interface pppoe-client add interface=ether1 user=логин password=пароль add-default-route=yes use-peer-dns=yes max-mtu=1492 max-mru=1492. MTU 1492 — это 1500 байт Ethernet минус 8 байт заголовка PPPoE. Без change-tcp-mss часть сайтов будет открываться не до конца: большие TCP-пакеты не пролезут в туннель. Перед включением клиента должны стоять правила файрвола и NAT.

Как объединить порты MikroTik в коммутатор вместе с Wi-Fi?

Создать bridge и добавить в него ether2–ether5 с параметром hw=yes и интерфейс wlan1. Проводные порты на RB951G-2HnD обслуживает коммутатор AR8327 без участия процессора, а Wi-Fi в мосту обрабатывается процессором — это нормально. IP-адрес и DHCP-сервер вешаются на bridge, а не на отдельные порты. Включать vlan-filtering на этой модели нельзя без потери аппаратной разгрузки: AR8327 фильтрацию VLAN в мосту не поддерживает.

Какие настройки Wi-Fi MikroTik выбрать для России?

country=russia и frequency-mode=regulatory-domain, чтобы роутер сам ограничил мощность под лимит 100 мВт ЭИИМ из решения ГКРЧ № 07-20-03-001. Режим 2ghz-g/n без 802.11b, ширина канала 20 МГц и список каналов 1, 6, 11 — единственные три непересекающиеся 20-мегагерцовые канала, которые видят устройства из любого региона. Шифрование — только WPA2-PSK с AES, WPS выключен.

Почему после настройки MikroTik интернет медленнее тарифа?

Чаще всего не срабатывает FastTrack, и весь трафик проходит через правила файрвола на процессоре 600 МГц. Проверить можно командой /ip firewall filter print stats: счётчик байт у правила fasttrack-connection должен расти. FastTrack отключается, если включены очереди с parent=global, запущены torch или sniffer, или у bridge включён use-ip-firewall. Если по кабелю скорость в порядке, а по Wi-Fi нет — упираетесь в радио: 802.11n 2×2 на канале 20 МГц даёт не больше 144 Мбит/с канальной скорости.

Что делать, если после импорта скрипта пропал доступ к MikroTik?

Проверить, в какой порт вы подключены. Скрипт разрешает Winbox, SSH и веб-интерфейс только из сети 192.168.88.0/24 и только с интерфейсов из списка LAN, а MAC-Winbox — тоже только из LAN. Если во время настройки кабель был в ether1, после импорта роутер перестанет отвечать на нём. Переключите ноутбук в любой из портов ether2–ether5 и подключайтесь к 192.168.88.1.

Когда скрипт базовой настройки MikroTik не подходит?

Когда провайдер выдаёт адрес по DHCP или статикой, а не по PPPoE; когда нужны VLAN, гостевая сеть, IPv6 или проброс портов; когда роутер уже работает и на нём есть конфигурация, которую жалко терять. Скрипт рассчитан на один сценарий — домашний или офисный роутер на пустой конфигурации — и сознательно отказывается запускаться, если на роутере уже есть мост, IP-адреса или правила файрвола.