nikovpn_openwrt/README.md
Niko Marmeladkov d4d00aa0e1
on-router install: git clone + ./install.sh
- install.sh работает из клона на роутере: креды из /root/creds
  или env NIKOVPN_CREDS, бинарники качаются с f.n1ko.dev с фолбэком
  на локальный bin/ и versions из репозитория
- README: быстрый старт git.n1ko.dev:Niko/nikovpn_openwrt.git,
  nikovpn.py (SSH-управление с ПК) — как опциональный способ
- .gitignore: bin/ (~150MB) и __pycache__ не коммитятся
2026-08-26 09:44:07 +03:00

103 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# NikoVPN OpenWRT
Установщик VPN для роутеров OpenWRT. Всё выполняется прямо на роутере:
нужны только busybox + wget/curl + nft/iptables (и git один раз — для клонирования).
- Принцип: **sing-box → ipt2socks** (прозрачный прокси для всего LAN).
- sing-box собирается из исходников slim-патчем: только vless (+uTLS, без
reality), hysteria, hysteria2, tuic, naive. vmess/trojan/shadowsocks/ssh/
tor/shadowtls/anytls/tun выпилены, gvisor/wireguard/clash-api/acme/dhcp
не включены. Итог: ~814 MB gz вместо ~1723 MB.
- Креды VPN (`login:password`): `/root/creds` на роутере или env
`NIKOVPN_CREDS`.
## Установка
Прямо на роутере:
```sh
git clone git.n1ko.dev:Niko/nikovpn_openwrt.git
cd nikovpn_openwrt
./install.sh
```
Перед запуском положите креды в `/root/creds`:
```sh
echo 'login:password' > /root/creds
```
Бинарники при установке качаются с f.n1ko.dev (каталог `bin/` ~150 MB
в репозиторий не входит; если он есть рядом с install.sh — берётся из него).
## Команды
| Команда | Что делает |
|---|---|
| `./install.sh` | установка / переустановка |
| `./install.sh update` | обновление бинарников и пересбор сервера |
| `./install.sh status` | статус VPN и трафик |
| `./install.sh uninstall` | удаление |
То же самое через обёртки `status.sh`, `update.sh`, `uninstall.sh`.
## Управление с ПК (опционально)
nikovpn.py делает то же самое по SSH, без git на роутере:
```sh
uv run nikovpn.py --host 192.168.1.1 --creds 'login:password' install
uv run nikovpn.py update | status | uninstall
```
Параметры подключения: `--host` (по умолчанию 192.168.1.1), `--user`,
`--port`, `--password` (нужен sshpass), `--identity`.
## Как это работает
1. Определяется архитектура (`DISTRIB_ARCH``apk``opkg``uname`);
nikovpn.py делает это по SSH.
2. Бинарники качаются с f.n1ko.dev (или заливаются из локального `bin/`,
если он есть).
3. Через API `vpnd.n1ko.dev` получаются ссылки на серверы.
4. Кандидаты перебираются: конфиг поднимается на роутере, туннель
проверяется; файрвол включается только после подтверждения, что
туннель живой (в nikovpn.py проверка сквозная — curl с ПК через
SSH-форвард).
5. Приоритет протоколов: `hysteria2 > tuic > naive > vless > shadowsocks`.
6. Поднимается прозрачный прокси (nft, при отсутствии — iptables) и
init-скрипт `/etc/init.d/nikovpn` (procd).
Типичные параметры — в `/etc/nikovpn/state`, предпочтения можно задать в
`/etc/nikovpn/config` на роутере:
```sh
PREFER_PROTOCOL="tuic" # принудительный протокол
PREFER_SERVER="host.n1ko.dev"
```
DNS (порт 53) всегда идёт в обход прокси; трафик в приватные сети и к самому
роутеру не проксируется.
## Пересборка бинарников
```sh
uv run fetch.py --jobs 4 # все архитектуры
uv run fetch.py --only mipsle # одну
```
Требует go (скачает сам), clang/lld + musl.cc sysroot для naive-архитектур,
zig для loong64. Готовое `bin/` + `versions` заливаются на
f.n1ko.dev/nikovpn_openwrt/.
> **xhttp не поддерживается**: это транспорт Xray-core, в sing-box его нет
> (только v2ray-транспорты tcp/ws/grpc/httpupgrade/quic). VLESS работает
> поверх tcp+tls.
## Отладка
```sh
ssh root@192.168.1.1 sh /etc/nikovpn/install.sh status
ssh root@192.168.1.1 cat /var/log/nikovpn.log
ssh root@192.168.1.1 nft list table inet nikovpn
```