<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Сеть | Константин Стародубов</title><link>https://starodubov.pro/tags/%D1%81%D0%B5%D1%82%D1%8C/</link><description>Личный сайт Константина Стародубова — информационная безопасность, комплаенс и технологии идентификации.</description><language>ru-RU</language><managingEditor>xaku68@gmail.com (Константин Стародубов)</managingEditor><lastBuildDate>Thu, 11 Jun 2026 22:02:12 +0300</lastBuildDate><atom:link href="https://starodubov.pro/tags/%D1%81%D0%B5%D1%82%D1%8C/index.xml" rel="self" type="application/rss+xml"/><item><title>MikroTik hAP ax3 с нуля: полный разбор конфигурации на RouterOS 7</title><link>https://starodubov.pro/mikrotik-hap-ax3-%D1%81-%D0%BD%D1%83%D0%BB%D1%8F-%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9-%D1%80%D0%B0%D0%B7%D0%B1%D0%BE%D1%80-%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%B8-%D0%BD%D0%B0-routeros-7/</link><pubDate>Sat, 07 Mar 2026 00:00:00 +0300</pubDate><author>xaku68@gmail.com (Константин Стародубов)</author><guid>https://starodubov.pro/mikrotik-hap-ax3-%D1%81-%D0%BD%D1%83%D0%BB%D1%8F-%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9-%D1%80%D0%B0%D0%B7%D0%B1%D0%BE%D1%80-%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%B8-%D0%BD%D0%B0-routeros-7/</guid><description>Разбор рабочей конфигурации роутера MikroTik hAP ax3 на RouterOS 7: Wi‑Fi 6, DHCP, DoH, WireGuard, split-tunnel для AI и YouTube, BGP, firewall, скрипты и обслуживание.</description><content:encoded><![CDATA[<p>Когда в руки попадает устройство с Wi‑Fi 6 (802.11ax), а не просто «ещё один роутер», хочется не только включить его и забыть, а разобраться: что именно даёт новый стандарт, как правильно выжать из него пользу и не наступить на типичные грабли. Я собрал в одном месте разбор своей рабочей конфигурации <strong>MikroTik hAP ax3</strong> на <strong>RouterOS 7.21.3</strong> — от схемы и сброса до Wi‑Fi, VPN, BGP и скриптов. Это не сухая инструкция «нажмите сюда», а скорее рассказ о том, как всё устроено и почему сделано именно так. Если нужна пошаговая настройка «с нуля» с картинками и тестами — отличный ориентир: <a href="https://gregory-gost.ru/mikrotik-perehodim-na-routeros-7-i-wi-fi-6-802-11ax-nastroika-hap-ax3/" target="_blank" rel="noopener">статья на Gregory Gost про hAP ax3 и RouterOS 7</a>.</p>
<hr>
<h2 id="0-кратко-об-устройстве-hap-ax3-и-routeros-7">0. Кратко об устройстве hAP ax3 и RouterOS 7</h2>
<p><img src="/images/external/mikrotik-hap-ax3-diagram.png" alt="Блок-схема MikroTik hAP ax³ — расположение чипов и интерфейсов" title="Официальный Block Diagram hAP ax³, источник: MikroTik" loading="lazy" decoding="async"></p>
<p><strong>hAP ax³</strong> — это уже не «коробочка с антеннами», а полноценный роутер с Wi‑Fi 6. Внешне он продолжает линейку MikroTik: чёрный корпус, приятная soft-touch поверхность, ничего лишнего. На схеме выше — официальная блок-схема платы (Block Diagram) с сайта производителя: расположение процессора IPQ-6010, радиомодулей, портов и USB. Страница продукта с фотографиями корпуса и спецификацией: <a href="https://mikrotik.com/product/hap%5Fax3" target="_blank" rel="noopener">mikrotik.com/product/hap_ax3</a>.</p>
<p>Под крышкой — ARM 64-bit, процессор <strong>IPQ-6010</strong> (4 ядра, авточастота 864–1800 МГц), 1 ГБ RAM и 128 МБ NAND. Порты: один на 2.5G и четыре гигабитных Ethernet, плюс USB 3.0 (до 1.5 А) — удобно для флешки с бэкапами. Беспроводная часть заявлена как <strong>AX1800</strong>: до 574 Mbit/s на 2.4 ГГц и до 1200 Mbit/s на 5 ГГц, два радиомодуля (Qualcomm QCN-5022 и QCN-5052), стандарты 802.11b/g/n/ax и 802.11a/n/ac/ax. То есть и старые устройства подключатся, и новые смогут использовать Wi‑Fi 6. Габариты 251×130×39 мм, рабочая температура от −20 до +70 °C — для дома с запасом.</p>
<p><strong>RouterOS 7</strong> компания MikroTik впервые показала в 2019 году на MUM в России; стабильной ветка стала в декабре 2021-го. Сейчас на всех ARM-устройствах по умолчанию уже седьмая версия. От шестой её отличает новое ядро Linux (5+): поддержка современных Wi‑Fi чипов, 5G-модемов и другой периферии, которой не было на старом ядре. На момент написания статьи у v7 по-прежнему нет ветки long-term — живём на stable. Важный нюанс: Wi‑Fi 6 на чипах Qualcomm в ROS 7 вынесен в отдельный пакет <strong>wifi-qcom</strong>. При обновлении прошивки его нужно ставить вместе с основным пакетом, иначе беспроводная часть не заработает. Подробная спецификация, фото платы и пошаговая настройка — в <a href="https://gregory-gost.ru/mikrotik-perehodim-na-routeros-7-i-wi-fi-6-802-11ax-nastroika-hap-ax3/" target="_blank" rel="noopener">статье Gregory Gost</a>.</p>
<hr>
<h2 id="1-что-мы-в-итоге-строим">1. Что мы в итоге строим</h2>
<p>Чтобы не блуждать по разделам впустую, сразу обозначу общую картину. Роутер выступает и как точка входа в интернет (WAN по DHCP от провайдера), и как единый центр для домашней сети и Wi‑Fi.</p>
<p><strong>Сеть и порты.</strong> Один порт (<code>ether1</code>) — WAN, четыре остальных плюс Wi‑Fi объединены в один LAN bridge. То есть и проводные устройства, и беспроводные оказываются в одной подсети. Два SSID: основной, условно <code>home-wifi</code>, для телефонов, ноутбуков и всего привычного; отдельный <code>iot-guest</code> на 2.4 ГГц — для умных лампочек, датчиков, принтера и прочего, что не хочется мешать с основным трафиком. Локальная сеть — классические <code>192.168.10.0/24</code>, роутер на <code>.1</code>, DHCP раздаёт адреса из пула (например 100–254).</p>
<p><strong>Интернет и DNS.</strong> DNS не доверяем провайдеру: всё идёт через <strong>AdGuard DoH</strong> на роутере, а клиентов принудительно перенаправляем на него, чтобы даже при ручной настройке DNS на устройстве запросы шли через наш фильтр.</p>
<p><strong>VPN и маршрутизация.</strong> Подняты <strong>WireGuard</strong> и <strong>L2TP/IPsec</strong> — два варианта на выбор или в запас. Часть трафика (например AI-сервисы и YouTube) уходит через WireGuard по отдельной routing table и mangle, остальное — напрямую через провайдера. Для обхода блокировок используются BGP-подписки (antifilter.download и antifilter.network): маршруты подтягиваются динамически, трафик к нужным префиксам уходит через VPN.</p>
<p><strong>Безопасность и обслуживание.</strong> Доступ к управлению (SSH, Winbox) только из LAN. Firewall, DDoS-защита, отключённые лишние сервисы. Плюс скрипты: резервные копии на USB, проверка обновлений RouterOS и уведомления в Telegram, мониторинг доступности хоста, сбор IP для YouTube из DNS-кэша и импорт списков подсетей. Всё это завязано на scheduler, чтобы работало само.</p>
<p>Дальше — как к этой схеме прийти по шагам и что важно не упустить.</p>
<hr>
<h2 id="2-с-чего-начать-с-нуля">2. С чего начать с нуля</h2>
<p>Если брать роутер «из коробки» и собирать конфиг с нуля, логичный порядок такой:</p>
<p>Сначала железо и база: обновить RouterOS (Main package + <strong>wifi-qcom</strong> из Extra packages), переименовать интерфейсы, собрать bridge, поднять Wi‑Fi (основной и при необходимости IoT SSID). Потом сеть: адресация на bridge, DHCP-сервер, WAN-клиент. Затем DNS и DoH, ограничение доступа к управлению. После этого — VPN (WireGuard, при желании L2TP), split-routing для нужных сервисов, BGP и фильтры. В конце — firewall, NAT, отключение лишних service-port, NTP, логирование, скрипты и scheduler. Так конфиг читается по слоям и меньше шансов что-то сломать в уже работающем.</p>
<hr>
<h2 id="21-сброс-и-обновление-прошивки">2.1. Сброс и обновление прошивки</h2>
<p>Роутер из коробки уже настроен под типовой сценарий. Чтобы собрать свою схему, конфигурацию лучше сбросить. Подключаться удобнее к порту <strong>Eth2</strong> (красный): у заводской конфигурации в Eth1 (зелёный) обычно предполагается кабель провайдера, и после сброса вы не потеряете связь с ПК. На компьютере выставляем статический IP, например 192.168.88.250/24, заходим в WinBox по MAC-адресу и выполняем:</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">system reset-configuration no-defaults=yes skip-backup=yes
</code></pre><p>После сброса у роутера не будет IP — подключаемся снова по MAC. Заводской пароль написан на наклейке <strong>Product information</strong> на выдвижной площадке под корпусом — «всё как у взрослых», ничего не придумываем.</p>
<p>Частая ошибка — попытаться залить бэкап со старого роутера и «чуть подправить». Версия ОС и железо другие, лучше не рисковать. Разумнее экспортировать конфиг с предыдущего устройства (<code>export file=myconfig</code>), сохранить файл и переносить настройки по частям, сверяясь с документацией. Так и ошибки виднее, и понимание конфига выше.</p>
<p>Обновление до актуальной stable (или long-term, когда она появится для v7): скачиваем <strong>Main package</strong> и из архива <strong>Extra packages</strong> достаём пакет <strong>wifi-qcom</strong>. Оба файла перетаскиваем в WinBox на роутер и перезагружаем. Роутер сам подхватит пакеты и обновится. После перезагрузки снова заходим и продолжаем настройку.</p>
<hr>
<h2 id="3-диск-и-хранение-резервных-копий">3. Диск и хранение резервных копий</h2>
<p>Встроенной памяти у роутера немного (128 МБ NAND), и таскать туда тяжёлые backup’ы не хочется. Удобнее сразу завести флешку: разбить её как отдельный раздел и складывать туда и бинарные backup’ы, и текстовые export’ы. Пример создания раздела (размер под свой носитель):</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/disk
add parent=usb1 partition-number=1 partition-offset=512 partition-size=15676210688 type=partition
</code></pre><p>Файлы резервных копий и экспортов тогда лежат, например, в <code>usb1-part1/backup/</code>. И место не жрём с роутера, и при перепрошивке или смене устройства архив под рукой.</p>
<hr>
<h2 id="4-именование-интерфейсов">4. Именование интерфейсов</h2>
<p>По умолчанию интерфейсы называются ether1, ether2 и т.д. — в конфиге и в головах быстро путаешься. Имеет смысл сразу переименовать их во что читаемое:</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/interface ethernet
set [ find default-name=ether1 ] name=LAN-Eth1
set [ find default-name=ether2 ] name=LAN-Eth2
set [ find default-name=ether3 ] name=LAN-Eth3
set [ find default-name=ether4 ] name=LAN-Eth4
set [ find default-name=ether5 ] name=LAN-Eth5
</code></pre><p>В моей схеме <code>LAN-Eth1</code> по факту используется как WAN (кабель провайдера). Название, конечно, сбивает с толку — идеальнее было бы что-то вроде <code>WAN-Eth1</code>. Но раз уж в рабочем конфиге имя прижилось, я его не трогал. Если настраиваете с нуля, можно сразу задать осмысленные имена: так и в списке интерфейсов всё будет сортироваться понятнее.</p>
<hr>
<h2 id="5-bridge-для-локальной-сети">5. Bridge для локальной сети</h2>
<p>Один общий bridge объединяет все LAN-интерфейсы и Wi‑Fi в один L2-сегмент:</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/interface bridge
add comment=LAN mtu=1500 name=LAN-Bridge protocol-mode=none
</code></pre><p>В него добавляются порты <code>LAN-Eth2</code>…<code>LAN-Eth5</code>, радиомодули <code>LAN-wifi5ghz</code> и <code>LAN-wifi24ghz</code>, а также виртуальный интерфейс для IoT (<code>iot-guest</code>). И основная сеть, и «умный дом» оказываются в одной подсети; разделение только по SSID и security profile, без VLAN. Для домашнего сценария этого часто хватает: устройства видят друг друга, при необходимости можно вынести IoT в отдельный VLAN позже.</p>
<p>Добавление портов в bridge (виртуальный интерфейс IoT создаётся в §8 и тогда же добавляется в bridge):</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/interface bridge port
add bridge=LAN-Bridge interface=LAN-Eth2
add bridge=LAN-Bridge interface=LAN-Eth3
add bridge=LAN-Bridge interface=LAN-Eth4
add bridge=LAN-Bridge interface=LAN-Eth5
add bridge=LAN-Bridge interface=LAN-wifi5ghz
add bridge=LAN-Bridge interface=LAN-wifi24ghz
add bridge=LAN-Bridge interface=iot-guest
</code></pre><hr>
<h2 id="6-списки-интерфейсов">6. Списки интерфейсов</h2>
<p>Чтобы не привязывать firewall и NAT к конкретным портам (которые потом можно перекинуть), в RouterOS удобно пользоваться <strong>interface list</strong>. Я завёл три: <code>LAN</code> (в нём bridge), <code>WAN</code> (порт с провайдером), <code>VPN</code> (интерфейс WireGuard). Все правила фильтрации, NAT, raw и mangle ссылаются на эти списки. Поменял порт — обновил членство в списке, правила остаются теми же.</p>
<p>Создание списков и привязка интерфейсов (член списка = интерфейс, по которому потом фильтруем):</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/interface list
add name=LAN
add name=WAN
add name=VPN comment=VPN

