Установка OpenWrt на Proxmox сводится к четырём действиям: правильный образ, два моста, ВМ с отключённым Secure Boot и аккуратный перенос IP хоста за новый роутер. Ниже рецепт целиком, с проверками и откатом.
- Скачай на хост Proxmox образ OpenWrt x86-64 generic-ext4-combined-efi и распакуй его.
- Подготовь два моста: vmbr0 смотрит в провайдера и не имеет IP хоста, vmbr1 становится локальной сетью.
- Создай ВМ q35 с OVMF, отключи предзагруженные ключи Secure Boot, импортируй образ как диск, первый сетевой адаптер подключи к LAN, второй к WAN.
- Запусти ВМ, задай пароль root и адрес LAN, поставь qemu-ga, включи автозапуск с порядком 1 и только потом переноси адрес хоста в vmbr1.
Если времени нет совсем — вот весь путь в командах. Выполняй на хосте Proxmox, в shell под root. Ниже каждый шаг разобран отдельно, с объяснением зачем и что может сломаться.
# Где выполнять: хост Proxmox, shell под root
VER=25.12.5
BASE=https://downloads.openwrt.org/releases/${VER}/targets/x86/64
IMG=openwrt-${VER}-x86-64-generic-ext4-combined-efi.img
mkdir -p /root/openwrt && cd /root/openwrt
wget ${BASE}/${IMG}.gz ${BASE}/sha256sums
sha256sum -c --ignore-missing sha256sums
gunzip -k ${IMG}.gz
qm create 100 --name openwrt --ostype l26 --machine q35 --bios ovmf \
--efidisk0 local-lvm:1,efitype=4m,pre-enrolled-keys=0 \
--cpu host --cores 2 --memory 512 --balloon 0 \
--scsihw virtio-scsi-single \
--scsi0 local-lvm:0,import-from=/root/openwrt/${IMG},discard=on,ssd=1 \
--boot order=scsi0 \
--net0 virtio,bridge=vmbr1 --net1 virtio,bridge=vmbr0 \
--serial0 socket --vga serial0 --agent enabled=1 \
--onboot 1 --startup order=1,up=30
qm start 100 && qm terminal 100
Диагноз: OpenWrt на Proxmox поднят, а интернета нет
Ставишь OpenWrt на Proxmox, чтобы домашний сервер заодно стал роутером. ВМ создана, лампочки зелёные, а интернета нет. Или он есть, но пропал доступ к веб-интерфейсу Proxmox. Знакомо?
OpenWrt на Proxmox ставится за 15 минут. Ещё два часа уходит на то, чтобы понять, куда делся доступ к самому Proxmox.
Проблема почти никогда не в OpenWrt. Он делает ровно то, что написано в конфиге. Ломается стык: какой виртуальный адаптер стал eth0, на каком мосту живёт IP хоста, кто кому раздаёт DHCP и кто первым стартует после перезагрузки. Этот стык и разберём.
Что получишь на выходе
- ВМ с OpenWrt 25.12, которая маршрутизирует трафик из локальной сети в интернет через отдельный WAN-мост.
- Хост Proxmox, который сидит в LAN за OpenWrt и не торчит веб-интерфейсом наружу.
- Автозапуск роутера первым после ребута хоста, остальные ВМ стартуют следом.
- Ежедневный бэкап конфига OpenWrt, еженедельный vzdump всей ВМ и снапшот перед каждым обновлением.
- Скрипт мониторинга, fail2ban на веб-интерфейс Proxmox и план отката для каждого рискованного шага.
По времени: 30-40 минут, если делаешь первый раз и читаешь объяснения. Из них минут пять уходит на скачивание, остальное на проверки. Проверки не пропускай. Именно они экономят ночь.
Что понадобится
Физический сервер или мини-ПК с Proxmox VE и поддержкой аппаратной виртуализации. Желательно две сетевые карты: одна смотрит в провайдера, вторая в локальную сеть. С одной картой тоже можно, это разобрано в альтернативах через VLAN.
Обязателен доступ к консоли хоста помимо сети: монитор с клавиатурой, IPMI, iDRAC или iLO. В какой-то момент ты будешь переносить адрес хоста с одного моста на другой. Если ошибёшься без консоли — поедешь к серверу ногами.
| Компонент | Версия на момент публикации | Минимум | Комментарий |
|---|---|---|---|
| Proxmox VE | 9.2, база Debian 13 | 8.x | Команды подходят для 8.x и 9.x |
| OpenWrt | 25.12.5, ветка 25.12 | 24.10 | С 25.12 пакетный менеджер apk вместо opkg |
| Образ OpenWrt | x86/64 generic-ext4-combined-efi | — | Для SeaBIOS бери вариант без efi |
| CPU хоста | Intel VT-x или AMD-V | 2 ядра | Без виртуализации KVM не стартует |
| RAM для ВМ | 512 МБ | 256 МБ | Больше нужно только под adblock и VPN |
| Диск для ВМ | 1 ГБ | около 120 МБ | Корневой раздел по умолчанию около 104 МБ |
| Сетевые карты | 2 порта | 1 порт | С одним портом нужен управляемый коммутатор и VLAN |
| QEMU Guest Agent | пакет qemu-ga в OpenWrt | — | Нужен для корректного бэкапа и мониторинга |
На момент публикации актуальны Proxmox VE 9.2 и OpenWrt 25.12.5. Перед установкой проверь свежие релизы: OpenWrt выпускает сервисные обновления каждые пару месяцев, и номер в переменной VER надо поменять на актуальный.
Ветка 24.10 перестала получать исправления безопасности с сентября 2026 года. Если у тебя где-то крутится она — это повод обновиться, а не повод ставить её заново.
Что будет в статье
- Причины, по которым OpenWrt в Proxmox не работает с первого раза.
- Пошаговый рецепт: мосты, образ, ВМ, первый запуск, перенос хоста за роутер.
- Проверка: команды и ожидаемый вывод.
- Осложнения: одиннадцать типовых ошибок с причиной и решением.
- Альтернативы: одна сетевая карта, проброс PCI, LXC, OPNsense, RouterOS CHR.
- Профилактика: мониторинг, безопасность, бэкап, обновление и откат.
- FAQ под вопросы, которые реально задают в поиске.
Почему OpenWrt в Proxmox не работает после настройки
Хорошая новость: почти все проблемы тут из одного короткого списка. Плохая: за первую установку ты наступишь минимум на два пункта из него.
| Причина | Почему ломает | Симптом |
|---|---|---|
| Включён Secure Boot в OVMF | Загрузчик OpenWrt не подписан ключами Microsoft, прошивка ВМ его отвергает | Access Denied, ВМ уходит в UEFI Shell |
| Перепутаны сетевые адаптеры | OpenWrt на x86 считает первый адаптер eth0 локальной сетью, второй eth1 провайдером | WAN без адреса, DHCP раздаётся в сторону провайдера |
| Одинаковые подсети LAN и WAN | Домашний роутер провайдера тоже выдаёт 192.168.1.0/24, маршрутизация путается | Пинги ходят через раз, интернета нет |
| IP хоста остался на WAN-мосту | Хост с белым адресом на vmbr0 открывает порт 8006 и SSH в интернет | Работает, но небезопасно. Сканеры найдут за сутки |
| Нет автозапуска и порядка старта | После ребута хоста остальные ВМ стартуют раньше роутера и не получают адреса | Утром половина сервисов без сети |
| Не тот образ | rootfs.tar.gz предназначен для контейнеров, образ без efi не грузится на OVMF | No bootable device, пустой диск |
| Эмуляция e1000 вместо virtio | Эмулируемая карта нагружает CPU хоста на каждом пакете | Скорость упирается в 300-500 Мбит/с, ядро хоста в полке |
Теперь посмотри на схему. На ней всё, что мы соберём. Запомни главное правило: у хоста Proxmox нет адреса на WAN-мосте. Хост живёт в LAN, как обычный клиент роутера.
%%{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
ISP["Провайдер или роутер провайдера"] --> NIC1["enp1s0 физический порт WAN"]
NIC1 --> VMBR0["vmbr0 мост WAN без IP хоста"]
VMBR0 --> ETH1["net1 в ВМ, внутри это eth1"]
ETH1 --> OWRT["ВМ 100 OpenWrt"]
OWRT --> ETH0["net0 в ВМ, внутри это eth0"]
ETH0 --> VMBR1["vmbr1 мост LAN"]
VMBR1 --> HOST["Хост Proxmox 192.168.10.2"]
VMBR1 --> VMS["Другие ВМ и контейнеры"]
VMBR1 --> NIC2["enp2s0 физический порт LAN"]
NIC2 --> SW["Коммутатор и клиенты"]
style ISP fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
style VMBR0 fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
style OWRT fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style VMBR1 fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style HOST fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style SW fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
Адресный план в статье такой. Подставь свои значения, но держи подсеть LAN отличной от той, что выдаёт провайдер или его роутер.
| Узел | Интерфейс | Адрес |
|---|---|---|
| OpenWrt | eth1, WAN | DHCP от провайдера или статика |
| OpenWrt | br-lan, LAN | 192.168.10.1/24 |
| Хост Proxmox | vmbr1 | 192.168.10.2/24, шлюз 192.168.10.1 |
| Клиенты LAN | — | DHCP от OpenWrt, пул 192.168.10.100-250 |
Рецепт: установка OpenWrt на Proxmox пошагово
Порты, которые будут работать
Сначала разберись, что и где слушает. Это пригодится на шаге с firewall и при отладке, когда непонятно, кто именно отвечает на запрос.
| Порт | Протокол | Сервис | Где слушает | Доступен снаружи? |
|---|---|---|---|---|
| 8006 | TCP | Веб-интерфейс Proxmox | Хост, 192.168.10.2 | Нет, только LAN |
| 22 | TCP | SSH хоста Proxmox | Хост, 192.168.10.2 | Нет, только LAN |
| 3128 | TCP | SPICE proxy Proxmox | Хост | Нет |
| 80, 443 | TCP | LuCI, веб-интерфейс OpenWrt | OpenWrt, 192.168.10.1 | Нет, firewall OpenWrt режет вход с WAN |
| 22 | TCP | Dropbear, SSH OpenWrt | OpenWrt, только LAN | Нет |
| 53 | TCP, UDP | DNS, dnsmasq | OpenWrt, LAN | Нет |
| 67, 68 | UDP | DHCP | OpenWrt: сервер в LAN, клиент на WAN | Только клиент на WAN |
| 51820 | UDP | WireGuard, если поднимешь | OpenWrt, WAN | Да, если откроешь правилом |
Подготовка: проверь хост
Зачем: убедиться, что KVM доступен, понять имена сетевых карт и хранилищ. Имена enp1s0 и local-lvm в статье условные. У тебя они почти наверняка другие.
# Где выполнять: хост Proxmox, shell под root
pveversion
grep -Ec '(vmx|svm)' /proc/cpuinfo
ip -br link
pvesm status
cat /etc/network/interfaces
Что должно получиться: pveversion показывает pve-manager 9.x или 8.x. Счётчик vmx или svm больше нуля, иначе включи виртуализацию в BIOS. В выводе ip -br link найди физические порты, обычно enp-что-то или eno-что-то. В pvesm status запомни хранилище с типом lvmthin или zfspool, туда ляжет диск ВМ.
Посмотри внимательно на /etc/network/interfaces. После стандартной установки там есть vmbr0 с IP хоста и одним физическим портом. Этот vmbr0 мы сделаем WAN-мостом. Порт, который в нём, должен смотреть в провайдера или в роутер провайдера.
Шаг 1. Сохрани сетевой конфиг хоста
Зачем: дальше ты дважды правишь сеть хоста. Копия конфига — это откат одной командой вместо поездки к серверу.
# Где выполнять: хост Proxmox
cp /etc/network/interfaces /root/interfaces.bak
cp /etc/hosts /root/hosts.bak
ls -l /root/*.bak
Результат: два файла с расширением bak в /root. Не перезаписывай их на следующих шагах, это твоя точка возврата.
Шаг 2. Создай LAN-мост vmbr1
Зачем: OpenWrt нужен мост, куда он будет раздавать адреса. Пока мы не трогаем IP хоста, он остаётся на vmbr0, и ты не теряешь доступ. Мост создаём без адреса.
Открой /etc/network/interfaces и добавь в конец блок. Вместо enp2s0 впиши свой второй физический порт. Если второго порта нет и LAN нужен только для ВМ внутри хоста, напиши bridge-ports none.
auto vmbr1
iface vmbr1 inet manual
bridge-ports enp2s0
bridge-stp off
bridge-fd 0
#LAN за OpenWrt
Примени конфиг. В Proxmox стоит ifupdown2, он умеет перечитывать сеть без перезагрузки и без обрыва существующих интерфейсов.
# Где выполнять: хост Proxmox
ifreload -a
ip -br link show vmbr1
bridge link show | grep vmbr1
Результат: vmbr1 в состоянии UP, если в порт воткнут кабель, или UNKNOWN без кабеля. Во втором выводе видно, что enp2s0 стал портом моста. Доступ к Proxmox при этом не пропал, потому что vmbr0 мы не трогали.
То же самое можно сделать в веб-интерфейсе: узел, System, Network, Create, Linux Bridge. Результат одинаковый, разница в том, что команды проще повторить на втором сервере.
Шаг 3. Скачай образ OpenWrt и проверь контрольную сумму
Зачем: нужен образ под x86/64 с разметкой под UEFI. Вариант ext4 проще расширять и чинить, squashfs даёт откат к заводским настройкам. В ВМ откат делает снапшот Proxmox, поэтому ext4 удобнее.
| Файл в каталоге targets/x86/64 | Для чего | Берём? |
|---|---|---|
| generic-ext4-combined-efi.img.gz | ВМ с OVMF, UEFI | Да, основной вариант |
| generic-ext4-combined.img.gz | ВМ с SeaBIOS | Если выбираешь BIOS вместо UEFI |
| generic-squashfs-combined-efi.img.gz | Железо, где нужен factory reset | Можно, но расширять диск сложнее |
| rootfs.tar.gz | LXC-контейнер | Нет, это для контейнеров |
Все образы лежат на официальном сервере загрузок OpenWrt. Качай прямо на хост, без промежуточного ПК.
# Где выполнять: хост Proxmox
VER=25.12.5
BASE=https://downloads.openwrt.org/releases/${VER}/targets/x86/64
IMG=openwrt-${VER}-x86-64-generic-ext4-combined-efi.img
mkdir -p /root/openwrt && cd /root/openwrt
wget ${BASE}/${IMG}.gz
wget ${BASE}/sha256sums
sha256sum -c --ignore-missing sha256sums
Результат: строка с именем образа и словом OK. Если видишь FAILED — образ битый или подменён, качай заново. Не ставь роутер из файла, который не прошёл проверку. Это единственное устройство в сети, через которое ходит весь трафик.
# Где выполнять: хост Proxmox, каталог /root/openwrt
gunzip -k ${IMG}.gz
ls -lh /root/openwrt/
Вот тут не пугайся. gunzip почти наверняка напишет про trailing garbage ignored. Это нормально: в конец образа OpenWrt дописана подпись, gunzip её не понимает и честно об этом говорит. Файл .img при этом распакован целиком, размер около 120 МБ.
Шаг 4. Создай ВМ одной командой
Зачем: веб-мастер создания ВМ требует ISO и предлагает лишнее. Одна команда qm create создаёт ВМ, сразу импортирует образ как диск и выставляет всё, что нужно роутеру. Параметр import-from работает с Proxmox VE 7.2 и выше.
# Где выполнять: хост Proxmox
VER=25.12.5
IMG=openwrt-${VER}-x86-64-generic-ext4-combined-efi.img
qm create 100 \
--name openwrt \
--ostype l26 \
--machine q35 \
--bios ovmf \
--efidisk0 local-lvm:1,efitype=4m,pre-enrolled-keys=0 \
--cpu host \
--cores 2 \
--memory 512 \
--balloon 0 \
--scsihw virtio-scsi-single \
--scsi0 local-lvm:0,import-from=/root/openwrt/${IMG},discard=on,ssd=1 \
--boot order=scsi0 \
--net0 virtio,bridge=vmbr1 \
--net1 virtio,bridge=vmbr0 \
--serial0 socket \
--vga serial0 \
--agent enabled=1 \
--onboot 1 \
--startup order=1,up=30
Разберу параметры, которые реально влияют на результат. Остальное можно оставить как есть.
| Параметр | Значение | Зачем |
|---|---|---|
| pre-enrolled-keys=0 | Пустая база ключей Secure Boot | Без этого OVMF не пустит неподписанный загрузчик OpenWrt |
| net0 на vmbr1 | Первый адаптер, внутри eth0 | OpenWrt на x86 делает eth0 локальной сетью |
| net1 на vmbr0 | Второй адаптер, внутри eth1 | eth1 по умолчанию становится WAN с DHCP-клиентом |
| cpu host | Все инструкции процессора хоста | Быстрее шифрование для VPN. В кластере с миграцией ставь x86-64-v2-AES |
| balloon 0 | Без динамической памяти | Роутеру не нужно, чтобы у него отбирали RAM под нагрузкой |
| serial0 и vga serial0 | Последовательная консоль | Работает qm terminal и копипаст в консоли |
| agent enabled=1 | Канал для QEMU Guest Agent | Корректное выключение, снапшоты, мониторинг |
| onboot и startup order=1,up=30 | Автозапуск первым, пауза 30 секунд | Остальные ВМ стартуют, когда роутер уже раздаёт DHCP |
Если 100 у тебя занят, возьми свободный номер. Узнать его можно командой pvesh get /cluster/nextid. Хранилище local-lvm замени на своё из вывода pvesm status. Для ZFS это обычно local-zfs.
# Где выполнять: хост Proxmox
qm config 100
Результат: в конфиге есть scsi0 размером около 120 МБ, efidisk0, два сетевых адаптера с разными мостами и строка onboot: 1. Запиши MAC-адреса net0 и net1 из этого вывода. Они понадобятся, если адаптеры придётся поменять местами.
Шаг 5. Увеличь диск, если нужно место под пакеты
Зачем: корневой раздел образа около 104 МБ. Для роутера с LuCI и парой пакетов этого хватает с запасом. Если планируешь adblock со списками, Zabbix-агент и WireGuard с логами, дай гигабайт.
Шаг необязательный. Пропусти его, если не уверен, что место понадобится. Есть нюанс: обычный sysupgrade образом перезаписывает таблицу разделов и возвращает размер к исходному. Расширение придётся повторять после каждого обновления.
# Где выполнять: хост Proxmox, ВМ выключена
qm disk resize 100 scsi0 1G
Диск вырос, но раздел внутри остался прежним. Его растянем на шаге 8, когда в OpenWrt будет интернет и можно будет поставить parted.
Шаг 6. Первый запуск и консоль
Зачем: на первом старте у OpenWrt нет пароля, LAN висит на 192.168.1.1, а доступ из сети к нему есть только из vmbr1. Самый надёжный путь — последовательная консоль прямо с хоста.
# Где выполнять: хост Proxmox
qm start 100
qm terminal 100
Нажми Enter, появится приглашение root@OpenWrt. Выйти из консоли можно сочетанием Ctrl+O. В веб-интерфейсе та же консоль открывается кнопкой Console, режим xterm.js.
Первым делом проверь, что адаптеры встали так, как мы задумали. Это главная точка, где установка OpenWrt на Proxmox идёт не туда.
# Где выполнять: консоль OpenWrt, qm terminal 100
ip -br link
uci show network | grep -E "device|proto"
Результат: eth0 состоит в br-lan, интерфейс wan использует eth1 с proto dhcp. Если наоборот — выходи из консоли и смотри раздел про осложнения, там есть команда для обмена адаптеров на стороне Proxmox.
Шаг 7. Пароль root и адрес LAN
Зачем: без пароля LuCI и SSH пускают любого из LAN. Адрес LAN меняем, потому что роутер провайдера почти всегда сидит в 192.168.1.0/24, а одинаковые подсети на WAN и LAN ломают маршрутизацию.
# Где выполнять: консоль OpenWrt
passwd
uci set network.lan.ipaddr='192.168.10.1'
uci set network.lan.netmask='255.255.255.0'
uci set system.@system[0].hostname='openwrt-pve'
uci commit network
uci commit system
service network restart
Результат: команда ip -br addr show br-lan показывает 192.168.10.1/24. Пул DHCP в OpenWrt задаётся смещением от адреса сети, поэтому после смены подсети он сам переедет в 192.168.10.100-250.
Если провайдер отдаёт статический адрес или нужен PPPoE, настрой WAN сейчас. Для PPPoE команды такие, логин и пароль подставь свои.
# Где выполнять: консоль OpenWrt, только если у провайдера PPPoE
uci set network.wan.proto='pppoe'
uci set network.wan.username='логин_от_провайдера'
uci set network.wan.password='пароль_от_провайдера'
uci commit network
service network restart
Шаг 8. Проверь WAN и поставь QEMU Guest Agent
Зачем: убедиться, что роутер видит интернет, пока хост ещё сидит на старом адресе. Если тут что-то не так, ты чинишь это без риска потерять доступ к Proxmox.
# Где выполнять: консоль OpenWrt
ifstatus wan | grep -A3 '"ipv4-address"'
ping -c 3 1.1.1.1
ping -c 3 openwrt.org
Результат: у WAN есть адрес, оба пинга проходят. Если первый пинг идёт, а второй нет — проблема в DNS, смотри осложнения.
Теперь агент. В 25.12 пакеты ставятся через apk, команды opkg больше нет. Это частая причина, почему старые инструкции не работают дословно.
# Где выполнять: консоль OpenWrt
apk update
apk add qemu-ga
service qemu-ga enable
service qemu-ga start
Вот тут важно. Канал агента появляется в ВМ только после полного выключения и включения с хоста. Перезагрузка изнутри OpenWrt не считается. Сделай это сейчас.
# Где выполнять: хост Proxmox
qm shutdown 100 && qm start 100
sleep 20
qm agent 100 ping && echo "agent OK"
qm guest cmd 100 network-get-interfaces | grep -E '"name"|"ip-address"'
Результат: agent OK и список интерфейсов с адресами, включая WAN. Теперь Proxmox видит адреса ВМ в сводке, умеет корректно её гасить и замораживать файловую систему перед бэкапом.
Если на шаге 5 ты увеличил диск, растяни раздел сейчас. Метод взят из официальной инструкции OpenWrt по расширению корня. Второй раздел в образе combined-efi — корневой.
# Где выполнять: консоль OpenWrt, только если делал шаг 5
apk add parted losetup resize2fs e2fsprogs
parted -f -s /dev/sda resizepart 2 100%
reboot
# Где выполнять: консоль OpenWrt, после перезагрузки
LOOP="$(losetup -f)"
losetup ${LOOP} /dev/sda2
fsck.ext4 -y ${LOOP}
resize2fs ${LOOP}
reboot
После второй перезагрузки команда df -h / покажет около гигабайта. Если раздел не вырос — проверь, что диск в Proxmox действительно увеличен: lsblk внутри OpenWrt покажет размер sda.
Шаг 9. Перенеси хост Proxmox за OpenWrt
Это самый рискованный шаг. Сейчас хост сидит на vmbr0 рядом с WAN роутера. Мы убираем с vmbr0 его адрес и даём ему адрес в LAN, где шлюзом станет OpenWrt.
# Где выполнять: хост Proxmox, из локальной консоли или IPMI
systemd-run --on-active=300 --unit=net-rollback \
/bin/sh -c 'cp /root/interfaces.bak /etc/network/interfaces; cp /root/hosts.bak /etc/hosts; ifreload -a'
systemctl list-timers net-rollback.timer
Таймер стоит. Это приём из продакшна: сетевые изменения на удалённой железке всегда делай с автоматическим откатом. Если связь пропадёт, через пять минут всё вернётся само.
Теперь итоговый /etc/network/interfaces. Замени файл целиком, подставив свои имена портов. На vmbr0 больше нет адреса, только порт к провайдеру.
auto lo
iface lo inet loopback
iface enp1s0 inet manual
iface enp2s0 inet manual
auto vmbr0
iface vmbr0 inet manual
bridge-ports enp1s0
bridge-stp off
bridge-fd 0
#WAN, у хоста адреса нет
auto vmbr1
iface vmbr1 inet static
address 192.168.10.2/24
gateway 192.168.10.1
bridge-ports enp2s0
bridge-stp off
bridge-fd 0
#LAN за OpenWrt
source /etc/network/interfaces.d/*
Proxmox требует, чтобы имя узла резолвилось в его реальный адрес через /etc/hosts. Если оставить старый IP, отвалится веб-интерфейс и сломается pve-cluster. Поправь строку с именем узла и DNS.
# Где выполнять: хост Proxmox
OLDIP=$(hostname -i | awk '{print $1}')
sed -i "s/^${OLDIP}\b/192.168.10.2/" /etc/hosts
grep "$(hostname)" /etc/hosts
echo "nameserver 192.168.10.1" > /etc/resolv.conf
ifreload -a
Проверь, что всё живое, и только потом отменяй откат.
# Где выполнять: хост Proxmox
ip -br addr show vmbr1
ip route | grep default
ping -c 3 192.168.10.1
ping -c 3 1.1.1.1
systemctl stop net-rollback.timer
Результат: у vmbr1 адрес 192.168.10.2/24, маршрут по умолчанию через 192.168.10.1, оба пинга проходят. Таймер остановлен. Подключи ноутбук в коммутатор за enp2s0. Он получит адрес из 192.168.10.100-250, а Proxmox откроется по адресу https://192.168.10.2:8006, LuCI по http://192.168.10.1.
Если что-то пошло не так и таймер уже отработал, ты снова на старом адресе. Разбери, что сломалось, и повтори шаг заново с новым таймером.
Шаг 10. Закрой SSH в OpenWrt ключами
Зачем: пароль root для LuCI нужен, а SSH по паролю — лишняя дыра даже внутри LAN. Ключ хоста Proxmox пригодится для автоматического бэкапа конфига.
# Где выполнять: хост Proxmox, затем повтори со своего ПК
test -f /root/.ssh/id_ed25519 || ssh-keygen -t ed25519 -N "" -f /root/.ssh/id_ed25519
cat /root/.ssh/id_ed25519.pub | ssh root@192.168.10.1 "cat >> /etc/dropbear/authorized_keys"
ssh root@192.168.10.1 "uname -a"
Обычный ssh-copy-id тут не подходит: он кладёт ключ в домашний каталог, а Dropbear читает /etc/dropbear/authorized_keys. Когда вход по ключу заработал со всех нужных машин, запрети пароли и привяжи SSH только к LAN.
# Где выполнять: консоль или SSH в OpenWrt
uci set dropbear.@dropbear[0].PasswordAuth='off'
uci set dropbear.@dropbear[0].RootPasswordAuth='off'
uci set dropbear.@dropbear[0].Interface='lan'
uci commit dropbear
service dropbear restart
Не закрывай текущую сессию. Открой новую и проверь вход по ключу. Если не пускает — в старой сессии верни PasswordAuth в on и разбирайся.
Шаг 11. Порядок старта остальных ВМ
Зачем: роутер стартует первым и ждёт 30 секунд. Остальным гостям ставим порядок 2 и дальше, чтобы они не загрузились раньше DHCP и DNS.
# Где выполнять: хост Proxmox, номера ВМ подставь свои
qm set 101 --onboot 1 --startup order=2,up=10
pct set 200 --onboot 1 --startup order=2
qm config 100 | grep -E 'onboot|startup'
Результат: у ВМ 100 onboot 1 и order=1. Перезагрузи хост в удобное окно и посмотри, что все гости поднялись с адресами. Это единственный честный тест автозапуска.
Вот как выглядит старт после ребута хоста. Если у какой-то ВМ нет адреса после загрузки, ищи ошибку в этой цепочке.
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#f8fafc',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'noteBkgColor': '#fefce8',
'noteTextColor': '#713f12',
'noteBorderColor': '#fbbf24',
'actorBkg': '#f8fafc',
'actorBorder': '#94a3b8',
'actorTextColor': '#1e293b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'sequence': {
'mirrorActors': false,
'messageAlign': 'center',
'actorMargin': 120,
'width': 160,
'noteMargin': 12
}
}}%%
sequenceDiagram
participant H as Хост Proxmox
participant O as OpenWrt ВМ 100
participant P as Провайдер
participant V as Остальные ВМ
H->>O: Старт, order 1
O->>P: DHCP запрос на WAN
P->>O: Адрес WAN и шлюз
Note over O: dnsmasq раздаёт адреса в LAN
H->>H: Ожидание 30 секунд
H->>V: Старт, order 2
V->>O: DHCP запрос в LAN
O->>V: Адрес из 192.168.10.0/24
Как проверить, что OpenWrt в Proxmox работает правильно
Проверка идёт с трёх сторон: хост видит ВМ и агент, роутер видит интернет, клиент в LAN получает адрес и ходит наружу. Если все три зелёные — готово.
# Где выполнять: хост Proxmox
qm status 100 --verbose | grep -E '^status|^uptime|^qmpstatus'
qm agent 100 ping && echo "agent OK"
ip route | grep default
ping -c 3 192.168.10.1
ping -c 3 1.1.1.1
getent hosts proxmox.com
# Где выполнять: SSH в OpenWrt
ifstatus wan | grep -E '"up"|"address"'
logread | grep -E 'dnsmasq-dhcp|netifd' | tail -20
cat /tmp/dhcp.leases
fw4 print | grep -c chain
df -h /
free -m
# Где выполнять: Linux-клиент в LAN, например ноутбук
ip -br addr
ip route | grep default
ping -c 3 192.168.10.1
ping -c 3 ya.ru
| Проверка | Ожидаемый результат | Если не так |
|---|---|---|
| qm status 100 | status: running, qmpstatus: running | Смотри журнал запуска: journalctl -u pve-guests |
| qm agent 100 ping | Пустой вывод и agent OK | Агент не стоит или ВМ не перезапускалась с хоста |
| ifstatus wan | «up»: true и адрес провайдера | Перепутаны адаптеры или провайдер привязан к MAC |
| /tmp/dhcp.leases | Строки с MAC и адресами клиентов | Порт LAN не в vmbr1 или в сети второй DHCP |
| df -h / | Свободно больше 50% | Расширь диск по шагам 5 и 8 |
| ping ya.ru с клиента | Ответы без потерь | Проблема в DNS или NAT, смотри осложнения |
И ещё один тест, который почти никто не делает. С внешней машины, например с телефона через мобильный интернет, попробуй открыть белый адрес на порту 8006. Должен быть таймаут. Если открылось — у хоста остался адрес на WAN-мосте.
Осложнения: типовые ошибки OpenWrt на Proxmox
Всё не так плохо, как ты думаешь. Обычно всё гораздо проще: две перепутанные строки в конфиге. Ниже ошибки в порядке того, как часто я их вижу.
Сначала дерево поиска неисправности. Иди сверху вниз, не перескакивай.
%%{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["Нет интернета за OpenWrt"] --> B{"ВМ загрузилась?"}
B -->|Нет| C["Secure Boot или не тот образ"]
B -->|Да| D{"У WAN есть адрес?"}
D -->|Нет| E["Перепутаны net0 и net1"]
D -->|Да| F{"Пинг 1.1.1.1 с роутера?"}
F -->|Нет| G["Конфликт подсетей или шлюз"]
F -->|Да| H{"Клиент получил адрес?"}
H -->|Нет| I["Порт LAN не в vmbr1"]
H -->|Да| J["Проверь DNS на клиенте"]
style A fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
style C fill:#f8fafc,stroke:#ef4444,stroke-width:2px,color:#b91c1c
style E fill:#f8fafc,stroke:#ef4444,stroke-width:2px,color:#b91c1c
style G fill:#f8fafc,stroke:#ef4444,stroke-width:2px,color:#b91c1c
style I fill:#f8fafc,stroke:#ef4444,stroke-width:2px,color:#b91c1c
style J fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
Ошибка 1. Access Denied при загрузке, ВМ падает в UEFI Shell
Причина: ВМ создана через веб-интерфейс с галкой Pre-Enroll keys. OVMF включает Secure Boot и отвергает неподписанный загрузчик OpenWrt.
Решение: пересоздай EFI-диск без предзагруженных ключей. Сам диск с OpenWrt не трогаем, данные не пострадают.
# Где выполнять: хост Proxmox
qm stop 100
qm set 100 --delete efidisk0
qm set 100 --efidisk0 local-lvm:1,efitype=4m,pre-enrolled-keys=0
qm start 100
Ошибка 2. No bootable device или вечная перезагрузка
Причина: не выставлен порядок загрузки, либо образ без efi подключён к ВМ с OVMF. Бывает и обратное: образ efi на SeaBIOS грузится, но не всегда.
Решение: проверь boot order. Если образ без efi, переключи ВМ на SeaBIOS.
# Где выполнять: хост Proxmox
qm config 100 | grep -E 'boot|bios|scsi0'
qm set 100 --boot order=scsi0
# только если образ без efi:
qm set 100 --bios seabios
Ошибка 3. У WAN нет адреса, DHCP уходит к провайдеру
Причина: net0 подключён к WAN-мосту, net1 к LAN. OpenWrt честно поднимает DHCP-сервер на eth0 и раздаёт адреса в сеть провайдера. Иногда провайдер за такое блокирует порт.
Решение: поменяй мосты местами на стороне Proxmox, сохранив MAC-адреса. Внутри OpenWrt ничего трогать не нужно. MAC возьми из qm config 100.
# Где выполнять: хост Proxmox, MAC подставь из qm config 100
qm config 100 | grep ^net
qm set 100 --net0 virtio=BC:24:11:AA:AA:AA,bridge=vmbr1
qm set 100 --net1 virtio=BC:24:11:BB:BB:BB,bridge=vmbr0
qm reboot 100
Ошибка 4. Провайдер не выдаёт адрес новому роутеру
Причина: провайдер привязал услугу к MAC старого роутера. У виртуального адаптера MAC случайный, из диапазона Proxmox.
Решение: задай WAN-адаптеру MAC старого роутера. Делай это на стороне Proxmox, тогда MAC переживёт любые переустановки OpenWrt. Старый роутер из сети убери, два одинаковых MAC в одном сегменте дадут хаос.
# Где выполнять: хост Proxmox, MAC старого роутера подставь свой
qm set 100 --net1 virtio=AA:BB:CC:DD:EE:FF,bridge=vmbr0
qm reboot 100
Ошибка 5. Пинги ходят через раз, интернет то есть, то нет
Причина: конфликт подсетей. Роутер провайдера выдал WAN адрес из 192.168.1.0/24, а LAN у OpenWrt остался на 192.168.1.1. Ядро не понимает, куда слать ответы.
Решение: смени подсеть LAN на любую другую. После этого не забудь, что адрес хоста Proxmox тоже должен переехать.
# Где выполнять: консоль OpenWrt, qm terminal 100
ifstatus wan | grep '"address"'
uci get network.lan.ipaddr
uci set network.lan.ipaddr='192.168.10.1'
uci commit network
service network restart
Ошибка 6. После переноса адреса пропал веб-интерфейс Proxmox
Причина: в /etc/hosts остался старый адрес узла, либо у vmbr1 нет порта, через который ты подключаешься, либо ноутбук сидит в старой подсети.
# Где выполнять: хост Proxmox, локальная консоль
cp /root/interfaces.bak /etc/network/interfaces
cp /root/hosts.bak /etc/hosts
ifreload -a
systemctl restart pve-cluster pveproxy
Когда доступ вернулся, проверь три вещи: имя узла в /etc/hosts указывает на новый адрес, у vmbr1 правильный физический порт, ноутбук подключён именно в этот порт или в коммутатор за ним.
Ошибка 7. Клиенты в LAN не получают адрес
Причина: физический порт не добавлен в vmbr1, в сети работает второй DHCP-сервер, или на сетевом адаптере ВМ включён firewall Proxmox и режет широковещательный трафик.
Решение: послушай DHCP прямо на мосту хоста. Если запросы клиента видны, а ответов нет — проблема в OpenWrt. Если запросов не видно — в физике или мосте.
# Где выполнять: хост Proxmox
bridge link show | grep vmbr1
apt install -y tcpdump
tcpdump -ni vmbr1 -c 20 port 67 or port 68
qm config 100 | grep ^net
В выводе qm config у net0 и net1 не должно быть firewall=1. Фильтрацией занимается OpenWrt, двойной firewall на одном пути добавляет только загадок.
Ошибка 8. Интернет есть по IP, но сайты не открываются
Причина: не работает DNS. Либо провайдер не выдал DNS по DHCP, либо dnsmasq упал, либо у хоста в /etc/resolv.conf остался старый сервер.
# Где выполнять: SSH в OpenWrt
nslookup ya.ru 127.0.0.1
cat /tmp/resolv.conf.d/resolv.conf.auto
service dnsmasq restart
logread -e dnsmasq | tail -20
Если провайдер не отдаёт DNS, пропиши серверы вручную на WAN. Затем проверь resolv.conf на хосте Proxmox, там должен быть 192.168.10.1.
# Где выполнять: SSH в OpenWrt
uci set network.wan.peerdns='0'
uci add_list network.wan.dns='77.88.8.8'
uci add_list network.wan.dns='1.1.1.1'
uci commit network
service network restart
Ошибка 9. Низкая скорость и загрузка CPU хоста
Причина: выбрана модель адаптера e1000 или rtl8139, работает одна очередь на гигабитном и выше канале, для PPPoE не настроен MTU.
Решение: virtio с несколькими очередями, по числу ядер ВМ. В OpenWrt включи packet steering, он раскидывает обработку пакетов по ядрам.
# Где выполнять: хост Proxmox, MAC оставь прежние
qm set 100 --net0 virtio=BC:24:11:AA:AA:AA,bridge=vmbr1,queues=2
qm set 100 --net1 virtio=BC:24:11:BB:BB:BB,bridge=vmbr0,queues=2
# Где выполнять: SSH в OpenWrt
uci set network.globals.packet_steering='1'
uci commit network
service network restart
Замеряй до и после. iperf3 между клиентом в LAN и сервером снаружи покажет реальную цифру. Не верь ощущениям, верь графикам.
Ошибка 10. QEMU guest agent is not running
Причина: агент не установлен, не запущен, или ВМ после включения опции agent ни разу не выключалась полностью. Виртуальный порт агента добавляется только при холодном старте.
# Где выполнять: SSH в OpenWrt
apk info -e qemu-ga && service qemu-ga status
# Где выполнять: хост Proxmox
qm set 100 --agent enabled=1
qm shutdown 100 && qm start 100
qm agent 100 ping && echo "agent OK"
Ошибка 11. После обновления пропали пакеты или уменьшился диск
Причина: sysupgrade образом ставит чистую систему и переносит только конфиги. Пакеты, поставленные вручную, надо ставить заново. Таблица разделов тоже приходит из образа.
Решение: перед обновлением сохрани список пакетов, после обновления поставь их одной командой. Для минорных обновлений внутри ветки удобнее Attended Sysupgrade, он собирает образ сразу с твоими пакетами.
# Где выполнять: SSH в OpenWrt, до обновления
apk info > /etc/backup-packages.txt
echo /etc/backup-packages.txt >> /etc/sysupgrade.conf
| Ошибка | Причина | Решение |
|---|---|---|
| Access Denied, UEFI Shell | Secure Boot с ключами Microsoft | Пересоздать efidisk0 с pre-enrolled-keys=0 |
| No bootable device | Порядок загрузки или не тот образ | boot order=scsi0, образ под свой BIOS |
| WAN без адреса | Перепутаны net0 и net1 | Поменять мосты с сохранением MAC |
| Провайдер не выдаёт адрес | Привязка к MAC | MAC старого роутера на net1 |
| Интернет через раз | Одинаковые подсети WAN и LAN | LAN в 192.168.10.0/24 |
| Пропал доступ к Proxmox | /etc/hosts, порт моста, подсеть ноутбука | Откат и повтор с таймером |
| Клиенты без адреса | Порт не в мосту, второй DHCP, firewall на NIC | tcpdump на vmbr1, убрать firewall=1 |
| Сайты не открываются | DNS | Ручные DNS на WAN, resolv.conf хоста |
| Низкая скорость | e1000, одна очередь | virtio, queues, packet steering |
| Агент не отвечает | Нет холодного старта | qm shutdown и qm start |
| Пакеты пропали после обновления | sysupgrade ставит чистую систему | Список пакетов в бэкап, ASU |
Альтернативы: OpenWrt в LXC, проброс сетевой карты, другие роутеры
ВМ с virtio — это компромисс между скоростью, изоляцией и простотой. Он закрывает большинство домашних и офисных задач до гигабита. Но вариантов больше, и в некоторых случаях другой подход честнее.
Одна сетевая карта: VLAN-aware мост
У мини-ПК часто один порт. Тогда WAN и LAN разносятся по VLAN, а разбирает их управляемый коммутатор. Кабель провайдера идёт в access-порт VLAN 20, сервер подключён в trunk с VLAN 10 и 20.
Без управляемого коммутатора эта схема не работает. Тегированный трафик просто некому разобрать. Неуправляемый свитч за 800 рублей тут не помощник.
auto lo
iface lo inet loopback
iface enp1s0 inet manual
auto vmbr0
iface vmbr0 inet manual
bridge-ports enp1s0
bridge-stp off
bridge-fd 0
bridge-vlan-aware yes
bridge-vids 2-4094
auto vmbr0.10
iface vmbr0.10 inet static
address 192.168.10.2/24
gateway 192.168.10.1
#Хост в LAN, VLAN 10
# Где выполнять: хост Proxmox, MAC оставь прежние
qm set 100 --net0 virtio=BC:24:11:AA:AA:AA,bridge=vmbr0,tag=10
qm set 100 --net1 virtio=BC:24:11:BB:BB:BB,bridge=vmbr0,tag=20
Внутри OpenWrt ничего не меняется: он по-прежнему видит eth0 и eth1 без тегов. Теги снимает мост Proxmox.
Проброс сетевой карты в ВМ
Если канал 2.5 или 10 Гбит/с и virtio не вытягивает, отдай физическую карту ВМ целиком через PCI passthrough. Хост эту карту больше не видит. Пакеты идут мимо его сетевого стека, задержка и нагрузка падают.
# Где выполнять: хост Proxmox
dmesg | grep -e DMAR -e IOMMU | head
lspci -nn | grep -i ethernet
find /sys/kernel/iommu_groups/ -type l | grep 03:00
qm set 100 --hostpci0 0000:03:00.0,pcie=1
Минусы: ВМ нельзя мигрировать на другой узел, карта должна сидеть в своей IOMMU-группе, а при сбое ВМ порт мёртв до её перезапуска. На свежих ядрах Proxmox IOMMU для Intel включён по умолчанию, для AMD тоже обычно работает из коробки. Проверяй вывод dmesg, а не форумы пятилетней давности.
OpenWrt в LXC-контейнере
Работает, но это вариант для экспериментов. Контейнер делит ядро с хостом, поэтому модули ядра OpenWrt не загрузить, а часть функций вроде некоторых VPN и SQM упирается в ядро Proxmox. Плюс почти нулевой расход ресурсов.
# Где выполнять: хост Proxmox, только для тестов
VER=25.12.5
cd /var/lib/vz/template/cache
wget https://downloads.openwrt.org/releases/${VER}/targets/x86/64/openwrt-${VER}-x86-64-rootfs.tar.gz
pct create 200 local:vztmpl/openwrt-${VER}-x86-64-rootfs.tar.gz \
--ostype unmanaged --arch amd64 --hostname openwrt-lxc \
--cores 1 --memory 256 --swap 0 --rootfs local-lvm:1 \
--net0 name=eth0,bridge=vmbr1 --net1 name=eth1,bridge=vmbr0
Для основного роутера сети я LXC не беру. Обновление ядра хоста здесь может молча поменять поведение роутера, и узнаешь ты об этом от пользователей.
Сравнение вариантов
| Вариант | Скорость | Сложность | Изоляция | Когда выбирать |
|---|---|---|---|---|
| OpenWrt в ВМ, virtio | До 1-2 Гбит/с | Низкая | Полная | Дом, офис до 50 человек, домашняя лаборатория |
| OpenWrt в ВМ, PCI passthrough | Линейная на 2.5-10G | Средняя | Полная | Быстрый канал, отдельная сетевая карта |
| OpenWrt в LXC | Высокая | Средняя | Слабая | Тесты, изолированные подсети внутри хоста |
| OPNsense в ВМ | До 1-2 Гбит/с | Средняя | Полная | Нужны IDS, отчёты и веб-интерфейс уровня enterprise |
| MikroTik RouterOS CHR | Зависит от лицензии | Средняя | Полная | Вся сеть уже на MikroTik, нужен единый стиль конфигов |
| Сам Proxmox как роутер, nftables | Максимальная | Высокая | Нет | Минимализм и понимание nftables. Хост становится пограничным |
| Отдельный железный роутер | По железу | Низкая | Физическая | Интернет должен жить, даже когда сервер на обслуживании |
Почему в статье ВМ с virtio. Она переживает обновления хоста без сюрпризов, снапшотится перед каждым изменением и переносится на другой узел. Скорости хватает для типичного канала. Когда канал вырастет — переход на passthrough занимает одну команду.
Отдельно скажу про последний пункт таблицы. Виртуальный роутер означает, что перезагрузка хоста равна перезагрузке интернета. Если это неприемлемо, держи железный роутер, а OpenWrt в Proxmox используй для лабораторных сегментов.
Профилактика: мониторинг, безопасность, бэкап, обновления
Роутер, который никто не мониторит, ломается в пятницу вечером. Это не закон природы, это просто статистика моих инцидентов.
Мониторинг
Минимум, который стоит сделать сразу: скрипт на хосте раз в минуту проверяет агент, LAN-адрес роутера и выход в интернет. Ошибки пишет в системный журнал. Оттуда их заберёт Zabbix, Prometheus или любой сборщик логов.
# Где выполнять: хост Proxmox
cat > /usr/local/bin/openwrt-watch.sh </dev/null 2>&1 || logger -t openwrt-watch "VM $VMID: guest agent не отвечает"
ping -c 2 -W 2 "$GW" >/dev/null 2>&1 || logger -t openwrt-watch "OpenWrt $GW недоступен из LAN"
ping -c 2 -W 2 "$EXT" >/dev/null 2>&1 || logger -t openwrt-watch "Нет выхода в интернет через OpenWrt"
EOF
chmod +x /usr/local/bin/openwrt-watch.sh
echo '* * * * * root /usr/local/bin/openwrt-watch.sh' > /etc/cron.d/openwrt-watch
journalctl -t openwrt-watch --since "10 min ago"
Автоматический qm reset по результатам проверки я специально не добавляю. Роутер, который перезапускается сам каждые пять минут из-за упавшего провайдера, хуже роутера, который просто лежит. Сначала алерт, потом решение человека.
Если у тебя есть Zabbix, повесь на 192.168.10.1 шаблон ICMP Ping и добавь триггер на потерю пакетов до внешнего адреса. Для метрик изнутри в OpenWrt есть пакет zabbix-agentd, ставится через apk add. Не забудь открыть его порт только с адреса Zabbix-сервера.
Безопасность
Firewall. UFW на хост Proxmox не ставь. У Proxmox свой pve-firewall на nftables или iptables, и два менеджера правил на одной машине перетирают друг друга. На OpenWrt работает fw4 с политикой по умолчанию: всё входящее с WAN отклоняется, LAN доверенный.
На хосте включи firewall уровня датацентра и ограничь управление подсетью LAN. Набор IP с именем management Proxmox использует специально: доступ к 8006 и 22 из него разрешается автоматически.
# Файл /etc/pve/firewall/cluster.fw на хосте Proxmox
[OPTIONS]
enable: 1
policy_in: DROP
policy_out: ACCEPT
[IPSET management]
192.168.10.0/24
# Где выполнять: хост Proxmox
pve-firewall compile | head -40
pve-firewall status
# откат из локальной консоли, если заперся:
# pve-firewall stop
Не включай firewall Proxmox на сетевых адаптерах самой ВМ OpenWrt. Роутер фильтрует трафик сам, а лишний слой conntrack на мосту ломает асимметричные потоки и добавляет задержку.
fail2ban на веб-интерфейс. На Debian 13 логи живут в journald, поэтому backend обязательно systemd. Фильтр ловит неудачные входы в pvedaemon.
# Где выполнять: хост Proxmox
apt install -y fail2ban python3-systemd
cat > /etc/fail2ban/filter.d/proxmox.conf <<'EOF'
[Definition]
failregex = pvedaemon\[.*authentication failure; rhost= user=.* msg=.*
ignoreregex =
journalmatch = _SYSTEMD_UNIT=pvedaemon.service
EOF
cat > /etc/fail2ban/jail.d/proxmox.local <<'EOF'
[DEFAULT]
backend = systemd
ignoreip = 127.0.0.1/8 ::1
[sshd]
enabled = true
[proxmox]
enabled = true
port = https,http,8006
filter = proxmox
maxretry = 3
findtime = 2d
bantime = 1h
EOF
systemctl enable --now fail2ban
fail2ban-client status proxmox
Проверка: введи неверный пароль в веб-интерфейсе три раза с тестовой машины. В выводе fail2ban-client status proxmox появится её адрес. Разбань его командой fail2ban-client set proxmox unbanip и адресом.
SSH hardening хоста. Вход root по ключу оставляем: Proxmox использует его для кластера и миграций. Пароли отключаем полностью. Сначала проверь, что твой ключ уже в /root/.ssh/authorized_keys и вход по нему работает.
# Где выполнять: хост Proxmox
cat > /etc/ssh/sshd_config.d/10-hardening.conf <<'EOF'
PermitRootLogin prohibit-password
PasswordAuthentication no
KbdInteractiveAuthentication no
MaxAuthTries 3
LoginGraceTime 30
EOF
sshd -t && systemctl reload ssh
Отдельный пользователь. Базы данных в этой схеме нет, поэтому роль отдельной учётки БД играет отдельный пользователь Proxmox для ежедневной работы. root@pam оставь для аварий, а себе заведи пользователя с ограниченной ролью и включи ему TOTP в веб-интерфейсе.
# Где выполнять: хост Proxmox
pveum user add andrey@pve --comment "Ежедневная работа"
pveum passwd andrey@pve
pveum acl modify /vms -user andrey@pve -role PVEVMAdmin
pveum user permissions andrey@pve
Ограничения по IP. Веб-интерфейс Proxmox и LuCI доступны только из LAN, это уже обеспечено схемой: у хоста нет адреса на WAN, а fw4 режет вход на роутер. Если нужен удалённый доступ - поднимай WireGuard на OpenWrt и заходи через туннель. Проброс 8006 наружу не делай никогда.
Резервное копирование
Один роутер без бэкапа конфига - это 43 правила firewall, которые ты восстанавливаешь по памяти в три ночи. Вспомнишь 41. Оставшиеся два всплывут через месяц.
| Что бэкапить | Как часто | Где хранить | Как восстановить |
|---|---|---|---|
| Конфиг OpenWrt, sysupgrade -b | Ежедневно и перед изменениями | Хост, затем NAS или PBS | sysupgrade -r с архивом и перезагрузка |
| ВМ 100 целиком, vzdump | Раз в неделю | Proxmox Backup Server или отдельный диск | qmrestore поверх или в новую ВМ |
| Снапшот ВМ | Перед каждым обновлением | То же хранилище, где диск | qm rollback |
| /etc/network/interfaces, /etc/hosts, /etc/pve | При каждом изменении сети | Вне хоста | Копирование файлов обратно и ifreload |
Скрипт ежедневного бэкапа конфига OpenWrt на хост. Ключ хоста мы положили в Dropbear на шаге 10. Флаг -O у scp нужен потому, что современный OpenSSH по умолчанию ходит через SFTP, а у Dropbear SFTP-сервера нет.
# Где выполнять: хост Proxmox
cat > /usr/local/bin/openwrt-backup.sh < /etc/backup-packages.txt; sysupgrade -b /tmp/$F"
scp -O -o BatchMode=yes "$OWRT:/tmp/$F" "$DST/"
ssh -o BatchMode=yes "$OWRT" "rm -f /tmp/$F"
find "$DST" -name 'owrt-*.tar.gz' -mtime +30 -delete
EOF
chmod +x /usr/local/bin/openwrt-backup.sh
echo '30 3 * * * root /usr/local/bin/openwrt-backup.sh' > /etc/cron.d/openwrt-backup
/usr/local/bin/openwrt-backup.sh && ls -lh /root/backup/openwrt/
Еженедельный vzdump через задание в датацентре. Режим snapshot с работающим агентом замораживает файловую систему ВМ на долю секунды, роутер при этом не перезагружается.
# Где выполнять: хост Proxmox, хранилище замени на своё
pvesh create /cluster/backup --schedule "sun 03:00" --vmid 100 \
--storage local --mode snapshot --compress zstd \
--prune-backups keep-last=4 --comment "OpenWrt weekly"
pvesh get /cluster/backup
vzdump 100 --storage local --mode snapshot --compress zstd
Последняя команда делает внеочередной бэкап прямо сейчас. Сделай его, чтобы убедиться, что задание вообще работает.
Восстановление. Бэкап, который ни разу не восстанавливали, это не бэкап, а надежда. Раз в квартал разворачивай копию в отдельную ВМ с номером 900 без сети и проверяй, что она грузится.
# Где выполнять: хост Proxmox
ls /var/lib/vz/dump/ | grep qemu-100
qmrestore /var/lib/vz/dump/vzdump-qemu-100-ДАТА.vma.zst 900 --unique 1
qm set 900 --net0 virtio,bridge=vmbr1,link_down=1 --net1 virtio,bridge=vmbr0,link_down=1 --onboot 0
qm start 900 && qm terminal 900
# Где выполнять: SSH в OpenWrt, восстановление только конфига
sysupgrade -r /tmp/owrt-ДАТА.tar.gz
reboot
Обновление
Обновление OpenWrt внутри ветки 25.12. Перед любым обновлением снапшот. Это 2 секунды, которые экономят вечер.
# Где выполнять: хост Proxmox
qm snapshot 100 pre-upgrade --description "Перед обновлением OpenWrt"
qm listsnapshot 100
Самый удобный путь - Attended Sysupgrade. В 25.12 он стоит по умолчанию: в LuCI есть пункт System, Attended Sysupgrade, а в консоли утилита owut. Сервер сборки сам соберёт образ с твоими пакетами.
# Где выполнять: SSH в OpenWrt
apk add owut
owut check
owut upgrade
Ручной путь, если ASU недоступен. Скачай новый combined-efi образ прямо в /tmp роутера, там файловая система в RAM, и 512 МБ памяти хватает. Ключ -v показывает, какие файлы конфигурации переносятся.
# Где выполнять: SSH в OpenWrt, номер версии замени на новый
cd /tmp
wget https://downloads.openwrt.org/releases/25.12.6/targets/x86/64/openwrt-25.12.6-x86-64-generic-ext4-combined-efi.img.gz
sysupgrade -v /tmp/openwrt-25.12.6-x86-64-generic-ext4-combined-efi.img.gz
После перезагрузки поставь пакеты из сохранённого списка, проверь интернет и агент. Не обновляй все пакеты разом через apk upgrade. В OpenWrt система и пакеты собираются как единое целое, и массовое обновление на живом роутере - классический способ получить несовместимые библиотеки.
Переход между мажорными ветками, например с 24.10 на 25.12, я делаю по схеме сине-зелёного развёртывания. Новая ВМ из свежего образа, конфиг из бэкапа через sysupgrade -r, переключение мостов, старую ВМ держу выключенной неделю. Откат в этом случае занимает 20 секунд.
Откат минорного обновления, если что-то сломалось.
# Где выполнять: хост Proxmox
qm rollback 100 pre-upgrade
qm start 100
# когда всё работает несколько дней:
qm delsnapshot 100 pre-upgrade
Обновление Proxmox. Только apt full-upgrade, никогда не apt upgrade: Proxmox меняет зависимости, и обычный upgrade оставляет систему в полуобновлённом состоянии. Помни, что перезагрузка хоста означает перезагрузку интернета для всей сети. Планируй окно.
# Где выполнять: хост Proxmox
vzdump 100 --storage local --mode snapshot --compress zstd
apt update
apt list --upgradable
apt full-upgrade
pveversion -v | head -5
proxmox-boot-tool kernel list
Если после обновления ядра что-то сломалось в сети или пробросе, вернись на предыдущее ядро без переустановки. Закрепи его и перезагрузись.
# Где выполнять: хост Proxmox, версию возьми из kernel list
proxmox-boot-tool kernel pin 6.17.2-1-pve
reboot
# когда исправленное ядро выйдет:
# proxmox-boot-tool kernel unpin
Для переходов между мажорными версиями Proxmox есть отдельные утилиты проверки, например pve8to9 для перехода с 8 на 9. Запускай её с ключом --full до обновления и чини всё, что она нашла. Предупреждения там пишут не для красоты.
FAQ: частые вопросы про OpenWrt на Proxmox
Почему OpenWrt на Proxmox не раздаёт интернет после настройки?
В девяти случаях из десяти перепутаны сетевые адаптеры или совпали подсети LAN и WAN. Проверь, что net0 подключён к LAN-мосту, net1 к WAN-мосту, и что LAN роутера не в 192.168.1.0/24, если роутер провайдера там же. Оставшийся десятый случай обычно DNS: пинг по IP проходит, сайты не открываются.
Как проверить, что OpenWrt в Proxmox работает правильно?
С хоста выполни qm agent 100 ping и пинг до 1.1.1.1, внутри OpenWrt посмотри ifstatus wan и /tmp/dhcp.leases. С клиента в LAN проверь, что он получил адрес из пула роутера и открывает сайты по имени. Последний тест - попытка открыть порт 8006 на белом адресе снаружи, она должна закончиться таймаутом.
Что делать, если OpenWrt на Proxmox не загружается с UEFI?
Почти всегда виноват Secure Boot: при создании ВМ через веб-интерфейс по умолчанию стоят предзагруженные ключи. Удали efidisk0 и создай его заново с параметром pre-enrolled-keys=0. Если не помогло, проверь, что образ именно combined-efi, а порядок загрузки указывает на scsi0.
Чем OpenWrt в виртуальной машине отличается от OpenWrt в LXC-контейнере?
ВМ запускает собственное ядро OpenWrt со всеми модулями, изолирована от хоста и снапшотится вместе с состоянием. Контейнер использует ядро Proxmox, поэтому часть сетевых функций недоступна, а обновление ядра хоста может изменить поведение роутера. Для основного роутера сети бери ВМ, контейнер оставь для тестов.
Можно ли поставить OpenWrt на Proxmox с одной сетевой картой?
Можно, через VLAN-aware мост и управляемый коммутатор. Кабель провайдера заводишь в access-порт одного VLAN, сервер в trunk, а адаптеры ВМ получают разные теги. Без управляемого коммутатора схема не работает, тогда LAN остаётся только внутренним для ВМ на хосте.
Сколько памяти и ядер нужно OpenWrt на Proxmox?
Для обычного роутера хватает одного-двух ядер и 256-512 МБ памяти. Больше нужно под adblock с большими списками, WireGuard на гигабитном канале или SQM. Динамическую память для этой ВМ лучше отключить.
Какой образ OpenWrt выбрать для Proxmox: ext4 или squashfs?
Для ВМ удобнее ext4: раздел проще расширить и починить, а откат к рабочему состоянию даёт снапшот Proxmox. Squashfs полезен на железе, где нужен сброс к заводским настройкам без внешних инструментов. Для OVMF бери вариант с efi в имени, для SeaBIOS без него.
Как обновить OpenWrt в Proxmox без потери настроек?
Сделай снапшот ВМ, сохрани конфиг через sysupgrade -b и обнови через Attended Sysupgrade, он соберёт образ с твоими пакетами. Ручной sysupgrade тоже сохраняет конфиги, но пакеты придётся поставить заново. Если что-то сломалось, qm rollback вернёт ВМ в состояние до обновления за секунды.
Прогноз: что у тебя теперь работает
Мы собрали роутер на OpenWrt 25.12 внутри Proxmox: два моста с понятным назначением, ВМ на virtio без Secure Boot, агент для корректных бэкапов и автозапуск первым номером. Хост переехал за роутер с таймером автоотката и больше не светит веб-интерфейсом в интернет. Сверху легли fail2ban, ключи вместо паролей, ограничение управления подсетью LAN.
Дальше роутер живёт сам: конфиг уезжает в бэкап каждую ночь, ВМ раз в неделю, а перед любым обновлением есть снапшот и одна команда отката. Следующий логичный шаг - WireGuard на OpenWrt для удалённого доступа к домашней сети и к тому же Proxmox. Без проброса портов и без нервов. Роутер виртуальный, а инциденты у него вполне настоящие. Просто теперь они закрываются за минуту.
Оставайтесь на связи
Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.
Подписаться на IT-Аптеку →



