[ Главная ] [ Блог ] 💛 Поддержать проект
// Услуги
🖥 IT Техподдержка

// Проекты
📊 BeitBoard 📡 OwrtCloud 🌐 BeLaz 🛡 AWG Manager 🧅 TG-Tor-Proxy 📓 Synology Note Bot

// Инструменты
🛡 WireGuard Generator ⚡ VLESS Converter 🔍 VLESS Checker 🔀 MikroTik SNI Generator 🔧 Split Routing WG / AWG 🔗 WG Site-to-Site
~ / blog / openwrt-on-vps

OpenWrt на VPS: заменяем CentOS через dd и поднимаем роутер в облаке

// 19.04.2026 · ~15 мин чтения · root@beit24
// содержание
  1. Зачем это вообще нужно
  2. Подготовка на CentOS
  3. Прошиваем диск через dd
  4. Настройка сети в OpenWrt
  5. SSH и файрвол
  6. Расширяем диск
  7. Fail2ban
  8. Опционально: открыть LuCI
  9. Опционально: BeLaz — веб-интерфейс AmneziaWG
// 01 — зачем это нужно

OpenWrt на VPS — это вообще зачем?

Обычно OpenWrt ставят на роутеры. Но иногда нужен полноценный роутер в облаке — с файрволом, VLAN, WireGuard, traffic shaping и прочим — а платить за дорогой облачный сервис не хочется. Берёшь дешёвый VPS с CentOS и прошиваешь его насквозь.

Конкретные сценарии где это применяли:

  • Exit-нода для WireGuard / VLESS трафика
  • Облачный роутер между несколькими сетями
  • Тестовый стенд для конфигов OpenWrt без физического железа
☠️
Это необратимая операция. dd перезапишет весь диск. Без KVM-консоли или IPMI к серверу не восстановиться. Убедитесь что провайдер даёт доступ к консоли до начала.
// 02 — подготовка на CentOS

Делаем всё на живой системе

Гайд проверялся на CentOS 10. Нам нужно скачать образ OpenWrt прямо на работающий сервер и записать его поверх. Проблема: при записи через dd файловая система /tmp может быть на том же диске что перезаписываем. Решение — смонтировать tmpfs в RAM.

1

Определяем имя диска

Перед всем остальным — узнаём как система видит диск. Это зависит от типа виртуализации:

bash
fdisk -l

Смотрим на строку вида Disk /dev/??? — запоминаем имя. В дальнейших командах подставляйте своё:

/dev/sda— KVM, большинство VPS
/dev/vda— VirtIO (Proxmox, OpenStack)
/dev/xvda— Xen (AWS EC2 старые типы)
⚠️
Не угадывайте. Если указать не тот диск — dd перезапишет не то. Всегда проверяйте через fdisk -l.
3

Монтируем tmpfs в RAM

Это позволит хранить образ в памяти, а не на диске который будем перезаписывать:

bash
mount -t tmpfs tmpfs /tmp/
4

Устанавливаем wget и gzip

bash
yum install wget gzip -y
5

Скачиваем образ OpenWrt

Берём EFI-версию для x86_64 с ext4 — подходит для большинства VPS. Переходим в /tmp и качаем:

bash
cd /tmp
wget -4 https://downloads.openwrt.org/releases/24.10.4/targets/x86/64/openwrt-24.10.4-x86-64-generic-ext4-combined-efi.img.gz
ℹ️
Флаг -4 форсирует IPv4. На некоторых VPS IPv6 не настроен и без него wget зависает.
6

Распаковываем архив

Образ упакован в gzip — распаковываем на месте. После этого в /tmp появится .img файл:

bash
gzip -d openwrt-24.10.4-x86-64-generic-ext4-combined-efi.img.gz
// 03 — прошиваем диск через dd

Точка невозврата

⚠️
Выполняйте команды по одной. Не вставляйте всё сразу — echo b перезагрузит сервер мгновенно, не дав dd завершиться. Результат — неработающая система.
1

