montana/Монтана-Протокол/Код/montana-vpn/docs/client-config.md

163 lines
6.4 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.

# Client config — формат VLESS URL и параметры
Полная разборка строки `vless://...` которую `install.sh` выдаёт оператору, и как её настроить вручную если нужно.
## Формат URL
```
vless://{UUID}@{HOST}:{PORT}?{params}#{label}
```
Реальный пример с обезличенными значениями:
```
vless://e6d355e2-2d79-4c96-a373-3b0e6b6f4b0d@91.132.142.42:443?encryption=none&flow=xtls-rprx-vision&security=reality&sni=www.googletagmanager.com&fp=chrome&pbk=AbCdEfGhIjKlMnOpQrStUvWxYz1234567890&sid=302805bc0c25e504&type=tcp#montana-vpn
```
Разбор полей:
| Поле | Значение | Что делает |
|---|---|---|
| `UUID` | `e6d355e2-2d79-4c96-a373-3b0e6b6f4b0d` | Authentication-токен клиента. Совпадает с `clients[].id` в xray config |
| `HOST` | `91.132.142.42` | Public IP сервера (либо domain если есть) |
| `PORT` | `443` | TCP порт сервера |
| `encryption=none` | none | VLESS не имеет своей encryption — она в Reality (TLS 1.3) |
| `flow=xtls-rprx-vision` | vision | Optimization после handshake — без TLS-in-TLS overhead |
| `security=reality` | reality | TLS-stealing handshake (vs `tls` для обычного TLS, `none` для plain) |
| `sni=www.googletagmanager.com` | dest | SNI который клиент шлёт в TLS ClientHello — должен совпадать с `dest` сервера |
| `fp=chrome` | chrome | uTLS fingerprint — точная репликация Chrome 124 ClientHello |
| `pbk=...` | publicKey | Reality public key — клиент использует для derive shared secret |
| `sid=302805bc0c25e504` | shortId | 8-байтовый идентификатор подключения. Серверу разрешено иметь несколько SID, клиент выбирает один |
| `type=tcp` | tcp | Transport-protocol (vs `ws` websocket, `grpc`) |
| `label` | `montana-vpn` | Локальное имя в клиенте (отображается, не передаётся серверу) |
## Что обязательно совпасть между клиентом и сервером
Сервер хранит:
- `clients[].id` (UUID) — должен совпасть с `UUID` клиента
- `realitySettings.privateKey` — sk соответствующий клиентскому `pbk`
- `realitySettings.shortIds[]` — должен содержать клиентский `sid`
- `realitySettings.serverNames[]` — должен содержать клиентский `sni`
- `realitySettings.dest` — куда сервер прокси handshake; **не** видно клиенту, но должно соответствовать `sni`
Любое расхождение → handshake fail, клиент подключиться не сможет.
## Ручная настройка клиента (если URL потерян)
### v2rayN (Windows)
1. Servers → Add → VLESS
2. Address: `91.132.142.42`, Port: `443`
3. UUID: твой клиентский UUID
4. Flow: `xtls-rprx-vision`
5. Network: `tcp`
6. Security: `reality`
7. SNI: `www.googletagmanager.com`
8. Fingerprint: `chrome`
9. PublicKey: `pbk` из URL
10. ShortId: `sid` из URL
### v2rayNG (Android)
Меню → Импорт из буфера → вставить VLESS URL. Готово.
### Hiddify (cross-platform)
Импорт по ссылке либо QR-коду. Hiddify сам распарсит URL.
### CLI xray (сервер-как-клиент / Linux)
`/etc/xray/client-config.json`:
```json
{
"log": { "loglevel": "warning" },
"inbounds": [
{
"tag": "socks-in",
"port": 1080,
"listen": "127.0.0.1",
"protocol": "socks",
"settings": { "auth": "noauth", "udp": true }
}
],
"outbounds": [
{
"tag": "reality-out",
"protocol": "vless",
"settings": {
"vnext": [{
"address": "91.132.142.42",
"port": 443,
"users": [{
"id": "e6d355e2-2d79-4c96-a373-3b0e6b6f4b0d",
"encryption": "none",
"flow": "xtls-rprx-vision"
}]
}]
},
"streamSettings": {
"network": "tcp",
"security": "reality",
"realitySettings": {
"show": false,
"fingerprint": "chrome",
"serverName": "www.googletagmanager.com",
"publicKey": "AbCdEfGhIjKlMnOpQrStUvWxYz1234567890",
"shortId": "302805bc0c25e504",
"spiderX": ""
}
}
}
]
}
```
Запустить:
```bash
xray run -config /etc/xray/client-config.json
```
Поднимет SOCKS5 прокси на `127.0.0.1:1080`. Браузер / приложение конфигурировать на этот SOCKS5.
## QR-код для мобильных
```bash
echo "vless://...полный URL..." | qrencode -t ANSIUTF8
```
(требует `qrencode` пакет: `apt install qrencode`)
Либо онлайн (опасно, URL утечёт): не рекомендуется.
## Безопасность доставки конфига
VLESS URL содержит **полный credential**. Кто его получил → имеет доступ к VPN. Передавать **только** через:
- Signal (E2E шифрование)
- Threema (no-phone-number, E2E)
- ProtonMail с PGP (если получатель имеет PGP ключ)
- Локальная QR-передача (показ экрана при личной встрече)
**Не использовать:**
- Telegram (есть unencrypted history с ключевыми словами)
- WhatsApp (E2E но Meta-controlled, метаданные у Meta)
- Email plaintext
- SMS
- Slack/Discord/любой коммерческий мессенджер с server-side history
## Проверка работы
После настройки клиента и подключения:
```bash
# IP должен показать сервер VPN, не реальный IP клиента
curl https://api.ipify.org
# DNS должен идти через VPN (проверка leak)
curl https://1.1.1.1/cdn-cgi/trace
```
Если оба показывают сервер VPN — работает. Если `curl ipify` показывает VPN-IP, а DNS leak показывает домашнего провайдера — DNS leak, нужно править клиентский config.