Перейти к содержимому

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>.ipk
opkg install luci-app-rvpn_1.3.1_all.ipk

Поддерживаемые архитектуры: x86_64, aarch64, armv7, mipsel_24kc, mips_24kc.

Хук postinst автоматически сгенерирует ключ идентификации в /etc/rvpn/identity.key и включит службу. Пока адрес сервера не задан, демон не запускается.

Откройте админку роутера и перейдите в Services → VPN → rVPN:

  1. Server — вставьте базовый URL (например, wss://vpn.example.com). Правильный WebSocket-путь дописывается автоматически.
  2. Mode — выберите SOCKS5 Proxy для необязательной пер-приложения маршрутизации LAN-клиентов (в паре с WPAD) или TUN (Full VPN) для прозрачной маршрутизации всей LAN.
  3. Prekey Bundle — вставьте JSON, который вам дал оператор сервера, в поле Prekey Bundle и нажмите Save & Apply.
  4. Server Fingerprint (опционально) — вставьте ik:1:… отпечаток оператора для строгого закрепления. Оставьте пустым, чтобы использовать Trust On First Use.
  5. Enabled — включите. Нажмите Save & Apply.

Метка статуса в разделе Overview показывает Connected / Connecting / Disabled согласно живому экземпляру procd.

Схема UCI простая:

Окно терминала
uci set rvpn.main.server_address='wss://your-server.com'
uci set rvpn.main.mode='socks5'
uci set rvpn.main.enabled='1'
# Опционально: строгое закрепление вместо TOFU
uci 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 на роутере. Самые полезные:

СекцияОпцияНазначение
mainserver_addressБазовый URL сервера rVPN (без пути).
mainmodesocks5 или tun.
server_identityserver_fingerprintКаноничный ik:1:-отпечаток. Пусто = TOFU.
server_identitytrust_on_first_useПо умолчанию 1, захват идентичности при первом подключении.
server_identitystrict_mode1 отклоняет неизвестные идентичности даже при первом подключении (нужен отпечаток).
socks5listen_addressКуда бинды SOCKS5-прокси. По умолчанию 0.0.0.0:1080.
http_proxyenabledТакже выставлять HTTP-прокси. По умолчанию выключен.
tunip_addressЛокальный TUN-адрес. По умолчанию 10.200.0.2/24.
split_tunnelbypass_countriesЧерез запятую ISO-коды стран, чей CIDR не идёт в туннель.
networkdns_serversРезервные DNS-резолверы.
wpadenabledОбъявлять SOCKS5-прокси через DHCP option 252. По умолчанию включено.

Когда 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-режиме демон создаёт виртуальный интерфейс (по умолчанию 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.

Та же модель, что и во всех клиентах 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-lan
ip route show table 100

Обе команды должны показывать записи. Если пусто — logread -e rvpn расскажет, почему hotplug-скрипт вышел (не разрешён шлюз, br-lan не найден и т. п.).

Save & Apply не перезагрузил демон. /etc/init.d/rvpn reload должен снова прогнать generate_config; если нет:

Окно терминала
uci show rvpn
/etc/init.d/rvpn restart

Убедитесь, что DHCP-опция на месте:

Окно терминала
uci get dhcp.@dnsmasq[0].dhcp_option

Ожидается 252,http://<LAN-IP роутера>/wpad.dat в списке. Если нет — рендер WPAD не удался, смотрите logread -e rvpn на предмет предупреждения о разрешении LAN IP.

Без файла /etc/rvpn/prekey-bundle.json демон отказывается запускаться. Вставьте JSON оператора в поле Prekey Bundle в LuCI или положите файл напрямую через SCP.

Дополнительно — на странице Устранение неполадок.