Обычно OpenWrt ставят на роутеры. Но иногда нужен полноценный роутер в облаке — с файрволом, VLAN, WireGuard, traffic shaping и прочим — а платить за дорогой облачный сервис не хочется. Берёшь дешёвый VPS с CentOS и прошиваешь его насквозь.
Конкретные сценарии где это применяли:
Гайд проверялся на CentOS 10. Нам нужно скачать образ OpenWrt прямо на работающий сервер и записать его поверх. Проблема: при записи через dd файловая система /tmp может быть на том же диске что перезаписываем. Решение — смонтировать tmpfs в RAM.
Перед всем остальным — узнаём как система видит диск. Это зависит от типа виртуализации:
fdisk -l
Смотрим на строку вида Disk /dev/??? — запоминаем имя. В дальнейших командах подставляйте своё:
/dev/sda— KVM, большинство VPS/dev/vda— VirtIO (Proxmox, OpenStack)/dev/xvda— Xen (AWS EC2 старые типы)dd перезапишет не то. Всегда проверяйте через fdisk -l.Это позволит хранить образ в памяти, а не на диске который будем перезаписывать:
mount -t tmpfs tmpfs /tmp/
yum install wget gzip -y
Берём EFI-версию для x86_64 с ext4 — подходит для большинства VPS. Переходим в /tmp и качаем:
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 зависает.Образ упакован в gzip — распаковываем на месте. После этого в /tmp появится .img файл:
gzip -d openwrt-24.10.4-x86-64-generic-ext4-combined-efi.img.gz
echo b перезагрузит сервер мгновенно, не дав dd завершиться. Результат — неработающая система.Снижает риск повреждения данных в момент записи образа:
echo u > /proc/sysrq-trigger
Дождитесь полного завершения — dd выведет статистику когда закончит. Это занимает 1–3 минуты:
# Замените /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
Только после того как dd завершился и вы убедились что он выдал статистику:
echo 1 > /proc/sys/kernel/sysrq echo b > /proc/sysrq-trigger
После перезагрузки OpenWrt загрузится, но сети не будет — нужно настроить через KVM-консоль. Нажмите Enter чтобы получить шелл.
По умолчанию OpenWrt создаёт bridge br-lan и кидает туда все интерфейсы. На VPS нам это не нужно — делаем статический IP прямо на eth0.
brctl delif br-lan eth0 ip link set br-lan down brctl delbr br-lan uci delete network.@device[0] uci delete network.lan
Подставьте свои данные: IP, маску, шлюз и DNS от вашего провайдера VPS:
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
По умолчанию OpenWrt блокирует SSH с WAN. Добавляем правило файрвола:
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
На стандартном 22 порту будет постоянный брутфорс. Меняем:
uci set dropbear.@dropbear[0].Port='58422' uci commit dropbear service dropbear restart
dest_port='58422'. Иначе сами себя заблокируете.passwd
После этого можно подключаться по SSH и работать без KVM-консоли.
OpenWrt записывается с маленьким образом. Если у VPS диск на 20–80 ГБ, остальное место пропадает. Расширяем раздел и файловую систему:
opkg update && opkg install parted losetup resize2fs e2fsprogs lsblk
parted -f -s /dev/sda resizepart 2 100% reboot
losetup /dev/loop0 /dev/sda2 2>/dev/null resize2fs -f /dev/loop0 reboot
После второй перезагрузки df -h покажет полный размер диска.
OpenWrt использует dropbear вместо openssh и uhttpd вместо nginx — логи у них специфичные, поэтому стандартные фильтры fail2ban не подойдут. Пишем свои.
opkg update && opkg install fail2ban mkdir -p /etc/fail2ban/jail.d
cat > /etc/fail2ban/filter.d/sshd.conf << 'EOF' [Definition] failregex = dropbear\[\d+\]: Bad password attempt for .* from <HOST> ignoreregex = EOF
cat > /etc/fail2ban/filter.d/luci.conf << 'EOF' [Definition] failregex = uhttpd\[\d+\]: \[info\] luci: failed login on .* from <HOST> ignoreregex = EOF
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
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
На OpenWrt /var/log/messages не создаётся автоматически. sleep 2 даёт syslog подняться раньше fail2ban, иначе он не видит лог при старте:
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
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
# fail2ban-client set sshd unbanip IP_АДРЕС # fail2ban-client set luci unbanip IP_АДРЕС
По умолчанию LuCI доступен только с LAN. Если хотите заходить в веб-интерфейс через браузер — откройте 443 порт:
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