Loading...
Loading...
Compare original and translation side by side
ЧАСТЬ 1: Настройка сервера
Fresh VPS (IP + root + password)
→ Determine execution mode (remote or local)
→ Generate SSH key / setup access
→ Connect as root
→ Update system
→ Create non-root user + sudo
→ Install SSH key
→ TEST new user login (critical!)
→ Firewall (ufw)
→ Kernel hardening
→ Time sync + packages
→ Configure local ~/.ssh/config
→ ✅ Server secured
ЧАСТЬ 2: Установка VPN (3x-ui)
→ Install 3x-ui panel
→ Enable BBR (TCP optimization)
→ Disable ICMP (stealth)
→ Reality: scanner → create inbound → get link
→ Install Hiddify client
→ Verify connection
→ Generate guide file (credentials + instructions)
→ Install fail2ban + lock SSH (after key verified)
→ ✅ VPN working第一部分:服务器配置
全新VPS(IP + root账号 + 密码)
→ 确定执行模式(远程或本地)
→ 生成SSH密钥 / 配置访问权限
→ 以root身份连接服务器
→ 更新系统
→ 创建非root用户并赋予sudo权限
→ 安装SSH密钥
→ 测试新用户登录(至关重要!)
→ 配置防火墙(ufw)
→ 内核加固
→ 时间同步与基础软件包安装
→ 配置本地~/.ssh/config文件
→ ✅ 服务器已安全加固
第二部分:安装VPN(3x-ui)
→ 安装3x-ui面板
→ 启用BBR(TCP优化)
→ 禁用ICMP(隐身模式)
→ Reality:扫描器 → 创建入站规则 → 获取连接链接
→ 安装Hiddify客户端
→ 验证连接有效性
→ 生成指南文件(包含凭证与操作说明)
→ 安装fail2ban并锁定SSH(密钥验证通过后执行)
→ ✅ VPN已正常运行myservervpn1myservervpn1myservervpn1curl -4 -s ifconfig.memyservervpn1curl -4 -s ifconfig.me| Step | Remote Mode (default) | Local Mode |
|---|---|---|
| Step 1 | Generate SSH key on LOCAL machine | SKIP -- user creates key on laptop later (Step 22) |
| Step 2 | | Already on server. If not root: |
| Steps 3-4 | Run on server via root SSH | Run directly (already on server) |
| Step 5 | Install local public key on server | SKIP -- user sends .pub via SCP later (Step 22) |
| Step 6 | SSH test from LOCAL: | Switch user: |
| Step 7 | SKIP -- lockdown deferred to Step 22 | SKIP -- lockdown deferred to Step 22 |
| Steps 8-11 | | |
| Step 12 | Write | SKIP -- user does this from guide file (Step 22) |
| Step 13 | Verify via | Run audit directly, skip SSH lockdown checks |
| Part 2 | | |
| Step 17A | Scanner via | Scanner runs directly (no SSH wrapper) -- see Step 17A for both commands |
| Panel access | Via SSH tunnel | Direct: |
| Step 22 | Generate guide + fail2ban + lock SSH | Generate guide → SCP download → SSH key setup → fail2ban + lock SSH |
ssh {nickname}| 步骤 | 远程模式(默认) | 本地模式 |
|---|---|---|
| 步骤1 | 在本地电脑生成SSH密钥 | 跳过 —— 用户后续在笔记本电脑创建密钥(步骤22) |
| 步骤2 | | 已在服务器上。若当前不是root用户: |
| 步骤3-4 | 通过root SSH在服务器上执行 | 直接执行(已在服务器上) |
| 步骤5 | 在服务器上安装本地公钥 | 跳过 —— 用户后续通过SCP发送.pub文件(步骤22) |
| 步骤6 | 从本地测试SSH: | 切换用户: |
| 步骤7 | 跳过 —— 锁定操作推迟至步骤22 | 跳过 —— 锁定操作推迟至步骤22 |
| 步骤8-11 | 通过SSH在服务器上使用 | 直接使用 |
| 步骤12 | 在本地编写 | 跳过 —— 用户通过指南文件完成此操作(步骤22) |
| 步骤13 | 通过 | 直接运行审计,跳过SSH锁定检查 |
| 第二部分 | | 直接执行 |
| 步骤17A | 通过 | 直接运行扫描器(无需SSH包装)—— 查看步骤17A中的两种命令 |
| 面板访问 | 通过SSH隧道 | 直接访问: |
| 步骤22 | 生成指南文件 + 安装fail2ban + 锁定SSH | 生成指南文件 → 通过SCP下载 → 配置SSH密钥 → 安装fail2ban + 锁定SSH |
ssh {nickname}ssh-keygen -t ed25519 -C "{username}@{nickname}" -f ~/.ssh/{nickname}_key -N ""cat ~/.ssh/{nickname}_key.pubssh-keygen -t ed25519 -C "{username}@{nickname}" -f ~/.ssh/{nickname}_key -N ""cat ~/.ssh/{nickname}_key.pubssh root@{SERVER_IP}ssh root@{SERVER_IP}ssh root@{SERVER_IP}ssh root@{SERVER_IP}apt update && DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a apt upgrade -yapt update && DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a apt upgrade -yuseradd -m -s /bin/bash {username}
echo "{username}:{GENERATE_STRONG_PASSWORD}" | chpasswd
usermod -aG sudo {username}undefineduseradd -m -s /bin/bash {username}
echo "{username}:{GENERATE_STRONG_PASSWORD}" | chpasswd
usermod -aG sudo {username}undefinedundefinedundefinedmkdir -p /home/{username}/.ssh
echo "{PUBLIC_KEY_CONTENT}" > /home/{username}/.ssh/authorized_keys
chmod 700 /home/{username}/.ssh
chmod 600 /home/{username}/.ssh/authorized_keys
chown -R {username}:{username} /home/{username}/.sshmkdir -p /home/{username}/.ssh
echo "{PUBLIC_KEY_CONTENT}" > /home/{username}/.ssh/authorized_keys
chmod 700 /home/{username}/.ssh
chmod 600 /home/{username}/.ssh/authorized_keys
chown -R {username}:{username} /home/{username}/.sshssh -i ~/.ssh/{nickname}_key {username}@{SERVER_IP}sudo whoamissh -i ~/.ssh/{nickname}_key {username}@{SERVER_IP}sudo whoami
**If this fails** -- debug permissions, do NOT disable root login:
```bash
**若测试失败**——调试权限,请勿禁用root登录:
```bashundefinedundefinedsudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw --force enable
sudo ufw statussudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw --force enable
sudo ufw statussudo tee /etc/sysctl.d/99-security.conf << 'EOF'
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
EOF
sudo sysctl -p /etc/sysctl.d/99-security.confsudo tee /etc/sysctl.d/99-security.conf << 'EOF'
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
EOF
sudo sysctl -p /etc/sysctl.d/99-security.confsudo apt install -y chrony curl wget unzip net-tools
sudo systemctl enable chronysudo apt install -y chrony curl wget unzip net-tools
sudo systemctl enable chronycat >> ~/.ssh/config << 'EOF'
Host {nickname}
HostName {SERVER_IP}
User {username}
IdentityFile ~/.ssh/{nickname}_key
IdentitiesOnly yes
EOFssh {nickname}cat >> ~/.ssh/config << 'EOF'
Host {nickname}
HostName {SERVER_IP}
User {username}
IdentityFile ~/.ssh/{nickname}_key
IdentitiesOnly yes
EOFssh {nickname}ssh {nickname}ssh {nickname}
Expected: ufw active, rp_filter = 1.
**Note:** SSH lockdown и fail2ban проверяются в конце (Step 22) после подтверждения работы SSH-ключа.
**Часть 1 завершена. Базовая настройка сервера готова. Переходим к установке VPN.**
---
预期结果:ufw处于活跃状态,rp_filter = 1。
**注意:** SSH锁定与fail2ban的检查将在末尾(步骤22)完成,需在SSH密钥确认可用后执行。
**第一部分完成。服务器基础配置已就绪。接下来进行VPN安装。**
---ssh {nickname}ssh {nickname}ssh {nickname} "curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh -o /tmp/3x-ui-install.sh && echo 'n' | sudo bash /tmp/3x-ui-install.sh"echo 'n'sudo bash <(curl ...)Данные панели 3x-ui (СОХРАНИ!):
Username: {panel_username}
Password: {panel_password}
Port: {panel_port}
Path: {web_base_path}
URL: https://127.0.0.1:{panel_port}/{web_base_path} (через SSH-туннель)ssh {nickname} "sudo x-ui status"ssh {nickname} "sudo x-ui start"ssh {nickname} "curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh -o /tmp/3x-ui-install.sh && echo 'n' | sudo bash /tmp/3x-ui-install.sh"echo 'n'sudo bash <(curl ...)3x-ui面板信息(务必保存!):
用户名: {panel_username}
密码: {panel_password}
端口: {panel_port}
路径: {web_base_path}
URL: https://127.0.0.1:{panel_port}/{web_base_path}(通过SSH隧道访问)ssh {nickname} "sudo x-ui status"ssh {nickname} "sudo x-ui start"ssh {nickname} 'current=$(sysctl -n net.ipv4.tcp_congestion_control); echo "Current: $current"; if [ "$current" != "bbr" ]; then echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.conf && echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf && sudo sysctl -p && echo "BBR enabled"; else echo "BBR already active"; fi'ssh {nickname} "sysctl net.ipv4.tcp_congestion_control net.core.default_qdisc"net.ipv4.tcp_congestion_control = bbrnet.core.default_qdisc = fqssh {nickname} 'current=$(sysctl -n net.ipv4.tcp_congestion_control); echo "当前配置: $current"; if [ "$current" != "bbr" ]; then echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.conf && echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf && sudo sysctl -p && echo "BBR已启用"; else echo "BBR已处于活跃状态"; fi'ssh {nickname} "sysctl net.ipv4.tcp_congestion_control net.core.default_qdisc"net.ipv4.tcp_congestion_control = bbrnet.core.default_qdisc = fqssh {nickname} "sudo sed -i 's/-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT/-A ufw-before-input -p icmp --icmp-type echo-request -j DROP/' /etc/ufw/before.rules && sudo sed -i 's/-A ufw-before-forward -p icmp --icmp-type echo-request -j ACCEPT/-A ufw-before-forward -p icmp --icmp-type echo-request -j DROP/' /etc/ufw/before.rules && sudo ufw reload"ping -c 2 -W 2 {SERVER_IP}ssh {nickname} "sudo sed -i 's/-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT/-A ufw-before-input -p icmp --icmp-type echo-request -j DROP/' /etc/ufw/before.rules && sudo sed -i 's/-A ufw-before-forward -p icmp --icmp-type echo-request -j ACCEPT/-A ufw-before-forward -p icmp --icmp-type echo-request -j DROP/' /etc/ufw/before.rules && sudo ufw reload"ping -c 2 -W 2 {SERVER_IP}references/vless-tls.mdreferences/vless-tls.mdshop.finn-auto.fissh {nickname} 'ARCH=$(dpkg --print-architecture); case "$ARCH" in amd64) SA="64";; arm64|aarch64) SA="arm64-v8a";; *) SA="$ARCH";; esac && curl -sL "https://github.com/XTLS/RealiTLScanner/releases/latest/download/RealiTLScanner-linux-${SA}" -o /tmp/scanner && chmod +x /tmp/scanner && file /tmp/scanner | grep -q ELF || { echo "ERROR: scanner binary not valid for this architecture"; exit 1; }; MY_IP=$(curl -4 -s ifconfig.me); SUBNET=$(echo $MY_IP | sed "s/\.[0-9]*$/.0\/24/"); echo "Scanning subnet: $SUBNET"; timeout 120 /tmp/scanner --addr "$SUBNET" 2>&1 | head -80'ARCH=$(dpkg --print-architecture); case "$ARCH" in amd64) SA="64";; arm64|aarch64) SA="arm64-v8a";; *) SA="$ARCH";; esac && curl -sL "https://github.com/XTLS/RealiTLScanner/releases/latest/download/RealiTLScanner-linux-${SA}" -o /tmp/scanner && chmod +x /tmp/scanner && file /tmp/scanner | grep -q ELF || { echo "ERROR: scanner binary not valid for this architecture"; exit 1; }; MY_IP=$(curl -4 -s ifconfig.me); SUBNET=$(echo $MY_IP | sed "s/\.[0-9]*$/.0\/24/"); echo "Scanning subnet: $SUBNET"; timeout 120 /tmp/scanner --addr "$SUBNET" 2>&1 | head -80ssh {nickname}64amd64arm64-v8aarm64casefile | grep ELFshop.finn-auto.fissh {nickname} 'ARCH=$(dpkg --print-architecture); case "$ARCH" in amd64) SA="64";; arm64|aarch64) SA="arm64-v8a";; *) SA="$ARCH";; esac && curl -sL "https://github.com/XTLS/RealiTLScanner/releases/latest/download/RealiTLScanner-linux-${SA}" -o /tmp/scanner && chmod +x /tmp/scanner && file /tmp/scanner | grep -q ELF || { echo "错误:扫描器二进制文件与当前架构不兼容"; exit 1; }; MY_IP=$(curl -4 -s ifconfig.me); SUBNET=$(echo $MY_IP | sed "s/\.[0-9]*$/.0\/24/"); echo "正在扫描子网: $SUBNET"; timeout 120 /tmp/scanner --addr "$SUBNET" 2>&1 | head -80'ARCH=$(dpkg --print-architecture); case "$ARCH" in amd64) SA="64";; arm64|aarch64) SA="arm64-v8a";; *) SA="$ARCH";; esac && curl -sL "https://github.com/XTLS/RealiTLScanner/releases/latest/download/RealiTLScanner-linux-${SA}" -o /tmp/scanner && chmod +x /tmp/scanner && file /tmp/scanner | grep -q ELF || { echo "错误:扫描器二进制文件与当前架构不兼容"; exit 1; }; MY_IP=$(curl -4 -s ifconfig.me); SUBNET=$(echo $MY_IP | sed "s/\.[0-9]*$/.0\/24/"); echo "正在扫描子网: $SUBNET"; timeout 120 /tmp/scanner --addr "$SUBNET" 2>&1 | head -80ssh {nickname}64amd64arm64-v8aarm64casefile | grep ELFshop.finn-auto.fiportal.company.degithub.comtwitch.tvwww.google.comwww.microsoft.comgoogletagmanager.com/23ssh {nickname} 'MY_IP=$(curl -4 -s ifconfig.me); SUBNET=$(echo $MY_IP | sed "s/\.[0-9]*$/.0\/23/"); timeout 180 /tmp/scanner --addr "$SUBNET" 2>&1 | head -80'MY_IP=$(curl -4 -s ifconfig.me); SUBNET=$(echo $MY_IP | sed "s/\.[0-9]*$/.0\/23/"); timeout 180 /tmp/scanner --addr "$SUBNET" 2>&1 | head -80www.yahoo.comshop.finn-auto.fiportal.company.degithub.comtwitch.tvwww.google.comwww.microsoft.comgoogletagmanager.com/23ssh {nickname} 'MY_IP=$(curl -4 -s ifconfig.me); SUBNET=$(echo $MY_IP | sed "s/\.[0-9]*$/.0\/23/"); timeout 180 /tmp/scanner --addr "$SUBNET" 2>&1 | head -80'MY_IP=$(curl -4 -s ifconfig.me); SUBNET=$(echo $MY_IP | sed "s/\.[0-9]*$/.0\/23/"); timeout 180 /tmp/scanner --addr "$SUBNET" 2>&1 | head -80www.yahoo.comssh {nickname} "ss -tlnp | grep ':443 '"sudo systemctl stop apache2 && sudo systemctl disable apache2-kssh {nickname} 'PANEL_PORT={panel_port}; curl -sk -c /tmp/3x-cookie -b /tmp/3x-cookie -X POST "https://127.0.0.1:${PANEL_PORT}/{web_base_path}/login" -H "Content-Type: application/x-www-form-urlencoded" -d "username={panel_username}&password={panel_password}"'ssh {nickname} "sudo /usr/local/x-ui/bin/xray-linux-* x25519"PrivateKeyPasswordssh {nickname} "sudo /usr/local/x-ui/bin/xray-linux-* uuid"ssh {nickname} "openssl rand -hex 8"ssh {nickname} 'PANEL_PORT={panel_port}; curl -sk -c /tmp/3x-cookie -b /tmp/3x-cookie -X POST "https://127.0.0.1:${PANEL_PORT}/{web_base_path}/panel/api/inbounds/add" -H "Content-Type: application/json" -d '"'"'{
"up": 0,
"down": 0,
"total": 0,
"remark": "vless-reality",
"enable": true,
"expiryTime": 0,
"listen": "",
"port": 443,
"protocol": "vless",
"settings": "{\"clients\":[{\"id\":\"{CLIENT_UUID}\",\"flow\":\"xtls-rprx-vision\",\"email\":\"user1\",\"limitIp\":0,\"totalGB\":0,\"expiryTime\":0,\"enable\":true}],\"decryption\":\"none\",\"fallbacks\":[]}",
"streamSettings": "{\"network\":\"tcp\",\"security\":\"reality\",\"externalProxy\":[],\"realitySettings\":{\"show\":false,\"xver\":0,\"dest\":\"{BEST_SNI}:443\",\"serverNames\":[\"{BEST_SNI}\"],\"privateKey\":\"{PRIVATE_KEY}\",\"minClient\":\"\",\"maxClient\":\"\",\"maxTimediff\":0,\"shortIds\":[\"{SHORT_ID}\"],\"settings\":{\"publicKey\":\"{PUBLIC_KEY}\",\"fingerprint\":\"chrome\",\"serverName\":\"\",\"spiderX\":\"/\"}},\"tcpSettings\":{\"acceptProxyProtocol\":false,\"header\":{\"type\":\"none\"}}}",
"sniffing": "{\"enabled\":true,\"destOverride\":[\"http\",\"tls\",\"quic\",\"fakedns\"],\"metadataOnly\":false,\"routeOnly\":false}",
"allocate": "{\"strategy\":\"always\",\"refresh\":5,\"concurrency\":3}"
}'"'"''ssh {nickname} "ss -tlnp | grep ':443 '"sudo systemctl stop apache2 && sudo systemctl disable apache2-kssh {nickname} 'PANEL_PORT={panel_port}; curl -sk -c /tmp/3x-cookie -b /tmp/3x-cookie -X POST "https://127.0.0.1:${PANEL_PORT}/{web_base_path}/login" -H "Content-Type: application/x-www-form-urlencoded" -d "username={panel_username}&password={panel_password}"'ssh {nickname} "sudo /usr/local/x-ui/bin/xray-linux-* x25519"PrivateKeyPasswordssh {nickname} "sudo /usr/local/x-ui/bin/xray-linux-* uuid"ssh {nickname} "openssl rand -hex 8"ssh {nickname} 'PANEL_PORT={panel_port}; curl -sk -c /tmp/3x-cookie -b /tmp/3x-cookie -X POST "https://127.0.0.1:${PANEL_PORT}/{web_base_path}/panel/api/inbounds/add" -H "Content-Type: application/json" -d '"'"'{
"up": 0,
"down": 0,
"total": 0,
"remark": "vless-reality",
"enable": true,
"expiryTime": 0,
"listen": "",
"port": 443,
"protocol": "vless",
"settings": "{\"clients\":[{\"id\":\"{CLIENT_UUID}\",\"flow\":\"xtls-rprx-vision\",\"email\":\"user1\",\"limitIp\":0,\"totalGB\":0,\"expiryTime\":0,\"enable\":true}],\"decryption\":\"none\",\"fallbacks\":[]}",
"streamSettings": "{\"network\":\"tcp\",\"security\":\"reality\",\"externalProxy\":[],\"realitySettings\":{\"show\":false,\"xver\":0,\"dest\":\"{BEST_SNI}:443\",\"serverNames\":[\"{BEST_SNI}\"],\"privateKey\":\"{PRIVATE_KEY}\",\"minClient\":\"\",\"maxClient\":\"\",\"maxTimediff\":0,\"shortIds\":[\"{SHORT_ID}\"],\"settings\":{\"publicKey\":\"{PUBLIC_KEY}\",\"fingerprint\":\"chrome\",\"serverName\":\"\",\"spiderX\":\"/\"}},\"tcpSettings\":{\"acceptProxyProtocol\":false,\"header\":{\"type\":\"none\"}}}",
"sniffing": "{\"enabled\":true,\"destOverride\":[\"http\",\"tls\",\"quic\",\"fakedns\"],\"metadataOnly\":false,\"routeOnly\":false}",
"allocate": "{\"strategy\":\"always\",\"refresh\":5,\"concurrency\":3}"
}'"'"''ssh -L {panel_port}:127.0.0.1:{panel_port} {nickname}https://127.0.0.1:{panel_port}/{web_base_path}ssh -L {panel_port}:127.0.0.1:{panel_port} {nickname}https://127.0.0.1:{panel_port}/{web_base_path}ssh {nickname} 'PANEL_PORT={panel_port}; curl -sk -b /tmp/3x-cookie "https://127.0.0.1:${PANEL_PORT}/{web_base_path}/panel/api/inbounds/list" | python3 -c "
import json,sys
data = json.load(sys.stdin)
for inb in data.get(\"obj\", []):
if inb.get(\"protocol\") == \"vless\":
settings = json.loads(inb[\"settings\"])
stream = json.loads(inb[\"streamSettings\"])
client = settings[\"clients\"][0]
uuid = client[\"id\"]
port = inb[\"port\"]
security = stream.get(\"security\", \"none\")
if security == \"reality\":
rs = stream[\"realitySettings\"]
sni = rs[\"serverNames\"][0]
pbk = rs[\"settings\"][\"publicKey\"]
sid = rs[\"shortIds\"][0]
fp = rs[\"settings\"].get(\"fingerprint\", \"chrome\")
flow = client.get(\"flow\", \"\")
link = f\"vless://{uuid}@$(curl -4 -s ifconfig.me):{port}?type=tcp&security=reality&pbk={pbk}&fp={fp}&sni={sni}&sid={sid}&spx=%2F&flow={flow}#vless-reality\"
print(link)
break
"'Скопируй всё ниже и вставь в любой LLM (ChatGPT, Claude) чтобы получить чистую ссылку:
Убери все переносы строк и лишние пробелы из этой ссылки, выдай одной строкой:
{VLESS_LINK}ssh {nickname} "echo '{VLESS_LINK}' > ~/vpn-link.txt"ssh {nickname} "rm -f /tmp/3x-cookie"ssh {nickname} 'PANEL_PORT={panel_port}; curl -sk -b /tmp/3x-cookie "https://127.0.0.1:${PANEL_PORT}/{web_base_path}/panel/api/inbounds/list" | python3 -c "
import json,sys
data = json.load(sys.stdin)
for inb in data.get(\"obj\", []):
if inb.get(\"protocol\") == \"vless\":
settings = json.loads(inb[\"settings\"])
stream = json.loads(inb[\"streamSettings\"])
client = settings[\"clients\"][0]
uuid = client[\"id\"]
port = inb[\"port\"]
security = stream.get(\"security\", \"none\")
if security == \"reality\":
rs = stream[\"realitySettings\"]
sni = rs[\"serverNames\"][0]
pbk = rs[\"settings\"][\"publicKey\"]
sid = rs[\"shortIds\"][0]
fp = rs[\"settings\"].get(\"fingerprint\", \"chrome\")
flow = client.get(\"flow\", \"\")
link = f\"vless://{uuid}@$(curl -4 -s ifconfig.me):{port}?type=tcp&security=reality&pbk={pbk}&fp={fp}&sni={sni}&sid={sid}&spx=%2F&flow={flow}#vless-reality\"
print(link)
break
"'复制以下所有内容并粘贴到任意LLM(ChatGPT、Claude)中以获取干净的链接:
请移除该链接中的所有换行符和多余空格,以单行形式输出:
{VLESS_LINK}ssh {nickname} "echo '{VLESS_LINK}' > ~/vpn-link.txt"ssh {nickname} "rm -f /tmp/3x-cookie"Теперь установи клиент Hiddify на своё устройство:
Android: Google Play -> "Hiddify" или https://github.com/hiddify/hiddify-app/releases
iOS: App Store -> "Hiddify"
Windows: https://github.com/hiddify/hiddify-app/releases (скачай .exe)
macOS: https://github.com/hiddify/hiddify-app/releases (скачай .dmg)
Linux: https://github.com/hiddify/hiddify-app/releases (.deb или .AppImage)
После установки:
1. Открой Hiddify
2. Нажми "+" или "Add Profile"
3. Выбери "Add from clipboard" (ссылка уже скопирована)
4. Или отсканируй QR-код (я могу его показать)
5. Нажми кнопку подключения (большая кнопка в центре)
6. Готово! Проверь IP на сайте: https://2ip.ru现在请在你的设备上安装Hiddify客户端:
Android: Google Play搜索"Hiddify",或访问https://github.com/hiddify/hiddify-app/releases
iOS: App Store搜索"Hiddify"
Windows: 访问https://github.com/hiddify/hiddify-app/releases(下载.exe文件)
macOS: 访问https://github.com/hiddify/hiddify-app/releases(下载.dmg文件)
Linux: 访问https://github.com/hiddify/hiddify-app/releases(下载.deb或.AppImage文件)
安装完成后:
1. 打开Hiddify
2. 点击"+"或"Add Profile"(添加配置文件)
3. 选择"Add from clipboard"(从剪贴板添加)(链接已复制)
4. 或扫描QR码(我可以为你展示)
5. 点击连接按钮(中央的大按钮)
6. 完成!访问https://2ip.ru验证IPssh {nickname} "sudo x-ui status && ss -tlnp | grep -E '443|{panel_port}'"ssh {nickname} "sudo x-ui status && ss -tlnp | grep -E '443|{panel_port}'"~/vpn-{nickname}-guide.md{variables}ssh {nickname} "echo 'SSH key access OK'"ssh {nickname} 'sudo apt install -y fail2ban && sudo tee /etc/fail2ban/jail.local << JAILEOF
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 24h
JAILEOF
sudo systemctl enable fail2ban && sudo systemctl restart fail2ban'ssh {nickname} 'sudo sed -i "s/^#\?PermitRootLogin.*/PermitRootLogin no/" /etc/ssh/sshd_config && sudo sed -i "s/^#\?PasswordAuthentication.*/PasswordAuthentication no/" /etc/ssh/sshd_config && sudo systemctl restart sshd'ssh {nickname} "grep -E 'PermitRootLogin|PasswordAuthentication' /etc/ssh/sshd_config && sudo systemctl status fail2ban --no-pager -l && echo 'Lockdown OK'"~/vpn-{nickname}-guide.md{variables}ssh {nickname} "echo 'SSH密钥访问正常'"ssh {nickname} 'sudo apt install -y fail2ban && sudo tee /etc/fail2ban/jail.local << JAILEOF
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 24h
JAILEOF
sudo systemctl enable fail2ban && sudo systemctl restart fail2ban'ssh {nickname} 'sudo sed -i "s/^#\?PermitRootLogin.*/PermitRootLogin no/" /etc/ssh/sshd_config && sudo sed -i "s/^#\?PasswordAuthentication.*/PasswordAuthentication no/" /etc/ssh/sshd_config && sudo systemctl restart sshd'ssh {nickname} "grep -E 'PermitRootLogin|PasswordAuthentication' /etc/ssh/sshd_config && sudo systemctl status fail2ban --no-pager -l && echo '锁定配置正常'"/home/{username}/vpn-guide.md{variables}/home/{username}/vpn-guide.md{variables}Методичка готова! Скачай её на свой компьютер.
Открой НОВЫЙ терминал на своём ноутбуке и выполни:
scp {username}@{SERVER_IP}:~/vpn-guide.md ./
Пароль: {sudo_password}
Файл сохранится в текущую папку. Открой его -- там все пароли и инструкции.指南文件已准备好!请将其下载到你的电脑上。
在你的笔记本电脑上打开一个**新终端**并执行:
scp {username}@{SERVER_IP}:~/vpn-guide.md ./
密码:{sudo_password}
文件将保存到当前目录。打开文件——其中包含所有密码和操作说明。Теперь создай SSH-ключ на своём компьютере.
Есть два варианта:
Вариант А: Следуй инструкциям из раздела "SSH Key Setup" в методичке.
Вариант Б (автоматический): Установи Claude Code на ноутбуке
(https://claude.ai/download) и скинь ему файл vpn-guide.md --
он сам всё настроит по инструкциям из раздела "Instructions for Claude Code".
После создания ключа отправь публичный ключ на сервер (следующий шаг).现在请在你的电脑上创建SSH密钥。
有两种选择:
选项A:按照指南文件中"SSH密钥配置"部分的说明操作。
选项B(自动方式):在笔记本电脑上安装Claude Code
(https://claude.ai/download),然后将vpn-guide.md文件发送给它——
它会根据指南文件中"Claude Code操作说明"部分自动完成所有配置。
创建密钥后,将公钥发送到服务器(下一步)。Отправь публичный ключ на сервер (из терминала на ноутбуке):
scp ~/.ssh/{nickname}_key.pub {username}@{SERVER_IP}:~/
Пароль: {sudo_password}将公钥发送到服务器(在笔记本电脑的终端中执行):
scp ~/.ssh/{nickname}_key.pub {username}@{SERVER_IP}:~/
密码:{sudo_password}mkdir -p /home/{username}/.ssh
cat /home/{username}/{nickname}_key.pub >> /home/{username}/.ssh/authorized_keys
chmod 700 /home/{username}/.ssh
chmod 600 /home/{username}/.ssh/authorized_keys
chown -R {username}:{username} /home/{username}/.ssh
rm -f /home/{username}/{nickname}_key.pubПроверь подключение с ноутбука:
ssh -i ~/.ssh/{nickname}_key {username}@{SERVER_IP}
Должно подключиться без пароля.mkdir -p /home/{username}/.ssh
cat /home/{username}/{nickname}_key.pub >> /home/{username}/.ssh/authorized_keys
chmod 700 /home/{username}/.ssh
chmod 600 /home/{username}/.ssh/authorized_keys
chown -R {username}:{username} /home/{username}/.ssh
rm -f /home/{username}/{nickname}_key.pub验证从笔记本电脑的连接:
ssh -i ~/.ssh/{nickname}_key {username}@{SERVER_IP}
应无需输入密码即可连接。sudo apt install -y fail2ban
sudo tee /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 24h
EOF
sudo systemctl enable fail2ban
sudo systemctl restart fail2bansudo sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo systemctl restart sshdgrep -E "PermitRootLogin|PasswordAuthentication" /etc/ssh/sshd_config
sudo systemctl status fail2ban --no-pagerPermitRootLogin noPasswordAuthentication noПроверь, что SSH-ключ всё ещё работает:
ssh {nickname}
Если подключился — всё настроено!sudo apt install -y fail2ban
sudo tee /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 24h
EOF
sudo systemctl enable fail2ban
sudo systemctl restart fail2bansudo sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo systemctl restart sshdgrep -E "PermitRootLogin|PasswordAuthentication" /etc/ssh/sshd_config
sudo systemctl status fail2ban --no-pagerPermitRootLogin noPasswordAuthentication no验证SSH密钥是否仍正常工作:
ssh {nickname}
若能连接——则所有配置已完成!Последний шаг! Добавь на ноутбуке в файл ~/.ssh/config:
Host {nickname}
HostName {SERVER_IP}
User {username}
IdentityFile ~/.ssh/{nickname}_key
IdentitiesOnly yes
Теперь подключайся просто: ssh {nickname}最后一步!在笔记本电脑的~/.ssh/config文件中添加以下内容:
Host {nickname}
HostName {SERVER_IP}
User {username}
IdentityFile ~/.ssh/{nickname}_key
IdentitiesOnly yes
现在你可以使用简单的命令连接:ssh {nickname}rm -f /home/{username}/vpn-guide.mdrm -f /home/{username}/vpn-guide.md{variables}undefined{variables}undefined| Параметр | Значение |
|---|---|
| IP | |
| Пользователь | |
| Пароль sudo | |
| SSH-ключ | |
| Быстрое подключение | |
| 参数 | 值 |
|---|---|
| IP | |
| 用户 | |
| sudo密码 | |
| SSH密钥 | |
| 快速连接命令 | |
| Параметр | Значение |
|---|---|
| URL | |
| Логин | |
| Пароль | |
ssh -L {panel_port}:127.0.0.1:{panel_port} {nickname}https://127.0.0.1:{panel_port}/{web_base_path}| 参数 | 值 |
|---|---|
| URL | |
| 登录账号 | |
| 密码 | |
ssh -L {panel_port}:127.0.0.1:{panel_port} {nickname}https://127.0.0.1:{panel_port}/{web_base_path}| Параметр | Значение |
|---|---|
| Протокол | VLESS Reality |
| Порт | 443 |
| SNI | |
| Клиент | Hiddify |
{VLESS_LINK}| 参数 | 值 |
|---|---|
| 协议 | VLESS Reality |
| 端口 | 443 |
| SNI | |
| 客户端 | Hiddify |
{VLESS_LINK}undefinedundefinedundefinedundefinedundefinedundefined
Примечание: `chmod` не нужен на Windows. SSH использует ACL автоматически.
注意:Windows无需使用`chmod`。SSH会自动使用ACL。ssh {nickname} # подключиться к серверу
ssh {nickname} "sudo x-ui status" # статус панели
ssh {nickname} "sudo x-ui restart" # перезапустить панель
ssh {nickname} "sudo x-ui log" # логи
ssh {nickname} "sudo x-ui setting -reset" # сбросить пароль панелиssh {nickname} # 连接服务器
ssh {nickname} "sudo x-ui status" # 查看面板状态
ssh {nickname} "sudo x-ui restart" # 重启面板
ssh {nickname} "sudo x-ui log" # 查看日志
ssh {nickname} "sudo x-ui setting -reset" # 重置面板密码| Параметр | Статус |
|---|---|
| Вход под root | Отключён |
| Вход по паролю | Отключён |
| Файрвол UFW | Включён (SSH, 80, 443) |
| fail2ban | Включён (3 попытки → бан 24ч) |
| Усиление ядра | Включено (sysctl) |
| BBR | Включён |
| ICMP (ping) | Отключён |
| 参数 | 状态 |
|---|---|
| Root登录 | 已禁用 |
| 密码登录 | 已禁用 |
| UFW防火墙 | 已启用(开放SSH、80、443端口) |
| fail2ban | 已启用(3次失败尝试 → 封禁24小时) |
| 内核加固 | 已启用(sysctl) |
| BBR | 已启用 |
| ICMP(ping) | 已禁用 |
| Проблема | Решение |
|---|---|
| Connection refused | |
| Permission denied (publickey) | Проверь путь и права ключа: |
| Host key verification failed | |
| Панель недоступна | Используй SSH-туннель (см. раздел 2) |
| VPN не подключается | Неверный SNI или сервер лежит — проверь |
| Забыл пароль панели | |
| 问题 | 解决方案 |
|---|---|
| Connection refused(连接被拒绝) | |
| Permission denied (publickey)(公钥权限被拒绝) | 检查密钥路径和权限: |
| Host key verification failed(主机密钥验证失败) | 执行 |
| 面板无法访问 | 使用SSH隧道(参见第2部分) |
| VPN无法连接 | SNI错误——重新运行扫描器,尝试其他域名 |
| Hiddify显示错误 | 将Hiddify更新到最新版本,重新添加链接 |
| "connection refused"(连接被拒绝) | 检查x-ui是否运行: |
| 忘记面板密码 | 执行 |
brew install hudochenkov/sshpass/sshpasssudo apt install -y sshpassssh-keygen -t ed25519 -C "{username}@{nickname}" -f ~/.ssh/{nickname}_key -N ""sshpass -p '{sudo_password}' ssh-copy-id -i ~/.ssh/{nickname}_key.pub -o StrictHostKeyChecking=accept-new {username}@{SERVER_IP}ssh -i ~/.ssh/{nickname}_key {username}@{SERVER_IP} "echo 'SSH key OK'"cat >> ~/.ssh/config << 'EOF'
Host {nickname}
HostName {SERVER_IP}
User {username}
IdentityFile ~/.ssh/{nickname}_key
IdentitiesOnly yes
EOFssh {nickname} "echo 'Config OK'"ssh {nickname} 'sudo apt install -y fail2ban && sudo tee /etc/fail2ban/jail.local << JAILEOF
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 24h
JAILEOF
sudo systemctl enable fail2ban && sudo systemctl restart fail2ban'ssh {nickname} 'sudo sed -i "s/^#\?PermitRootLogin.*/PermitRootLogin no/" /etc/ssh/sshd_config && sudo sed -i "s/^#\?PasswordAuthentication.*/PasswordAuthentication no/" /etc/ssh/sshd_config && sudo systemctl restart sshd'ssh {nickname} "grep -E 'PermitRootLogin|PasswordAuthentication' /etc/ssh/sshd_config && sudo systemctl status fail2ban --no-pager && echo 'Сервер полностью защищён!'"
---brew install hudochenkov/sshpass/sshpasssudo apt install -y sshpassssh-keygen -t ed25519 -C "{username}@{nickname}" -f ~/.ssh/{nickname}_key -N ""sshpass -p '{sudo_password}' ssh-copy-id -i ~/.ssh/{nickname}_key.pub -o StrictHostKeyChecking=accept-new {username}@{SERVER_IP}ssh -i ~/.ssh/{nickname}_key {username}@{SERVER_IP} "echo 'SSH密钥正常'"cat >> ~/.ssh/config << 'EOF'
Host {nickname}
HostName {SERVER_IP}
User {username}
IdentityFile ~/.ssh/{nickname}_key
IdentitiesOnly yes
EOFssh {nickname} "echo '配置正常'"ssh {nickname} 'sudo apt install -y fail2ban && sudo tee /etc/fail2ban/jail.local << JAILEOF
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 24h
JAILEOF
sudo systemctl enable fail2ban && sudo systemctl restart fail2ban'ssh {nickname} 'sudo sed -i "s/^#\?PermitRootLogin.*/PermitRootLogin no/" /etc/ssh/sshd_config && sudo sed -i "s/^#\?PasswordAuthentication.*/PasswordAuthentication no/" /etc/ssh/sshd_config && sudo systemctl restart sshd'ssh {nickname} "grep -E 'PermitRootLogin|PasswordAuthentication' /etc/ssh/sshd_config && sudo systemctl status fail2ban --no-pager && echo '服务器已完全加固!'"
---VPN-сервер полностью настроен и работает!
Подключение к серверу:
Команда: ssh {nickname}
IP: {SERVER_IP}
Пользователь: {username}
SSH-ключ: ~/.ssh/{nickname}_key
Пароль sudo: {sudo_password}
Безопасность сервера:
Root-вход отключён
Парольный вход отключён
Файрвол включён (порты: SSH, 80, 443)
fail2ban защищает от брутфорса
Ядро усилено (sysctl)
BBR включён (TCP-оптимизация)
ICMP отключён (сервер не пингуется)
Панель 3x-ui:
URL: https://127.0.0.1:{panel_port}/{web_base_path} (через SSH-туннель)
Login: {panel_username}
Password: {panel_password}
VPN-подключение:
Протокол: VLESS Reality
Порт: 443
SNI: {best_sni}
Клиент:
Hiddify -- ссылка добавлена
Управление (через SSH):
ssh {nickname} # подключиться к серверу
ssh {nickname} "sudo x-ui status" # статус панели
ssh {nickname} "sudo x-ui restart" # перезапустить панель
ssh {nickname} "sudo x-ui log" # логи
SSH-туннель к админке:
ssh -L {panel_port}:127.0.0.1:{panel_port} {nickname}
Затем открыть: https://127.0.0.1:{panel_port}/{web_base_path}
Добавить нового клиента:
Открой админку -> Inbounds -> ... -> Add Client
Скинь ссылку или QR-код другому человеку
Методичка: ~/vpn-{nickname}-guide.md
Все пароли, инструкции и команды в одном файлеVPN服务器已完全配置并正常运行!
服务器连接信息:
命令: ssh {nickname}
IP: {SERVER_IP}
用户: {username}
SSH密钥: ~/.ssh/{nickname}_key
sudo密码: {sudo_password}
服务器安全状态:
Root登录已禁用
密码登录已禁用
防火墙已启用(开放端口:SSH、80、443)
fail2ban已安装以防止暴力破解
内核已加固(sysctl)
BBR已启用(TCP优化)
ICMP已禁用(服务器无法被ping通)
3x-ui面板信息:
URL: https://127.0.0.1:{panel_port}/{web_base_path}(通过SSH隧道访问)
登录账号: {panel_username}
密码: {panel_password}
VPN连接信息:
协议: VLESS Reality
端口: 443
SNI: {best_sni}
客户端信息:
Hiddify -- 链接已添加
管理命令(通过SSH):
ssh {nickname} # 连接服务器
ssh {nickname} "sudo x-ui status" # 查看面板状态
ssh {nickname} "sudo x-ui restart" # 重启面板
ssh {nickname} "sudo x-ui log" # 查看日志
面板SSH隧道:
ssh -L {panel_port}:127.0.0.1:{panel_port} {nickname}
然后打开:https://127.0.0.1:{panel_port}/{web_base_path}
添加新客户端:
打开面板 → Inbounds(入站规则)→ ... → Add Client(添加客户端)
将链接或QR码发送给其他人
指南文件:~/vpn-{nickname}-guide.md
所有密码、操作说明和命令均包含在此文件中| Problem | Solution |
|---|---|
| Connection drops after password change | Normal -- reconnect with new password |
| Permission denied (publickey) | Check key path and permissions (700/600) |
| Host key verification failed | |
| x-ui install fails | |
| Panel not accessible | Use SSH tunnel: |
| Reality not connecting | Wrong SNI -- re-run scanner, try different domain |
| Hiddify shows error | Update Hiddify to latest version, re-add link |
| "connection refused" | Check x-ui is running: |
| Forgot panel password | |
| SCP fails (Windows) | Install OpenSSH: Settings → Apps → Optional Features → OpenSSH Client |
| SCP fails (connection refused) | Check UFW allows SSH: |
| BBR not active after reboot | Re-check: |
| 问题 | 解决方案 |
|---|---|
| 修改密码后连接断开 | 正常现象——使用新密码重新连接 |
| Permission denied (publickey)(公钥权限被拒绝) | 检查密钥路径和权限(700/600) |
| Host key verification failed(主机密钥验证失败) | 执行 |
| x-ui安装失败 | 执行 |
| 面板无法访问 | 使用SSH隧道: |
| Reality无法连接 | SNI错误——重新运行扫描器,尝试其他域名 |
| Hiddify显示错误 | 将Hiddify更新到最新版本,重新添加链接 |
| "connection refused"(连接被拒绝) | 检查x-ui是否运行: |
| 忘记面板密码 | 执行 |
| SCP失败(Windows) | 安装OpenSSH:设置 → 应用 → 可选功能 → OpenSSH客户端 |
| SCP失败(连接被拒绝) | 检查UFW是否允许SSH: |
| 重启后BBR未激活 | 重新检查: |
x-ui start # start panel
x-ui stop # stop panel
x-ui restart # restart panel
x-ui status # check status
x-ui setting -reset # reset username/password
x-ui log # view logs
x-ui cert # manage SSL certificates
x-ui update # update to latest versionx-ui start # 启动面板
x-ui stop # 停止面板
x-ui restart # 重启面板
x-ui status # 检查状态
x-ui setting -reset # 重置用户名/密码
x-ui log # 查看日志
x-ui cert # 管理SSL证书
x-ui update # 更新到最新版本