sources/de-vds-3xui-setup-2026-07-14.md (new) — session chronicle capturing
the 3x-ui 3.5.0 troubleshooting: login 403 = CSRFMiddleware (X-CSRF-Token,
GET {BP}csrf-token), direct DB insert into inbounds no longer renders
(client model split across clients/client_inbounds/client_traffics → use
panel API add with stringified settings), wrapper `x-ui setting` doesn't
persist creds (binary only). Reference JSON lifted from working nl-vds 32030.
Entity sources: bound. +index.md sources line, +log.md ingest entry.
gitignore: .tmp/ (cred-bearing local throwaway, like .scratch/) and
.tasks/.lock (runtime). .tmp/ removed from disk.
Co-Authored-By: Claude <noreply@anthropic.com>
74 lines
7.4 KiB
Markdown
74 lines
7.4 KiB
Markdown
---
|
||
title: DE VDS 3x-UI — setup session 2026-07-14
|
||
type: source
|
||
tags: [vless, germany, fornex, 3x-ui, csrf, troubleshooting, session]
|
||
ingested: 2026-07-14
|
||
raw_path: (live session, no raw file)
|
||
sources: []
|
||
updated: 2026-07-14
|
||
---
|
||
|
||
# DE VDS 3x-UI — сессия настройки 2026-07-14
|
||
|
||
Хроника заведения прокси-VDS [`de-vds-3xui`](../entities/de-vds-3xui.md) (Fornex, Германия). Аналог [`nl-vds-3xui`](../entities/nl-vds-3xui.md) — повторены **только proven-working** решения, маскированные протоколы НЕ поднимались.
|
||
|
||
## Закуп / стартовая точка
|
||
|
||
Заказ: VPS Custom 1-2-20, Ubuntu 24.04, без панели, Германия, 300 Мбит/с, 1 vCPU / 2 ГБ / 20 ГБ NVMe. Провайдер по факту — **Fornex** (`335555.fornex.cloud`), IP `130.17.17.158`. Свежая машина: только `:22`, ufw inactive, swap 0. Креды → `pass de-vds-3xui/full-env` (host-key `SHA256:1AQ5…cmdE`).
|
||
|
||
Подход (по урокам NL-сессии [`nl-vds-3xui-setup-2026-06-05`](nl-vds-3xui-setup-2026-06-05.md)):
|
||
- только plain VLESS `security=none` (Reality/MTProto/SOCKS5 у боевых клиентов из РФ не заработали);
|
||
- проверять на реальном клиенте, не на своих curl-тестах ([`proxy-debugging-test-the-real-client`](../concepts/proxy-debugging-test-the-real-client.md));
|
||
- креды сразу в `pass`.
|
||
|
||
## Что сделано
|
||
|
||
1. **Recon + `pass`.** SSH через `plink -m <script>` (инлайн-кавычки PowerShell корёжит — тот же урок, что на NL). Креды в `pass de-vds-3xui/full-env`.
|
||
2. **Установка 3x-ui v3.5.0** официальным `install.sh` (нативный systemd, плюс автоставка fail2ban `3x-ipl`). v3.5.0 **автогенерит** рандомные panel user/pass/port/webBasePath (`hasDefaultCredential:false`) — лучше старых версий, НО plaintext пароля недоступен (bcrypt).
|
||
3. **Panel-креды перевыставлены** на свои (random user/pass) — см. гоча ниже про wrapper.
|
||
4. **Plain VLESS 32030** `security=none` создан — см. ниже, не напрямую, а через panel API (борьба с 3.5.0).
|
||
5. **Server-side e2e:** xray-клиент на сервере → 32030 → exit = IP сервера (IPv4 `130.17.17.158`, IPv6 `2a02:6b40:2000:3505::1`).
|
||
6. **Real-client из РФ — подтверждён:** user подключён через этот узел прямо во время сессии. ✅
|
||
|
||
## Борьба с 3x-ui 3.5.0 (главное знание сессии)
|
||
|
||
На NL стояла 3.2.7; тут 3.5.0, и API/DB-модель поменялись. Это и заняло основное время.
|
||
|
||
### Гоча 1 — login 403 (CSRF, не креды)
|
||
|
||
`POST {webBasePath}login` возвращал `403 Forbidden` с **пустым телом** + CSP-nonce заголовками. Выглядело как «битые креды», но:
|
||
- `/login` → 404 (роут только под `webBasePath`);
|
||
- `{BP}login` → 403 (роут есть, но режется middleware);
|
||
- x-ui лог молчит (запрос до хендлера не доходит);
|
||
- Referer/Origin/UA/X-Requested-With — не помогали.
|
||
|
||
**Root cause** (найден через source на GitHub): `internal/web/middleware/security.go` → `CSRFMiddleware` — на всех unsafe-методах (POST) без валидного CSRF-токена → `c.AbortWithStatus(403)` (пустое тело, а SecurityHeaders уже навесил CSP). Логин-хендлер тут **ни при чём** (он даже при неудаче отдаёт 200+JSON). Токен: `GET {webBasePath}csrf-token` (публичный, кладёт `CSRF_TOKEN` в session-cookie) → вернуть тем же заголовком `X-CSRF-Token`.
|
||
|
||
### Гоча 2 — прямой INSERT в `inbounds` не рендерит инбаунд
|
||
|
||
Первые две попытки — `INSERT INTO inbounds ...` с валидным JSON (вторая — с эталонным `settings`/`stream_settings`/`sniffing`, **скопированным 1:1 с рабочего nl-vds 32030**). x-ui стартовал, логировал `Normalized sub_sort_index on 1 inbound(s)`, но в `/usr/local/x-ui/bin/config.json` инбаунд **не попадал**, xray `:32030` не слушал. Никакой ошибки в логе.
|
||
|
||
**Root cause:** в 3.5.0 клиентская модель разнесена по таблицам `clients` / `client_inbounds` / `client_traffics`; эти записи заполняются **только сервисом `AddInbound`** (пути panel API/UI), а не raw-SQL. Инбаунд без клиентских строк x-ui в xray-конфиг не рендерит.
|
||
|
||
**Лекарство:** panel API `POST {BP}panel/api/inbounds/add` — body = `model.Inbound` (camelCase: `remark,enable,port,protocol,listen,tag,settings,streamSettings,sniffing,shareAddrStrategy,...`), причём `settings`/`streamSettings`/`sniffing` — **stringified JSON** (строки, не вложенные объекты). После API-add xray сразу начал слушать 32030 (3.5.0 hot-applies к работающему xray), а после `x-ui restart` — конфиг персистентен.
|
||
|
||
### Гоча 3 — wrapper `x-ui setting` не применяет креды
|
||
|
||
`x-ui setting -username … -password …` (shell-wrapper) печатает меню, но `users`-таблицу **не меняет** → логин падает «Invalid username or password». Работает только бинарник напрямую: `systemctl stop x-ui; /usr/local/x-ui/x-ui setting -username … -password …` → «Username and password updated successfully».
|
||
|
||
### Эталон JSON (снят с рабочего nl-vds 32030)
|
||
|
||
- `settings` (vless): `{"clients":[{auth,comment,created_at,email,enable,expiryTime,id(uuid),limitIp,password,reset,security:"auto",subId,tgId,totalGB,updated_at}], "decryption":"none","encryption":"none","testseed":[900,500,900,256]}`
|
||
- `streamSettings`: `{"network":"tcp","tcpSettings":{"acceptProxyProtocol":false,"header":{"type":"none"}},"security":"none"}` — **`tcpSettings`, не `tcp`**, с `header.type:none`.
|
||
- `sniffing`: `{"enabled":false}` (простой, без `destOverride`).
|
||
|
||
## Рабочее решение для друзей
|
||
|
||
`vless://f3a0dda0-947b-4a11-b3f5-ca973640f843@130.17.17.158:32030?type=tcp&security=none&encryption=none#de-vless-32030` — Hiddify/v2rayN/v2rayNG. При включённом VPN в Telegram прокси не настраивать. Ключи/uuid — `pass de-vds-3xui/full-env`.
|
||
|
||
## Открытые хвосты
|
||
|
||
- **Per-friend UUID** (сейчас один — `vitya`): заводить через панель при раздаче, для возможности отзыва.
|
||
- **DPI-стойкий канал** (не plain VLESS) — отдельная нерешённая задача (на NL Reality у боевых клиентов так и не поднялся).
|
||
- **Panel на http:37601** — random path + fail2ban компенсируют; при желании — SSH-tunnel-only или LE-серт (опция 20 меню).
|
||
- **Бэкап `x-ui.db`** в pipeline (как `backup-inventory-2026-06` для nl-vds) — не заведён. |