年轻人的第一台 VPS 代理服务器
免责声明
本文涉及的任何解锁和解密分析脚本仅用于资源共享和学习研究,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。
间接使用脚本的任何用户,包括但不限于建立VPS或在某些行为违反国家/地区法律或相关法规的情况下进行传播, 本文作者对于由此引起的任何隐私泄漏或其他后果概不负责。
请勿将本文内的任何内容用于商业或非法目的,否则后果自负。
如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我将在收到认证文件后删除相关脚本。
对任何本文中包含的脚本在使用中可能出现的问题概不负责,包括但不限于由任何脚本错误导致的任何损失或损害.
您必须在下载后的24小时内从计算机或手机中完全删除以上内容。
任何以任何方式查看此项目的人或直接或间接使用该项目的任何脚本的使用者都应仔细阅读此声明。本文作者保留随时更改或补充此免责声明的权利。一旦使用并复制了任何本文相关脚本或其他内容,则视为您已接受此免责声明。
实现的功能
- 搭建一个稳定的代理服务器。
- 提供便捷的订阅转换服务,便于分享节点信息。可供 3-4 人使用。
- 能够访问 ChatGPT,VPS 的 IP 最好是原生 IP,访问一些特殊网站时不会被 block。
- 提供的对外服务要够安全。例如,xray 面板需要以 TLS 加密访问,不能 http 裸奔在公网、SSH 服务更改端口,限制 root 用户登陆、节点使用当前较为安全的的协议等。
- 有 IPV6,平时有使用 BT、 PT 的需求。
基于上述功能,本教程搭建的 VPS 有如下特点:
- 选用原生 IP 的 VPS 提供商,价格在 20 刀一年左右。能解锁 GPT。
- 购买域名,使用 cloudflare 解析 DNS,申请 TLS 证书,使得域名能够提供 https 安全访问。
- 使用 nginx 分流、反代本服务器上的代理服务、订阅服务、伪装服务。
- 使用 x-ui 面板搭建 vless+tls+vision 节点;搭建 hysteria2 节点。
- 搭建 sub-store,提供前后端订阅转换、分享服务,提供第三方网盘、glist 同步服务。
本教程并非面向纯小白用户,如果你对基础的 Linux 命令不懂,对简单计算机网络知识不懂,建议不要尝试。如果你真的想尝试,并且愿意花时间学习,可以先购买机场,完成科学上网第一步。
在 youtube 上学习科学上网基本知识,推荐不良林:www.youtube.com/@bulianglin
再结合 Project X 项目的文档 小小白白话文 对照阅读。遇到不明白的知识去问 GPT,大概率能得到一个清晰的答案;或者 google 搜索对应知识。
本教程在 Linux 系统下完成。
前期准备
购买域名
域名一般都推荐 namesilo,购买一些便宜点的域名,例如 top,一年只要不到 2 美金,续费基本在 5 美金左右。如果嫌续费贵,大可以在到期以后,重新买一个便宜域名,然后再更新 DNS 解析,和节点信息。
购买后需要将 DNS 服务换成 Cloudflare,参考:Namesilo/Cloudflare 域名注册和解析设置教程,便于后续申请 TLS 证书。申请合法的 TLS 证书非常重要,避免你的 VPS 用 http 访问,数据裸奔在公网,指不定哪天就被黑了。
DNS 解析
当你购买域名,并按照上述参考将域名解析托管到 clouflare 后,就可以设置 DNS 解析了。你可以设置无限多的三级域名,解析到不同的 IP,用作不同的用途。
需要注意,这里有一个代理状态栏,如果开启代理,则解析 DNS 时,会解析到 cloudflare 的 CDN IP,而不是自己设置的服务器 IP。该 CDN 会转发请求到服务器,但默认只会转发 443 端口的内容,不过你可以设置 Origin Rules 在 CDN 转发时,转发到服务器指定的端口上。
后续的节点搭建会要求设置不同的三级域名,解析到服务器 IP,以识别不同的服务。有一些不需要设置代理,有一些则需要设置代理以提高服务的安全性。
购买 VPS
经典的 VPS 推荐环节,但由于咱们的情况特殊,一旦有人推荐一些好用的 VPS,或者可以薅羊毛的 VPS,不出多久,就会有大量的用户滥用,导致原有的用户体验下降,或者 IP 段被 GFW 特殊照顾。因此,不给出目前自用的 VPS 推荐。也不给 VPS 长期购买建议。
补充:这个网站 vpsIs 罗列了许多VPS 厂家,以及其目前的订购费用,可以按需自选。
此处仅仅列出一些目前比较有名的境外 VPS 厂家:
- BandwagonHost,板瓦工,国内出名的厂家,用的人很多,所以普通线路的质量可能会差点(没用过,仅供参考),C2N 线路的据说速度很快。IP 被封可以给钱换机器。普通机器 50💲 一年,对于个人用户来说小贵。
- VULTR,小时计费,速度一般,可以用来练手,ip 被封可以直接删除实例,重开一台其他地方的机器。便宜的大概 6💲一月,也有 3、4💲一月的,但几乎买不到。
- RackNerd,最近两年好像很火,也属于便宜的那一档。
- CloudCone,了解不多。
- DMIT,了解不多。
除了费用、网络质量外,我们还需要关心:是否有 ipv6、是否支持 GPT 访问(网页端、移动端)。
IPV6 一般都会提供,不需要额外费用。
但是否支持 GPT 则是看 IP 是否“安全”。主要指的是 风控值,例如之前我在 vultr 购买的波兰服务器
现在使用的机器
所以,vultr 的波兰 VPS 只支持网页端访问,还会经常弹出 cloudflare 的人机验证。而现在的机器直接可以支持 app 访问。当然 GPT 是否能访问也根据地区有关,我没有仔细测试过,只是说明,在挑选 VPS 的时候尽可能的在网上搜索看看是否支持 GPT 的访问。
当然,如果你购买的机器不支持,也可以通过 warp 等手段解锁。
安装终端软件
如果你也用 Linux,可以略过这一步。
使用 windows 的用户推荐安装 termius(全平台可用),免费功能足够了。ssh 登陆,sftp 传输文件非常方便,并且 UI 很好看。其也有移动端 app,我有时会通过手机端登陆上服务器看看情况。
官网地址:termius.com/
方案选择
经过对目前主流的代理协议调查,决定同时搭建两种协议:hysteria2、vless+vision。前者基于 udp 传输、伪装成 http3 流量;后者则是为了解决 tls in tls 问题而推出的一种缓解该特征的方式。只能保证当前时刻,两者用来代理是稳定的。声明:没有最好的协议,只有最适合自己的协议。
在搭建上述两种协议时,涉及到 x-ui 面版和 nginx 的使用。为了使服务尽可能的稳定,x-ui 面板启用 https,而 hysteria2 需要在 80 和 443 端口进行伪装,所以要用 nginx 在 443 端口对 x-ui 流量和 hysteria2 的伪装流量分流。
除了代理服务,还有订阅服务。目前网络上主要两种:sub converter 和 sub-store。
sub converter 的官方支持较慢,例如:clash 原版删除跑路后,clash.meta 继续维护,但改动较大,截止目前 sub converter 官方版本仍未支持 meta 内核的新协议;在 hysteria2 出现 1 年后,其支持才被合并到官方主枝。但即使如此,并不影响其作为一款优秀的订阅转换工具,因为上述的兼容问题,有各种魔改版本来解决,比如 meta 内核官方自己基于 sub converter 开发了支持 meta 协议版本(github.com/MetaCubeX/subconverter)。还有一个重要的原因是,clash 系列、sing-box 等部分软件,配置文件不仅仅需要节点信息,还需要软件配置信息才能正常运行,sub converter 在转换时,可以同时给出配置信息。大部分的机场订阅都是使用 sub converter。例如,曾经使用的一个机场就是用免费的订阅转换工具 sub.v1.mk 来转换其搭建的 v2ray 节点。这里要注意:所有的订阅工具,都可以在后台看到你使用的节点转换信息。所以不能保证所有的搭建者都不去浏览抓换的节点信息。
sub-store 则更新维护比较及时,也有前后端界面,区别在于,sub-store 转换节点信息比较方便,但要转换 clash 系列、sing-box 等部分软件时麻烦一些。好处是 sub-store 有更为完善的数据保存同步功能,你可以把你的配置同步到 glist。
本教程采用 sub-store 来管理订阅。sub converter 我也做过尝试,但因为其订阅管理不够方便,仍然需要搭配 sub-store 来使用、转换 hysteria2 还有 passwd 不兼容问题,最终作罢。
下面是这些服务共存在一台服务器上时,使用 nginx 进行端口分流时拓扑图。
服务器购买
当前服务器 20 💲一年,原生 ip,支持 gpt 网页和移动端,不支持 Netflix 非自制剧。
使用 debian 12系统,ubuntu 的操作应该也类似。
整体框架
搭建步骤分为几步:
- 防火墙设置
- 申请域名证书
- 节点搭建-hysteria2
- 节点搭建-vless+vision
- 搭建 sub-store 服务
- Nginx 分流隐藏服务
服务器搭建
服务器 ssh 服务安全加固
购买服务器后,供应商会给 root 用户和密码,或者让你上传 ssh key,然后通过 ssh 访问服务器。
ssh 连接到服务器后,就可以对服务器的基础安全性进行加固。
安装常用软件
1apt update && apt-get install -y curl vim ufw
后续会使用 curl 下载各种脚本,vim 编辑文件(不熟悉的可以替换为 nano),iptables-persistent 管理网络防火墙。
注:部分 vps 提供商有自己的防火墙管理面板,仅仅在 vps 中更改可能不生效。吐槽一下甲骨文的 vps 面板是真的难用,试用了一下直接劝退。
建立【非 root】的新用户
1apt list --upgradable apt update && apt-get install -y sudo2getent group 1001|| groupadd -g 1001 vps \3 && getent passwd username || useradd -ms /bin/bash -u 1001 -g 1001 -G sudo username \4 && echo "username:passwd" | chpasswd5
6echo "username ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
上述命令的含义为:1. 安装 sudo,管理 root 权限。 2. 创建用户名为 username 的用户,密码为 passwd;并将其加入到 root 用户组,且使用 sudo 时不需要输入密码。
设置好后,另起一个终端,使用用户 username 登陆尝试一下是否建立成功。
注:上述用户名和密码请自行替换为自己的。后续同理。
修改 ssh 登陆端口
注意命令执行顺序,先放行 ssh,再启动 ufw,并未验证 ufw 的默认配置会不会放行 ssh(虽说应该会考虑到),千万别把自己也挡在防火墙外了。
1sudo apt-get install ufw2sudo ufw allow ssh3sudo ufw enable4
5sudo ufw allow 11116sudo vim /etc/ssh/sshd_config # 修改 PORT 为11117sudo systemctl restart ssh
上述命令,编辑 ssh 配置文档 /etc/ssh/sshd_config
修改其访问端口为 1111,并使用 ufw 管理防火墙,放行 1111 端口。
注:自行修改为自己想用的端口。
禁用 root 用户 SSH 远程登录
1vim /etc/ssh/sshd_config # PermitRootLogin yes 改为 no
SSH 启用 RSA 密钥验证登录
在本机上单独开启一个终端,执行下列操作,允许 VPS 服务器接受本机的 ssh 密钥登陆请求。
1ssh-keygen # 一路回车,在 ~/.ssh 目录下生成公钥和私钥2ssh-copy-id -p 1111 useranem@ip # 上传公钥到服务器
完成上述全部操作后,登陆 VPS,并禁用 22 端口
1ssh -p 1111 username@ip2sudo ufw deny 22
为你的域名申请 TLS 证书
参考:使用 acme.sh DNS 验证的方式签发 Let’sEncrypt 证书
本教程后续依赖于有 tls 证书验证的域名,务必完成。
acme.sh 是一个用来自动获取和管理 SSL/TLS 证书的开源脚本,可以从 Let’s Encrypt 等多个 CA 获取免费的证书。结合使用 Cloudflare DNS 验证的模式申请泛域名证书,并自动续签。
在前面购买域名后,已经使用过 Cloudflare 解析域名到 VPS 服务器的 IP 地址了。下面还需要用 Cloudflare 帮助验证域名的有效性,结合 Let’sEncrypt 自动申请和续签证书。
Cloudflare API
使用 Cloudflare DNS 模式需要准备:
- Zone ID
- Account ID
- API Token
获取 Zone ID, Account ID
这两种 ID 直接在 Overview 页就能找到。
获取 API Token
Overview 页点击 获取您的 API 令牌
进入 API Tokens 页。
点击 API Tokens 项旁边 创建令牌
按钮,接着选择 编辑区域 DNS
的模板,点击 使用模板
。
区域资源
里选择需要签发的域名
在 客户端 IP 地址筛选
里建议写下 acme.sh 所在的主机做为白名单,需要注意,如果服务器有 ipv6 地址,则也需要添加,因为有可能会 ipv6 优先访问。
击 继续以显示摘要
, 确认没问题后最后点击 创建令牌
。
此时就会出现一个 Token,,即 CF_Token,拷贝备用。
安装脚本
后续申请证书的命令,都是在 root 用户下执行的,请先使用 su
切换到 root 用户。
安装脚本,设置 letsencrypt 为默认认证服务商,并设置邮箱用来接受 Let’s Encrypt 的邮件通知。安装时,acme 会自动的启动 cron 任务,每天检查是否需要续签证书。
1su # 进入root用户2curl https://get.acme.sh | sh -s email=name@gmail.com; apt install socat -y; ~/.acme.sh/acme.sh --set-default-ca --server letsencrypt
安装后的设置
安装完毕后重新加载 bash,自动启用 acme 设置的环境变量,可以直接输入 acme.sh 而无需输入路径。
1source ~/.bashrc
开启自动更新
1acme.sh --upgrade --auto-upgrade
设置环境变量, 也就是准备的那三样, 可以准备好在一个文本编辑器里, 拷贝粘贴依次执行:
1export CF_Token="<拷贝的 API Token>"2export CF_Account_ID="<拷贝的 Account ID>"3export CF_Zone_ID="<拷贝的 Zone ID>"
使用 Cloudflare DNS 验证签发证书
将 CA 服务器改成 Let’s Encrypt
1acme.sh --set-default-ca --server letsencrypt
开始签发证书
使用 DNS 的方式申请不需要放行 80 443 端口。
这里以 hyperdns.com 为例,-d 后面接上域名, 可以签发多个,这里签了二级域名(hyperdns.com
) 和所有三级域名(*.hyperdns.com
)
1acme.sh --issue --dns dns_cf -d hyperdns.com -d *.hyperdns.com
需要注意,如果出现错误,需要找到错误原因后,再进行下一步,否则错误次数过多,会触发 letsencrypt 速率限制,一段时间内将无法继续验证。(请注意,完整替换域名,这里演示的 .com 的一级域名,如果只改了一级域名,二级域名不对,将会一直验证,不会成功获取证书。一般的验证5分钟以内就可以完成,如果长时间都不成功,可能就是没有完整替换域名为你自己的域名)。
成功后,会给出证书的位置,一般位于 ~/.acme.sh/域名_ecc/
1-----END CERTIFICATE-----2[Wed Dec 18 10:07:05 PM CST 2024] Your cert is in: /root/.acme.sh/hyperdns.com_ecc/hyperdns.com.cer3[Wed Dec 18 10:07:05 PM CST 2024] Your cert key is in: /root/.acme.sh/hyperdns.com_ecc/hyperdns.com.key4[Wed Dec 18 10:07:05 PM CST 2024] The intermediate CA cert is in: /root/.acme.sh/hyperdns.com_ecc/ca.cer5[Wed Dec 18 10:07:05 PM CST 2024] And the full-chain cert is in: /root/.acme.sh/hyperdns.com_ecc/fullchain.cer
也可以加上以下参数,指定生成的位置。
1acme.sh --issue --dns dns_cf -d hyperdns.com -d *.hyperdns.com \2--cert-file /path/to/certfile/in/apache/cert.pem \3--key-file /path/to/keyfile/in/apache/key.pem \4--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
验证自动续签
1$ crontab -l223 9 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
表示每天的上午9:23执行一次。检查是否需要更新证书。
手动执行:
1$ acme.sh --cron --home /root/.acme.sh2[Thu Dec 19 09:51:00 AM CST 2024] ===Starting cron===3[Thu Dec 19 09:51:00 AM CST 2024] Renewing: 'hex.hyperdns.com'4[Thu Dec 19 09:51:00 AM CST 2024] Renewing using Le_API=https://acme-v02.api.letsencrypt.org/directory5[Thu Dec 19 09:51:00 AM CST 2024] Skipping. Next renewal time is: 2025-02-08T09:00:33Z6[Thu Dec 19 09:51:00 AM CST 2024] Add '--force' to force renewal.7[Thu Dec 19 09:51:00 AM CST 2024] Skipped hex.hyperdns.com_ecc8[Thu Dec 19 09:51:00 AM CST 2024] Renewing: 'hyperdns.com'9[Thu Dec 19 09:51:00 AM CST 2024] Renewing using Le_API=https://acme-v02.api.letsencrypt.org/directory10[Thu Dec 19 09:51:00 AM CST 2024] Skipping. Next renewal time is: 2025-02-15T14:07:05Z11[Thu Dec 19 09:51:00 AM CST 2024] Add '--force' to force renewal.12[Thu Dec 19 09:51:00 AM CST 2024] Skipped hyperdns.com_ecc13[Thu Dec 19 09:51:00 AM CST 2024] ===End cron===
使用
使用时,往往会要求填入证书和秘钥,这里注意,生成证书时,会有三种,在上述例子中,
- hyperdns.com.cer:只有域名的叶子证书。
- ca.cer:中间证书,用来构建完整的信任链。
- fullchain.cer:由域名证书与中间证书组合而成的完整证书链文件,配置服务器时常用此文件以确保客户端能正确验证证书链。
通常,采用 fullchain.cer 作为网站证书的配置。密钥只有一个,例如:hyperdns.com.key,对应域名证书的私钥,直接输入就行。
该证书会作为 hysteria2、x-ui、nginx使用。
由于目前在 root 用户下操作,证书文件的权限仅 root 用户访问,因此需要修改。
1cp /root/.acme.sh/hyperdns.com_ecc/hyperdns.com.key /home/username/hyperdns.com.key2cp /root/.acme.sh/hyperdns.com_ecc/fullchain.cer /home/username/fullchain.cer3sudo chmod 644 /home/username/hyperdns.com.key4sudo chmod 644 /home/username/fullchain.cer
节点搭建
注意:后续所有节点均使用的是三级域名,在 cloudflare 解析 DNS 时,都不勾选 代理。因为 hysteria2 和 vless+vision 都不支持 cdn。全部都是直连。但提供订阅或者面板访问的域名,需要打开代理,提高一些安全性。
注:由于 x-ui 在生成节点时,如果面板配置有域名,则会自动将 server 处填写为 xui 的域名。但是 dns 解析时,为 xui 的域名勾选了代理,这会导致节点无法连接,因为此次搭建的节点都不支持 cdn。需要在使用时,手动将 xui 域名改为 直连的域名。
搭建和配置 hysteria2
同样在root权限下完成。命令 su
官网脚本安装
官网地址:v2.hysteria.network/zh/,可查看其配置说明。
1bash <(curl -fsSL https://get.hy2.sh/)
如果出现
1$ bash <(curl -fsSL https://get.hy2.sh/)2Checking for installed version ... v2.6.03Checking for latest version ... v2.6.04Install /etc/hysteria/config.yaml ... exists5Creating user hysteria ... /dev/fd/63: line 1021: useradd: command not found
则是系统的 PATH 环境出现问题,可以执行 export PATH=$PATH:/usr/sbin
暂时缓解,如果希望永久解决,可以将 /usr/sbin 添加到 PATH 中,在系统的 shell 配置文件(例如 ~/.bashrc 或 ~/.profile)中加入如下行:
1export PATH=$PATH:/usr/sbin2# 然后执行以下命令来使更改生效:3source ~/.bashrc
若域名没有 SSL 证书,则可生成自签证书(但不推荐,相当于你没有任何验证,容易被中间人攻击)。或者购买域名(namesilo 域名购买 和 cloudflare 托管解析)。但如果经过前面的设置,就无需担心,已经拥有了正规的 SSL 证书。
自签证书申请(不建议使用)
注:需要切换到 root 用户
1su2openssl req -x509 -nodes -newkey ec:<(openssl ecparam -name prime256v1) -keyout /etc/hysteria/server.key -out /etc/hysteria/server.crt -subj "/CN=bing.com" -days 36500 && sudo chown hysteria /etc/hysteria/server.key && sudo chown hysteria /etc/hysteria/server.crt
非面板搭建的配置
如果不使用面板搭建,则需要手动设置配置文件。
服务器配置文件
hysteria2 支持 acme 通过 dns 方式申请证书,同样需要 cloudflare_api_token
,但为了方便续签和其他服务使用证书,不采用这种方式。当然,即便你采用这种方式,也不会产生任何冲突和影响。
自行修改下面的配置中用户密码、trafficStats 端口/密码。
简单解释这个配置的含义:
- 监听 8443 端口,该端口是建立 hysteria2 服务的基础。可以修改,但需要同时允许防火墙通过端口、修改客户端配置。
- tls 认证,配置自有域名的证书,以防止安全攻击。可以使用自签证书,但理论上并不安全,虽然大多数的小白教程都直接使用。如果完成本文前面的证书申请步骤,则这一步填入已有的证书即可。
- auth,权限验证,验证通过,才能够正常提供服务。支持多用户认证,每个用户使用 用户名+密码 的方式进行验证,适合小规模多用户使用。需要注意:用户名不能含有大写字母。使用大写字母会连不上,目前已经确认这是一个 bug,后续版本会修复。Hysteria2 版本为 v2.6.0。
- masquerade,伪装,服务器像普通网站服务器一样真的响应 HTTP 请求,假装自己就是一个正常的网页服务器。
- trafficStats,流量统计接口
- bandwidth,带宽设置,不宜设置过大,造成流量浪费。
1cat << EOF > /etc/hysteria/config.yaml2listen: :8443 #监听端口3
4#使用 acme 证书,如果用cloudflare解析dns,并开启代理,则不需要申请,只填写域名即可5#acme:6# domains:7# - a.com #你的域名,需要先解析到服务器ip8# email: test@sharklasers.com9#使用 acme 申请 CA 证书10#acme:11# domains:12# - "*.hyperdns.com"13# email: your_email_address14# type: dns15# dns:38 collapsed lines
16# name: cloudflare17# config:18# cloudflare_api_token: your_api_token19
20#使用自签证书 或者已有 ca 证书21#ca 证书22tls:23 cert: /home/username/fullchain.cer24 key: /home/username/hyperdns.com.key25#使用自签证书26#tls:27# cert: /etc/hysteria/server.crt28# key: /etc/hysteria/server.key29
30auth:31 # 设置多用户32 type: userpass33 userpass:34 usr1: 8374393j4d35 usr2: t2rt9shd9236
37masquerade:38 type: proxy39 proxy:40 url: https://bing.com #伪装网址41 rewriteHost: true42 listenHTTP: :8043 listenHTTPS: :844344
45trafficStats:46 listen: :2222247 secret: trafficStats_passwd48
49bandwidth:50 up: 20 mbps51 down: 50 mbps52
53EOF
最后,服务器端需要启动 hysteria2 server,并设置开机自启。
1systemctl enable hysteria-server.service --now
并运行命令:systemctl status hysteria-server.service
查看 hysteria 日志,观察是否启动成功。
如果没有启动成功,请查看具体的报错信息,并解决。可以查看 hysteria2 官网:故障排除。
端口跳跃
参考:hysteria2 端口跳跃、meta hysteria2配置
运营商可能会阻断或限速 UDP 连接。表现为突然无法使用,或者网速慢,但几分钟(十几分钟)后又恢复。不过,这些限制往往仅限单个端口。端口跳跃可用作此情况的解决方法。
Hysteria 服务端并不能同时监听多个端口,因此不能在服务器端使用上面的格式作为监听地址。建议配合 iptables 或 nftables 的 DNAT 将端口转发到服务器的监听端口。
1# IPv42iptables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j REDIRECT --to-ports 4433# IPv64ip6tables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j REDIRECT --to-ports 443
在这个示例中,服务器监听 443 端口,但客户端可以通过 20000-50000 范围内的任何端口连接。
对于本示例来说,没有放行这么多端口,只放行部分(端口号需要在 1000-65535),供参考:
1ufw allow 50220:50959/udp2ufw allow 60133:60968/udp3iptables -t nat -A PREROUTING -i eth0 -p udp --dport 50220:50959 -j REDIRECT --to-ports 84434iptables -t nat -A PREROUTING -i eth0 -p udp --dport 60133:60968 -j REDIRECT --to-ports 84435ip6tables -t nat -A PREROUTING -i eth0 -p udp --dport 50220:50959 -j REDIRECT --to-ports 84436ip6tables -t nat -A PREROUTING -i eth0 -p udp --dport 60133:60968 -j REDIRECT --to-ports 8443
如果添加出错,需要删除规则,则可以参考:
删除 ufw 规则
1ufw status numbered # 查看规则的编号2ufw delete 3 # 删除想删除的规则的编号
删除改 iptables
列出当前的规则并找到规则的编号。使用以下命令列出规则:
1sudo iptables -L -v -n --line-numbers2sudo iptables -L -v -n -t nat # 查看添加的 nat 规则
这会输出规则列表,并在每个规则前面显示一个编号。假设你要删除编号为 2 的规则,可以执行:
1sudo iptables -D <链名> <规则编号>
例如,要删除 nat 表中的 PREROUTING 链上的第 2 条规则:
1sudo iptables -t nat -D PREROUTING 2
使用端配置
clash.meta 为例,在配置文件中按照如下方式填写,yaml 格式。
1proxies:2 - name: "🇺🇸 Hysteria" # Hysteria2 不支持套用 CDN3 server: your_ip4 port: 84435 ports: 50220-50959/60133-609686 type: hysteria27 password: usr1:8374393j4d # 多用户配置 用户名:密码8 up: 209 down: 5010 sni: www.hyperdns.com11 skip-cert-verify: false
将上述节点信息,添加到已有的 clash 配置文件中,就可以看到节点,如果检测不通,则说明信息填写错误,请仔细检查,并确认 hysteria 服务器端成功启动。节点信息配置出错,或者与服务端不匹配,则无法连通。
填写参考:
server 填写服务器 ip 或者没有开启代理的域名。 hysteria 不支持cdn,开启代理会导致无法正常使用。如果使用域名,有可能会发生不稳定的情况,这时改回 ip 即可。
port 监听端口要和服务器一致。
ports 端口跳跃端口也要和服务器上开放的端口一致,保证服务器防火墙放行对应端口,并设置端口转发到监听端口。
密码 password 要正确,多用户需要注意格式要求,用户名和密码中间必须要有 :
但不能有空格。
sni 认证网址也要正确,需要和证书提供的一致。但这仅限于 tls 认证,只要该域名是证书中包含的域名即可。
常用指令
1#启动Hysteria22systemctl start hysteria-server.service3#重启Hysteria24systemctl restart hysteria-server.service5#查看Hysteria2状态6systemctl status hysteria-server.service7#停止Hysteria28systemctl stop hysteria-server.service9#设置开机自启10systemctl enable hysteria-server.service11#查看日志12journalctl -u hysteria-server.service
流量统计 API
在服务端配置 trafficStats
后,可通过 HTTP API 查询服务器的==流量==统计信息,以及踢用户下线。
注:下述 api 都是 http,不安全。在后续使用 nginx 反代时,会更新为 https 访问方式。
1curl -H 'Authorization: trafficStats_passwd' http://ip_address:22222/traffic
bash 脚本
1#!/bin/bash2green='\033[0;32m'3cyan='\033[0;36m'4NC='\033[0m' # No Color5
6# 显示在线用户7echo "在线用户:"8curl -H 'Authorization: trafficStats_passwd' http://ip_address:22222/online9echo10# 函数:将字节转换为可读格式11bytes_to_readable() {12 local bytes=$113 if (( bytes < 1024 )); then14 printf "%d B" "$bytes"15 elif (( bytes < 1024**2 )); then29 collapsed lines
16 printf "%.2f KB" "$(echo "scale=2; $bytes / 1024" | bc)"17 elif (( bytes < 1024**3 )); then18 printf "%.2f MB" "$(echo "scale=2; $bytes / (1024^2)" | bc)"19 else20 printf "%.2f GB" "$(echo "scale=2; $bytes / (1024^3)" | bc)"21 fi22}23
24# 设置URL和头部25URL="http://ip_address:22222/traffic"26AUTH_HEADER="Authorization: trafficStats_passwd"27
28# 发送GET请求并获取响应29response=$(curl -s -w "HTTPSTATUS:%{http_code}" -H "$AUTH_HEADER" "$URL")30
31# 提取body和状态码32body=$(echo "$response" | sed -e 's/HTTPSTATUS\:.*//g')33status_code=$(echo "$response" | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')34
35if [ "$status_code" -eq 200 ]; then36 # 使用 jq 解析 JSON 并遍历每个键37 echo "$body" | jq -r 'to_entries[] | "\(.key) \(.value.tx) \(.value.rx)"' | while read -r key tx rx; do38 readable_tx=$(bytes_to_readable "$tx")39 readable_rx=$(bytes_to_readable "$rx")40 echo -e "$key: 上传 ${green}${readable_tx}${NC}, 下载${cyan}${readable_rx}${NC}"41 done42else43 echo "请求失败,状态码:$status_code"44fi
搭建缓解 TIT 特征的 vless+vision+tls
TIT 特征 TLS in TLS 是一种 TIS 传输 TLS 的特征,可能在某些地区能够被精确的识别和封禁。目前可以通过一些搭建方式来缓解。比如 naive 和 vision 通过字节填充来缓解 TIT。
使用 x-ui 面板搭建节点,x-ui 是一个前端项目,负责通过 UI 界面配置节点参数,最终使用 xray 来搭建节点。
安装 x-ui 面板
x-ui 虽然提供了 docker 镜像,但是没有更新,且不好使用。还是直接安装比较合适。
1bash <(curl -Ls https://raw.githubusercontent.com/FranzKafkaYu/x-ui/956bf85bbac978d56c0e319c5fac2d6db7df9564/install.sh) 0.3.4.4
安装时,建议修改端口和账号用户与密码。
需要防火墙放行自己设定的端口,假设设置的是 11080 端口。
安装后输入命令 x-ui
可以查看使用方式。
1root@LA:~# x-ui2
3 x-ui 面板管理脚本4 0. 退出脚本5————————————————6 1. 安装 x-ui7 2. 更新 x-ui8 3. 卸载 x-ui9————————————————10 4. 重置用户名密码11 5. 重置面板设置12 6. 设置面板端口13 7. 查看当前面板信息14————————————————15 8. 启动 x-ui17 collapsed lines
16 9. 停止 x-ui17 10. 重启 x-ui18 11. 查看 x-ui 状态19 12. 查看 x-ui 日志20————————————————21 13. 设置 x-ui 开机自启22 14. 取消 x-ui 开机自启23————————————————24 15. 一键安装 bbr (最新内核)25 16. 一键申请SSL证书(acme申请)26 17. 配置x-ui定时任务27
28面板状态: 已运行29是否开机自启: 是30xray 状态: 运行31
32请输入选择 [0-17],查看面板登录信息请输入数字7:0
x-ui 面板
安装成功后,需要登陆面板进行操作。鉴于目前对 http 访问的安全风险很重视,在初次没有配置好 https 时,需要先用 ssh 隧道进行访问。
在本机上输入下列命令,让本机的 11080 端口和服务器的 11080 端口建立 ssh 隧道。
1ssh -L 11080:localhost:11080 user@serverip
在浏览器中输入 http://localhost:port
登陆 x-ui 面板,第一次登陆以后,点击面板设置,会自动更改根路径,后续登陆需要输入 http://localhost:port/新根路径
才能正常登陆。其中 port 在安装时由自己设置,本例子中为 11080。
1http://localhost:port/5I1Q/xui/
但这种方式不要长期使用,当我们登入面板后,就应该立即去设置中,将 http 明文访问,升级为 https。
此处,填写已经申请到的 fullchain 证书,和密钥。保存后重启面板即可通过下面的网址访问
1https://ip:port/5I1Q
但这样访问,浏览器会提示不安全,因为 ip 并不符合证书中所认证的域名。所以,还需要在 cloudflare 中为 xui 面板单独设置一个三级域名单独用于访问 xui 面板,并且需要和后续的 nginx 分流配合起来,让访问 xui 域名的流量由 443 正确的分到 xui 端口。
否则就需要在 cloudflare 中配置 Origin Rules 将 cloudflare 前端代理的 443 端口流量自动的分流到服务器的对应端口,服务器也因此要开放 xui 端口,有暴露服务的风险。
x-ui 搭建配置
在面板添加节点。
注:flow 在打开 4 和 5 后才会显示。
还需要防火墙放行 xray 的端口。
其中域名需要解析到服务器的ip地址,且 cloudflare 解析时,不能打开代理。
使用端配置
直接复制面板中提供的链接可以导入到小火箭,但是不能导入到 clash,clash 需要手动配置,或者用 sub-store 转换。这里还没有搭建 sub-store,则手动填写。
clash 端
1proxies:2 - name: "🇺🇸 vless"3 type: vless4 server: hvl.hyperdns.com # 解析到真实ip,不套用 CDN5 port: 585056 udp: true7 uuid: c19119d6-796d-4c4b-add6-8392jeusisk8 flow: xtls-rprx-vision9 packet-encoding: xudp10 tls: true11 servername: hvl.hyperdns.com12 alpn:13 - h214 - http/1.115 client-fingerprint: chrome4 collapsed lines
16 skip-cert-verify: false17 network: tcp18 smux:19 enabled: false
上述节点导入后就可以正常访问了。
订阅服务搭建
参考:通过VPS架设Sub-Store(新版)、SubStore 部署
Sub-Store 项目分为前后端,前后端是分离的,部署在 VPS 上则需要前后端都部署,并且需要在前端访问之前套一个 Nginx,否则传输的都是 http 流量,不安全。部署后,可以在任意前端设置后端 api,即可使用。因此,在 mihomo-party 中,可以输入后端 api,以支持节点分享。
安装组件
同样先进入 su
。
1apt update -y && apt install unzip curl wget git -y
安装 FNM - Node 版本管理器
1$ curl -fsSL https://fnm.vercel.app/install | bash2...3In order to apply the changes, open a new terminal or run the following command:4 source /root/.bashrc
按照回显的图示,运行命令保存生效
1source /root/.bashrc #请按照你的回显提示命令进行输入
FNM 安装 Node
1fnm install v20.18.0
可以安装其他版本,但是后续服务配置文件需要同步修改版本。
安装 PNPM 软件包管理器
1curl -fsSL https://get.pnpm.io/install.sh | sh -
按照回显的图示,运行命令
1source /root/.bashrc
安装 Sub-Store
创建文件夹并拉取项目
1mkdir -p /root/sub-store #在 root 目录下面创建 sub-store 文件夹2cd /root/sub-store #进入 sub-store 文件夹
拉取项目并解压
1# 拉取后端项目2curl -fsSL https://github.com/sub-store-org/Sub-Store/releases/latest/download/sub-store.bundle.js -o sub-store.bundle.js3
4# 拉取前端项目5curl -fsSL https://github.com/sub-store-org/Sub-Store-Front-End/releases/latest/download/dist.zip -o dist.zip
解压前端文件,并改名为 frontend,而后删除源压缩文件
1unzip dist.zip && mv dist frontend && rm dist.zip
创建系统服务
pm2 的启动方式会有 BUG,所以我们采用服务进程的方式来启动
进入 VPS 目录 /etc/systemd/system/
,在里面创建一个文件 sub-store.service
,
vim /etc/systemd/system/sub-store.service
写入以下服务信息
1[Unit]2Description=Sub-Store3After=network-online.target4Wants=network-online.target systemd-networkd-wait-online.service5
6[Service]7LimitNOFILE=327678Type=simple9Environment="SUB_STORE_FRONTEND_BACKEND_PATH=/2cXaAxRGfddmGz2yx1wA"10Environment="SUB_STORE_BACKEND_CRON=0 0 * * *"11Environment="SUB_STORE_FRONTEND_PATH=/root/sub-store/frontend"12Environment="SUB_STORE_FRONTEND_HOST=0.0.0.0"13Environment="SUB_STORE_FRONTEND_PORT=3001"14Environment="SUB_STORE_DATA_BASE_PATH=/root/sub-store"15Environment="SUB_STORE_BACKEND_API_HOST=127.0.0.1"12 collapsed lines
16Environment="SUB_STORE_BACKEND_API_PORT=3000"17ExecStart=/root/.local/share/fnm/fnm exec --using v20.18.0 node /root/sub-store/sub-store.bundle.js18User=root19Group=root20Restart=on-failure21RestartSec=5s22ExecStartPre=/bin/sh -c ulimit -n 5120023StandardOutput=journal24StandardError=journal25
26[Install]27WantedBy=multi-user.target
上面服务代码中的 2cXaAxRGfddmGz2yx1wA
为API请求密钥,请自行修改,推荐自动生成地址:点击访问
启动服务,并设置开机自启。如果前面 fnm 安装 nodo 时,不是版本 v20.18.0,这里需要同步修改,否则执行不成功。
1systemctl enable sub-store.service --now
后端服务相关命令
1systemctl start sub-store.service #启动服务2systemctl enable sub-store.service #设置为开机自启3systemctl status sub-store.service #查看服务状态4systemctl stop sub-store.service #停止服务5systemctl restart sub-store.service #重启服务
正常情况下,运行服务状态,应该类似下图:( active:running
)
Nginx
前面搭建面板、订阅服务时,都需要在访问时,加上对应的端口号,如果暴露在公网,有安全风险。可以通过搭建 Nginx 服务,对外只暴露 443 80 端口,将 443 加密流量在 Nginx 内部分流到不同的本地端口,本地端口不需要暴露。就解决了这个问题。
安装 Nginx
1sudo apt install libnginx-mod-stream nginx -y
配置分流
在我的主机上,同时存在 x-ui面板
、hysteria2
,因此,希望 sub-store
可以和其他两个服务共存。且 hysteria2
伪装需要监听 80 443 端口,普通的 https 网络访问,也需要直接访问 443 端口。
在拥有一个有 ssl 认证的域名,一台可用服务器时,有两种解决方式:
-
通过 Cloudfalre 设置 Origin Rules,根据不同的 访问域名,将服务转发到不同的端口。例如:
hysteria2
仍然监听 80,443端口,x-ui面板
设置访问端口 81,sub-store
设置访问端口 82。然后 Cloudfalre 中将访问 sub.name.com 的 https 流量转发到服务器的 82 端口,访问 xui.name.com 的 https 流量转发到服务器的 81 端口,普通流量不管,自动转发到服务器的 80,443。但由于 sub-store 不支持 https 流量,所以还是需要设置 nginx 服务器,将 https 流量解析并代理成 http 流量到 sub-store 端口。 -
设置 nginx 反代服务,开放 443,80,8443端口。xui、sub-store 的网络访问都走 443,hysteria 监听 80 和 8443,hysteria 代理端口也为 8443。ngnix 将流量从 443 分流到 xui、sub-store、hysteria各自的端口上。当通过 https 协议访问 443 时,xui、sub-store分流到各自端口,其余流量全部分流到 8443,这部分流量被重定向到伪装站,而符合 hysteria 代理流量会直接访问 8443,不走 nginx 分流。
示意图如下:
因为一定需要 nginx 作反代,所以,采用第二种方式。
配置 nginx stream 分流和 nginx server
在 /etc/nginx/nginx.conf
中的 http 块外部分,也就是顶层配置下,加入 include /etc/nginx/vps.conf;
,并删除 /etc/nginx/site-enabled
下的基础配置。
1user www-data;2worker_processes auto;3pid /run/nginx.pid;4error_log /var/log/nginx/error.log;5include /etc/nginx/modules-enabled/*.conf;6
7events {8 worker_connections 768;9 # multi_accept on;10}11
12http {13 sendfile on;14 tcp_nopush on;16 collapsed lines
15 types_hash_max_size 2048;16
17 include /etc/nginx/mime.types;18 default_type application/octet-stream;19
20 ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE21 ssl_prefer_server_ciphers on;22
23 access_log /var/log/nginx/access.log;24 gzip on;25
26 include /etc/nginx/conf.d/*.conf;27 include /etc/nginx/sites-enabled/*;28}29
30include /etc/nginx/vps.conf;
在 /etc/nginx
下创建文件 vps.conf
,并填入下列分流规则:
- 根据域名分流将 443 端口的 https 流量分流到不同的后端。其中 xui 本身支持 https,不需要对 https 解密再转发。而 substore 目前只支持 http,所以需要将 sub 流量转发到 nginx server,由 nginx server 解密再转发到 sub 的端口。除此之外的流量,都转发到 hysteria 的伪装端口。
- 后续会在 /etc/nginx/sites-enabled/vps.conf 中为 substore 配置一个 nginx 反代服务,其监听的是 8444 端口,因此这里需要将 sub 对应的流量分流至 8444。
- xui 端口为 11080,这在 xui 面板搭建一节中提到过,是用户安装时自行设置的。
- hysteria 则是在配置文件中设置了伪装服务端口为 8443。
1stream {2 # 定义一个映射,将 SNI 中的服务器名映射到后端标识符3 map $ssl_preread_server_name $backend {4 hostnames;5 sub.xyz.top sub;6 xui.xyz.top xui;7 default hysteria; # 默认后端8 }9
10 # 定义各个后端的上游服务器11 upstream sub {12 server 127.0.0.1:8444; # sub.xyz.top 对应的后端,对接的是 nginx server13 }17 collapsed lines
14
15 upstream xui {16 server 127.0.0.1:11080; # xui.xyz.top 对应的后端17 }18
19 upstream hysteria {20 server 127.0.0.1:8443; # 默认后端21 }22
23 # 定义一个服务器块,监听指定端口并根据 SNI 分发流量24 server {25 listen 443;26 listen [::]:443;27 proxy_pass $backend;28 ssl_preread on;29 }30}
然后需要设置 sub-store 的 server 反代并部署 SSL 证书用于 tls 认证,解密 https 流量。
1server {2 listen 8444 ssl http2;3 listen [::]:8444 ssl http2;4 server_name sub.xyz.top;5
6 ssl_certificate /root/.acme.sh/xyz.top_ecc/fullchain.cer;7 ssl_certificate_key /root/.acme.sh/xyz.top_ecc/xyz.top.key;8
9 location / {10 proxy_pass http://127.0.0.1:3001;11 proxy_set_header Host $host;12 proxy_set_header X-Real-IP $remote_addr;13 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;2 collapsed lines
14 }15}
启动 nginx
移除默认的配置文件:sudo rm /etc/nginx/sites-enabled/default
。如果 /etc/nginx/sites-enabled
有其他的配置文件,都会被 nginx 启动,因此为了防止冲突,需要移除。
1sudo nginx -t # 检测配置是否正确2sudo systemctl restart nginx3sudo nginx -s reload # 重新启动 nginx
如果出现下列错误 unknown directive "stream"
,则是缺少 stream 的支持库,安装即可 sudo apt install libnginx-mod-stream
。这可能是由于 nginx v20.18.0 版本较低,v22.13.0 版本没有该问题。
1$ sudo nginx -t22024/12/19 16:53:58 [emerg] 1424878#1424878: unknown directive "stream" in /etc/nginx/vps.conf:23nginx: configuration file /etc/nginx/nginx.conf test failed
访问服务
在搭建好 nginx 反代后,就可以通过域名直接用 https 访问对应的服务了,不需要像之前一样,输入 ip+端口号的形式来访问。大大提高了安全性和易用性。
访问 SubStore
设置好后,SubStore 地址为:https://sub.xyz.top
其后端 API 为(可以在 mihomo-party 中添加),也可以直接在前端的设置中填入。
1https://sub.xyz.top/2cXaAxRGfddmGz2yx1wA
浏览器访问带有后端功能的前端,输入
1https://sub.xyz.top?api=https://sub.xyz.top/2cXaAxRGfddmGz2yx1wA
或者访问前端,在设置中,保存后端的 api。
访问 xui
首先在 cloudflare 中,设置一个三级域名,并解析到服务器 ip,且关闭代理。
假设三级域名是:xui.hyperds.com,则现在可以通过
1https://xui.hyperds.com/5I1Q
直接访问。
访问其他网址
除了上述 xui、sub以外的域名,都会被发送到 hysteria 伪装端口,返回的就是伪装的网站。
sub-store 的使用
我在另一个贴子中有详细介绍:节点的订阅管理\分享-我的方案