Установка MikroTik CHR на Proxmox: от образа до базовой защиты

Установка MikroTik CHR на Proxmox: пошаговое руководство
Что получишь на выходе
Рабочий MikroTik CHR на Proxmox VE за 15 минут. Чистая VM, SSH на нестандартном порту, лишние сервисы отключены, базовый firewall настроен. Всё через консоль Proxmox — без GUI, без магии.

Что такое MikroTik CHR и зачем он на Proxmox

CHR — это Cloud Hosted Router. RouterOS в виде виртуальной машины. Тот же MikroTik, те же команды, та же логика — только запускается на любом гипервизоре.

Зачем это нужно. Тестовый стенд без физического железа. Лабораторная среда для изучения RouterOS. Маршрутизатор или файервол внутри Proxmox-кластера. Дешевле чем покупать отдельное устройство для каждой задачи.

По лицензии: бесплатная версия CHR ограничена 1 Mbps на интерфейс. Для лабы и тестов — хватает. Для продакшна нужна платная лицензия P1, P10 или Unlimited. Мы работаем с бесплатной — всё что показано в статье работает без покупки лицензии.

Системные требования

Компонент Минимум В статье
Proxmox VE 7.x и выше 9.1.4
RouterOS CHR 7.x 7.22.1 stable
RAM для VM 256 MiB 256 MiB
Диск для VM 128 MiB 128 MiB (local-lvm)
CPU 1 ядро x86_64 1 ядро, host type
Сеть 1 интерфейс virtio, vmbr0

На момент публикации актуальная версия CHR — 7.22.1. Перед установкой проверь свежие релизы на mikrotik.com/download.

Архитектура стенда

