Files
admin/.wiki/sources/de-vds-3xui-setup-2026-07-14.md
vitya a02c4b86a2 wiki: ingest de-vds-3xui source chronicle + gitignore .tmp/.tasks/.lock
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>
2026-07-14 15:01:26 +03:00

7.4 KiB
Raw Blame History

title, type, tags, ingested, raw_path, sources, updated
title type tags ingested raw_path sources updated
DE VDS 3x-UI — setup session 2026-07-14 source
vless
germany
fornex
3x-ui
csrf
troubleshooting
session
2026-07-14 (live session, no raw file)
2026-07-14

DE VDS 3x-UI — сессия настройки 2026-07-14

Хроника заведения прокси-VDS de-vds-3xui (Fornex, Германия). Аналог nl-vds-3xui — повторены только 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):

  • только plain VLESS security=none (Reality/MTProto/SOCKS5 у боевых клиентов из РФ не заработали);
  • проверять на реальном клиенте, не на своих curl-тестах (proxy-debugging-test-the-real-client);
  • креды сразу в 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.goCSRFMiddleware — на всех 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/sniffingstringified 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) — не заведён.