OpenWrt
Пакет rVPN для OpenWrt переносит демон на роутер. LAN-клиенты подхватывают его либо автоматически (через WPAD-объявленный SOCKS5 / HTTP-прокси), либо прозрачно (в режиме TUN, с policy routing, отправляющим forwarded LAN-трафик в туннель).
Поставляется как два .ipk-пакета:
rvpn-client— демон, служба procd, схема UCI, hotplug-скрипт policy routing. Зависит от архитектуры.luci-app-rvpn— LuCI 23.05 веб-интерфейс. Архитектурно-независимый.
Требования
Заголовок раздела «Требования»- OpenWrt 22.03 или новее.
- Роутер с достаточным ОЗУ и флешем под ~5–10 МБ статический бинарь. Современные устройства обычно справляются; старые с 8 МБ флеша могут не потянуть.
- Развёрнутый сервер rVPN (адрес + prekey bundle).
Установка
Заголовок раздела «Установка»Возьмите два .ipk-файла под архитектуру вашего роутера и установите через opkg:
opkg install rvpn-client_1.3.1_<arch>.ipkopkg install luci-app-rvpn_1.3.1_all.ipkПоддерживаемые архитектуры: x86_64, aarch64, armv7, mipsel_24kc, mips_24kc.
Хук postinst автоматически сгенерирует ключ идентификации в /etc/rvpn/identity.key и включит службу. Пока адрес сервера не задан, демон не запускается.
Настройка через LuCI
Заголовок раздела «Настройка через LuCI»Откройте админку роутера и перейдите в Services → VPN → rVPN:
- Server — вставьте базовый URL (например,
wss://vpn.example.com). Правильный WebSocket-путь дописывается автоматически. - Mode — выберите SOCKS5 Proxy для необязательной пер-приложения маршрутизации LAN-клиентов (в паре с WPAD) или TUN (Full VPN) для прозрачной маршрутизации всей LAN.
- Prekey Bundle — вставьте JSON, который вам дал оператор сервера, в поле Prekey Bundle и нажмите Save & Apply.
- Server Fingerprint (опционально) — вставьте
ik:1:…отпечаток оператора для строгого закрепления. Оставьте пустым, чтобы использовать Trust On First Use. - Enabled — включите. Нажмите Save & Apply.
Метка статуса в разделе Overview показывает Connected / Connecting / Disabled согласно живому экземпляру procd.
Настройка через CLI
Заголовок раздела «Настройка через CLI»Схема UCI простая:
uci set rvpn.main.server_address='wss://your-server.com'uci set rvpn.main.mode='socks5'uci set rvpn.main.enabled='1'
# Опционально: строгое закрепление вместо TOFUuci set rvpn.server_identity.server_fingerprint='ik:1:...'uci set rvpn.server_identity.strict_mode='1'
uci commit rvpn/etc/init.d/rvpn restartКаждый UCI-параметр задокументирован inline в /etc/config/rvpn на роутере. Самые полезные:
| Секция | Опция | Назначение |
|---|---|---|
main | server_address | Базовый URL сервера rVPN (без пути). |
main | mode | socks5 или tun. |
server_identity | server_fingerprint | Каноничный ik:1:-отпечаток. Пусто = TOFU. |
server_identity | trust_on_first_use | По умолчанию 1, захват идентичности при первом подключении. |
server_identity | strict_mode | 1 отклоняет неизвестные идентичности даже при первом подключении (нужен отпечаток). |
socks5 | listen_address | Куда бинды SOCKS5-прокси. По умолчанию 0.0.0.0:1080. |
http_proxy | enabled | Также выставлять HTTP-прокси. По умолчанию выключен. |
tun | ip_address | Локальный TUN-адрес. По умолчанию 10.200.0.2/24. |
split_tunnel | bypass_countries | Через запятую ISO-коды стран, чей CIDR не идёт в туннель. |
network | dns_servers | Резервные DNS-резолверы. |
wpad | enabled | Объявлять SOCKS5-прокси через DHCP option 252. По умолчанию включено. |
SOCKS5-режим + WPAD
Заголовок раздела «SOCKS5-режим + WPAD»Когда rVPN стартует в SOCKS5-режиме, init-скрипт формирует /www/wpad.dat в runtime, используя реальный LAN IP роутера (uci get network.lan.ipaddr), и объявляет его LAN-клиентам через DHCP option 252. Клиенты, поддерживающие WPAD — macOS, Chrome, Firefox с нужными настройками — подхватывают прокси автоматически.
Устройство без WPAD можно вручную направить на SOCKS5 <LAN-IP роутера>:1080.
TUN-режим
Заголовок раздела «TUN-режим»В TUN-режиме демон создаёт виртуальный интерфейс (по умолчанию rvpn0), а hotplug-скрипт /etc/hotplug.d/iface/99-rvpn-tun настраивает policy routing для IPv4 и IPv6 сразу после подъёма интерфейса:
- Таблица
100получает маршрут по умолчанию через VPN-шлюз. - Правила с приоритетом
100матчатiif br-lan— LAN-клиенты попадают в таблицу, свой исходящий трафик роутера — нет.
Firewall-зона rvpn делает masquerade на выходе и rejects на входе для обоих семейств адресов. Так dual-stack LAN не сливает IPv6 напрямую в WAN.
Закрепление идентификации сервера (TOFU)
Заголовок раздела «Закрепление идентификации сервера (TOFU)»Та же модель, что и во всех клиентах rVPN: при первом успешном подключении демон захватывает Ed25519-идентичность сервера в канонической форме ik:1:<base32>. Если сервер когда-либо предъявит другую идентичность без подписанной ротации, демон откажется подключаться.
Чтобы закрепить конкретную идентичность с самого начала, вставьте ik:1: оператора в Server Fingerprint (LuCI) или задайте rvpn.server_identity.server_fingerprint (CLI). Установка strict_mode='1' отклоняет неизвестные идентичности даже при самом первом подключении — используйте вместе с отпечатком.
Полная модель, включая ротацию ключа идентификации оператором, — на странице Закрепление идентификации сервера.
Устранение неполадок
Заголовок раздела «Устранение неполадок»Туннель поднят, но LAN-клиенты через него не идут (TUN-режим)
Заголовок раздела «Туннель поднят, но LAN-клиенты через него не идут (TUN-режим)»Проверьте, что правила policy routing и маршрут по умолчанию встали после подъёма интерфейса:
ip rule show | grep br-lanip route show table 100Обе команды должны показывать записи. Если пусто — logread -e rvpn расскажет, почему hotplug-скрипт вышел (не разрешён шлюз, br-lan не найден и т. п.).
LuCI показывает «Disabled», но демон запущен
Заголовок раздела «LuCI показывает «Disabled», но демон запущен»Save & Apply не перезагрузил демон. /etc/init.d/rvpn reload должен снова прогнать generate_config; если нет:
uci show rvpn/etc/init.d/rvpn restartКлиенты не подхватывают WPAD
Заголовок раздела «Клиенты не подхватывают WPAD»Убедитесь, что DHCP-опция на месте:
uci get dhcp.@dnsmasq[0].dhcp_optionОжидается 252,http://<LAN-IP роутера>/wpad.dat в списке. Если нет — рендер WPAD не удался, смотрите logread -e rvpn на предмет предупреждения о разрешении LAN IP.
«Профиль без prekey bundle» при старте
Заголовок раздела ««Профиль без prekey bundle» при старте»Без файла /etc/rvpn/prekey-bundle.json демон отказывается запускаться. Вставьте JSON оператора в поле Prekey Bundle в LuCI или положите файл напрямую через SCP.
Дополнительно — на странице Устранение неполадок.