OpenWrt CGI proxy converting VPN Time JSON subscriptions to VLESS URIs
- Lua 69.5%
- Shell 30.5%
| examples | ||
| tests | ||
| LICENSE | ||
| README.md | ||
| vtime-json-to-links.lua | ||
| vtime-sub | ||
vtime-subproxy
Минимальный CGI-прокси для OpenWrt, преобразующий JSON-подписку VPN Time в список стандартных vless:// URI для Passwall2.
Как работает
- CGI доступен только с loopback (
127.0.0.1/::1). - URL и User-Agent upstream-подписки читаются из существующей секции
/etc/config/passwall2. - Запрос получает OpenWrt device headers, требуемые upstream.
- JSON-массив Xray-конфигураций преобразуется в отдельные VLESS URI.
- Ответ отдаётся как
text/plainсCache-Control: no-store.
Требования
- OpenWrt
uhttpdcurllua- 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.