"Что
<br />
Рабочий MikroTik CHR на Proxmox VE за 15 минут. Чистая VM, SSH на нестандартном порту, лишние сервисы отключены, базовый firewall настроен. Всё через консоль Proxmox — без GUI, без магии.<br />
<h2>Что такое MikroTik CHR и зачем он на Proxmox</h2>
<p>CHR — это Cloud Hosted Router. RouterOS в виде виртуальной машины. Тот же <a class="wpil_keyword_link" title="mikrotik" href="https://it-apteka.com/tag/mikrotik/" target="_blank" rel="noopener" data-wpil-keyword-link="linked" data-wpil-monitor-id="1727">MikroTik</a>, те же команды, та же логика — только запускается на любом гипервизоре.</p>
<p>Зачем это нужно. Тестовый стенд без физического железа. Лабораторная среда для изучения RouterOS. Маршрутизатор или файервол внутри Proxmox-кластера. Дешевле чем покупать отдельное устройство для каждой задачи.</p>
<p>По лицензии: бесплатная версия CHR ограничена 1 Mbps на интерфейс. Для лабы и тестов — хватает. Для продакшна нужна платная лицензия P1, P10 или Unlimited. Мы работаем с бесплатной — всё что показано в статье работает без покупки лицензии.</p>
<h2>Системные требования</h2>
<table>
<thead>
<tr>
<th>Компонент</th>
<th>Минимум</th>
<th>В статье</th>
</tr>
</thead>
<tbody>
<tr>
<td>Proxmox VE</td>
<td>7.x и выше</td>
<td>9.1.4</td>
</tr>
<tr>
<td>RouterOS CHR</td>
<td>7.x</td>
<td>7.22.1 stable</td>
</tr>
<tr>
<td>RAM для VM</td>
<td>256 MiB</td>
<td>256 MiB</td>
</tr>
<tr>
<td>Диск для VM</td>
<td>128 MiB</td>
<td>128 MiB (local-lvm)</td>
</tr>
<tr>
<td>CPU</td>
<td>1 ядро x86_64</td>
<td>1 ядро, host type</td>
</tr>
<tr>
<td>Сеть</td>
<td>1 интерфейс</td>
<td>virtio, vmbr0</td>
</tr>
</tbody>
</table>
<p>На момент публикации актуальная версия CHR — 7.22.1. Перед установкой проверь свежие релизы на mikrotik.com/download.</p>
<h2>Архитектура стенда</h2>
<pre class="mermaid">%%{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
</pre>
<p>CHR получает один интерфейс ether1 через virtio-драйвер. Он смотрит в vmbr0 — стандартный bridge Proxmox. Дальше — в твою локальную сеть. Просто и без лишних сущностей.</p>
<h2>Часть 1: Установка CHR на Proxmox</h2>
<h4>Пошаговое видео, скринкаст консоли:</h4>
<h3>Шаг 1. Проверяем Proxmox</h3>
<p> </p>
<p>Заходи на Proxmox по SSH и проверяй версию:</p>
<pre><code class="language-bash">
pveversion
</code></pre>
<p>Результат:</p>
<pre><code class="language-text">
pve-manager/9.1.4/5ac30304265fbd8e (running kernel: 6.17.4-1-pve)
</code></pre>
<h3>Шаг 2. Смотрим хранилища</h3>
<p>Нам нужны два хранилища: одно для образа, второе для диска VM.</p>
<pre><code class="language-bash">
pvesm status
</code></pre>
<p>Результат:</p>
<pre><code class="language-text">
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%
</code></pre>
<p>Образ CHR кладём в <code>local</code> — путь <code>/var/lib/vz/template/iso/</code>. Диск VM создаём на <code>local-lvm</code> — это lvmthin, быстро и без лишнего расхода места.</p>
<h3>Шаг 3. Скачиваем актуальную версию CHR</h3>
<p>Не хардкодим версию руками — получаем её у MikroTik автоматически:</p>
<pre><code class="language-bash">
STABLE=$(curl -s https://upgrade.mikrotik.com/routeros/NEWESTa7.stable | awk '{print $1}')
echo $STABLE
</code></pre>
<p>Результат:</p>
<pre><code class="language-text">
7.22.1
</code></pre>
<p>Теперь скачиваем образ:</p>
<pre><code class="language-bash">
cd /var/lib/vz/template/iso/
wget https://download.mikrotik.com/routeros/${STABLE}/chr-${STABLE}.img.zip
</code></pre>
<p>MikroTik отдаёт RAW disk image в zip-архиве. 43 MB, скачивается за 10-15 секунд.</p>
<h3>Шаг 4. Распаковываем образ</h3>
<pre><code class="language-bash">
unzip chr-${STABLE}.img.zip
</code></pre>
<p>Результат:</p>
<pre><code class="language-text">
inflating: chr-7.22.1.img
</code></pre>
<h3>Шаг 5. Получаем свободный ID для VM</h3>
<p>Не угадываем ID руками — Proxmox сам знает что свободно:</p>
<pre><code class="language-bash">
VMID=$(pvesh get /cluster/nextid)
echo $VMID
</code></pre>
<p>Результат:</p>
<pre><code class="language-text">
110
</code></pre>
<h3>Шаг 6. Создаём VM</h3>
<pre><code class="language-bash">
qm create $VMID --name "mikrotik-chr-${STABLE}" --ostype l26 --memory 256 --cores 1 --cpu host --net0 virtio,bridge=vmbr0
</code></pre>
<p>Разберём параметры:</p>
<table>
<thead>
<tr>
<th>Параметр</th>
<th>Значение</th>
<th>Зачем</th>
</tr>
</thead>
<tbody>
<tr>
<td>—ostype l26</td>
<td><a class="wpil_keyword_link" title="Linux" href="https://it-apteka.com/category/linux/" target="_blank" rel="noopener" data-wpil-keyword-link="linked" data-wpil-monitor-id="1724">Linux</a> 2.6+</td>
<td>CHR основан на Linux-ядре</td>
</tr>
<tr>
<td>—memory 256</td>
<td>256 MiB</td>
<td>минимум для ROS7 с одним интерфейсом</td>
</tr>
<tr>
<td>—cpu host</td>
<td>тип CPU host</td>
<td>передаём реальные инструкции CPU, быстрее чем эмуляция</td>
</tr>
<tr>
<td>—net0 virtio</td>
<td>virtio драйвер</td>
<td>паравиртуализация — лучшая производительность <a class="wpil_keyword_link" title="Сети" href="https://it-apteka.com/category/networks/" target="_blank" rel="noopener" data-wpil-keyword-link="linked" data-wpil-monitor-id="1729">сети</a></td>
</tr>
</tbody>
</table>
<h3>Шаг 7. Импортируем диск</h3>
<pre><code class="language-bash">
qm importdisk $VMID /var/lib/vz/template/iso/chr-${STABLE}.img local-lvm
</code></pre>
<p>Результат:</p>
<pre><code class="language-text">
transferred 128.0 MiB of 128.0 MiB (100.00%)
unused0: successfully imported disk 'local-lvm:vm-110-disk-0'
</code></pre>
<p>Proxmox скопировал RAW образ в LVM и создал диск <code>vm-110-disk-0</code>. Пока он висит как <code>unused0</code> — не подключён к VM.</p>
<h3>Шаг 8. Подключаем диск и настраиваем загрузку</h3>
<pre><code class="language-bash">
qm set $VMID --scsi0 local-lvm:vm-${VMID}-disk-0 --scsihw virtio-scsi-single --boot order=scsi0
</code></pre>
<p>Подключаем диск как <code>scsi0</code> через контроллер <code>virtio-scsi-single</code> и говорим VM грузиться с него. Без <code>--boot order=scsi0</code> VM не знает откуда стартовать.</p>
<h3>Шаг 9. Добавляем serial консоль</h3>
<pre><code class="language-bash">
qm set $VMID --serial0 socket --vga serial0
</code></pre>
<p>Вот тут важно. CHR не имеет графического вывода. Без serial консоли <code>qm terminal</code> не откроется — получишь пустой экран. Эти две опции обязательны.</p>
<h3>Шаг 10. Запускаем VM</h3>
<pre><code class="language-bash">
qm start $VMID
</code></pre>
<p>Ждём 10 секунд пока CHR загрузится и подключаемся:</p>
<pre><code class="language-bash">
qm terminal $VMID
</code></pre>
<p>Нажимай Enter — появится приглашение сменить пароль. Установи пароль и попадёшь в консоль RouterOS. Для выхода из консоли — Ctrl+O.</p>
<h2>Автоматический скрипт установки</h2>
<p>Все шаги выше собраны в один <a class="wpil_keyword_link" title="Скрипты" href="https://it-apteka.com/category/scripts/" target="_blank" rel="noopener" data-wpil-keyword-link="linked" data-wpil-monitor-id="1725">скрипт</a>. Запускай на чистом Proxmox — получишь рабочий CHR за 2-3 минуты:</p>
<pre><code class="language-bash">
#!/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)"
</code></pre>
<h2>Часть 2: Первая проверка CHR</h2>
<p>VM запущена. Подключаемся и смотрим что внутри.</p>
<h4>Пошаговое видео, скринкаст консоли:</h4>
<h3>Интерфейсы</h3>
<pre><code class="language-bash">
/interface print
</code></pre>
<p>Результат:</p>
<pre><code class="language-text">
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
</code></pre>
<p>Один интерфейс ether1 — запущен. Всё как ожидали.</p>
<h3>IP адрес</h3>
<pre><code class="language-bash">
/ip address print
</code></pre>
<p>Результат:</p>
<pre><code class="language-text">
# ADDRESS NETWORK INTERFACE VRF
0 D 192.168.168.29/24 192.168.168.0 ether1 main
</code></pre>
<p>Флаг <code>D</code> означает DHCP. CHR получил адрес автоматически из твоей сети.</p>
<h3>Проверка интернета</h3>
<pre><code class="language-bash">
/ping 8.8.8.8 count=3
</code></pre>
<p>Результат:</p>
<pre><code class="language-text">
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
</code></pre>
<p>Потери 0%, интернет есть. CHR маршрутизирует корректно.</p>
<h3>Ресурсы системы</h3>
<pre><code class="language-bash">
/system resource print
</code></pre>
<p>Результат:</p>
<pre><code class="language-text">
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
</code></pre>
<p>256 MiB RAM, из них 55 MiB свободно. Для роутера хватает с запасом.</p>
<h3>Первый бэкап</h3>
<p>Перед любыми изменениями делаем бэкап. Это правило номер один:</p>
<pre><code class="language-bash">
/system backup save name=chr-initial
</code></pre>
<p>Проверяем:</p>
<pre><code class="language-bash">
/file print
</code></pre>
<p>Результат:</p>
<pre><code class="language-text">
# 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
</code></pre>
<p>Бэкап есть. Теперь можно двигаться дальше.</p>
<h3>Меняем порт SSH</h3>
<p>Порт 22 — первое что сканируют боты. Меняем на нестандартный:</p>
<pre><code class="language-bash">
/ip service set ssh port=2222
</code></pre>
"Проверь
<br />
Сразу проверь подключение на новом порту не закрывая текущую сессию. Если что-то пошло не так — ещё можно исправить через qm terminal.<br />
<p>Проверяем подключение на новом порту:</p>
<pre><code class="language-bash">
ssh -p 2222 admin@192.168.168.29
</code></pre>
<p>Работает — едем дальше. Не работает — подключайся через <code>qm terminal</code> и смотри что пошло не так.</p>
<h2>Часть 3: Отключаем лишние сервисы и настраиваем firewall</h2>
<p>На чистом CHR запущено много лишнего. Смотрим.</p>
<h4>Пошаговое видео, скринкаст консоли:</h4>
<pre><code class="language-bash">
/ip service print
</code></pre>
<p>Результат:</p>
<pre><code class="language-text">
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
</code></pre>
<p>FTP, Telnet, WWW, API — открытые порты без надобности. Оставляем SSH на 2222 и Winbox на 8291, всё остальное закрываем.</p>
<h3>Отключаем ненужные сервисы</h3>
<pre><code class="language-bash">
/ip service disable ftp
/ip service disable telnet
/ip service disable www
/ip service disable api,api-ssl
</code></pre>
<p>Проверяем результат:</p>
<pre><code class="language-bash">
/ip service print
</code></pre>
<p>Должны остаться только SSH на 2222 и Winbox на 8291. Остальные будут с флагом X — disabled.</p>
<h3>Базовые правила firewall</h3>
<p>Схема простая: разрешаем нужное, остальное дропаем.</p>
<pre class="mermaid">%%{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
</pre>
<p>Добавляем правила строго в таком порядке:</p>
<pre><code class="language-bash">
/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
</code></pre>
"Порядок
<br />
RouterOS проверяет правила сверху вниз и останавливается на первом совпадении. Правило drop-all должно быть последним. Если поставишь его первым — заблокируешь всё включая себя.<br />
<p>Проверяем что правила встали правильно:</p>
<pre><code class="language-bash">
/ip firewall filter print
</code></pre>
<p>Результат:</p>
<pre><code class="language-text">
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
</code></pre>
<p>Проверяем что SSH ещё работает после добавления drop:</p>
<pre><code class="language-bash">
ssh -p 2222 admin@192.168.168.29
</code></pre>
<p>Работает — отлично. Делаем финальный бэкап:</p>
<pre><code class="language-bash">
/system backup save name=chr-firewall-basic
</code></pre>
<h2>Таблица портов</h2>
<table>
<thead>
<tr>
<th>Сервис</th>
<th>Порт</th>
<th>Протокол</th>
<th>Статус</th>
<th>Доступ</th>
</tr>
</thead>
<tbody>
<tr>
<td>FTP</td>
<td>21</td>
<td>TCP</td>
<td>отключён</td>
<td>—</td>
</tr>
<tr>
<td>Telnet</td>
<td>23</td>
<td>TCP</td>
<td>отключён</td>
<td>—</td>
</tr>
<tr>
<td>WWW</td>
<td>80</td>
<td>TCP</td>
<td>отключён</td>
<td>—</td>
</tr>
<tr>
<td>SSH</td>
<td>2222</td>
<td>TCP</td>
<td>активен</td>
<td>192.168.168.0/24</td>
</tr>
<tr>
<td>Winbox</td>
<td>8291</td>
<td>TCP</td>
<td>активен</td>
<td>192.168.168.0/24</td>
</tr>
<tr>
<td>API</td>
<td>8728</td>
<td>TCP</td>
<td>отключён</td>
<td>—</td>
</tr>
<tr>
<td>API-SSL</td>
<td>8729</td>
<td>TCP</td>
<td>отключён</td>
<td>—</td>
</tr>
</tbody>
</table>
<h2>Troubleshooting</h2>
<h3>qm terminal не открывается — пустой экран</h3>
<p>Не добавил serial консоль. Останови VM и добавь:</p>
<pre><code class="language-bash">
qm stop 110
qm set 110 --serial0 socket --vga serial0
qm start 110
</code></pre>
<h3>VM запустилась но CHR не грузится</h3>
<p>Диск не подключён как загрузочный. Проверь:</p>
<pre><code class="language-bash">
qm config 110 | grep -E "boot|scsi"
</code></pre>
<p>Должно быть <code>boot: order=scsi0</code> и <code>scsi0: local-lvm:vm-110-disk-0</code>. Если нет — повтори шаг 8.</p>
<h3>wget сохраняет файл как chr-7.22.1.img.zip.1</h3>
<p>Предыдущий архив не удалён. Почисти и качай заново:</p>
<pre><code class="language-bash">
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
</code></pre>
<h3>SSH не подключается после смены порта</h3>
<p>Подключись через консоль Proxmox и проверь что порт сменился:</p>
<pre><code class="language-bash">
qm terminal 110
</code></pre>
<p>В консоли CHR:</p>
<pre><code class="language-bash">
/ip service print
</code></pre>
<p>Смотри колонку PORT напротив SSH.</p>
<h3>Заблокировал себя firewall-ом</h3>
<p>Подключайся через <code>qm terminal 110</code> — firewall не блокирует консоль Proxmox. Сбрасывай правила:</p>
<pre><code class="language-bash">
/ip firewall filter remove [find]
</code></pre>
<p>И добавляй заново в правильном порядке.</p>
<h2>FAQ</h2>
<h3>Чем MikroTik CHR отличается от обычного RouterOS?</h3>
<p>Только платформой и лицензией. CHR работает как виртуальная машина на x86_64. Команды, конфигурация, логика — всё идентично физическому MikroTik. Бесплатная версия ограничена 1 Mbps на интерфейс. Для снятия ограничения нужна платная лицензия.</p>
<h3>Как проверить текущую лицензию CHR?</h3>
<pre><code class="language-bash">
/system license print
</code></pre>
<p>Бесплатная версия покажет <code>free</code>. Для лабораторных задач этого достаточно.</p>
<h3>Можно ли увеличить диск CHR после установки?</h3>
<p>Да. Останови VM, увеличь диск в Proxmox и запусти снова — RouterOS увидит новый размер автоматически:</p>
<pre><code class="language-bash">
qm stop 110
qm disk resize 110 scsi0 +8G
qm start 110
</code></pre>
<h3>Как удалить CHR и начать заново?</h3>
<pre><code class="language-bash">
qm stop 110
qm destroy 110 --purge
rm -f /var/lib/vz/template/iso/chr-*.img /var/lib/vz/template/iso/chr-*.zip*
</code></pre>
<h3>Почему SSH просит пароль на каждую команду в скрипте?</h3>
<p>Каждый вызов <code>ssh</code> в <a class="wpil_keyword_link" title="Bash" href="https://it-apteka.com/tag/bash/" target="_blank" rel="noopener" data-wpil-keyword-link="linked" data-wpil-monitor-id="1723">bash</a> — это новая сессия. Решается двумя способами: передавать пароль через <code>sshpass</code> или настроить SSH-ключи. Для продакшна — только ключи. Для тестового стенда — sshpass достаточно.</p>
<h2>Что дальше</h2>
<p>CHR установлен, базовая <a class="wpil_keyword_link" title="Безопасность" href="https://it-apteka.com/category/security/" target="_blank" rel="noopener" data-wpil-keyword-link="linked" data-wpil-monitor-id="1726">защита</a> настроена. Лишние сервисы отключены, firewall закрывает всё кроме SSH и Winbox из локальной сети.</p>
<p>Это первая статья цикла по MikroTik CHR. Следующая — <a href="https://it-apteka.com/?p=2161&preview=true" target="_blank" rel="noopener"><strong>полная настройка безопасности: SSH только по ключам, смена имени устройства, защита от брутфорса, настройка NTP и логирования.</strong></a></p>
"Не
<br />
Если что-то пошло не так — пиши в комментарии. Описывай: версию Proxmox, что именно делал, какую ошибку получил. Разберём.<br />
Что получишь на выходе
Рабочий 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, что именно делал, какую ошибку получил. Разберём.