Чтобы настроить 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, и таких роутеров в квартирах и небольших офисах ещё много.
Провайдер
│ 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| Порт | Роль | Что на нём |
|---|---|---|
| ether1 | WAN | PPPoE-клиент, MTU 1492, маршрут по умолчанию |
| ether2–ether5 | LAN | Мост с аппаратной коммутацией |
| wlan1 | LAN | Точка доступа WPA2, в том же мосту |
Устройства в проводной сети и в Wi-Fi видят друг друга напрямую: принтер по кабелю доступен с ноутбука по Wi-Fi без дополнительных правил. Из интернета на роутер и в локальную сеть входящие соединения не проходят.
Почему сброс с no-defaults, а не правка заводской конфигурации
Заводская конфигурация MikroTik (defconf) уже содержит мост, адрес 192.168.88.1, DHCP-сервер, списки интерфейсов и правила файрвола. Кажется логичным взять её и поменять DHCP-клиент на PPPoE. На практике получаются две проблемы.
Первая — дубликаты. Скрипт, написанный под пустую конфигурацию, на defconf создаст второй мост, второй адрес из той же сети и второй набор правил. Роутер начнёт вести себя непредсказуемо: адрес висит на двух интерфейсах, DHCP-серверы конкурируют за одни и те же порты.
Вторая — неизвестное состояние. Defconf отличается между версиями RouterOS и между моделями, и если роутер уже кто-то настраивал, вы не знаете, что в нём осталось. Скрипт, применённый к неизвестному состоянию, даёт неизвестный результат.
Поэтому скрипт проверяет, что на роутере нет ни одного моста, IP-адреса и правила файрвола, и отказывается работать, если что-то есть. Сброс выполняется так:
# Терминал RouterOS: сброс без заводской конфигурации
/system reset-configuration no-defaults=yes skip-backup=yes keep-users=yesno-defaults=yes оставляет роутер пустым, keep-users=yes сохраняет пользователей и их пароли. После перезагрузки на роутере нет ни одного IP-адреса, и подключаться к нему придётся по MAC-адресу.
Сброс стирает всю конфигурацию. Если роутер уже работает, сначала сохраните её: /export file=before-reset даёт читаемый скрипт, /system backup save name=before-reset — бинарную копию для восстановления на этом же устройстве. Оба файла скачайте с роутера до сброса.
Как запустить скрипт: пошагово
- Подставить свои данные. В начале скрипта четыре переменные: логин и пароль PPPoE от провайдера, имя и пароль Wi-Fi. Пароль Wi-Fi — от 8 до 63 символов, иначе скрипт остановится. Руками их можно не править: генератор на bash или PowerShell спросит данные и соберёт готовый
rb951g-setup.rsc. - Сбросить роутер командой выше. Кабель провайдера из ether1 на время настройки вынуть.
- Подключиться по MAC. Ноутбук — кабелем в ether2. В Winbox на вкладке Neighbors появится роутер; подключаться нужно по MAC-адресу, а не по IP.
- Загрузить скрипт. Перетащить файл
rb951g-setup.rscв окно Files. - Выполнить импорт в New Terminal:
# Терминал RouterOS: импорт скрипта
/import file-name=rb951g-setup.rsc- Подключить провайдера. После строки
Setup completeвставить кабель провайдера в ether1. Ноутбук получит адрес из диапазона 192.168.88.100–250, роутер будет доступен по 192.168.88.1. - Удалить скрипт с роутера. Файл остаётся во флеш-памяти, и пароли в нём лежат открытым текстом:
/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
# 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=nohw=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 выбрать для России
# 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
# 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=yesMTU 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: как не потерять скорость
# 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-out1FastTrack — это механизм 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:
# Терминал 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 скрипт не запустится.
# 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
#!/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Запуск — из папки, где лежит шаблон:
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
# 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 -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-адреса или правила файрвола.