Переводим ФС в read-only

Снижает риск повреждения данных в момент записи образа:

bash
echo u > /proc/sysrq-trigger
2

Пишем образ на диск

Дождитесь полного завершения — dd выведет статистику когда закончит. Это занимает 1–3 минуты:

bash
# Замените /dev/sda на ваш диск из fdisk -l
dd if=/tmp/openwrt-24.10.4-x86-64-generic-ext4-combined-efi.img of=/dev/sda bs=4M oflag=sync
3

Включаем sysrq и перезагружаемся

Только после того как dd завершился и вы убедились что он выдал статистику:

bash
echo 1 > /proc/sys/kernel/sysrq
echo b > /proc/sysrq-trigger
⚠️
После последней команды сервер перезагрузится мгновенно. SSH-сессия оборвётся. Открывайте KVM-консоль до выполнения этого шага.

После перезагрузки OpenWrt загрузится, но сети не будет — нужно настроить через KVM-консоль. Нажмите Enter чтобы получить шелл.

// 04 — настройка сети

Убираем br-lan, поднимаем wan на eth0

По умолчанию OpenWrt создаёт bridge br-lan и кидает туда все интерфейсы. На VPS нам это не нужно — делаем статический IP прямо на eth0.

1

Удаляем br-lan

bash
brctl delif br-lan eth0
ip link set br-lan down
brctl delbr br-lan

uci delete network.@device[0]
uci delete network.lan
2

Создаём wan интерфейс со статическим IP

Подставьте свои данные: IP, маску, шлюз и DNS от вашего провайдера VPS:

bash
uci set network.wan=interface
uci set network.wan.device='eth0'
uci set network.wan.proto='static'
uci set network.wan.ipaddr='YOUR_IP'
uci set network.wan.netmask='255.255.255.0'
uci set network.wan.gateway='YOUR_GATEWAY'
uci set network.wan.dns='8.8.8.8'
uci commit network
service network restart
ℹ️
IP, маску и шлюз смотрите в панели управления VPS-провайдера. Обычно это раздел "Networking" или "IP адреса".
// 05 — ssh и файрвол

Открываем SSH из интернета

По умолчанию OpenWrt блокирует SSH с WAN. Добавляем правило файрвола:

bash
uci add firewall rule
uci set firewall.@rule[-1].name='Allow-SSH-WAN'
uci set firewall.@rule[-1].src='wan'
uci set firewall.@rule[-1].dest_port='22'
uci set firewall.@rule[-1].proto='tcp'
uci set firewall.@rule[-1].target='ACCEPT'
uci commit firewall
service firewall restart

Меняем порт SSH (рекомендуется)

На стандартном 22 порту будет постоянный брутфорс. Меняем:

bash
uci set dropbear.@dropbear[0].Port='58422'
uci commit dropbear
service dropbear restart
⚠️
Если меняете порт — не забудьте обновить правило файрвола: dest_port='58422'. Иначе сами себя заблокируете.

Устанавливаем пароль

bash
passwd

После этого можно подключаться по SSH и работать без KVM-консоли.

// 06 — расширяем диск

Образ занимает ~300 МБ — расширяем на весь диск

OpenWrt записывается с маленьким образом. Если у VPS диск на 20–80 ГБ, остальное место пропадает. Расширяем раздел и файловую систему:

1

Устанавливаем нужные утилиты

bash
opkg update && opkg install parted losetup resize2fs e2fsprogs lsblk
2

Расширяем раздел и перезагружаемся

bash
parted -f -s /dev/sda resizepart 2 100%
reboot
3

После перезагрузки — расширяем файловую систему

bash
losetup /dev/loop0 /dev/sda2 2>/dev/null
resize2fs -f /dev/loop0
reboot

После второй перезагрузки df -h покажет полный размер диска.

// 07 — fail2ban

Защита от брутфорса SSH и LuCI

OpenWrt использует dropbear вместо openssh и uhttpd вместо nginx — логи у них специфичные, поэтому стандартные фильтры fail2ban не подойдут. Пишем свои.