/interface list member
add interface=LAN-Bridge list=LAN
add interface=LAN-Eth1 list=WAN
add interface=wireguard1 list=VPN
</code></pre><p>Дополнительно имеет смысл включить <strong>neighbor discovery</strong> только для LAN — чтобы WinBox и прочие утилиты видели роутер в списке соседей только с внутренней сети: <code>/ip neighbor discovery-settings set discover-interface-list=LAN</code>.</p>
<hr>
<h2 id="7-wifi-6-основная-домашняя-сеть">7. Wi‑Fi 6: основная домашняя сеть</h2>
<p>Здесь самое интересное: ради чего вообще брали устройство с AX. Настройки в RouterOS 7 разнесены по меню <strong>WiFi</strong> — Security, Channel, Configuration; отдельного «Advanced Mode» больше нет, все опции на виду.</p>
<h3 id="что-даёт-стандарт-80211ax-wifi-6">Что даёт стандарт 802.11ax (Wi‑Fi 6)</h3>
<p>Помимо заявленных скоростей, полезны вещи, которые реально чувствуются в быту. <strong>Beamforming</strong> — роутер «подстраивает» луч под клиента, приём и передача стабильнее. <strong>WPA3</strong> даёт более стойкую аутентификацию. <strong>OFDMA</strong> (то, что давно есть в LTE) помогает, когда к одной точке висит куча устройств — они меньше мешают друг другу. Модуляция <strong>QAM-1024</strong> против прежней QAM-256 даёт прирост бит на герц. Плюс 802.11r/k/v: быстрый роуминг между точками, RRM (клиент может запрашивать список соседних AP), WNM (сеть может подсказывать клиенту перейти на другой канал). Всё это уже заложено в железе и драйверах; главное — не отключать лишнего и правильно выбрать канал.</p>
<h3 id="5-ггц-в-россии-unii-1-и-грабли-с-dfs">5 ГГц в России: UNII-1 и грабли с DFS</h3>
<p>С 5 ГГц в нашей стране ситуация особая. По факту для гражданского Wi‑Fi широко доступен только диапазон <strong>UNII-1</strong> (5170–5250 МГц). Остальные диапазоны (UNII-2, UNII-2 Extended, UNII-3) либо не лицензированы под бытовой Wi‑Fi, либо используются другими службами. И вот тут подвох: на этих частотах работает <strong>DFS</strong> (Dynamic Frequency Selection). Если роутер «услышит» радар (а радарные импульсы короткие, порядка долей микросекунды, и их бывает сложно отличить от помех), он обязан сменить канал. В итоге все клиенты разом теряют связь — сидишь, работаешь или смотришь фильм, и в один момент всё обрывается. Неприятно и непредсказуемо. Найти «тихую» частоту в DFS-диапазоне методом тыка можно, но гарантий нет: полгода всё ок, потом в один день — смена канала и обрыв.</p>
<p>Практичный вывод для домашней сети: зафиксировать канал в <strong>UNII-1</strong>, например <strong>5180 МГц</strong>, и отключить DFS (<code>skip-dfs-channels=all</code> или <code>disabled</code>). Тогда Wi‑Fi не будет самопроизвольно перепрыгивать. Ширина канала — 20, 40 или 80 MHz. 80 MHz занимает весь UNII-1 и даёт максимум скорости, но в плотной застройке все соседи тоже сидят на 5 ГГц, и узкий канал (20 или 40 MHz) часто оказывается стабильнее. Узнать, какие диапазоны разрешены для страны, можно так (для России):</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/interface wifi radio reg-info country=Russia number=0
</code></pre><p>В выводе будут указаны допустимые диапазоны, например 2402–2482 (2.4 ГГц) и 5170–5250 (UNII-1) и далее. Подробнее про 5 ГГц в РФ, DFS и тесты — в <a href="https://gregory-gost.ru/mikrotik-perehodim-na-routeros-7-i-wi-fi-6-802-11ax-nastroika-hap-ax3/" target="_blank" rel="noopener">статье Gregory Gost</a>.</p>
<h3 id="профиль-безопасности-и-конфигурация">Профиль безопасности и конфигурация</h3>
<p>Сначала создаём профиль безопасности: WPA2 и WPA3, отключаем PMKID и WPS, включаем <strong>management protection</strong> (для WPA3 он, как правило, обязателен). Потом — каналы: для 5 ГГц берём 5180 МГц, отключаем DFS, ширину 20/40/80 MHz по вкусу; для 2.4 ГГц — свой channel (например 2437), ширина 20 MHz. В конфигурации привязываем канал, страну (Russia), SSID, включаем 802.11r (FT), multicast-enhance и при необходимости RRM/WNM с общим steering neighbor group, чтобы клиенты могли плавно переключаться между 2.4 и 5 ГГц.</p>
<p>В ROS 7 логика такая: <strong>Security</strong> (аутентификация, passphrase) → <strong>Channel</strong> (band, frequency, width) → <strong>Configuration</strong> (channel + security + SSID + country) → вешаем configuration на интерфейсы <code>wifi1</code> и <code>wifi2</code>. Иногда security-профиль приходится указывать и в configuration, и прямо на интерфейсе — в разных версиях ведут себя по-разному. Ниже пример шаблона (passphrase и имена подставьте свои):</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/interface wifi security
add authentication-types=wpa2-psk,wpa3-psk disable-pmkid=yes management-protection=allowed name=sec1 wps=disable

/interface wifi channel
add band=5ghz-ax frequency=5180 name=ch5 skip-dfs-channels=all width=20/40/80mhz
add band=2ghz-ax frequency=2437 name=ch24 width=20mhz

/interface wifi configuration
add channel=ch5 country=Russia mode=ap name=cfg5ghz security=sec1 ssid=home-wifi
add channel=ch24 country=Russia mode=ap name=cfg24ghz security=sec1 ssid=home-wifi

/interface wifi
set [ find default-name=wifi1 ] configuration=cfg5ghz name=LAN-wifi5ghz security=sec1 disabled=no
set [ find default-name=wifi2 ] configuration=cfg24ghz name=LAN-wifi24ghz security=sec1 disabled=no
</code></pre><h3 id="один-ssid-для-24-и-5-ггц-с-роумингом">Один SSID для 2.4 и 5 ГГц с роумингом</h3>
<p>Если хочется один и тот же SSID для обоих диапазонов и чтобы телефон или ноутбук сам переключался между 2.4 и 5 ГГц в зависимости от уровня сигнала — это как раз то, для чего придуманы 802.11r/k/v. Включаем <strong>802.11r</strong> (FT, Fast BSS Transition) в security или configuration: при переключении на другую точку или канал ключи уже согласованы, разрыв минимальный. Дополнительно в steering можно включить <strong>802.11k</strong> (RRM) и <strong>802.11v</strong> (WNM): клиент получает список соседних AP и подсказки, куда перейти. Один и тот же SSID задаём в обеих configuration (2.4 и 5 ГГц), у обоих интерфейсов указываем общий <code>steering.neighbor-group</code> (он создаётся автоматически, вида <code>dynamic-SSID-xxxxxxxx</code>). Важно: когда именно переключаться — решает само клиентское устройство, роутер только даёт информацию. В логах потом можно увидеть строки вроде «roamed to LAN-wifi24ghz, signal strength -69».</p>
<hr>
<h2 id="8-отдельная-iot-сеть">8. Отдельная IoT сеть</h2>
<p>Умные лампочки, датчики, принтер и прочая мелочь не обязательно должны сидеть в той же сети, что и ноутбуки. Отдельный SSID (например <code>iot-guest</code>) только на 2.4 ГГц с собственным security profile — простой способ логически отгородить их. В моей схеме они по-прежнему в одном L2 с основной сетью (без VLAN), но уже в отдельном SSID; при необходимости доступ можно ограничить через access-list по MAC или вынести IoT в отдельный VLAN.</p>
<p><strong>Security profile для IoT</strong> — обычно только WPA2 (многие устройства ещё не поддерживают WPA3), без management protection. Отдельный профиль даёт свой пароль и при желании — другие настройки:</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/interface wifi security
add authentication-types=wpa2-psk disable-pmkid=yes management-protection=disabled name=sec_iot wps=disable
# passphrase задайте своим
</code></pre><p><strong>Виртуальный интерфейс</strong> — «вторая точка доступа» на том же радиомодуле 2.4 ГГц, со своим SSID. Указываем master-interface (основной Wi‑Fi 2.4 ГГц), имя виртуального интерфейса и привязываем security:</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/interface wifi
add comment=iot-guest configuration.mode=ap disabled=no master-interface=LAN-wifi24ghz name=iot-guest security=sec_iot
</code></pre><p>В <strong>bridge port</strong> добавляем этот виртуальный интерфейс, чтобы трафик IoT шёл в тот же LAN-Bridge. <strong>Access-list</strong> по MAC нужен, если хотите явно разрешать только известные устройства (например принтер): тогда на интерфейсе IoT и при необходимости на основном 2.4 ГГц добавляете правило <code>action=accept</code> с <code>mac-address=AA:BB:CC:DD:EE:FF</code> (подставьте MAC принтера или датчика). Остальные по умолчанию могут быть reject или не подключаться без пароля — зависит от политики.</p>
<hr>
<h2 id="9-kid-control">9. Kid Control</h2>
<p>RouterOS умеет ограничивать устройства по расписанию и по скорости (rate-limit). В конфиге заведён профиль Kid Control для одного из пользователей: к нему привязаны устройства по MAC, заданы окна доступа и лимиты. В firewall добавлен jump в цепочку kid-control, чтобы трафик этих устройств обрабатывался по своим правилам.</p>
<p><strong>Профиль</strong> — имя пользователя, дни/часы доступа и лимит скорости. Например: пн–пт (fri) 7:00–21:00, сб (sat) 6:00–21:00, лимит 2 Mbit/s:</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/ip kid-control
add name=kid-user fri=7h-21h sat=6h-21h rate-limit=2M
</code></pre><p><strong>Устройства</strong> привязываются к профилю по MAC (и при желании имя для удобства):</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/ip kid-control device
add mac-address=AA:BB:CC:DD:EE:01 name=Phone user=kid-user
add mac-address=AA:BB:CC:DD:EE:02 name=Tablet user=kid-user
</code></pre><p>В <strong>firewall filter</strong> в цепочке forward в начале добавлен jump в цепочку <code>kid-control</code>, где по connection mark или по адресам устройств применяются ограничения. Так трафик с этих MAC обрабатывается по правилам Kid Control (расписание и rate-limit).</p>
<hr>
<h2 id="10-адресация-lan-и-dhcp">10. Адресация LAN и DHCP</h2>
<p>Роутер получает адрес <code>192.168.10.1/24</code> на <code>LAN-Bridge</code>. Пул DHCP — например <code>192.168.10.100</code>–<code>192.168.10.254</code>. В опциях DHCP клиентам отдаём адрес роутера как DNS и NTP, чтобы все ходили через наш DNS и единое время. Для серверов, камер, NAS и прочего, что должно быть по постоянному IP, настроены статические lease по MAC — так и в логах понятнее, и резервирование не съезжает.</p>
<p><strong>IP на bridge</strong> и <strong>пул</strong>:</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/ip address
add address=192.168.10.1/24 interface=LAN-Bridge network=192.168.10.0 comment=Local

/ip pool
add name=dhcp_pool1 ranges=192.168.10.100-192.168.10.254
</code></pre><p><strong>DHCP-сервер</strong> — привязка к интерфейсу LAN-Bridge и пулу; <strong>сеть</strong> — та же подсеть, шлюз и DNS/NTP указываем на роутер, чтобы клиенты получали их через опции DHCP:</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/ip dhcp-server
add address-pool=dhcp_pool1 interface=LAN-Bridge name=dhcp_Lan

