wswg/README.md

147 lines
12 KiB
Markdown
Raw Permalink 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.

# wswg
Простой менеджер WireGuard + wstunnel. Один статический Go-бинарник, встроенный
GUI без JS-фреймворков и терминальное меню. GUI открывается в локальном браузере,
не требует GTK, Qt, WebView или интернета. Закрытие вкладки не останавливает VPN;
для отключения нажмите Disconnect или завершите процесс Ctrl+C.
## Запуск
Распакуйте **весь** ZIP, сохраняя папки `bin/` и `redist/` рядом с программой.
```sh
./wswg # DISPLAY/WAYLAND_DISPLAY: GUI, иначе TUI; Windows: GUI
./wswg -t # принудительно TUI
./wswg -g # принудительно GUI
./wswg -c 1 # подключить первый конфиг, обновлять строку статуса
./wswg -c 'Home' # подключить по имени
./wswg -a # подключить последний успешно использованный конфиг
./wswg -a -d # то же в фоне
./wswg -c 1 -d # конкретный конфиг в фоне
./wswg -a --no-wstunnel # последний конфиг напрямую, не меняя сохранённые настройки
./wswg -c Home -d --no-wstunnel # тот же временный override для демона
./wswg --data-dir /path # отдельное хранилище
```
Короткие флаги имеют длинные варианты: `--tui`, `--gui`, `--config`, `--auto`,
`--daemon`. `-d` без `-a` или `-c` считается ошибкой. `--no-wstunnel` требует `-a` или `-c`, действует на один запуск и не сохраняет
изменение в профиль. `-t` и `-g` несовместимы.
`-a` и `-c` запускают подключение со строкой статуса вместо меню.
Нужны root на Linux/Android и Administrator на Windows. Запускайте приложение
сразу с этими правами. Хранилище по умолчанию: `os.UserConfigDir()/wswg`, обычно
`~/.config/wswg` на Linux, `%AppData%\wswg` на Windows. При запуске через sudo
укажите `--data-dir`, чтобы использовать ту же папку. Конфиги содержат приватные
ключи и сохраняются с правами 0600, каталог 0700. На Windows доступ регулирует
ACL пользовательского профиля, не кладите data-dir в общедоступную папку.
## Конфиги и интерфейс
New → вставить WireGuard-конфиг → Save → Connect. Редактирование и удаление
подключённого профиля запрещено. WireGuard-конфиги с PreUp, PostUp, PreDown,
PostDown и SaveConfig не поддерживаются: приложение не исполняет конфиги как код.
Сохранённый оригинал не меняется при подключении. Галочка DNS определяет,
попадёт ли DNS в рабочую копию.
В TUI выберите номер профиля, затем номер операции. WireGuard открывается через
`$EDITOR`, иначе `nano`. Допускаются аргументы и путь в кавычках, например
`EDITOR='"/path with spaces/editor" --wait'`. После подключения статус обновляется
в одной строке. Enter возвращает в меню, соединение остаётся активным.
Статус: адрес сервера, возраст последнего WireGuard-handshake в секундах,
ICMP ping, `Packet loss: N%`. Один ICMP-запрос в секунду с таймаутом 950 мс;
процент округляется до ближайшего целого по последним 100 попыткам. До 100
попыток используются имеющиеся результаты. Окно сбрасывается при подключении.
Если сервер блокирует ICMP, потеря будет 100%, даже если VPN работает.
`Connected` означает поднятый интерфейс; успешный handshake показывается отдельно.
## wstunnel
Поле IP/host задаёт адрес **wstunnel-сервера**. Пустое поле берёт host из WG
Endpoint. Порт по умолчанию 443. HTTPS включает `wss://`, выключенный переключатель
использует `ws://`. Как в стандартном wstunnel, допускаются self-signed TLS
сертификаты; аутентификацию VPN обеспечивает ключ WireGuard. На сервере должен быть запущен wstunnel, например:
```sh
wstunnel server --restrict-to 127.0.0.1:51820 wss://0.0.0.0:443
```
UDP на серверной стороне направляется на `127.0.0.1:<порт исходного WG Endpoint>`.
То есть wstunnel и WireGuard должны находиться на одной машине или в одном
сетевом namespace. Режим wstunnel поддерживает один Peer на профиль. На клиенте
Endpoint временно заменяется на локальный UDP-порт. До подъёма WG добавляется
отдельный маршрут до wstunnel, после отключения удаляются только маршруты,
созданные приложением. Для доменного имени сохраняются TLS SNI и HTTP Host.
При проблемах с MTU попробуйте `MTU = 1280` в секции Interface.
## Системные требования
* Linux: ядро с WireGuard, `bash`, `iproute2`, `ping`, `nft` либо `iptables` для
полного туннеля. Для включённого DNS нужен `resolvconf`. `wg` и `wg-quick`
включены в архив. Пример для Debian: `apt install iproute2 iputils-ping
nftables openresolv bash`. Root без сетевых capabilities в контейнере не хватит.
* Windows: Administrator. Официальные `wireguard.exe` и `wg.exe` включены в архив;
WireGuard устанавливает подписанный драйвер через tunnel service. В `redist/`
лежит VC++ Redistributable своей архитектуры. При коде отсутствующей runtime
0xC0000135/0xC000007B он устанавливается автоматически и запуск повторяется
один раз. Другие ошибки не запускают установку. Сам Go-бинарник не требует VC++.
* Termux: root и Android-ядро с WireGuard. `pkg install bash iproute2 nano
iputils`. Статические Linux ELF для ARMv7 и ARM64 не требуют Bionic/NDK.
Запускайте из Termux через root-окружение с сохранением PATH, например
`su -c 'PATH=/data/data/com.termux/files/usr/bin:/system/bin /полный/путь/wswg -t --data-dir /полный/путь/data'`.
В Android нет обычного resolvconf: отключите DNS из конфига и настройте DNS
средствами системы. Доступность маршрутов и root зависит от прошивки. Для
надёжности в Termux используйте числовые IP, Linux resolver не использует Android DNS API.
Процесс должен работать всё время подключения. Ctrl+C/SIGTERM отключает туннель,
останавливает wstunnel и удаляет временный конфиг. SIGKILL/отключение питания не
дают выполнить очистку; при необходимости удалите интерфейс командой
`bin/wg-quick down <data-dir>/wswg0.conf` или удалите Windows tunnel service.
Параллельные подключения не поддерживаются, интерфейс называется `wswg0`.
Фоновый процесс пишет в `daemon.log`; его PID выводится при запуске. Для остановки
используйте `kill <PID>` на Linux или завершите процесс Windows.
## Автозапуск
* Autorun в GUI автоматически подключает последний профиль при следующем
обычном запуске GUI. Флаг `-a` действует независимо от этой галочки.
* On boot на Linux создаёт `/etc/systemd/system/wswg.service`, включает его
через `systemctl enable` и запускает приложение с `-a`. Нужен работающий
systemd. Файлы программы и data-dir должны оставаться на постоянном месте.
* В Windows On boot создаёт задачу `wswg` в Task Scheduler от SYSTEM с ONSTART.
* В TUI Settings содержит только On boot. На системах без systemd настройка
возвращает ошибку и не записывает фиктивное состояние.
* Сначала подключите профиль вручную, чтобы сохранить последний выбор. On boot
вступает в силу при следующей загрузке. Выключение галочки отменяет будущий
автозапуск, текущую сессию можно отключить кнопкой Disconnect.
## Сборка
Go 1.24+, Python 3.11+, make, gcc, cross GCC для arm-linux-gnueabi,
arm-linux-gnueabihf и aarch64-linux-gnu, 32-битные заголовки gcc, `msiextract`.
На Debian: `apt install --no-install-recommends build-essential gcc-arm-linux-gnueabi
gcc-arm-linux-gnueabihf gcc-aarch64-linux-gnu libc6-dev-i386 lib32gcc-12-dev msitools`.
```sh
./scripts/build.sh
# Только приложение, без загрузки и сборки сторонних инструментов:
SKIP_BUNDLE=1 ./scripts/build.sh
# После осознанного обновления зависимостей, записать новые SHA-256:
UPDATE_LOCK=1 ./scripts/build.sh
# На сервере с уже настроенным html_plans.t.snw.su:
python3 scripts/publish.py 0.1.0
```
`dist/` содержит папки и ZIP для Linux amd64, 386, ARMv6, ARMv7, ARM64;
Windows amd64, x86, ARM64; Termux ARMv7, ARM64. ARMv8 здесь ARM64. Windows
ARM32 не поддерживается Go. `wswg-all.zip` содержит все платформенные ZIP,
`SHA256SUMS` позволяет проверить целостность. Бинарники Go и Linux wg статические,
wstunnel берётся из официальных Linux-сборок и проверяется по upstream checksums.
Библиотеки системных утилит и браузер принадлежат ОС, они не встраиваются.
```sh
go test -race ./...
go vet ./...
# Необязательный локальный тест настоящего handshake, нужны root/CAP_NET_ADMIN:
sudo python3 scripts/integration.py
```