%%{init: {
  'theme': 'base',
  'themeVariables': {
    'primaryColor': '#ffffff',
    'primaryTextColor': '#1e293b',
    'primaryBorderColor': '#94a3b8',
    'lineColor': '#64748b',
    'fontSize': '15px',
    'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
  },
  'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
    A["Proxmox VE 9.1.4"] --> B["VM 110 - MikroTik CHR 7.22.1"]
    B --> C["ether1 - virtio"]
    C --> D["vmbr0 - bridge"]
    D --> E["Локальная сеть 192.168.168.0/24"]
    style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
    style B fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
    style C fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
    style D fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
    style E fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d

CHR получает один интерфейс ether1 через virtio-драйвер. Он смотрит в vmbr0 — стандартный bridge Proxmox. Дальше — в твою локальную сеть. Просто и без лишних сущностей.

Часть 1: Установка CHR на Proxmox

Пошаговое видео, скринкаст консоли:

Шаг 1. Проверяем Proxmox

 

Заходи на Proxmox по SSH и проверяй версию:


pveversion

Результат:


pve-manager/9.1.4/5ac30304265fbd8e (running kernel: 6.17.4-1-pve)

Шаг 2. Смотрим хранилища

Нам нужны два хранилища: одно для образа, второе для диска VM.


pvesm status

Результат:


Name           Type     Status     Total (KiB)    Used (KiB)  Available (KiB)   %
local           dir     active       98497780       7058528       86389704    7.17%
local-lvm   lvmthin     active      855855104     373067239      482787864   43.59%

Образ CHR кладём в local — путь /var/lib/vz/template/iso/. Диск VM создаём на local-lvm — это lvmthin, быстро и без лишнего расхода места.

Шаг 3. Скачиваем актуальную версию CHR

Не хардкодим версию руками — получаем её у MikroTik автоматически:


STABLE=$(curl -s https://upgrade.mikrotik.com/routeros/NEWESTa7.stable | awk '{print $1}')
echo $STABLE

Результат:


7.22.1

Теперь скачиваем образ:


cd /var/lib/vz/template/iso/
wget https://download.mikrotik.com/routeros/${STABLE}/chr-${STABLE}.img.zip

MikroTik отдаёт RAW disk image в zip-архиве. 43 MB, скачивается за 10-15 секунд.

Шаг 4. Распаковываем образ


unzip chr-${STABLE}.img.zip

Результат:


inflating: chr-7.22.1.img

Шаг 5. Получаем свободный ID для VM

Не угадываем ID руками — Proxmox сам знает что свободно:


VMID=$(pvesh get /cluster/nextid)
echo $VMID

Результат:


110

Шаг 6. Создаём VM


qm create $VMID --name "mikrotik-chr-${STABLE}" --ostype l26 --memory 256 --cores 1 --cpu host --net0 virtio,bridge=vmbr0

Разберём параметры:

Параметр Значение Зачем
—ostype l26 Linux 2.6+ CHR основан на Linux-ядре
—memory 256 256 MiB минимум для ROS7 с одним интерфейсом
—cpu host тип CPU host передаём реальные инструкции CPU, быстрее чем эмуляция
—net0 virtio virtio драйвер паравиртуализация — лучшая производительность сети

Шаг 7. Импортируем диск


qm importdisk $VMID /var/lib/vz/template/iso/chr-${STABLE}.img local-lvm

Результат:


transferred 128.0 MiB of 128.0 MiB (100.00%)
unused0: successfully imported disk 'local-lvm:vm-110-disk-0'

Proxmox скопировал RAW образ в LVM и создал диск vm-110-disk-0. Пока он висит как unused0 — не подключён к VM.

Шаг 8. Подключаем диск и настраиваем загрузку


qm set $VMID --scsi0 local-lvm:vm-${VMID}-disk-0 --scsihw virtio-scsi-single --boot order=scsi0

Подключаем диск как scsi0 через контроллер virtio-scsi-single и говорим VM грузиться с него. Без --boot order=scsi0 VM не знает откуда стартовать.

Шаг 9. Добавляем serial консоль


qm set $VMID --serial0 socket --vga serial0

Вот тут важно. CHR не имеет графического вывода. Без serial консоли qm terminal не откроется — получишь пустой экран. Эти две опции обязательны.

Шаг 10. Запускаем VM


qm start $VMID

Ждём 10 секунд пока CHR загрузится и подключаемся:


qm terminal $VMID

Нажимай Enter — появится приглашение сменить пароль. Установи пароль и попадёшь в консоль RouterOS. Для выхода из консоли — Ctrl+O.

Автоматический скрипт установки

Все шаги выше собраны в один скрипт. Запускай на чистом Proxmox — получишь рабочий CHR за 2-3 минуты:


#!/bin/bash

echo "=== ШАГ 1: Проверяем версию Proxmox ==="
echo "Убеждаемся что Proxmox актуальный и ядро загружено корректно"
echo "Запускаем -> pveversion"
sleep 3
pveversion
sleep 4

echo ""
echo "=== ШАГ 2: Смотрим доступные хранилища ==="
echo "Выбираем куда скачать образ и куда создать диск VM"
echo "Запускаем -> pvesm status"
sleep 3
pvesm status
sleep 4

echo ""
echo "=== ШАГ 3: Получаем актуальную версию CHR ==="
echo "Запрашиваем у MikroTik последнюю стабильную версию RouterOS 7"
echo "Запускаем -> curl -s https://upgrade.mikrotik.com/routeros/NEWESTa7.stable"
sleep 3
STABLE=$(curl -s https://upgrade.mikrotik.com/routeros/NEWESTa7.stable | awk '{print $1}')
echo "Актуальная версия: $STABLE"
sleep 4

echo ""
echo "=== ШАГ 4: Скачиваем образ CHR ==="
echo "Загружаем RAW disk image CHR прямо на Proxmox в папку для ISO"
echo "Запускаем -> wget https://download.mikrotik.com/routeros/${STABLE}/chr-${STABLE}.img.zip"
sleep 3
cd /var/lib/vz/template/iso/
rm -f chr-*.img chr-*.zip chr-*.zip.*
wget https://download.mikrotik.com/routeros/${STABLE}/chr-${STABLE}.img.zip
sleep 3

echo ""
echo "=== ШАГ 5: Распаковываем образ ==="
echo "Из zip извлекаем RAW img - именно его будем импортировать в VM"
echo "Запускаем -> unzip chr-${STABLE}.img.zip"
sleep 3
unzip chr-${STABLE}.img.zip
sleep 3

echo ""
echo "=== ШАГ 6: Получаем свободный ID для VM ==="
echo "Proxmox сам назначит следующий свободный ID - не будем угадывать"
echo "Запускаем -> pvesh get /cluster/nextid"
sleep 3
VMID=$(pvesh get /cluster/nextid)
echo "Используем ID: $VMID"
sleep 4

echo ""
echo "=== ШАГ 7: Создаём VM ==="
echo "Создаём пустую VM: Linux, 256MB RAM, 1 CPU, один сетевой интерфейс на vmbr0"
echo "Запускаем -> qm create ..."
sleep 3
qm create $VMID --name "mikrotik-chr-${STABLE}" --ostype l26 --memory 256 --cores 1 --cpu host --net0 virtio,bridge=vmbr0
echo "VM $VMID создана"
sleep 4

echo ""
echo "=== ШАГ 8: Импортируем диск ==="
echo "Копируем RAW образ CHR в хранилище local-lvm и создаём диск VM"
echo "Запускаем -> qm importdisk ..."
sleep 3
qm importdisk $VMID /var/lib/vz/template/iso/chr-${STABLE}.img local-lvm
sleep 3

echo ""
echo "=== ШАГ 9: Подключаем диск и настраиваем загрузку ==="
echo "Подключаем импортированный диск как scsi0 и указываем загружаться с него"
echo "Запускаем -> qm set ..."
sleep 3
qm set $VMID --scsi0 local-lvm:vm-${VMID}-disk-0 --scsihw virtio-scsi-single --boot order=scsi0
sleep 4

echo ""
echo "=== ШАГ 10: Добавляем serial консоль ==="
echo "Без serial консоли CHR не откроется в терминале Proxmox"
echo "Запускаем -> qm set $VMID --serial0 socket --vga serial0"
sleep 3
qm set $VMID --serial0 socket --vga serial0
sleep 4

echo ""
echo "=== ШАГ 11: Запускаем VM ==="
echo "Стартуем VM и ждём пока CHR загрузится"
echo "Запускаем -> qm start $VMID"
sleep 3
qm start $VMID
echo "Ждём загрузки CHR..."
sleep 10

echo ""
echo "=== ГОТОВО ==="
echo "VM ID: $VMID"
echo "Версия CHR: $STABLE"
echo "Подключение: qm terminal $VMID"
echo "Логин: admin / пароль пустой (Enter)"

Часть 2: Первая проверка CHR

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

Пошаговое видео, скринкаст консоли:

Интерфейсы


/interface print

Результат:


Flags: R - RUNNING
Columns: NAME, TYPE, ACTUAL-MTU, MAC-ADDRESS
#   NAME    TYPE      ACTUAL-MTU  MAC-ADDRESS
0 R ether1  ether           1500  BC:24:11:97:B4:FD
1 R lo      loopback       65536  00:00:00:00:00:00

Один интерфейс ether1 — запущен. Всё как ожидали.

IP адрес


/ip address print

Результат:


#   ADDRESS            NETWORK        INTERFACE  VRF
0 D 192.168.168.29/24  192.168.168.0  ether1     main

Флаг D означает DHCP. CHR получил адрес автоматически из твоей сети.

Проверка интернета


/ping 8.8.8.8 count=3

Результат:


SEQ HOST        SIZE TTL TIME
  0 8.8.8.8      56 104 36ms722us
  1 8.8.8.8      56 104 37ms758us
  2 8.8.8.8      56 104 37ms142us
sent=3 received=3 packet-loss=0% min-rtt=36ms722us avg-rtt=37ms207us max-rtt=37ms758us

Потери 0%, интернет есть. CHR маршрутизирует корректно.

Ресурсы системы


/system resource print

Результат:


             uptime: 16m19s
            version: 7.22.1 (stable)
         build-time: 2026-03-23 14:35:15
   factory-software: 7.1
        free-memory: 55.1MiB
       total-memory: 256.0MiB
                cpu: Intel(R)
          cpu-count: 1
      cpu-frequency: 2494MHz
           cpu-load: 1%
     free-hdd-space: 69.3MiB
    total-hdd-space: 89.2MiB
   architecture-name: x86_64
           board-name: CHR QEMU Standard PC (i440FX + PIIX, 1996)
             platform: MikroTik

256 MiB RAM, из них 55 MiB свободно. Для роутера хватает с запасом.

Первый бэкап

Перед любыми изменениями делаем бэкап. Это правило номер один:


/system backup save name=chr-initial

Проверяем:


/file print

Результат:


# NAME                TYPE       SIZE     LAST-MODIFIED
0 skins               directory           2026-04-19 05:24:02
1 chr-initial.backup  backup     19.4KiB  2026-04-19 05:45:09

Бэкап есть. Теперь можно двигаться дальше.

Меняем порт SSH

Порт 22 — первое что сканируют боты. Меняем на нестандартный:


/ip service set ssh port=2222
Проверь сразу после смены порта
Сразу проверь подключение на новом порту не закрывая текущую сессию. Если что-то пошло не так — ещё можно исправить через qm terminal.

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


ssh -p 2222 admin@192.168.168.29

Работает — едем дальше. Не работает — подключайся через qm terminal и смотри что пошло не так.

Часть 3: Отключаем лишние сервисы и настраиваем firewall

На чистом CHR запущено много лишнего. Смотрим.

Пошаговое видео, скринкаст консоли:


/ip service print

Результат:


Flags: D - DYNAMIC; X - DISABLED
#   NAME           PORT  PROTO
0   ftp              21  tcp
1   telnet           23  tcp
2   www              80  tcp
3   ssh            2222  tcp
4   winbox         8291  tcp
5   api            8728  tcp
6   api-ssl        8729  tcp

FTP, Telnet, WWW, API — открытые порты без надобности. Оставляем SSH на 2222 и Winbox на 8291, всё остальное закрываем.

Отключаем ненужные сервисы


/ip service disable ftp
/ip service disable telnet
/ip service disable www
/ip service disable api,api-ssl

Проверяем результат:


/ip service print

Должны остаться только SSH на 2222 и Winbox на 8291. Остальные будут с флагом X — disabled.

Базовые правила firewall

Схема простая: разрешаем нужное, остальное дропаем.

%%{init: {
  'theme': 'base',
  'themeVariables': {
    'primaryColor': '#ffffff',
    'primaryTextColor': '#1e293b',
    'primaryBorderColor': '#94a3b8',
    'lineColor': '#64748b',
    'fontSize': '15px',
    'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
  },
  'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
    A["Входящий пакет"] --> B{"established / related?"}
    B -->|да| C["ACCEPT"]
    B -->|нет| D{"ICMP?"}
    D -->|да| C
    D -->|нет| E{"SSH 2222 из 192.168.168.0/24?"}
    E -->|да| C
    E -->|нет| F{"Winbox 8291 из 192.168.168.0/24?"}
    F -->|да| C
    F -->|нет| G["DROP"]
    style A fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#1e293b
    style C fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
    style G fill:#f8fafc,stroke:#ef4444,stroke-width:2px,color:#dc2626

Добавляем правила строго в таком порядке:


/ip firewall filter add chain=input connection-state=established,related action=accept comment=accept-established-related

/ip firewall filter add chain=input protocol=icmp action=accept comment=accept-icmp

/ip firewall filter add chain=input protocol=tcp dst-port=2222 src-address=192.168.168.0/24 action=accept comment=accept-ssh-mgmt

/ip firewall filter add chain=input protocol=tcp dst-port=8291 src-address=192.168.168.0/24 action=accept comment=accept-winbox-mgmt

/ip firewall filter add chain=input action=drop comment=drop-all
Порядок правил критичен
RouterOS проверяет правила сверху вниз и останавливается на первом совпадении. Правило drop-all должно быть последним. Если поставишь его первым — заблокируешь всё включая себя.

Проверяем что правила встали правильно:


/ip firewall filter print

Результат:


Flags: X - DISABLED, I - INVALID; D - DYNAMIC
#   CHAIN   ACTION   PROTOCOL  SRC-ADDRESS           DST-PORT  COMMENT
0   input   accept             established,related             accept-established-related
1   input   accept   icmp                                      accept-icmp
2   input   accept   tcp       192.168.168.0/24      2222      accept-ssh-mgmt
3   input   accept   tcp       192.168.168.0/24      8291      accept-winbox-mgmt
4   input   drop                                               drop-all

Проверяем что SSH ещё работает после добавления drop:


ssh -p 2222 admin@192.168.168.29

Работает — отлично. Делаем финальный бэкап:


/system backup save name=chr-firewall-basic

Таблица портов

Сервис Порт Протокол Статус Доступ
FTP 21 TCP отключён
Telnet 23 TCP отключён
WWW 80 TCP отключён
SSH 2222 TCP активен 192.168.168.0/24
Winbox 8291 TCP активен 192.168.168.0/24
API 8728 TCP отключён
API-SSL 8729 TCP отключён

Troubleshooting

qm terminal не открывается — пустой экран

Не добавил serial консоль. Останови VM и добавь:


qm stop 110
qm set 110 --serial0 socket --vga serial0
qm start 110

VM запустилась но CHR не грузится

Диск не подключён как загрузочный. Проверь:


qm config 110 | grep -E "boot|scsi"

Должно быть boot: order=scsi0 и scsi0: local-lvm:vm-110-disk-0. Если нет — повтори шаг 8.

wget сохраняет файл как chr-7.22.1.img.zip.1

Предыдущий архив не удалён. Почисти и качай заново:


rm -f /var/lib/vz/template/iso/chr-*.img /var/lib/vz/template/iso/chr-*.zip*
wget https://download.mikrotik.com/routeros/${STABLE}/chr-${STABLE}.img.zip

SSH не подключается после смены порта

Подключись через консоль Proxmox и проверь что порт сменился:


qm terminal 110

В консоли CHR:


/ip service print

Смотри колонку PORT напротив SSH.

Заблокировал себя firewall-ом

Подключайся через qm terminal 110 — firewall не блокирует консоль Proxmox. Сбрасывай правила:


/ip firewall filter remove [find]

И добавляй заново в правильном порядке.

FAQ

Чем MikroTik CHR отличается от обычного RouterOS?

Только платформой и лицензией. CHR работает как виртуальная машина на x86_64. Команды, конфигурация, логика — всё идентично физическому MikroTik. Бесплатная версия ограничена 1 Mbps на интерфейс. Для снятия ограничения нужна платная лицензия.

Как проверить текущую лицензию CHR?


/system license print

Бесплатная версия покажет free. Для лабораторных задач этого достаточно.

Можно ли увеличить диск CHR после установки?

Да. Останови VM, увеличь диск в Proxmox и запусти снова — RouterOS увидит новый размер автоматически:


qm stop 110
qm disk resize 110 scsi0 +8G
qm start 110

Как удалить CHR и начать заново?


qm stop 110
qm destroy 110 --purge
rm -f /var/lib/vz/template/iso/chr-*.img /var/lib/vz/template/iso/chr-*.zip*

Почему SSH просит пароль на каждую команду в скрипте?

Каждый вызов ssh в bash — это новая сессия. Решается двумя способами: передавать пароль через sshpass или настроить SSH-ключи. Для продакшна — только ключи. Для тестового стенда — sshpass достаточно.

Что дальше

CHR установлен, базовая защита настроена. Лишние сервисы отключены, firewall закрывает всё кроме SSH и Winbox из локальной сети.

Это первая статья цикла по MikroTik CHR. Следующая — полная настройка безопасности: SSH только по ключам, смена имени устройства, защита от брутфорса, настройка NTP и логирования.

Не заработало - разберёмся
Если что-то пошло не так — пиши в комментарии. Описывай: версию Proxmox, что именно делал, какую ошибку получил. Разберём.
Андрей Анатольевич
Author: Андрей Анатольевич

Руководитель ИТ / Кризис-менеджер 25 лет в IT: от инженера в МегаФоне до руководителя отдела. Знаю, как выглядит бардак: нестабильные сети, устаревшая инфраструктура, конфликты в команде, раздутые сроки. Помогаю бизнесу выходить из кризиса: навожу порядок в легаси, стабилизирую то, что разваливается, выстраиваю прогнозируемые процессы. Не раз возвращал к жизни ИТ-структуры — знаю цену хаосу. 📍 Ищу проект для полной реорганизации / стабилизации. 📬 Telegram: @over_dude ✉️ mail@it-apteka.com

Оставайтесь на связи

Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.

Подписаться на IT-Аптеку →

Мы ВКонтакте

IT-Аптека — советы, новости и помощь рядом.

Вступить в группу ВКонтакте →
Поделитесь:

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх