Перейти к основному содержимому

MikroTik (RouterOS 7.x)

b4 запускается как контейнер на MikroTik RouterOS 7.x.

Требования

  • RouterOS версии 7.21.1 и выше
  • Архитектура ARM64 или AMD64
  • Подключённый внешний накопитель (Flash/SSD/HDD), отформатированный в Ext4
warning

Контейнеры на MikroTik требуют внешний накопитель - внутренней памяти роутера недостаточно.

Образ от сообщества

Кроме официального образа lavrushin/b4 существует образ, собранный специально под RouterOS: wiktorbgu/b4-mikrotik, его поддерживает wiktorbgu. Образ выходит следом за релизами b4 с теми же номерами версий и упаковывает сервис под контейнеры RouterOS:

  • b4 работает внутри контейнера как сервис OpenRC, поэтому его можно перезапустить, не останавливая контейнер
  • entrypoint выбирает бэкенд файрвола при старте - nftables либо iptables-legacy с ipset - в зависимости от того, какие модули ядра RouterOS отдаёт контейнеру
  • он приводит в порядок приоритеты правил маршрутизации main и default, которые RouterOS 7.22 передаёт в контейнер в виде, ломающем policy routing
  • парный контейнер wiktorbgu/dnsproxy-mikrotik пересылает DNS-запросы через DoH, чтобы их не перехватывали

Инструкция по настройке - на странице образа. Образ поддерживает сообщество, проект b4 его не собирает, исходники сборки не опубликованы, поэтому сверить его содержимое с этим репозиторием нельзя. Дальнейшее руководство использует официальный образ.

Параметры примера

В руководстве используются следующие значения, их нужно заменить на соответствующие локальной сети:

ПараметрЗначение
Сеть моста192.168.210.0/24
Шлюз моста192.168.210.1
Имя мостаbridge-docker
IP контейнера192.168.210.10
Имя интерфейсаB4
Сеть LAN192.168.100.0/24
DNS-сервер192.168.100.1
Таблица маршрутизацииto_b4
Диск/usb1
Список клиентовb4users

Шаг 1: Мост

Мост для Docker-сети:

/interface/bridge add name=bridge-docker port-cost-mode=short
/ip/address add address=192.168.210.1/24 interface=bridge-docker network=192.168.210.0

Шаг 2: Интерфейс

Виртуальный Ethernet-интерфейс, подключённый к мосту:

/interface/veth add address=192.168.210.10/24 gateway=192.168.210.1 name=B4
/interface/bridge/port add bridge=bridge-docker interface=B4

Шаг 3: Маршрутизация

Таблица маршрутизации и маршрут через контейнер:

/routing table add disabled=no fib name=to_b4
/ip route add check-gateway=ping gateway=192.168.210.10 routing-table=to_b4

Шаг 4: Маркировка трафика

Трафик клиентов из списка b4users перенаправляется через контейнер:

/ip firewall mangle add chain=prerouting action=mark-connection \
new-connection-mark=b4_connections passthrough=yes connection-state=new \
dst-address-type=!local src-address-list=b4users in-interface-list=LAN \
place-before=0

/ip firewall mangle add chain=prerouting action=mark-routing \
new-routing-mark=to_b4 passthrough=no connection-mark=b4_connections \
in-interface-list=LAN log=no place-before=1
FastTrack

FastTrack обходит правила mangle. Его нужно ограничить немаркированными соединениями:

/ip firewall filter set [find action=fasttrack-connection] connection-mark=no-mark

Шаг 5: Точки монтирования

/container/mounts add name=b4_etc src=/usb1/docker/b4-mounts/etc dst=/opt/etc/b4

Директория /usb1/docker/b4-mounts/etc должна существовать на диске.

Шаг 6: Запуск контейнера

Настройка реестра:

/container/config set registry-url=https://registry-1.docker.io tmpdir=/usb1/docker/pull

Создание контейнера:

/container add remote-image=lavrushin/b4:latest interface=B4 \
root-dir=/usb1/docker/b4-mikrotik mounts=b4_etc \
cmd="--config /opt/etc/b4/b4.json" start-on-boot=yes \
logging=yes dns=192.168.100.1

После загрузки образа:

/container start [find tag~"b4"]
Перехват DNS

Если провайдер перехватывает DNS (редирект 53 порта), публичные резолверы внутри контейнера не помогут. Выход - DoH на MikroTik, а в контейнере вместо публичного DNS указывается шлюз моста:

/ip dns set use-doh-server=https://cloudflare-dns.com/dns-query verify-doh-cert=yes

DNS контейнера при этом становится dns=192.168.210.1 (шлюз моста).

Шаг 7: Добавление клиентов

Устройства добавляются в адресный список b4users:

/ip firewall address-list add list=b4users address=192.168.100.50
/ip firewall address-list add list=b4users address=192.168.100.51

Веб-интерфейс

После запуска контейнера: http://192.168.210.10:7000

Снижение износа диска

USB-флешки и SD-карты имеют ограниченное число циклов записи. Логи b4 можно перенести в RAM через веб-интерфейс:

Settings -> Logging Configuration -> Log file path: /tmp/log/b4/errors.log

Логи теряются при перезагрузке, но накопитель прослужит дольше.

Обновление

/container stop [find tag~"b4"]
/container remove [find tag~"b4"]
/container add remote-image=lavrushin/b4:latest interface=B4 \
root-dir=/usb1/docker/b4-mikrotik mounts=b4_etc \
cmd="--config /opt/etc/b4/b4.json" start-on-boot=yes \
logging=yes dns=192.168.100.1

Конфигурация хранится на точке монтирования и сохраняется при пересоздании контейнера.

Решение проблем

Контейнер не запускается:

  1. Статус: /container print
  2. Логи: /log print where topics~"container"
  3. Диск должен быть отформатирован в Ext4

Нет доступа к веб-интерфейсу:

  1. Контейнер должен быть запущен: /container print
  2. Связность: /ping 192.168.210.10

Трафик не перенаправляется:

  1. Список: /ip firewall address-list print where list=b4users
  2. Mangle: /ip firewall mangle print
  3. Маршрут: /ip route print where routing-table=to_b4