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

// Проекты
📊 BeitBoard 📡 OwrtCloud

// Инструменты
🛡 WireGuard Generator ⚡ VLESS Converter 🔀 MikroTik SNI Generator 🔧 Split Routing WG / AWG
~ / 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
// 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 защищает от брутфорса.