MikroTik CHR на Proxmox: свой роутер и изолированная сеть для виртуалок

· Павел · mikrotik chr routeros proxmox networking

У Proxmox есть удобная возможность, о которой многие не знают: можно поднять полноценный MikroTik прямо виртуалкой и спрятать за ним остальные машины. Получается сеть внутри гипервизора — со своей адресацией, своим NAT и своим межсетевым экраном, никак не связанная с домашней или офисной сетью.

Зачем это нужно:

Раньше под такие задачи покупали бэушное железо с авито и городили стойку в кладовке. Теперь это одна виртуалка на 256 мегабайт памяти, которая поднимается за десять минут и сносится за десять секунд.

Твоя Циска в зоне риска.

Разберу по шагам.

Сначала про лицензию

Момент, на котором спотыкаются все. CHR — это RouterOS для виртуальных машин, и он бесплатен, но бесплатная лицензия ограничивает каждый интерфейс скоростью 1 Мбит/с.

Для изучения и настройки этого хватает. Для реального трафика — нет.

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

Держите это в голове: если после настройки всё работает, но упирается в мегабит, дело не в вашей конфигурации.

Загрузка образа и создание машины

MikroTik раздаёт CHR несколькими способами; проще всего взять raw-образ диска и подсунуть его готовой виртуалке.

На узле Proxmox, по SSH:

cd /tmp
wget https://download.mikrotik.com/routeros/7.20/chr-7.20.img.zip
unzip chr-7.20.img.zip

Версию подставьте актуальную — список есть на сайте MikroTik в разделе загрузок, вкладка Cloud Hosted Router.

Создаём машину. Аппетиты у CHR скромные:

qm create 200 --name chr --memory 256 --cores 1 \
  --net0 virtio,bridge=vmbr0 \
  --scsihw virtio-scsi-pci

Подключаем скачанный образ как диск:

qm disk import 200 chr-7.20.img local-lvm

В старых версиях Proxmox эта команда называлась qm importdisk — если ругается на синтаксис, попробуйте прежнее имя.

Команда напечатает, куда лёг диск. Подключаем его и указываем загрузку:

qm set 200 --scsi0 local-lvm:vm-200-disk-0
qm set 200 --boot order=scsi0
qm set 200 --onboot 1

Машина готова. Пока у неё один интерфейс, смотрящий в вашу основную сеть.

Вторая сеть: мост без физического порта

Вот ключевая часть.

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

В веб-интерфейсе: Узел → System → Network → Create → Linux Bridge.

Про пустой адрес отдельно. Если не давать мосту IP, сам гипервизор в эту сеть не входит. Виртуалки общаются между собой и с роутером, а хост остаётся снаружи. Так правильнее: меньше точек соприкосновения, и если стенд что-то натворит, до гипервизора он не дотянется.

Нажмите Apply Configuration. Сеть создана.

Добавляем CHR второй интерфейс

qm set 200 --net1 virtio,bridge=vmbr1

Теперь у роутера две ноги:

Интерфейс Мост Роль
ether1 vmbr0 наружу, в вашу основную сеть
ether2 vmbr1 внутрь, к виртуалкам

Запускаем: qm start 200. Консоль открывается в веб-интерфейсе Proxmox.

Вход — admin, пароль пустой. RouterOS сразу потребует задать новый, и это правильно: роутер без пароля в сети живёт недолго.

Настройка RouterOS

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

Сначала внешний интерфейс. Если в вашей сети есть DHCP:

/ip dhcp-client add interface=ether1 disabled=no

Либо задайте адрес руками:

/ip address add address=192.168.1.50/24 interface=ether1
/ip route add gateway=192.168.1.1
/ip dns set servers=1.1.1.1,8.8.8.8 allow-remote-requests=yes

Теперь внутренняя сеть. Берём подсеть, которая не пересекается с основной — пусть будет 10.20.0.0/24:

/ip address add address=10.20.0.1/24 interface=ether2

/ip pool add name=lab ranges=10.20.0.100-10.20.0.200
/ip dhcp-server add name=lab interface=ether2 address-pool=lab disabled=no
/ip dhcp-server network add address=10.20.0.0/24 gateway=10.20.0.1 dns-server=10.20.0.1

И выпускаем внутреннюю сеть наружу:

/ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade

Минимальная защита самого роутера — снаружи к нему лезть не должны:

/ip firewall filter add chain=input connection-state=established,related action=accept
/ip firewall filter add chain=input in-interface=ether2 action=accept
/ip firewall filter add chain=input action=drop

Порядок правил имеет значение: последнее — запрещающее, и оно должно быть последним. Настраивайте через консоль Proxmox, а не по сети: правило drop способно отрезать вас от роутера на полуслове.

Подключаем виртуалки

Остаётся перевести машины во вторую сеть. Для существующей виртуалки — в веб-интерфейсе: ВМ → Hardware → Network Device → Edit → Bridge: vmbr1.

Или командой:

qm set 201 --net0 virtio,bridge=vmbr1

Для контейнеров всё то же самое, только pct set вместо qm set.

После перезапуска сети машина получит адрес из пула 10.20.0.x, шлюзом будет CHR, интернет — через NAT. Проверяется обычным ping до 10.20.0.1 и дальше наружу.

Как достучаться до машин снаружи

Виртуалки теперь за NAT, и это ровно то, чего мы добивались. Но иногда нужно пустить к ним трафик.

Проброс порта на CHR:

/ip firewall nat add chain=dstnat in-interface=ether1 protocol=tcp \
  dst-port=8080 action=dst-nat to-addresses=10.20.0.100 to-ports=80

Стучимся на адрес CHR в основной сети, порт 8080 — попадаем на веб-сервер внутри стенда.

Маршрут вместо NAT. Если хочется ходить внутрь напрямую, пропишите на своём роутере или компьютере статический маршрут: сеть 10.20.0.0/24 через адрес CHR в основной сети. Тогда внутренние машины будут доступны по настоящим адресам, без пробросов.

Второй способ удобнее для лаборатории, первый — когда наружу надо отдать ровно одну службу.

Грабли

Забыли про скорость. Всё настроено верно, а файлы ползут. Это бесплатная лицензия с её мегабитом на интерфейс, а не ошибка конфигурации.

Мост с физическим портом вместо пустого. Если у vmbr1 указан сетевой интерфейс, изоляции не будет: ваш «внутренний» сегмент окажется в общей сети, а DHCP-сервер CHR начнёт раздавать адреса чужим устройствам. Это быстро заметят коллеги.

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

Роутер без пароля и без правил. CHR приезжает пустым. Если дать ему внешний адрес и уйти пить чай, его найдут быстрее, чем вы вернётесь.

Диск впритык. Образ маленький, и места под логи почти нет. Если планируете что-то серьёзнее стенда, расширьте диск сразу — потом это делается через qm disk resize и перезагрузку.

Что дальше

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

Если Proxmox у вас ещё не стоит — начните с установки. А про то, что вообще стоит держать на домашнем гипервизоре, — в обзоре моей установки.