OpenWrt CGI proxy converting VPN Time JSON subscriptions to VLESS URIs
  • Lua 69.5%
  • Shell 30.5%
Find a file
2026-09-07 08:49:00 +00:00
examples feat: publish VPN Time subscription converter 2026-09-07 08:49:00 +00:00
tests feat: publish VPN Time subscription converter 2026-09-07 08:49:00 +00:00
LICENSE feat: publish VPN Time subscription converter 2026-09-07 08:49:00 +00:00
README.md feat: publish VPN Time subscription converter 2026-09-07 08:49:00 +00:00
vtime-json-to-links.lua feat: publish VPN Time subscription converter 2026-09-07 08:49:00 +00:00
vtime-sub feat: publish VPN Time subscription converter 2026-09-07 08:49:00 +00:00

vtime-subproxy

Минимальный CGI-прокси для OpenWrt, преобразующий JSON-подписку VPN Time в список стандартных vless:// URI для Passwall2.

Как работает

  1. CGI доступен только с loopback (127.0.0.1/::1).
  2. URL и User-Agent upstream-подписки читаются из существующей секции /etc/config/passwall2.
  3. Запрос получает OpenWrt device headers, требуемые upstream.
  4. JSON-массив Xray-конфигураций преобразуется в отдельные VLESS URI.
  5. Ответ отдаётся как text/plain с Cache-Control: no-store.

Требования

  • OpenWrt
  • uhttpd
  • curl
  • lua
  • Lua-модуль luci.jsonc
  • sha256sum, uci, mktemp (обычно BusyBox/OpenWrt base)

Установка

install -m 0755 vtime-sub /www/cgi-bin/vtime-sub
install -m 0755 vtime-json-to-links.lua /usr/libexec/vtime-json-to-links.lua
cp examples/vtime_subproxy /etc/config/vtime_subproxy

В /etc/config/vtime_subproxy указывается имя секции Passwall2:

config proxy 'main'
    option source_section 'subscription_section_name'

В соответствующей секции /etc/config/passwall2 должны находиться локальные секретные параметры:

config subscribe_list 'subscription_section_name'
    option vtime_upstream_url 'https://provider.example/private-subscription-url'
    option vtime_upstream_user_agent 'Mozilla/5.0'

Реальный URL подписки нельзя коммитить в Git.

Использование

Локально на роутере:

curl http://127.0.0.1/cgi-bin/vtime-sub

Passwall2 должен использовать локальный URL CGI. Прямой сетевой доступ CGI намеренно возвращает 403 Forbidden.

Поддерживаемые варианты

Преобразователь ожидает непустой JSON-массив Xray-конфигураций с первым outbound типа VLESS. Поддерживаются transport:

  • TCP → type=raw
  • SplitHTTP → type=xhttp
  • WebSocket
  • gRPC

Переносятся основные TLS/REALITY параметры, включая SNI, fingerprint, ALPN, public key и short ID.

Безопасность

  • CGI не содержит и не публикует URL подписки.
  • Секреты остаются в UCI-конфигурации роутера.
  • Endpoint доступен только через loopback.
  • Ответ не кэшируется.

Лицензия

MIT.