/ip dhcp-server network
add address=192.168.10.0/24 dns-server=192.168.10.1 gateway=192.168.10.1 ntp-server=192.168.10.1
</code></pre><p><strong>Статические lease</strong> — по MAC закрепляем постоянный IP за камерой, NAS, умным устройством (comment для удобства):</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/ip dhcp-server lease
add address=192.168.10.10 comment=NAS mac-address=AA:BB:CC:DD:EE:FF server=dhcp_Lan
add address=192.168.10.70 comment=Camera mac-address=11:22:33:44:55:66 server=dhcp_Lan
</code></pre><hr>
<h2 id="11-wan-и-базовый-интернет">11. WAN и базовый интернет</h2>
<p>Кабель провайдера подключён к порту WAN; адрес получаем по DHCP. Важно: <code>use-peer-dns=no</code> и <code>use-peer-ntp=no</code>, чтобы DNS и время задавались на роутере, а не подставлялись от провайдера. Тогда все клиенты гарантированно идут через наш DoH и NTP.</p>
<p>Конкретно:</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/ip dhcp-client
add comment=Internet interface=LAN-Eth1 use-peer-dns=no use-peer-ntp=no
</code></pre><p>Роутер получит IP, маску и шлюз от провайдера, но не будет подставлять полученные от него DNS и NTP — их мы задаём в <code>/ip dns</code> и через NTP client на роутере.</p>
<hr>
<h2 id="12-dns-через-adguard-doh">12. DNS через AdGuard DoH</h2>
<p>Все DNS-запросы с роутера и с клиентов (благодаря redirect) идут через <strong>AdGuard DoH</strong>. В <code>/ip dns</code> включаем <code>allow-remote-requests=yes</code>, прописываем DoH-URL <code>https://dns.adguard-dns.com/dns-query</code>, <code>verify-doh-cert=yes</code>. Чтобы при первом запросе не упереться в «курицу и яйцо», добавляем статические A-записи для <code>dns.adguard-dns.com</code> (94.140.14.14, 94.140.15.15) — bootstrap. В NAT настроен redirect DNS (TCP и UDP) и NTP на роутер для клиентов из LAN: даже если на устройстве прописать другой DNS, трафик всё равно пойдёт через наш.</p>
<p><strong>Настройка DNS и DoH</strong> (таймауты уменьшаем, чтобы долгие запросы не висели):</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/ip dns
set allow-remote-requests=yes query-server-timeout=1s query-total-timeout=4s use-doh-server=https://dns.adguard-dns.com/dns-query verify-doh-cert=yes
</code></pre><p><strong>Bootstrap для DoH</strong> — пока резолвера ещё нет, роутер должен знать IP AdGuard; добавляем две A-записи (у AdGuard два адреса):</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/ip dns static
add address=94.140.14.14 name=dns.adguard-dns.com type=A comment=&#34;AdGuard DoH&#34;
add address=94.140.15.15 name=dns.adguard-dns.com type=A comment=&#34;AdGuard DoH&#34;
</code></pre><p>После этого первый запрос к <code>dns.adguard-dns.com</code> пойдёт по одной из этих записей, и DoH заработает без «курицы и яйца».</p>
<hr>
<h2 id="13-wireguard">13. WireGuard</h2>
<p>Поднят интерфейс <code>wireguard1</code>, listen-port 51820, своя подсеть (например 10.8.0.2/24). Peer настроен с <code>allowed-address=0.0.0.0/0</code> — по умолчанию весь трафик через WG не гоняем. Кто куда идёт, решаем через отдельную routing table и mangle: помечаем нужные потоки и направляем их в таблицу с default gateway через WireGuard. Так получается аккуратный split-tunnel без перевода всей сети в VPN.</p>
<p><strong>Интерфейс</strong> (private-key и peer добавляются своими — ключи в статью не подставляем):</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/interface wireguard
add listen-port=51820 mtu=1420 name=wireguard1
# private-key= и адрес на интерфейсе задаются при настройке
</code></pre><p><strong>Отдельная routing table</strong> для трафика в VPN — в неё потом добавляется default route через wireguard1:</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/routing table
add fib name=to_wg
</code></pre><p><strong>IP на WireGuard</strong> и <strong>peer</strong>: у роутера свой адрес в подсети туннеля (например 10.8.0.2/24); peer с <code>allowed-address=0.0.0.0/0</code>, <code>endpoint-address</code> и <code>endpoint-port</code> — адрес вашего WG-сервера, <code>persistent-keepalive=25s</code> — чтобы туннель не засыпал за NAT. Маршрут по умолчанию в таблице <code>to_wg</code> задаётся отдельным правилом: <code>dst-address=0.0.0.0/0 gateway=wireguard1 routing-table=to_wg</code>. Весь трафик, помеченный mangle в эту таблицу, пойдёт через WG.</p>
<hr>
<h2 id="14-split-tunnel-для-ai-и-youtube">14. Split-tunnel для AI и YouTube</h2>
<p>Чтобы только трафик к AI-сервисам и YouTube шёл через VPN, а остальное — через провайдера, заведена отдельная routing table <code>to_wg</code> с default route через <code>wireguard1</code>. В mangle по address-list <code>ai_wg</code> и <code>youtube_wg</code> ставится mark-routing с <code>new-routing-mark=to_wg</code>. Списки пополняются доменами и подсетями (OpenAI, YouTube и т.п.); удобно вести их в отдельном export или скриптами (см. ниже). В итоге браузер и приложения ходят в интернет как обычно, а запросы к выбранным сервисам уходят через WireGuard.</p>
<p><strong>Mangle</strong> — помечаем маршрутизацию для трафика из LAN, у которого destination попал в списки <code>ai_wg</code> или <code>youtube_wg</code>:</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/ip firewall mangle
add action=mark-routing chain=prerouting comment=&#34;Route AI via WireGuard&#34; dst-address-list=ai_wg in-interface-list=LAN new-routing-mark=to_wg passthrough=no
add action=mark-routing chain=prerouting comment=&#34;Route YouTube via WireGuard&#34; dst-address-list=youtube_wg in-interface-list=LAN new-routing-mark=to_wg passthrough=no
</code></pre><p><strong>Address-list</strong> <code>ai_wg</code> и <code>youtube_wg</code> содержат домены (openai.com, api.openai.com, chatgpt.com, youtube.com, googlevideo.com и т.д.) и подсети (например 172.64.150.0/24, 173.194.0.0/16 для Google/YouTube). Домены резолвятся в IP при первом запросе; подсети добавляются вручную или скриптами. Примеры записей (остальные по тому же принципу):</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/ip firewall address-list
add address=api.openai.com list=ai_wg comment=&#34;AI split&#34;
add address=openai.com list=ai_wg comment=&#34;AI split&#34;
add address=youtube.com list=youtube_wg comment=&#34;YouTube split&#34;
add address=142.250.150.0/24 list=youtube_wg comment=&#34;YouTube split&#34;
</code></pre><hr>
<h2 id="15-l2tpipsec-клиент">15. L2TP/IPsec клиент</h2>
<p>Помимо WireGuard настроен L2TP-клиент к своему VPN-серверу (например <code>vpn.example.com</code>) с IPsec. Две технологии — и запас на случай проблем с одной, и возможность раскидывать разные задачи по разным туннелям.</p>
<p><strong>Профиль PPP</strong> для L2TP: трафик туннеля помечаем для interface-list=VPN (чтобы применять к нему свои правила и NAT), включаем сжатие и шифрование, change-tcp-mss — чтобы не ломать MTU по туннелю:</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/ppp profile
add bridge-learning=no change-tcp-mss=yes interface-list=VPN name=l2tp use-compression=yes use-encryption=yes use-mpls=no use-upnp=no
</code></pre><p><strong>L2TP-клиент</strong>: адрес сервера, логин и пароль (и при необходимости IPsec secret) — свои; keepalive чтобы соединение не рвалось:</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/interface l2tp-client
add allow=mschap2 allow-fast-path=yes connect-to=vpn.example.com keepalive-timeout=30 name=L2TP-VPN profile=l2tp use-ipsec=yes user=your_l2tp_user
</code></pre><p>Пароль задаётся в <strong>Secrets</strong> (<code>/ppp secret</code>). IPsec: в <strong>IPsec proposal</strong> можно оставить aes-128-cbc; в <strong>IPsec profile</strong> — dh-group и enc-algorithm под ваш сервер. После подключения интерфейс L2TP появится в списке, и маршруты через него настраиваются по необходимости.</p>
<hr>
<h2 id="16-bgp-и-антифильтр">16. BGP и антифильтр</h2>
<p>Для обхода блокировок используются BGP-подписки: два instance (antifilter.download и antifilter.network), свои router-id и AS. Подключение к пирам: один через <code>wireguard1</code>, второй через WAN. Routing filters определяют, какие префиксы принимать и через какой шлюз их отдавать — вся логика «что принимать и куда слать» сосредоточена в фильтрах, конфиг не превращается в сотни статических маршрутов.</p>
<p><strong>Instance</strong> — по одному на подписку, свой router-id (обычно ваш внешний IP или произвольный уникальный в сети; в примере — документационный адрес, подставьте свой):</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/routing bgp instance
add as=64999 name=bgp-instance-1 router-id=203.0.113.1 comment=&#34;antifilter.download&#34;
add as=64999 name=antifilter.network router-id=203.0.113.1 comment=&#34;antifilter.network&#34;
</code></pre><p><strong>Template</strong> — hold-time и keepalive для стабильной сессии, input filter задаёт, какие префиксы принять и с каким gateway (wireguard1 или WAN):</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/routing bgp template
add as=64999 hold-time=4m input.filter=bgp_in keepalive-time=1m multihop=yes name=tpl_antifilter_download routing-table=main
add as=64999 hold-time=4m input.filter=antifilter-in keepalive-time=1m multihop=yes name=tpl_antifilter_network routing-table=main output.network=bgp-networks
</code></pre><p><strong>Connection</strong> — привязка к instance и template, адрес пира (у antifilter это публичные IP, например 45.154.73.71 и 45.148.244.55), remote AS. Один пир доступен через wireguard1 — для него добавляем статический маршрут до его IP через wireguard1; второй — через WAN (gateway провайдера). <strong>Routing filter</strong> в input задаёт правило вида: принять префиксы с нужными BGP communities и установить им gateway wireguard1 (или WAN). Детали фильтров смотрите в документации antifilter.download и antifilter.network.</p>
<hr>
<h2 id="17-firewall-filter">17. Firewall filter</h2>
<p>На input: принимаем established/related/untracked, ICMP, разрешаем BGP от известных peer; invalid дропаем; всё, что не из LAN, в конце дропаем. Для защиты от перебора по SSH и Winbox агрессивные попытки с WAN попадают в blacklist. Forward: established/related — accept, invalid — drop, с WAN без dstnat новое — drop, затем цепочка DDoS и jump в kid-control. FastTrack отключён — из-за mangle, WireGuard, BGP и DDoS нужен полный проход пакетов через фильтр.</p>
<p><strong>Input</strong>: порядок правил — сначала разрешаем «нормальные» состояния и ICMP, потом BGP от IP пиров (чтобы не потерять сессию), затем защита портов 22 и 8291 — при превышении лимита соединений добавляем в blacklist и дропаем, в конце дроп всего не из LAN:</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/ip firewall filter
add action=accept chain=input connection-state=established,related,untracked comment=&#34;accept established,related,untracked&#34;
add action=drop chain=input connection-state=invalid comment=&#34;drop invalid&#34;
add action=accept chain=input protocol=icmp comment=&#34;accept ICMP&#34;
add action=accept chain=input dst-port=179 protocol=tcp src-address=45.154.73.71 comment=&#34;BGP peer antifilter.download&#34;
add action=accept chain=input dst-port=179 protocol=tcp src-address=45.148.244.55 comment=&#34;BGP peer antifilter.network&#34;
add action=add-src-to-address-list address-list=mgmt_blacklist address-list-timeout=1d chain=input connection-limit=20,32 connection-state=new dst-port=22,8291 in-interface-list=WAN protocol=tcp comment=&#34;blacklist on limit&#34;
add action=drop chain=input dst-port=22,8291 in-interface-list=WAN protocol=tcp src-address-list=mgmt_blacklist comment=&#34;drop blacklisted&#34;
add action=drop chain=input in-interface-list=!LAN comment=&#34;drop all not from LAN&#34;
</code></pre><p><strong>Forward</strong>: jump в kid-control, затем accept established/related, drop invalid, drop новое с WAN не dstnat, jump в detect_DDoS для нового трафика с WAN (и при желании такой же jump для input на порты 22,80,443,8291). <strong>Цепочка detect_DDoS</strong>: при нормальной частоте — return; при превышении — add-dst-to-address-list ddos-targets и add-src-to-address-list ddos-attackers (timeout 10m).</p>
<hr>
<h2 id="18-ddos-защита">18. DDoS-защита</h2>
<p>Отдельная цепочка <code>detect_DDoS</code> по порогам добавляет в address-list <code>ddos-targets</code> и <code>ddos-attackers</code>. В raw эти пары дропаются, чтобы не нагружать основной firewall. BGP peer из DDoS-обработки исключены, иначе можно потерять сессию с антифильтром.</p>
<p><strong>Raw</strong> — обрабатывается до filter; сначала разрешаем трафик до BGP peer (чтобы их не занести в DDoS по ошибке), затем дроп по паре attackers → targets:</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/ip firewall raw
add action=accept chain=prerouting dst-port=179 protocol=tcp src-address=45.148.244.55 comment=&#34;Bypass DDoS for BGP antifilter.network&#34;
add action=accept chain=prerouting dst-port=179 protocol=tcp src-address=45.154.73.71 comment=&#34;Bypass DDoS for BGP antifilter.download&#34;
add action=drop chain=prerouting dst-address-list=ddos-targets in-interface-list=WAN src-address-list=ddos-attackers comment=&#34;DDoS drop attackers-&gt;targets&#34;
</code></pre><p>Цепочка <strong>detect_DDoS</strong> в filter при превышении dst-limit добавляет адреса в <code>ddos-targets</code> и <code>ddos-attackers</code>; raw затем режет трафик между ними без нагрузки на основные правила.</p>
<hr>
<h2 id="19-nat">19. NAT</h2>
<p>Masquerade на WAN — весь исходящий трафик в интернет уходит с адресом роутера. Отдельно masquerade на интерфейсе WireGuard для трафика, уходящего в VPN. Redirect DNS (TCP/UDP) и NTP (UDP) на роутер для клиентов из LAN — чтобы все запросы шли через наш DNS и NTP.</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/ip firewall nat
add action=masquerade chain=srcnat out-interface-list=WAN ipsec-policy=out,none comment=&#34;masquerade WAN&#34;
add action=masquerade chain=srcnat out-interface-list=VPN comment=&#34;WG_NAT&#34;
add action=redirect chain=dstnat dst-address-type=!local dst-port=53 in-interface-list=LAN protocol=tcp comment=&#34;Redirect DNS TCP to router&#34;
add action=redirect chain=dstnat dst-address-type=!local dst-port=53 in-interface-list=LAN protocol=udp comment=&#34;Redirect DNS UDP to router&#34;
add action=redirect chain=dstnat dst-address-type=!local dst-port=123 in-interface-list=LAN protocol=udp comment=&#34;Redirect NTP UDP to router&#34;
</code></pre><p><code>ipsec-policy=out,none</code> в masquerade WAN — чтобы не маскарадить трафик, уже уходящий в IPsec. Redirect перехватывает запросы клиентов к внешним 53 и 123 портам и отправляет их на роутер.</p>
<hr>
<h2 id="20-mss-clamp">20. MSS-clamp</h2>
<p>По VPN туннелю MTU обычно меньше, и большие TCP-сегменты начинают фрагментироваться или рваться. В mangle для трафика через <code>wireguard1</code> ставится change-mss для TCP с <code>new-mss=1380</code> — тогда соединения не упираются в лимит и работают стабильнее.</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/ip firewall mangle
add action=change-mss chain=forward new-mss=1380 out-interface=wireguard1 protocol=tcp tcp-flags=syn tcp-mss=1381-65535
</code></pre><p>Правило срабатывает только для SYN с MSS больше 1380 — подменяем на 1380, чтобы по туннелю не уходили слишком большие сегменты.</p>
<hr>
<h2 id="21-отключение-ненужных-service-port">21. Отключение ненужных service-port</h2>
<p>В <code>/ip firewall service-port</code> отключены ftp, tftp, h323, sip, pptp и прочее, чем не пользуемся. Меньше открытых портов — меньше поверхность для случайных сканеров и ботов.</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/ip firewall service-port
set ftp disabled=yes
set tftp disabled=yes
set h323 disabled=yes
set sip disabled=yes
set pptp disabled=yes
</code></pre><hr>
<h2 id="22-ограничение-сервисов-управления">22. Ограничение сервисов управления</h2>
<p>SSH и Winbox разрешены только с подсети <code>192.168.10.0/24</code>. Telnet, www, api, api-ssl, ftp отключены. Для домашнего роутера этого обычно достаточно: с улицы до управления не добраться, изнутри сети — всё под рукой.</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/ip service
set ssh address=192.168.10.0/24
set winbox address=192.168.10.0/24
set telnet disabled=yes
set www disabled=yes
set api disabled=yes
set api-ssl disabled=yes
set ftp disabled=yes
</code></pre><p>Подставьте свою LAN-подсеть в <code>address</code>; с других адресов SSH и Winbox будут недоступны.</p>
<hr>
<h2 id="23-ntp-логирование-и-системные-параметры">23. NTP, логирование и системные параметры</h2>
<p>Часовой пояс — <code>Europe/Moscow</code>, identity роутера задаётся своим именем (например <code>home-ax3</code>), чтобы в логах и уведомлениях было понятно, какое устройство пишет. Логирование включено по нужным topic’ам. NTP client — со своими серверами (например российские NTP-пулы), NTP server на роутере включён: он и сам синхронизируется, и раздаёт время клиентам в LAN. При желании можно настроить светодиоды (например привязка к интерфейсам в <code>/system leds</code>) — в <a href="https://gregory-gost.ru/mikrotik-perehodim-na-routeros-7-i-wi-fi-6-802-11ax-nastroika-hap-ax3/" target="_blank" rel="noopener">статье Gregory Gost</a> есть пример.</p>
<p>Конкретные команды:</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/system clock
set time-zone-autodetect=no time-zone-name=Europe/Moscow