1

Установка

bash
opkg update && opkg install fail2ban
mkdir -p /etc/fail2ban/jail.d
2

Фильтр для SSH (dropbear)

bash
cat > /etc/fail2ban/filter.d/sshd.conf << 'EOF'
[Definition]
failregex = dropbear\[\d+\]: Bad password attempt for .* from <HOST>
ignoreregex =
EOF
3

Фильтр для LuCI

bash
cat > /etc/fail2ban/filter.d/luci.conf << 'EOF'
[Definition]
failregex = uhttpd\[\d+\]: \[info\] luci: failed login on .* from <HOST>
ignoreregex =
EOF
4

Джейл для SSH

bash
cat > /etc/fail2ban/jail.d/sshd.conf << 'EOF'
[sshd]
enabled = true
port = 22
filter = sshd
backend = auto
logpath = /var/log/messages
maxretry = 5
bantime = 3600
findtime = 600
EOF
5

Джейл для LuCI (только HTTPS)

bash
cat > /etc/fail2ban/jail.d/luci.conf << 'EOF'
[luci]
enabled = true
port = 443
filter = luci
logpath = /var/log/messages
maxretry = 5
bantime = 3600
findtime = 600
EOF
6

Автозапуск через rc.local

На OpenWrt /var/log/messages не создаётся автоматически. sleep 2 даёт syslog подняться раньше fail2ban, иначе он не видит лог при старте:

bash
cat > /etc/rc.local << 'EOF'
touch /var/log/messages
logger "fail2ban init"
sleep 2
killall fail2ban-server 2>/dev/null
rm -f /var/run/fail2ban/fail2ban.sock
fail2ban-server -xf start &
exit 0
EOF

service fail2ban enable
7

Первый запуск и проверка

bash
killall fail2ban-server 2>/dev/null
rm -f /var/run/fail2ban/fail2ban.sock
touch /var/log/messages
logger "fail2ban init"
sleep 2
fail2ban-server -xf start &
sleep 5
fail2ban-client status

Разбан вручную

bash
# fail2ban-client set sshd unbanip IP_АДРЕС
# fail2ban-client set luci unbanip IP_АДРЕС
// 08 — опционально: открыть luci

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

По умолчанию LuCI доступен только с LAN. Если хотите заходить в веб-интерфейс через браузер — откройте 443 порт:

bash
uci add firewall rule
uci set firewall.@rule[-1].name='Allow-HTTPS-WAN'
uci set firewall.@rule[-1].src='wan'
uci set firewall.@rule[-1].dest_port='443'
uci set firewall.@rule[-1].proto='tcp'
uci set firewall.@rule[-1].target='ACCEPT'
uci commit firewall
service firewall restart
⚠️
Открытый LuCI в интернете — риск. Используйте сложный пароль и обязательно включите fail2ban для LuCI (шаг 7). Или лучше открывайте только под VPN.
✓
На этом базовая установка завершена. OpenWrt работает на VPS, сеть настроена, SSH доступен, диск расширен, fail2ban защищает от брутфорса.
// 09 — опционально: BeLaz — веб-интерфейс AmneziaWG

BeLaz — управление AmneziaWG через браузер

Если хочется управлять AmneziaWG сервером через веб-интерфейс — есть BeLaz, LuCI-приложение для OpenWrt. Серверы, клиенты, маршрутизация и мониторинг туннелей — всё через браузер без командной строки.

bash
# Шаг 1 — установка AmneziaWG
sh <(wget -O - https://raw.githubusercontent.com/Slava-Shchipunov/awg-openwrt/refs/heads/master/amneziawg-install.sh)

# Шаг 2 — скачать и установить IPK-пакет BeLaz
opkg install luci-app-belaz_*.ipk
ℹ️
Требования: OpenWrt 24.04+, x86_64, KVM (OpenVZ и LXC не поддерживаются). IPK-пакет и исходники — на странице проекта и на GitHub.