English | فارسی | العربية | 中文 | Español | Русский | Türkçe
این پروژه، یک نسخهی ارتقایافته از پنل 3X-UI (نسخهی 2.9.3) هستش. هدف این پروژه اضافه کردن پروتکل های مختلف و راه اندازی بصورت یک پنل جامعه با پشتیبانی از قابلیت های Xray-core هستش
- PPTP
- L2TP (RAW)
- L2TP/IPsec
- OpenVPN
- OpenConnect (cisco)
- SSTP
- IKEv2
- WireGuard (C)
- AmneziaWG (نسخهی مبهمسازیشدهی WireGuard)
- GRE (تونلهای site-to-site بین روترها، در صورت نیاز روی IPsec)
- MTProto Proxy (Telegram)
- SSH
-
چند مدیره با دسترسی جداگانه به هر Inbound، هر مدیر فقط Inbound هایی را میبیند که به او دادهاید
-
حسابهای نماینده با اعتبار ترافیک که مدیر آن را شارژ میکند و فقط روی Inbound های دادهشده خرج میشود
-
قابلیت Client to Client حتی بصورت Cross Inbound (اتصال داخلی کاربر L2TP به کاربر OpenVPN)
-
اضافهشدن Encryption های AES-256-GCM و AES-128-GCM به پروتکل Shadowsocks
-
پشتیبانی از XHTTP Object در Inbound و Outbound
-
اسکریپت نصب خودکار WARP-CLI (نسخهی رسمی Cloudflare)
-
هستهی Xray-core پچشده برای رفع خطای «Unsupported Cipher» در پروتکل Shadowsocks
-
باندلشدن همهی فایلها (Geofile، Xray-core و هستههای Backend) داخل یک فایل باینریِ واحد
-
خروجی گرفتن لینک اکانت ها بصورت TXT و PDF
-
قابلیت Freez کردن اکانت هات
-
اضافه شدن checkbox به کلاینت و Inbound ها
-
قابلیت Bulk Operation:
- تغییر گروهی حجم اکانت ها
- تغییر گروهی روز اکانت ها
- فعال سازی/غیر فعال سازی گروهی اکانت ها
- حذف گروهی اکانت ها
- حذف گروهی Inbound ها
- قابلیت Freez/Un-Freez کردن گروهی اکانت ها
| توزیع | نسخه | نسخه | |
|---|---|---|---|
| Ubuntu | 24.04 |
26.04 |
|
| Debian | 12 |
13 |
|
| Fedora | 43 |
44 |
|
| AlmaLinux | 9 |
10 |
|
| Rocky Linux | 9 |
10 |
|
| CentOS Stream | 9 |
10 |
|
| Arch Linux | Rolling |
Important
پیشنهاد میشه حتماً پنل رو روی سیستمعاملهای تستشده نصب کنید؛ چون احتمال اینکه هستههای جدید روی بقیهی سیستمعاملها درست کار نکنن بالاست!
Note
پروتکل AmneziaWG فقط روی Debian 12/13 و Ubuntu 24.04/26.04 کار میکنه.
برخلاف بقیهی پروتکلها، AmneziaWG توی هستهی هیچ توزیعی نیست: پنل موقع راهاندازی، ماژول هستهاش رو روی سرور خودتون کامپایل میکنه. این ماژول فعلاً توی دو حالت بیلد نمیشه. روی هستهی 7.1 و بالاتر (Fedora 43/44 و Arch) هسته سمبل ipv6_stub رو که ماژول هنوز ازش استفاده میکنه حذف کرده. روی AlmaLinux، Rocky Linux و CentOS Stream هم هستههای بکپورتشدهی RHEL با لایهی سازگاری ماژول تداخل دارن و EL10 اصلاً براش شناختهشده نیست. هر دوی اینها محدودیت خودِ ماژول AmneziaWG هستن و رفعشون هنوز سمت پروژهی اصلی بازه، پس چیزی نیست که پنل بتونه با تنظیمات دورش بزنه.
فرایند راهاندازی این رو تشخیص میده و بهتون خبر میده، بهجای اینکه بیصدا شکست بخوره. بقیهی پروتکلها روی همهی سیستمعاملهای تستشده بهطور عادی کار میکنن.
curl -Ls https://raw.githubusercontent.com/Sir-MmD/vpn-ui/refs/heads/main/deploy.sh | sudo bashsudo /opt/vpn-ui/vpn-ui-amd64 --uninstallNote
مسیر دیتابیس، سرویس systemd و همهی پورتهای پیشفرض تغییر کردهاند، پس میتونید این پنل رو بدون هیچ مشکلی کنار پنلهای دیگهتون نصب کنید.
flowchart TB
Client["VPN Client<br/>(L2TP/IPsec · PPTP · OpenVPN · OpenConnect · SSTP · IKEv2 · WireGuard (C) · AmneziaWG)"]
TGC["Telegram Client<br/>(MTProto Proxy)"]
SSHC["SSH Client<br/>(ssh -D dynamic SOCKS · badvpn-udpgw for UDP)"]
GREC["Customer Router<br/>(GRE · IP protocol 47 · optional IPsec / FOU)"]
subgraph PANEL["vpn-ui panel — root process"]
PROC["procmgr<br/>supervises the daemons"]
RAD["in-binary RADIUS<br/>127.0.0.1:1812 auth · :1813 acct"]
HOOK["OpenVPN hooks<br/>auth / connect / disconnect / evict"]
CONF["writes Xray config:<br/>dokodemo-door inbound +<br/>per-account source-IP routing"]
STAT["reads Xray stats (gRPC)<br/>enforces traffic / device limits"]
SSHSRV["in-binary SSH gateway (x/crypto/ssh)<br/>no daemon, no bundle: direct-tcpip + udpgw"]
end
subgraph DAEMON["Bundled VPN daemons (panel children)"]
D["xl2tpd + strongSwan/charon · pptpd · openvpn · ocserv · accel-ppp<br/>(pppd for L2TP/PPTP · accel-ppp for SSTP · charon for IKEv2 and GRE-over-IPsec)"]
MT["telemt (MTProto Proxy)<br/>userspace relay: no tunnel, no pool IP"]
end
subgraph KERNEL["Linux kernel data plane"]
IFACE["ppp0 / tun0 / wgc0 / awg0 / gre-*<br/>client is assigned a pool IP"]
NFT["nftables mark:<br/>UDP → TPROXY · TCP → REDIRECT"]
RULE["ip rule fwmark 1 → table 100"]
end
subgraph XRAY["Xray-core (bundled, panel-managed)"]
DOKO["dokodemo-door inbound<br/>sockopt tproxy, mark 255"]
SOCKS["socks inbound (loopback)<br/>tag = MTProto / SSH inbound<br/>username = account"]
ROUTE{"routing:<br/>match source IP → account<br/>or socks username → account"}
OUT["outbound<br/>freedom / proxy / WARP"]
end
NET["Internet"]
%% control plane
Client -->|"tunnel + credentials"| D
Client -.->|"WireGuard (C): in-kernel wgc, no daemon"| IFACE
Client -.->|"AmneziaWG: in-kernel awg (DKMS module), no daemon<br/>obfuscated handshake: Jc/Jmin/Jmax · S1/S2 · H1-H4"| IFACE
GREC -.->|"GRE: in-kernel tunnel, no daemon and no credentials<br/>peer pinned by its public IP, or learned from its first packets<br/>optional ESP transport on the shared charon · FOU for peers behind NAT"| IFACE
TGC -->|"obfuscated2 / dd / FakeTLS secret"| MT
SSHC -->|"username + password (checked in-process, no RADIUS)"| SSHSRV
D -.->|"MS-CHAPv2 Access-Request"| RAD
RAD -.->|"Accept + pool IP"| D
D -.->|"user-pass / client-connect"| HOOK
HOOK -.->|"lease per-account IP"| D
PROC --- D
CONF --> DOKO
CONF --> ROUTE
%% data plane
D -->|"decapsulated packets"| IFACE
IFACE --> NFT --> RULE --> DOKO
DOKO --> ROUTE --> OUT --> NET
MT -->|"relayed TCP, socks user = account"| SOCKS
SSHSRV -->|"direct-tcpip → socks CONNECT · udpgw → socks UDP ASSOCIATE<br/>socks user = account"| SOCKS
SOCKS --> ROUTE
%% accounting + return
OUT -.->|"per-account counters"| STAT
MT -.->|"per-account octets (Prometheus scrape)"| STAT
SSHSRV -.->|"per-account octets (in-process counters)"| STAT
STAT -.->|"disconnect over-limit"| RAD
NET -.->|"replies (symmetric path back)"| OUT
برای دو پروتکل tunnel مبتنی بر کلید، یعنی WireGuard (C) و AmneziaWG، مقدار K در User Limit به هر اکانت تعداد K جای دستگاه میدهد: K جفتکلید، K فایل config و K آدرس IP متفاوت داخل tunnel، یعنی برای هر دستگاه یک config جداگانه. این همان مدلی است که سرویسهای تجاری استفاده میکنند و باعث میشود یک اکانت همزمان روی موبایل، لپتاپ و روتر کار کند، بدون اینکه دستگاهها سر یک کلید با هم تداخل پیدا کنند.
flowchart TB
subgraph SRC["Non-RADIUS protocols (public-key / certificate auth, no RADIUS round-trip)"]
WG["WireGuard (C)<br/>in-kernel, wgctrl-managed"]
AWG["AmneziaWG<br/>in-kernel amneziawg (DKMS), obfuscated"]
IKE["IKEv2 PSK / EAP-TLS<br/>strongSwan charon"]
end
subgraph BRIDGE["RBridge, the Radius Bridge (one pass per traffic tick)"]
SWEEP["Sweeper.Tick()"]
P1["1 · Poll live tunnels via each Adapter"]
P2["2 · Enforce quota + disable<br/>+ User-Limit K + strategy"]
P3["3 · Reconcile survivors into the Sink"]
end
subgraph SINK["Sink, the existing RADIUS session model"]
REG["in-binary RADIUS<br/>session registry"]
ACCT["nftables per-account counters<br/>→ client_traffics (usage / quota)"]
end
XRAY["Xray-core<br/>source-IP routing → outbound → Internet"]
%% control plane
WG -.->|"peers + last-handshake"| P1
AWG -.->|"peers + last-handshake"| P1
IKE -.->|"active SAs + Framed-IP"| P1
SWEEP --> P1 --> P2 --> P3
P2 -.->|"evict: remove peer / terminate SA"| WG
P2 -.->|"evict: remove peer"| AWG
P2 -.->|"evict: terminate SA"| IKE
P3 -->|"tunnel IP → account"| REG
P3 -->|"add / remove counters"| ACCT
ACCT -.->|"disabled / over-quota"| P2
%% data plane
WG ==> XRAY
AWG ==> XRAY
IKE ==> XRAY
ACCT -.- XRAY
git clone https://github.com/Sir-MmD/vpn-ui.git && cd vpn-ui
./build.shیک تست E2E کامل با Python داخل فولدر test_unit برای این پروژه طراحی شده که میتونید ازش استفاده کنید. مراحلش اینطوریه:
- وارد فولدر
test_unitبشید و تنظیمات دلخواهتون رو تویconfig.tomlوارد کنید. - اسکریپت
setup.shرو اجرا کنید. - فایل باینریِ کامپایلشده رو داخل فولدر
test_subjectقرار بدید. run.shرو با دسترسیsudoاجرا کنید.
Important
تست کامل E2E بهشدت زمانبره؛ اگه فقط یه تغییر کوچیک توی پروژه دادید، بهتره با سویچ --tests فقط همون بخش رو تست کنید:
| Test ID | Description |
|---|---|
core-init |
provision kernel modules + packages + xray core |
server-setup |
create inbounds + accounts + source-IP routing rules |
openvpn |
connect variants + checks + peer reachability (OpenVPN) |
l2tp |
connect variants + checks + peer reachability (L2TP/IPsec) |
pptp |
connect variants + checks + peer reachability (PPTP) |
openconnect |
connect variants + checks + peer reachability + same-NAT user-limit (OpenConnect/ocserv) |
sstp |
connect variants + checks + peer reachability (SSTP/accel-ppp, PPP-over-TLS) |
ikev2 |
connect + checks + peer reachability (IKEv2/IPsec, strongSwan charon; eap-mschapv2 + psk + eap-tls) |
wg-c |
connect + checks + peer reachability + per-account usage/termination (WireGuard C, in-kernel wgctrl, gateway /29, + preshared-key mode) |
awg |
connect + checks + peer reachability + per-account usage/termination (AmneziaWG, in-kernel amneziawg DKMS module, obfuscation params, + preshared-key mode) |
gre |
connect + checks + peer reachability + per-account usage/termination (GRE site-to-site, in-kernel ip_gre; raw / IPsec / FOU peer modes, static and dynamic peers) |
mtproto |
alias: runs every MTProto phase below (MTProto Proxy, telemt) |
mtproto-classic |
handshake + relay to a real Telegram DC + wrong-secret control + usage (obfuscated2) |
mtproto-secure |
same, "dd" random-padding secret |
mtproto-tls |
same + FakeTLS ServerHello HMAC verified, "ee" secret |
mtproto-toggle |
editing an account's modes takes effect on the RUNNING daemon (no restart) |
mtproto-termination |
quota auto-disables the account AND the proxy stops relaying for it |
mtproto-adtag |
an ad tag forces middle-proxy egress and drops the inbound's Xray routing, and clearing it restores both |
ssh |
connect + checks + routing + user-limit + both strategies + per-account usage/termination (SSH relay, in-binary Go gateway) |
ssh-udp |
UDP through the relay: udpgw terminated in-process and bridged to Xray via SOCKS5 UDP ASSOCIATE, plus accounting |
bulk-ops |
bulk client add/sub/enable/disable + TXT/PDF export via API |
backup-restore |
DB export + import round-trip |
warp-socks |
Cloudflare warp-cli SOCKS install + egress |
random-cfg |
--random switch: randomize port + creds + webpath, then restore |
systemd |
--systemd switch: install + run the panel as a systemd unit |
uninstall |
--uninstall switch: install everything, tear down, assert clean host |
export-js |
host-side Node TXT/PDF export test (no VM) |
برای تست روی فقط یک سیستمعامل خاص هم میتونید از سویچ --only استفاده کنید:
sudo ./run.sh --only ubuntu-24🔹USDC-Polygon: 0xdC2Ab962954e8fA1502C44656c5A32CF2979568C
🔹USDT-BEP20: 0xdC2Ab962954e8fA1502C44656c5A32CF2979568C
🔹USDT-TRC20: TXEhckDXtdLGAjP5PZXfNnQjPHzEVTcBmR
🔹TRX: TXEhckDXtdLGAjP5PZXfNnQjPHzEVTcBmR
🔹LTC: ltc1qmapmnuf6cq9x679nmu0k4uyq779mxxcwnkgdll
🔹BTC: bc1q62w7lyndzndsp74vj4dsayvun8xnapzq6hx5ea
🔹ETH: 0xdC2Ab962954e8fA1502C44656c5A32CF2979568C