/system identity
set name=home-ax3

/system ntp client
set enabled=yes

/system ntp server
set enabled=yes

/system ntp client servers
add address=0.ru.pool.ntp.org
add address=1.ru.pool.ntp.org
</code></pre><p>Серверы NTP — пример (российская зона pool.ntp.org); подставьте свои. Логирование по темам, например account и critical: <code>/system logging add topics=account</code> и <code>topics=critical</code>. Обновление времени через облако MikroTik можно отключить: <code>/ip cloud set update-time=no</code>.</p>
<hr>
<h2 id="24-скрипты-по-данным-из-export">24. Скрипты (по данным из export)</h2>
<p>Ручное обслуживание роутера быстро надоедает: проверять обновления, смотреть, жив ли NAS, чистить старые бэкапы. В конфиге заведены несколько скриптов, которые висят на scheduler и делают это сами: бэкапы на USB, проверка новой версии RouterOS с уведомлением в Telegram, пинг хоста с алертом при недоступности, сбор IP для YouTube из DNS-кэша и импорт списков подсетей, плюс выгрузка логов (например вход/выход пользователей) в Telegram. Ниже — тела скриптов в виде кода. Вместо секретов (токен бота, chat ID, пароли) стоят плейсхолдеры: подставьте свои значения перед использованием.</p>
<h3 id="back_up_1">Back_up_1</h3>
<p>Создаёт бинарный backup и текстовый export в <code>usb1-part1/backup/</code>. Запускается из scheduler Backup.</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">:local currentTime [/system clock get time]
:local currentDate [/system clock get date]
:local backupFile (&#34;usb1-part1/backup/backup-&#34; . $currentDate . &#34;-&#34; . $currentTime . &#34;.backup&#34;)
:local backupTXT (&#34;usb1-part1/backup/backup-&#34; . $currentDate . &#34;-&#34; . $currentTime . &#34;.txt&#34;)
/system backup save name=$backupFile
/export show-sensitive file=$backupTXT
</code></pre><h3 id="backup_2">Backup_2</h3>
<p>Удаляет файлы в <code>usb1-part1/backup/</code> старше 30 дней. Запускается сразу после Back_up_1.</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">{
   :local daysAgo 30
   :local filter &#34;usb1-part1/backup/&#34;
   :local curDate [/system clock get date]
   :local curMonth [:pick $curDate 5 7]
   :local curDay [:pick $curDate 8 10]
   :local curYear [:pick $curDate 0 4]

   :foreach i in=[/file find type=backup] do={
      :local fileDate [/file get number=$i last-modified]
      :set fileDate [:pick $fileDate 0 11]
      :local fileMonth [:pick $fileDate 5 7]
      :local fileDay [:pick $fileDate 8 10]
      :local fileYear [:pick $fileDate 0 4]
      :local sum 0
      :set sum ($sum + (($curYear - $fileYear) * 365))
      :set sum ($sum + (($curMonth - $fileMonth) * 30))
      :set sum ($sum + ($curDay - $fileDay))
      :if ($sum &gt;= $daysAgo &amp;&amp; [/file get number=$i name] ~ $filter) do={
         /file remove $i
      }
   }

   :foreach i in=[/file find type=script] do={
      :local fileDate [/file get number=$i last-modified]
      :set fileDate [:pick $fileDate 0 11]
      :local fileMonth [:pick $fileDate 5 7]
      :local fileDay [:pick $fileDate 8 10]
      :local fileYear [:pick $fileDate 0 4]
      :local sum 0
      :set sum ($sum + (($curYear - $fileYear) * 365))
      :set sum ($sum + (($curMonth - $fileMonth) * 30))
      :set sum ($sum + ($curDay - $fileDay))
      :if ($sum &gt;= $daysAgo &amp;&amp; [/file get number=$i name] ~ $filter) do={
         /file remove $i
      }
   }
}
</code></pre><h3 id="telegram">Telegram</h3>
<p>Проверяет наличие новой версии RouterOS и при наличии отправляет уведомление в Telegram. <strong>Замените <code>YOUR_BOT_TOKEN</code> и <code>YOUR_CHAT_ID</code> на свои.</strong></p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">:local TGSendMessage do={
    :local tgUrl (&#34;https://api.telegram.org/bot&#34; . $Token . &#34;/sendMessage?chat_id=&#34; . $ChatID . &#34;&amp;text=&#34; . $Text . &#34;&amp;parse_mode=html&amp;disable_web_page_preview=True&#34;)
    /tool fetch http-method=get url=$tgUrl keep-result=no
}

:local TelegramBotToken &#34;YOUR_BOT_TOKEN&#34;
:local TelegramChatID &#34;YOUR_CHAT_ID&#34;
:local DeviceName [/system identity get name]
:local TelegramMessageText (&#34;&lt;b&gt;&#34; . $DeviceName . &#34;:&lt;/b&gt;  &#34;)

:local MyVar [/system package update check-for-updates as-value]
:local Chan ($MyVar -&gt; &#34;channel&#34;)
:local InstVer ($MyVar -&gt; &#34;installed-version&#34;)
:local LatVer ($MyVar -&gt; &#34;latest-version&#34;)

:if ($InstVer = $LatVer) do={
    :set TelegramMessageText ($TelegramMessageText . &#34;System is already up to date&#34;)
} else={
    :set TelegramMessageText ($TelegramMessageText . &#34;New version &#34; . $LatVer . &#34; is available! [Installed: &#34; . $InstVer . &#34;, channel &#34; . $Chan . &#34;].&#34;)
    $TGSendMessage Token=$TelegramBotToken ChatID=$TelegramChatID Text=$TelegramMessageText
}

:log info $TelegramMessageText
</code></pre><h3 id="check-host-and-alert">check-host-and-alert</h3>
<p>Проверяет доступность хоста пингом; при отсутствии ответов шлёт alert в Telegram. <strong>Замените <code>YOUR_BOT_TOKEN</code>, <code>YOUR_CHAT_ID</code> и при необходимости IP хоста.</strong></p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros"># IP проверяемого хоста (например NAS или сервер в LAN)
:local host &#34;192.168.10.10&#34;

:local telegramToken &#34;YOUR_BOT_TOKEN&#34;
:local chatId &#34;YOUR_CHAT_ID&#34;
:local message (&#34;Host &#34; . $host . &#34; unreachable!&#34;)

:local result [/ping $host count=3]

:if ($result = 0) do={
    /tool fetch url=(&#34;https://api.telegram.org/bot&#34; . $telegramToken . &#34;/sendMessage?chat_id=&#34; . $chatId . &#34;&amp;text=&#34; . $message) keep-result=no
    :log warning (&#34;Host &#34; . $host . &#34; unreachable. Alert sent to Telegram.&#34;)
} else={
    :log info (&#34;Host &#34; . $host . &#34; reachable (&#34; . $result . &#34; replies).&#34;)
}
</code></pre><h3 id="youtube-dns">youtube dns</h3>
<p>Собирает IP YouTube из DNS-кэша и добавляет их в address-list <code>youtube_dns_ips</code> (timeout 2d). Секретов нет.</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">:foreach i in=[/ip dns cache find where (name~&#34;youtube&#34;) or (name~&#34;ytstatic&#34;) or (name~&#34;ytimg&#34;) or (name~&#34;googlevideo.com&#34;) or (name~&#34;googleapis.com&#34;)] do={
  :local cacheName [/ip dns cache all get $i name]
  :local cacheType [/ip dns cache all get $i type]
  :delay delay-time=10ms
  :if ($cacheType=&#34;A&#34;) do={
    :local cacheData [/ip dns cache all get $i data]
    :if ([/ip firewall address-list find where address=$cacheData]=&#34;&#34;) do={
      :put (&#34;add: &#34; . $cacheName . &#34; &#34; . $cacheType . &#34; &#34; . $cacheData)
      /ip firewall address-list add address=$cacheData comment=$cacheName timeout=2d list=youtube_dns_ips
    }
  }
}
</code></pre><h3 id="youtube-ip">youtube ip</h3>
<p>Скачивает список подсетей YouTube с iplist.opencck.org и импортирует в RouterOS. Секретов нет.</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">/tool fetch url=&#34;https://iplist.opencck.org/?format=mikrotik&amp;site=youtube.com&amp;data=cidr4&#34; mode=https dst-path=iplist_v4_0cidr4.rsc
:delay 5s
:log info &#34;Downloaded iplist_v4_0cidr4.rsc youtube.com&#34;

/import file-name=iplist_v4_0cidr4.rsc
:delay 10s
:log info &#34;New iplist_v4_0cidr4 added youtube.com&#34;
</code></pre><h3 id="log_allert">Log_allert</h3>
<p>Выбирает новые записи логов по маске (например вход/выход), при необходимости исключает по подстроке, формирует текст в <code>MSG</code> и вызывает TG_ME. Подставьте свои фильтры в <code>IncludeMessages</code> и <code>ExcludeMessages</code>.</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">:local IncludeMessages &#34;logged in|logged out&#34;
:local ExcludeMessages &#34;user1|user2&#34;
:local Topics &#34;info|warning|error|critical&#34;
:local MsgLength 100

:global LogId
:local Msg &#34;&#34;
:local Array [/log find where topics~$Topics message~$IncludeMessages]
:local End ([:len $Array] - 1)
:local Start ([:find $Array $LogId])

:if ([:len $Start] = 0) do={
    :set Start ($End + 1)
} else={
    :set Start ($Start + 1)
}

:if ($Start &lt;= $End) do={
    :for i from=$Start to=$End do={
        :if (($ExcludeMessages = &#34;&#34;) || !([/log get ($Array-&gt;$i) message] ~ $ExcludeMessages)) do={
            :set Msg ($Msg . &#34;%0A&#34; . [/log get ($Array-&gt;$i) time] . &#34; &#34; . [:pick [/log get ($Array-&gt;$i) message] 0 $MsgLength])
        }
    }
}

:set LogId ($Array-&gt;$End)

:if ($Msg != &#34;&#34;) do={
    :global MSG
    :set MSG $Msg
    /system script run TG_ME
}
</code></pre><h3 id="tg_me">TG_ME</h3>
<p>Отправляет глобальную переменную <code>MSG</code> в Telegram. <strong>Замените <code>YOUR_CHAT_ID</code> и <code>YOUR_BOT_TOKEN</code> на свои.</strong> Вызывается из Telegram, check-host-and-alert, Log_allert.</p>
<pre tabindex="0"><code class="language-routeros" data-lang="routeros">:local ID &#34;YOUR_CHAT_ID&#34;
:local TKN &#34;YOUR_BOT_TOKEN&#34;
:global MSG

/tool fetch keep-result=no url=(&#34;https://api.telegram.org/bot&#34; . $TKN . &#34;/sendMessage?chat_id=&#34; . $ID . &#34;&amp;text=&#34; . [/system identity get name] . &#34;: &#34; . $MSG)
</code></pre><hr>
<h2 id="25-scheduler">25. Scheduler</h2>
<ul>
<li><strong>Backup</strong> — каждые 5 дней в 00:00:00: Back_up_1, затем Backup_2.</li>
<li><strong>Telegram</strong> — ежедневно в 16:00: скрипт Telegram.</li>
<li><strong>check-host</strong> — каждый час: check-host-and-alert.</li>
<li><strong>Log_allert_daily</strong> — ежедневно в 22:00: Log_allert.</li>
</ul>
<hr>
<h2 id="26-безопасность-и-практические-замечания">26. Безопасность и практические замечания</h2>
<p>Уже хорошо: сервисы ограничены, firewall input не открыт наружу, DoH, DDoS, backup и очистка, принудительный DNS/NTP на роутер, разделение WAN/VPN/LAN через interface list.</p>
<p>Стоит помнить: IoT без отдельного VLAN; в скриптах Telegram в export попадают токены и chat ID — полный <code>show-sensitive</code> нельзя публиковать. Для следующей итерации можно рассмотреть: VLAN для IoT, отдельный guest SSID, вынос секретов из script source, переименование WAN-порта в <code>WAN-Eth1</code>.</p>
<hr>
<h2 id="27-порядок-настройки-вручную">27. Порядок настройки вручную</h2>
<p>Если собирать конфиг вручную с нуля, удобно идти так: переименовать интерфейсы → создать LAN-Bridge и добавить порты → interface list (LAN, WAN, VPN) → Wi‑Fi security, channel, configuration → включить wifi1/wifi2 → при необходимости IoT SSID → IP на bridge → DHCP pool и server → DHCP client на WAN → DNS и DoH, bootstrap для AdGuard → WireGuard → routing-table to_wg → address-list для AI/YouTube → mangle → BGP и фильтры → filter, raw, nat → service-port и <code>/ip service</code> → NTP, identity, логи → скрипты и scheduler. В конце — <code>export show-sensitive</code> и сохранение в архив, чтобы не потерять наработки.</p>
<hr>
<h2 id="29-сравнение-с-hap-ac-и-что-даёт-переход-на-ax3">29. Сравнение с hAP ac и что даёт переход на ax3</h2>
<p>Резонный вопрос: стоит ли менять старый hAP ac на ax3, или это «просто ещё один роутер». На практике разница ощутимая. На Gregory Gost проводили сравнительные тесты: тот же сценарий — iPerf3 (60 потоков, 20 секунд, TCP) и передача файла 20 ГБ по SCP — сначала на hAP ac (RouterOS 6.49), потом на hAP ax3 (RouterOS 7.15). Результаты такие:</p>
<table>
	<thead>
			<tr>
					<th>Направление</th>
					<th>hAP ac</th>
					<th>hAP ax3</th>
					<th>Разница</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Client → Server (sender)</td>
					<td>434 Mbit/s</td>
					<td>614 Mbit/s</td>
					<td>~29% в пользу ax3</td>
			</tr>
			<tr>
					<td>Client → Server (receiver)</td>
					<td>378 Mbit/s</td>
					<td>595 Mbit/s</td>
					<td>~36% в пользу ax3</td>
			</tr>
			<tr>
					<td>Server → Client (sender)</td>
					<td>340 Mbit/s</td>
					<td>522 Mbit/s</td>
					<td>~35% в пользу ax3</td>
			</tr>
			<tr>
					<td>Server → Client (receiver)</td>
					<td>335 Mbit/s</td>
					<td>493 Mbit/s</td>
					<td>~32% в пользу ax3</td>
			</tr>
			<tr>
					<td>Скачивание файла 20 ГБ</td>
					<td>27 MB/s</td>
					<td>48 MB/s</td>
					<td>~44% в пользу ax3</td>
			</tr>
			<tr>
					<td>Загрузка файла 20 ГБ</td>
					<td>47 MB/s</td>
					<td>35 MB/s</td>
					<td>в этом тесте выше ac</td>
			</tr>
	</tbody>
</table>
<p>В среднем по Wi‑Fi прирост 30–45%: и скорость выше, и картина стабильнее. На 5 ГГц ax3 утилизирует канал заметно лучше; при линке провайдера до 500 Mbit/s по Wi‑Fi можно по-настоящему его использовать. Детальные замеры, графики и пошаговую настройку с нуля смотрите в <a href="https://gregory-gost.ru/mikrotik-perehodim-na-routeros-7-i-wi-fi-6-802-11ax-nastroika-hap-ax3/" target="_blank" rel="noopener">статье Gregory Gost про hAP ax3 и RouterOS 7</a> (раздел «Сравнительное тестирование»).</p>
<p>Если нужна именно точка доступа без лишних портов — можно присмотреться к <strong>cAP ax</strong>: характеристики близкие, несколько таких устройств можно объединить через CAPsMAN и сделать бесшовный Wi‑Fi по квартире или офису.</p>
<hr>
<h2 id="итог">Итог</h2>
<p>В итоге получается не «коробочка с Wi‑Fi», а полноценная RouterOS-конфигурация под одну крышу: Wi‑Fi 6 с отдельным IoT SSID и роумингом между 2.4 и 5 ГГц, DoH и принудительный redirect DNS/NTP, WireGuard и L2TP/IPsec, split-routing для AI и YouTube, BGP с антифильтром, firewall, DDoS-защита, резервные копии на USB, scheduler и оповещения в Telegram. Всё это реально собрать в одном устройстве, если разложить конфиг по слоям и не превращать его в свалку правил. Статья получилась длинной именно потому, что хотелось не просто перечислить пункты, а объяснить, зачем каждый кусок и как он связан с остальным. Для пошаговой настройки «с нуля», сброса, выбора каналов 5 ГГц и живых бенчмарков очень рекомендую <a href="https://gregory-gost.ru/mikrotik-perehodim-na-routeros-7-i-wi-fi-6-802-11ax-nastroika-hap-ax3/" target="_blank" rel="noopener">подробную статью по hAP ax3 и RouterOS 7 на Gregory Gost</a> — там и скриншоты, и консольные команды, и тесты в цифрах. Удачной настройки.</p>
]]></content:encoded></item><item><title>Полный гайд: Установка Frigate на Yandex Cloud с NetBird</title><link>https://starodubov.pro/%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9-%D0%B3%D0%B0%D0%B9%D0%B4-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-frigate-%D0%BD%D0%B0-yandex-cloud-%D1%81-netbird/</link><pubDate>Fri, 14 Feb 2025 00:00:00 +0300</pubDate><author>xaku68@gmail.com (Константин Стародубов)</author><guid>https://starodubov.pro/%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9-%D0%B3%D0%B0%D0%B9%D0%B4-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-frigate-%D0%BD%D0%B0-yandex-cloud-%D1%81-netbird/</guid><description>Развёртывание Frigate NVR на Yandex Cloud: NetBird VPN, Docker, отдельный диск для записей и доступ к домашним камерам.</description><content:encoded><![CDATA[<p><img src="/images/external/frigate-logo.svg" alt="Frigate NVR — система видеонаблюдения с AI" title="Frigate NVR" loading="lazy" decoding="async"></p>
<p>Этот гайд описывает полный процесс развертывания системы видеонаблюдения Frigate на сервере в Yandex Cloud с хранением записей на отдельном диске и доступом к домашним камерам через защищённый VPN NetBird.</p>
<p>Гайд включает:</p>
<ul>
<li>настройку NetBird</li>
<li>подключение сервера к домашней сети</li>
<li>подключение и монтирование диска</li>
<li>установку Docker и Docker Compose</li>
<li>установку и настройку Frigate</li>
<li>настройку хранения видео</li>
<li>получение доступа к Web UI</li>
</ul>
<hr>
<h2 id="архитектура">Архитектура</h2>
<p><img src="/images/external/yandex-cloud-logo.svg" alt="Yandex Cloud — облачная платформа" title="Yandex Cloud" loading="lazy" decoding="async"></p>
<p>Схема работы: камеры отдают RTSP-поток на устройство в домашней сети (роутер, NAS или ПК). NetBird соединяет это устройство с виртуальной машиной в Yandex Cloud. Frigate в Docker на VM получает потоки по NetBird IP, пишет записи на отдельный диск и отдаёт Web UI на порт 8971.</p>
<pre tabindex="0"><code>Домашние камеры
      │
      │ RTSP
      │
Домашний сервер / роутер
      │
      │ NetBird VPN
      │
Yandex Cloud VM
      │
      │ Docker
      │
      │ Frigate
      │
      └── /data/frigate/media (записи)
</code></pre><hr>
<h2 id="часть-1-настройка-netbird">Часть 1. Настройка NetBird</h2>
<p><img src="/images/external/netbird-logo.png" alt="NetBird — Zero Trust VPN на базе WireGuard" title="NetBird" loading="lazy" decoding="async"></p>
<p>NetBird используется для создания защищённой приватной сети между:</p>
<ul>
<li>сервером в Yandex Cloud</li>
<li>домашней сетью</li>
</ul>
<p><strong>Зачем это нужно:</strong> Камеры находятся дома, а Frigate — в облаке. Без VPN сервер в Yandex Cloud не сможет достучаться до RTSP-потоков камер в вашей локальной сети. NetBird создаёт зашифрованный туннель между облаком и домом — камеры остаются за NAT, но сервер получает к ним доступ как к устройствам в одной сети. Это безопаснее, чем пробрасывать порты на роутере.</p>
<p>Официальный сайт:</p>
<p><a href="https://app.netbird.io/" target="_blank" rel="noopener">https://app.netbird.io/</a></p>
<hr>
<h2 id="шаг-1-регистрация-и-вход">Шаг 1. Регистрация и вход</h2>
<p>Перейдите:</p>
<p><a href="https://app.netbird.io/" target="_blank" rel="noopener">https://app.netbird.io/</a></p>
<p>Создайте аккаунт или войдите.</p>
<p><strong>Зачем:</strong> NetBird Cloud управляет всеми подключёнными устройствами и правилами доступа. Без аккаунта вы не сможете создать Setup Key и связать сервер с домашней сетью.</p>
<hr>
<h2 id="шаг-2-создание-setup-key-для-сервера">Шаг 2. Создание Setup Key для сервера</h2>
<p>Перейдите:</p>
<pre tabindex="0"><code>Access Control → Setup Keys
</code></pre><p>Нажмите:</p>
<pre tabindex="0"><code>Create Setup Key
</code></pre><p>Укажите:</p>
<p>Name:</p>
<pre tabindex="0"><code>yandex-cloud
</code></pre><p>Group:</p>
<pre tabindex="0"><code>remote
</code></pre><p>Сохраните Setup Key.</p>
<p>Пример:</p>
<pre tabindex="0"><code>6A40F5F1-777-XXXX
</code></pre><p><strong>Зачем:</strong> Setup Key — это одноразовый токен для подключения устройства к вашей NetBird-сети. Он привязывает сервер к группе <code>remote</code> и позволяет потом настроить правила: кто к кому может подключаться. Отдельный ключ для облачного сервера нужен, чтобы отличать его от домашних устройств в политиках доступа.</p>
<p>⚠️ Важно: используйте Setup Key, иначе устройство может отключиться.</p>
<hr>
<h2 id="шаг-3-установка-netbird-на-сервер-yandex-cloud">Шаг 3. Установка NetBird на сервер Yandex Cloud</h2>
<p>Подключитесь к серверу:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ssh skv@SERVER_IP
</span></span></code></pre></div><p>Установите NetBird:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -fsSL https://pkgs.netbird.io/install.sh <span class="p">|</span> sh
</span></span></code></pre></div><p>Подключите сервер:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo netbird up --setup-key YOUR_SETUP_KEY
</span></span></code></pre></div><p>Проверьте статус:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">netbird status
</span></span></code></pre></div><p>Должно быть:</p>
<pre tabindex="0"><code>Connected: yes
</code></pre><p><strong>Зачем:</strong> NetBird-клиент на сервере подключает его к вашей приватной сети и выдаёт ему виртуальный IP (например, 100.64.0.x). После этого сервер сможет обращаться к домашним устройствам по этому IP, как будто они в одной локальной сети.</p>
<hr>
<h2 id="шаг-4-установка-netbird-дома">Шаг 4. Установка NetBird дома</h2>
<p>На домашнем сервере или компьютере:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -fsSL https://pkgs.netbird.io/install.sh <span class="p">|</span> sh
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo netbird up --setup-key YOUR_HOME_SETUP_KEY
</span></span></code></pre></div><p>Добавьте устройство в группу:</p>
<pre tabindex="0"><code>Home
</code></pre><p><strong>Зачем:</strong> Домашнее устройство (роутер, NAS или ПК с камерами) должно быть в сети NetBird и в группе <code>Home</code>. Тогда по правилам доступа сервер из группы <code>remote</code> сможет подключаться к нему. Группы нужны для сегментации: вы явно разрешаете, кто к кому имеет доступ.</p>
<hr>
<h2 id="шаг-5-настройка-правил-доступа">Шаг 5. Настройка правил доступа</h2>
<p>Перейдите:</p>
<pre tabindex="0"><code>Access Control → Policies
</code></pre><p>Создайте правило:</p>
<p>Source:</p>
<pre tabindex="0"><code>remote
</code></pre><p>Destination:</p>
<pre tabindex="0"><code>Home
</code></pre><p>Action:</p>
<pre tabindex="0"><code>Allow
</code></pre><p><strong>Зачем:</strong> По умолчанию NetBird использует Zero Trust — устройства не видят друг друга, пока вы не разрешите. Это правило говорит: «устройства из группы <code>remote</code> (облачный сервер) могут подключаться к устройствам из группы <code>Home</code>». Без него ping и RTSP-подключения к камерам не пройдут.</p>
<hr>
<h2 id="шаг-6-проверка-соединения">Шаг 6. Проверка соединения</h2>
<p>Получите NetBird IP домашнего устройства:</p>
<p>Пример:</p>
<pre tabindex="0"><code>100.64.0.5
</code></pre><p>С сервера:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ping 100.64.0.5
</span></span></code></pre></div><p>Если работает — сеть настроена.</p>
<p><strong>Зачем:</strong> Проверка подтверждает, что VPN работает и сервер в облаке может достучаться до домашней сети. Если ping проходит, Frigate тоже сможет получать RTSP-потоки с камер по NetBird IP.</p>
<hr>
<h2 id="часть-2-подключение-и-монтирование-диска">Часть 2. Подключение и монтирование диска</h2>
<p><strong>Зачем отдельный диск:</strong> Системный диск (vda) в Yandex Cloud обычно 10–40 ГБ — этого мало для видеозаписей. Frigate пишет круглосуточно, и за несколько дней место закончится. Отдельный диск (vdb) на 256–512 ГБ даёт место для хранения записей с настраиваемым сроком хранения.</p>
<p>Проверяем диски:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">lsblk
</span></span></code></pre></div><p>Пример:</p>
<pre tabindex="0"><code>vda 40G
vdb 512G
</code></pre><hr>
<h2 id="шаг-7-форматирование-диска">Шаг 7. Форматирование диска</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo mkfs.ext4 /dev/vdb
</span></span></code></pre></div><p><strong>Зачем:</strong> Новый диск приходит «сырым» — без файловой системы. <code>mkfs.ext4</code> создаёт ext4, которая хорошо подходит для Linux: журналирование, стабильность при сбоях, нормальная работа с большими файлами видео. Важно: форматирование удаляет все данные на диске.</p>
<hr>
<h2 id="шаг-8-монтирование">Шаг 8. Монтирование</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo mkdir /data
</span></span><span class="line"><span class="cl">sudo mount /dev/vdb /data
</span></span></code></pre></div><p><strong>Зачем:</strong> Диск нужно «привязать» к каталогу, чтобы система могла с ним работать. Без монтирования запись в <code>/data</code> пойдёт на системный диск. После <code>mount</code> всё, что пишется в <code>/data</code>, сохраняется на отдельном диске.</p>
<p>Проверка:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">df -h
</span></span></code></pre></div><hr>
<h2 id="шаг-9-автомонтирование">Шаг 9. Автомонтирование</h2>
<p>Получаем UUID:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo blkid /dev/vdb
</span></span></code></pre></div><p>Редактируем:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo nano /etc/fstab
</span></span></code></pre></div><p>Добавляем:</p>
<pre tabindex="0"><code>UUID=YOUR_UUID /data ext4 defaults,nofail 0 2
</code></pre><p><strong>Зачем:</strong> После перезагрузки диск размонтируется, и Frigate перестанет писать записи. Запись в <code>/etc/fstab</code> заставляет систему автоматически монтировать диск при загрузке. UUID используется вместо <code>/dev/vdb</code>, потому что имена устройств могут меняться, а UUID диска — постоянный. <code>nofail</code> не даёт системе зависнуть при загрузке, если диск временно недоступен.</p>
<hr>
<h2 id="шаг-10-настройка-прав">Шаг 10. Настройка прав</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo mkdir -p /data/frigate/<span class="o">{</span>config,media,db<span class="o">}</span>
</span></span><span class="line"><span class="cl">sudo chown -R skv:skv /data/frigate
</span></span></code></pre></div><p><strong>Зачем:</strong> Frigate в Docker будет работать от вашего пользователя (или от root в контейнере). Каталоги <code>config</code>, <code>media</code> и <code>db</code> нужны для конфигурации, видеозаписей и базы данных. <code>chown</code> даёт вашему пользователю права на запись, чтобы не использовать <code>sudo</code> при редактировании конфигов и чтобы Docker мог писать в эти каталоги.</p>
<hr>
<h2 id="часть-3-установка-docker">Часть 3. Установка Docker</h2>
<p><img src="/images/external/docker-logo.png" alt="Docker — платформа контейнеризации" title="Docker" loading="lazy" decoding="async"></p>
<p><strong>Зачем Docker:</strong> Frigate поставляется как готовый Docker-образ со всеми зависимостями (Python, FFmpeg, детекторы и т.д.). Установка через Docker избавляет от ручной настройки окружения, конфликтов версий и упрощает обновления — достаточно перезапустить контейнер с новым образом.</p>
<p>Обновляем систему:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt update
</span></span></code></pre></div><p>Устанавливаем Docker:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt install docker.io -y
</span></span></code></pre></div><p>Запускаем:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> docker
</span></span><span class="line"><span class="cl">sudo systemctl start docker
</span></span></code></pre></div><p>Добавляем пользователя:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo usermod -aG docker skv
</span></span><span class="line"><span class="cl">newgrp docker
</span></span></code></pre></div><p>Проверка:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker ps
</span></span></code></pre></div><p><strong>Зачем <code>usermod -aG docker</code>:</strong> По умолчанию только root может запускать контейнеры. Добавление пользователя в группу <code>docker</code> позволяет запускать Docker без <code>sudo</code>, что удобнее и безопаснее для повседневной работы.</p>
<hr>
<h2 id="часть-4-установка-docker-compose">Часть 4. Установка Docker Compose</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt install docker-compose -y
</span></span></code></pre></div><p>Проверка:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose version
</span></span></code></pre></div><p><strong>Зачем Docker Compose:</strong> Вместо длинной команды <code>docker run</code> с кучей флагов Compose описывает сервисы в YAML-файле. Проще хранить конфигурацию в репозитории, менять параметры и перезапускать одной командой <code>docker compose up -d</code>.</p>
<hr>
<h2 id="часть-5-установка-frigate">Часть 5. Установка Frigate</h2>
<p><img src="/images/external/frigate-logo.svg" alt="Frigate — NVR с AI-детекцией объектов" title="Frigate NVR" loading="lazy" decoding="async"></p>
<p>Создаем compose файл:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">nano /data/frigate/docker-compose.yml
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">frigate</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l">frigate</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">ghcr.io/blakeblackshear/frigate:stable</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">shm_size</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;512mb&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/data/frigate/config:/config</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/data/frigate/media:/media/frigate</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/data/frigate/db:/db</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/etc/localtime:/etc/localtime:ro</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;8971:8971&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;8554:8554&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;8555:8555/tcp&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;8555:8555/udp&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">TZ=Europe/Berlin</span><span class="w">
</span></span></span></code></pre></div><p><strong>Что за что в compose:</strong></p>
<ul>
<li><code>shm_size: &quot;512mb&quot;</code> — Frigate хранит кадры в shared memory для детекции. Для 2–4 камер 720p хватает 256–512 МБ; при нехватке будет ошибка «Bus error».</li>
<li><code>volumes</code> — привязка каталогов: <code>config</code> для настроек и БД, <code>media</code> для записей и клипов, <code>db</code> для SQLite. <code>localtime</code> нужен для корректного времени в логах и метаданных.</li>
<li><code>8971</code> — Web UI и API (с авторизацией). <code>8554</code> — RTSP-рестрим для камер. <code>8555</code> — WebRTC для двусторонней связи с камерами.</li>
<li><code>TZ</code> — часовой пояс для корректного отображения времени событий.</li>
</ul>
<hr>
<h2 id="часть-6-создание-конфигурации-frigate">Часть 6. Создание конфигурации Frigate</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">nano /data/frigate/config/config.yml
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">mqtt</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">record</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">retain</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">days</span><span class="p">:</span><span class="w"> </span><span class="m">3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="l">all</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">cameras</span><span class="p">:</span><span class="w"> </span>{}<span class="w">
</span></span></span></code></pre></div><p><strong>Зачем такая конфигурация:</strong> Минимальный конфиг для первого запуска. MQTT отключён — он нужен только для интеграции с Home Assistant. <code>record</code> включает запись с хранением 3 дней в режиме <code>all</code> (все кадры, не только при детекции). <code>cameras: {}</code> пустой — камеры добавите позже через Web UI или вручную в конфиг, указав RTSP-путь через NetBird IP (например, <code>rtsp://100.64.0.5:554/stream1</code>).</p>
<hr>
<h2 id="часть-7-запуск">Часть 7. Запуск</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /data/frigate
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">docker compose up -d
</span></span></code></pre></div><p>Проверка:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker ps
</span></span></code></pre></div><p><strong>Зачем <code>-d</code>:</strong> Флаг <code>-d</code> (detached) запускает контейнер в фоне. Без него терминал будет занят логами Frigate. Контейнер продолжит работать после закрытия SSH.</p>
<hr>
<h2 id="часть-8-получение-пароля">Часть 8. Получение пароля</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker logs frigate
</span></span></code></pre></div><p>или</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker logs frigate <span class="p">|</span> grep password
</span></span></code></pre></div><p>Логин:</p>
<pre tabindex="0"><code>admin
</code></pre><p><strong>Зачем:</strong> При первом запуске Frigate генерирует случайный пароль и выводит его в логи. Это защищает Web UI от несанкционированного доступа. Пароль можно сменить в настройках после входа.</p>
<hr>
<h2 id="часть-9-доступ-к-web-ui">Часть 9. Доступ к Web UI</h2>
<pre tabindex="0"><code>http://SERVER_IP:8971
</code></pre><p><strong>Зачем:</strong> Web UI — основной интерфейс Frigate: просмотр камер в реальном времени, настройка зон и масок, просмотр событий и записей, добавление камер. Убедитесь, что в Security Groups Yandex Cloud открыт порт 8971 для вашего IP, иначе доступ извне будет закрыт.</p>
<hr>
<h2 id="часть-10-проверка-записи">Часть 10. Проверка записи</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ls /data/frigate/media
</span></span></code></pre></div><p><strong>Зачем:</strong> Проверка, что Frigate пишет на отдельный диск. В <code>media/recordings</code> появятся каталоги по камерам и датам. Если камеры ещё не добавлены, каталоги будут пустыми — это нормально. Главное, что путь смонтирован и доступен для записи.</p>
<hr>
<h2 id="структура">Структура</h2>
<pre tabindex="0"><code>/data/frigate
 ├── config
 ├── media
 ├── db
 └── docker-compose.yml
</code></pre><p><strong>Назначение каталогов:</strong> <code>config</code> — конфиг и SQLite с событиями; <code>media</code> — записи, клипы и экспорты; <code>db</code> — дополнительные данные Frigate; <code>docker-compose.yml</code> — описание сервиса для перезапуска и обновлений.</p>
<hr>
<h2 id="готово">Готово</h2>
<p>Теперь Frigate работает на Yandex Cloud и имеет доступ к домашним камерам через NetBird.</p>
<p>Видео сохраняется на отдельном диске.</p>
<p>Система готова к production использованию.</p>
]]></content:encoded></item></channel></rss>