Lyndra's Blog

年轻人的第一台 VPS 代理服务器

2024-12-20
系统维护网络安全 VPSProxy
50分钟
9820字

年轻人的第一台 VPS 代理服务器

免责声明

  本文涉及的任何解锁和解密分析脚本仅用于资源共享和学习研究,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。

  间接使用脚本的任何用户,包括但不限于建立VPS或在某些行为违反国家/地区法律或相关法规的情况下进行传播, 本文作者对于由此引起的任何隐私泄漏或其他后果概不负责。

  请勿将本文内的任何内容用于商业或非法目的,否则后果自负。

  如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我将在收到认证文件后删除相关脚本。

  对任何本文中包含的脚本在使用中可能出现的问题概不负责,包括但不限于由任何脚本错误导致的任何损失或损害.

  您必须在下载后的24小时内从计算机或手机中完全删除以上内容。

  任何以任何方式查看此项目的人或直接或间接使用该项目的任何脚本的使用者都应仔细阅读此声明。本文作者保留随时更改或补充此免责声明的权利。一旦使用并复制了任何本文相关脚本或其他内容,则视为您已接受此免责声明。

实现的功能

  1. 搭建一个稳定的代理服务器。
  2. 提供便捷的订阅转换服务,便于分享节点信息。可供 3-4 人使用。
  3. 能够访问 ChatGPT,VPS 的 IP 最好是原生 IP,访问一些特殊网站时不会被 block。
  4. 提供的对外服务要够安全。例如,xray 面板需要以 TLS 加密访问,不能 http 裸奔在公网、SSH 服务更改端口,限制 root 用户登陆、节点使用当前较为安全的的协议等。
  5. 有 IPV6,平时有使用 BT、 PT 的需求。

  基于上述功能,本教程搭建的 VPS 有如下特点:

  1. 选用原生 IP 的 VPS 提供商,价格在 20 刀一年左右。能解锁 GPT。
  2. 购买域名,使用 cloudflare 解析 DNS,申请 TLS 证书,使得域名能够提供 https 安全访问。
  3. 使用 nginx 分流、反代本服务器上的代理服务、订阅服务、伪装服务。
  4. 使用 x-ui 面板搭建 vless+tls+vision 节点;搭建 hysteria2 节点。
  5. 搭建 sub-store,提供前后端订阅转换、分享服务,提供第三方网盘、glist 同步服务。

  本教程并非面向纯小白用户,如果你对基础的 Linux 命令不懂,对简单计算机网络知识不懂,建议不要尝试。如果你真的想尝试,并且愿意花时间学习,可以先购买机场,完成科学上网第一步。

  在 youtube 上学习科学上网基本知识,推荐不良林:www.youtube.com/@bulianglin

  再结合 Project X 项目的文档 小小白白话文 对照阅读。遇到不明白的知识去问 GPT,大概率能得到一个清晰的答案;或者 google 搜索对应知识。

  本教程在 Linux 系统下完成。

前期准备

购买域名

  域名一般都推荐 namesilo,购买一些便宜点的域名,例如 top,一年只要不到 2 美金,续费基本在 5 美金左右。如果嫌续费贵,大可以在到期以后,重新买一个便宜域名,然后再更新 DNS 解析,和节点信息。

​default​

  购买后需要将 DNS 服务换成 Cloudflare,参考:Namesilo/Cloudflare 域名注册和解析设置教程,便于后续申请 TLS 证书。申请合法的 TLS 证书非常重要,避免你的 VPS 用 http 访问,数据裸奔在公网,指不定哪天就被黑了。

DNS 解析

  当你购买域名,并按照上述参考将域名解析托管到 clouflare 后,就可以设置 DNS 解析了。你可以设置无限多的三级域名,解析到不同的 IP,用作不同的用途。

  需要注意,这里有一个代理状态栏,如果开启代理,则解析 DNS 时,会解析到 cloudflare 的 CDN IP,而不是自己设置的服务器 IP。该 CDN 会转发请求到服务器,但默认只会转发 443 端口的内容,不过你可以设置 Origin Rules 在 CDN 转发时,转发到服务器指定的端口上。

  后续的节点搭建会要求设置不同的三级域名,解析到服务器 IP,以识别不同的服务。有一些不需要设置代理,有一些则需要设置代理以提高服务的安全性。

​default​

  ‍

购买 VPS

  经典的 VPS 推荐环节,但由于咱们的情况特殊,一旦有人推荐一些好用的 VPS,或者可以薅羊毛的 VPS,不出多久,就会有大量的用户滥用,导致原有的用户体验下降,或者 IP 段被 GFW 特殊照顾。因此,不给出目前自用的 VPS 推荐。也不给 VPS 长期购买建议。

  补充:这个网站 vpsIs 罗列了许多VPS 厂家,以及其目前的订购费用,可以按需自选。

  此处仅仅列出一些目前比较有名的境外 VPS 厂家:

  1. BandwagonHost,板瓦工,国内出名的厂家,用的人很多,所以普通线路的质量可能会差点(没用过,仅供参考),C2N 线路的据说速度很快。IP 被封可以给钱换机器。普通机器 50💲 一年,对于个人用户来说小贵。
  2. VULTR,小时计费,速度一般,可以用来练手,ip 被封可以直接删除实例,重开一台其他地方的机器。便宜的大概 6💲一月,也有 3、4💲一月的,但几乎买不到。
  3. RackNerd,最近两年好像很火,也属于便宜的那一档。
  4. CloudCone,了解不多。
  5. DMIT,了解不多。

  除了费用、网络质量外,我们还需要关心:是否有 ipv6、是否支持 GPT 访问(网页端、移动端)。

  IPV6 一般都会提供,不需要额外费用。

  但是否支持 GPT 则是看 IP 是否“安全”。主要指的是 风控值,例如之前我在 vultr 购买的波兰服务器

​default​

  现在使用的机器

​default​

  所以,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 进行端口分流时拓扑图。

​default​

服务器购买

  当前服务器 20 💲一年,原生 ip,支持 gpt 网页和移动端,不支持 Netflix 非自制剧。

  使用 debian 12系统,ubuntu 的操作应该也类似。

整体框架

  搭建步骤分为几步:

  1. 防火墙设置
  2. 申请域名证书
  3. 节点搭建-hysteria2
  4. 节点搭建-vless+vision
  5. 搭建 sub-store 服务
  6. Nginx 分流隐藏服务

服务器搭建

服务器 ssh 服务安全加固

  购买服务器后,供应商会给 root 用户和密码,或者让你上传 ssh key,然后通过 ssh 访问服务器。

  ssh 连接到服务器后,就可以对服务器的基础安全性进行加固。

安装常用软件

Terminal window
1
apt update && apt-get install -y curl vim ufw

  后续会使用 curl 下载各种脚本,vim 编辑文件(不熟悉的可以替换为 nano),iptables-persistent 管理网络防火墙。
注:部分 vps 提供商有自己的防火墙管理面板,仅仅在 vps 中更改可能不生效。吐槽一下甲骨文的 vps 面板是真的难用,试用了一下直接劝退。

建立【非 root】的新用户

Terminal window
1
apt list --upgradable apt update && apt-get install -y sudo
2
getent 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" | chpasswd
5
6
echo "username ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

  上述命令的含义为:1. 安装 sudo,管理 root 权限。 2. 创建用户名为 username 的用户,密码为 passwd;并将其加入到 root 用户组,且使用 sudo 时不需要输入密码。

  设置好后,另起一个终端,使用用户 username 登陆尝试一下是否建立成功。

  注:上述用户名和密码请自行替换为自己的。后续同理。

修改 ssh 登陆端口

  注意命令执行顺序,先放行 ssh,再启动 ufw,并未验证 ufw 的默认配置会不会放行 ssh(虽说应该会考虑到),千万别把自己也挡在防火墙外了。

Terminal window
1
sudo apt-get install ufw
2
sudo ufw allow ssh
3
sudo ufw enable
4
5
sudo ufw allow 1111
6
sudo vim /etc/ssh/sshd_config # 修改 PORT 为1111
7
sudo systemctl restart ssh

  上述命令,编辑 ssh 配置文档 /etc/ssh/sshd_config​ 修改其访问端口为 1111,并使用 ufw 管理防火墙,放行 1111 端口。

  注:自行修改为自己想用的端口。

禁用 root 用户 SSH 远程登录

Terminal window
1
vim /etc/ssh/sshd_config # PermitRootLogin yes 改为 no

SSH 启用 RSA 密钥验证登录

  参考:使用-rsa-密钥登录并禁用密码登录

  在本机上单独开启一个终端,执行下列操作,允许 VPS 服务器接受本机的 ssh 密钥登陆请求。

Terminal window
1
ssh-keygen # 一路回车,在 ~/.ssh 目录下生成公钥和私钥
2
ssh-copy-id -p 1111 useranem@ip # 上传公钥到服务器

  完成上述全部操作后,登陆 VPS,并禁用 22 端口

Terminal window
1
ssh -p 1111 username@ip
2
sudo 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 模式需要准备:

  1. Zone ID
  2. Account ID
  3. API Token
获取 Zone ID, Account ID

  这两种 ID 直接在 Overview 页就能找到。

​default​

获取 API Token

  Overview 页点击 获取您的 API 令牌​ 进入 API Tokens 页。

  点击 API Tokens 项旁边 创建令牌​ 按钮,接着选择 编辑区域 DNS​ 的模板,点击 使用模板​。

​default​

​default​

  ​区域资源​ 里选择需要签发的域名

  在 客户端 IP 地址筛选​ 里建议写下 acme.sh 所在的主机做为白名单,需要注意,如果服务器有 ipv6 地址,则也需要添加,因为有可能会 ipv6 优先访问。

  击 继续以显示摘要​, 确认没问题后最后点击 创建令牌​。 default​

  此时就会出现一个 Token,,即 CF_Token,拷贝备用。

default​

安装脚本

  后续申请证书的命令,都是在 root 用户下执行的,请先使用 su​ 切换到 root 用户。

  安装脚本,设置 letsencrypt 为默认认证服务商,并设置邮箱用来接受 Let’s Encrypt 的邮件通知。安装时,acme 会自动的启动 cron 任务,每天检查是否需要续签证书。

Terminal window
1
su # 进入root用户
2
curl 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 而无需输入路径。

Terminal window
1
source ~/.bashrc

  开启自动更新

Terminal window
1
acme.sh --upgrade --auto-upgrade

  设置环境变量, 也就是准备的那三样, 可以准备好在一个文本编辑器里, 拷贝粘贴依次执行:

Terminal window
1
export CF_Token="<拷贝的 API Token>"
2
export CF_Account_ID="<拷贝的 Account ID>"
3
export CF_Zone_ID="<拷贝的 Zone ID>"

使用 Cloudflare DNS 验证签发证书

将 CA 服务器改成 Let’s Encrypt
Terminal window
1
acme.sh --set-default-ca --server letsencrypt
开始签发证书

  使用 DNS 的方式申请不需要放行 80 443 端口。

  这里以 hyperdns.com 为例,-d 后面接上域名, 可以签发多个,这里签了二级域名(hyperdns.com​) 和所有三级域名(*.hyperdns.com​),并指定生成的证书位置为用户名为 username 的家目录下。

Terminal window
1
acme.sh --issue --dns dns_cf -d hyperdns.com -d *.hyperdns.com \
2
--key-file /home/username/hyperdns.com.key \
3
--fullchain-file /home/username/fullchain.cer \
4
--reloadcmd 'bash -c "nginx -s reload && x-ui restart"'

  上述命令含有 --reloadcmd 参数,目的是在每次更新证书后,重启相关的服务。在此时由于 x-ui 和 nginx 还没有安装,执行命令会出错,但不妨碍证书的申请,此处可以忽略。

  需要注意,如果出现错误,需要找到错误原因后,再进行下一步,否则错误次数过多,会触发 letsencrypt 速率限制,一段时间内将无法继续验证。(请注意,完整替换域名,这里演示的 .com 的一级域名,如果只改了一级域名,二级域名不对,将会一直验证,不会成功获取证书。一般的验证5分钟以内就可以完成,如果长时间都不成功,可能就是没有完整替换域名为你自己的域名)。

  成功后,会给出证书的位置,如果不指定位置,则一般位于 ~/.acme.sh/域名_ecc/​。

Terminal window
1
-----END CERTIFICATE-----
2
[Wed Dec 18 10:07:05 PM CST 2024] Your cert is in: /home/username/hyperdns.com.cer
3
[Wed Dec 18 10:07:05 PM CST 2024] Your cert key is in: /home/username/hyperdns.com.key
4
[Wed Dec 18 10:07:05 PM CST 2024] The intermediate CA cert is in: /home/username/ca.cer
5
[Wed Dec 18 10:07:05 PM CST 2024] And the full-chain cert is in: /home/username/fullchain.cer
验证自动续签
Terminal window
1
$ crontab -l
2
23 9 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

  表示每天的上午9:23执行一次。检查是否需要更新证书。

  手动执行:

Terminal window
1
$ acme.sh --cron --home /root/.acme.sh
2
[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/directory
5
[Thu Dec 19 09:51:00 AM CST 2024] Skipping. Next renewal time is: 2025-02-08T09:00:33Z
6
[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_ecc
8
[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/directory
10
[Thu Dec 19 09:51:00 AM CST 2024] Skipping. Next renewal time is: 2025-02-15T14:07:05Z
11
[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_ecc
13
[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 用户访问,因此需要修改。

Terminal window
1
# 在 acme 申请命令时,已经将默认路径修改为相应路径,则不需要执行 cp 拷贝命令。
2
cp /root/.acme.sh/hyperdns.com_ecc/hyperdns.com.key /home/username/hyperdns.com.key
3
cp /root/.acme.sh/hyperdns.com_ecc/fullchain.cer /home/username/fullchain.cer
4
sudo chmod 644 /home/username/hyperdns.com.key
5
sudo 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/,可查看其配置说明。

Terminal window
1
bash <(curl -fsSL https://get.hy2.sh/)

  如果出现

Terminal window
1
$ bash <(curl -fsSL https://get.hy2.sh/)
2
Checking for installed version ... v2.6.0
3
Checking for latest version ... v2.6.0
4
Install /etc/hysteria/config.yaml ... exists
5
Creating user hysteria ... /dev/fd/63: line 1021: useradd: command not found

  则是系统的 PATH 环境出现问题,可以执行 export PATH=$PATH:/usr/sbin​ 暂时缓解,如果希望永久解决,可以将 /usr/sbin 添加到 PATH 中,在系统的 shell 配置文件(例如 ~/.bashrc 或 ~/.profile)中加入如下行:

Terminal window
1
export PATH=$PATH:/usr/sbin
2
# 然后执行以下命令来使更改生效:
3
source ~/.bashrc

  若域名没有 SSL 证书,则可生成自签证书(但不推荐,相当于你没有任何验证,容易被中间人攻击)。或者购买域名(namesilo 域名购买 和 cloudflare 托管解析)。但如果经过前面的设置,就无需担心,已经拥有了正规的 SSL 证书。

  自签证书申请(不建议使用)

  注:需要切换到 root 用户

Terminal window
1
su
2
openssl 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 端口/密码。

  简单解释这个配置的含义:

  1. 监听 8443 端口,该端口是建立 hysteria2 服务的基础。可以修改,但需要同时允许防火墙通过端口、修改客户端配置。
  2. tls 认证,配置自有域名的证书,以防止安全攻击。可以使用自签证书,但理论上并不安全,虽然大多数的小白教程都直接使用。如果完成本文前面的证书申请步骤,则这一步填入已有的证书即可。
  3. auth,权限验证,验证通过,才能够正常提供服务。支持多用户认证,每个用户使用 用户名+密码 的方式进行验证,适合小规模多用户使用。需要注意:用户名不能含有大写字母。使用大写字母会连不上,目前已经确认这是一个 bug,后续版本会修复。Hysteria2 版本为 v2.6.0。
  4. masquerade,伪装,服务器像普通网站服务器一样真的响应 HTTP 请求,假装自己就是一个正常的网页服务器。
  5. trafficStats,流量统计接口
  6. bandwidth,带宽设置,不宜设置过大,造成流量浪费。
Terminal window
1
cat << EOF > /etc/hysteria/config.yaml
2
listen: :8443 #监听端口
3
4
#使用 acme 证书,如果用cloudflare解析dns,并开启代理,则不需要申请,只填写域名即可
5
#acme:
6
# domains:
7
# - a.com #你的域名,需要先解析到服务器ip
8
# email: test@sharklasers.com
9
#使用 acme 申请 CA 证书
10
#acme:
11
# domains:
12
# - "*.hyperdns.com"
13
# email: your_email_address
14
# type: dns
15
# dns:
38 collapsed lines
16
# name: cloudflare
17
# config:
18
# cloudflare_api_token: your_api_token
19
20
#使用自签证书 或者已有 ca 证书
21
#ca 证书
22
tls:
23
cert: /home/username/fullchain.cer
24
key: /home/username/hyperdns.com.key
25
#使用自签证书
26
#tls:
27
# cert: /etc/hysteria/server.crt
28
# key: /etc/hysteria/server.key
29
30
auth:
31
# 设置多用户
32
type: userpass
33
userpass:
34
usr1: 8374393j4d
35
usr2: t2rt9shd92
36
37
masquerade:
38
type: proxy
39
proxy:
40
url: https://bing.com #伪装网址
41
rewriteHost: true
42
listenHTTP: :80
43
listenHTTPS: :8443
44
45
trafficStats:
46
listen: :22222
47
secret: trafficStats_passwd
48
49
bandwidth:
50
up: 20 mbps
51
down: 50 mbps
52
53
EOF

  最后,服务器端需要启动 hysteria2 server,并设置开机自启。

Terminal window
1
systemctl enable hysteria-server.service --now

  并运行命令:systemctl status hysteria-server.service​ 查看 hysteria 日志,观察是否启动成功。

  如果没有启动成功,请查看具体的报错信息,并解决。可以查看 hysteria2 官网:故障排除。

端口跳跃

  参考:hysteria2 端口跳跃、meta hysteria2配置

  运营商可能会阻断或限速 UDP 连接。表现为突然无法使用,或者网速慢,但几分钟(十几分钟)后又恢复。不过,这些限制往往仅限单个端口。端口跳跃可用作此情况的解决方法。

  Hysteria 服务端并不能同时监听多个端口,因此不能在服务器端使用上面的格式作为监听地址。建议配合 iptables 或 nftables 的 DNAT 将端口转发到服务器的监听端口。

Terminal window
1
# IPv4
2
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j REDIRECT --to-ports 443
3
# IPv6
4
ip6tables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j REDIRECT --to-ports 443

  在这个示例中,服务器监听 443 端口,但客户端可以通过 20000-50000 范围内的任何端口连接。

  对于本示例来说,没有放行这么多端口,只放行部分(端口号需要在 1000-65535),供参考:

Terminal window
1
ufw allow 50220:50959/udp
2
ufw allow 60133:60968/udp
3
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 50220:50959 -j REDIRECT --to-ports 8443
4
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 60133:60968 -j REDIRECT --to-ports 8443
5
ip6tables -t nat -A PREROUTING -i eth0 -p udp --dport 50220:50959 -j REDIRECT --to-ports 8443
6
ip6tables -t nat -A PREROUTING -i eth0 -p udp --dport 60133:60968 -j REDIRECT --to-ports 8443

  如果添加出错,需要删除规则,则可以参考:

删除 ufw 规则
Terminal window
1
ufw status numbered # 查看规则的编号
2
ufw delete 3 # 删除想删除的规则的编号
删除改 iptables

  列出当前的规则并找到规则的编号。使用以下命令列出规则:

Terminal window
1
sudo iptables -L -v -n --line-numbers
2
sudo iptables -L -v -n -t nat # 查看添加的 nat 规则

  这会输出规则列表,并在每个规则前面显示一个编号。假设你要删除编号为 2 的规则,可以执行:

Terminal window
1
sudo iptables -D <链名> <规则编号>

  例如,要删除 nat 表中的 PREROUTING 链上的第 2 条规则:

Terminal window
1
sudo iptables -t nat -D PREROUTING 2
使用端配置

  clash.meta 为例,在配置文件中按照如下方式填写,yaml 格式。

Terminal window
1
proxies:
2
- name: "🇺🇸 Hysteria" # Hysteria2 不支持套用 CDN
3
server: your_ip
4
port: 8443
5
ports: 50220-50959/60133-60968
6
type: hysteria2
7
password: usr1:8374393j4d # 多用户配置 用户名:密码
8
up: 20
9
down: 50
10
sni: www.hyperdns.com
11
skip-cert-verify: false

  将上述节点信息,添加到已有的 clash 配置文件中,就可以看到节点,如果检测不通,则说明信息填写错误,请仔细检查,并确认 hysteria 服务器端成功启动。节点信息配置出错,或者与服务端不匹配,则无法连通。

  填写参考:

  server 填写服务器 ip 或者没有开启代理的域名。 hysteria 不支持cdn,开启代理会导致无法正常使用。如果使用域名,有可能会发生不稳定的情况,这时改回 ip 即可。

  port 监听端口要和服务器一致。

  ports 端口跳跃端口也要和服务器上开放的端口一致,保证服务器防火墙放行对应端口,并设置端口转发到监听端口。

  密码 password 要正确,多用户需要注意格式要求,用户名和密码中间必须要有 :​ 但不能有空格。

  sni 认证网址也要正确,需要和证书提供的一致。但这仅限于 tls 认证,只要该域名是证书中包含的域名即可。

常用指令
Terminal window
1
#启动Hysteria2
2
systemctl start hysteria-server.service
3
#重启Hysteria2
4
systemctl restart hysteria-server.service
5
#查看Hysteria2状态
6
systemctl status hysteria-server.service
7
#停止Hysteria2
8
systemctl stop hysteria-server.service
9
#设置开机自启
10
systemctl enable hysteria-server.service
11
#查看日志
12
journalctl -u hysteria-server.service
流量统计 API

  在服务端配置 trafficStats​ 后,可通过 HTTP API 查询服务器的==流量==统计信息,以及踢用户下线。

  注:下述 api 都是 http,不安全。在后续使用 nginx 反代时,会更新为 https 访问方式。

Terminal window
1
curl -H 'Authorization: trafficStats_passwd' http://ip_address:22222/traffic

  bash 脚本

1
#!/bin/bash
2
green='\033[0;32m'
3
cyan='\033[0;36m'
4
NC='\033[0m' # No Color
5
6
# 显示在线用户
7
echo "在线用户:"
8
curl -H 'Authorization: trafficStats_passwd' http://ip_address:22222/online
9
echo
10
# 函数:将字节转换为可读格式
11
bytes_to_readable() {
12
local bytes=$1
13
if (( bytes < 1024 )); then
14
printf "%d B" "$bytes"
15
elif (( bytes < 1024**2 )); then
29 collapsed lines
16
printf "%.2f KB" "$(echo "scale=2; $bytes / 1024" | bc)"
17
elif (( bytes < 1024**3 )); then
18
printf "%.2f MB" "$(echo "scale=2; $bytes / (1024^2)" | bc)"
19
else
20
printf "%.2f GB" "$(echo "scale=2; $bytes / (1024^3)" | bc)"
21
fi
22
}
23
24
# 设置URL和头部
25
URL="http://ip_address:22222/traffic"
26
AUTH_HEADER="Authorization: trafficStats_passwd"
27
28
# 发送GET请求并获取响应
29
response=$(curl -s -w "HTTPSTATUS:%{http_code}" -H "$AUTH_HEADER" "$URL")
30
31
# 提取body和状态码
32
body=$(echo "$response" | sed -e 's/HTTPSTATUS\:.*//g')
33
status_code=$(echo "$response" | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')
34
35
if [ "$status_code" -eq 200 ]; then
36
# 使用 jq 解析 JSON 并遍历每个键
37
echo "$body" | jq -r 'to_entries[] | "\(.key) \(.value.tx) \(.value.rx)"' | while read -r key tx rx; do
38
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
done
42
else
43
echo "请求失败,状态码:$status_code"
44
fi

搭建缓解 TIT 特征的 vless+vision+tls

  TIT 特征 TLS in TLS 是一种 TIS 传输 TLS 的特征,可能在某些地区能够被精确的识别和封禁。目前可以通过一些搭建方式来缓解。比如 naive 和 vision 通过字节填充来缓解 TIT。

  参考:搭建 VISION 节点、TIT 问题及解决方式

  使用 x-ui 面板搭建节点,x-ui 是一个前端项目,负责通过 UI 界面配置节点参数,最终使用 xray 来搭建节点。

安装 x-ui 面板

  x-ui 虽然提供了 docker 镜像,但是没有更新,且不好使用。还是直接安装比较合适。

Terminal window
1
bash <(curl -Ls https://raw.githubusercontent.com/FranzKafkaYu/x-ui/956bf85bbac978d56c0e319c5fac2d6db7df9564/install.sh) 0.3.4.4

  安装时,建议修改端口和账号用户与密码。

​default​

  需要防火墙放行自己设定的端口,假设设置的是 11080 端口。

  安装后输入命令 x-ui​ 可以查看使用方式。

Terminal window
1
root@LA:~# x-ui
2
3
x-ui 面板管理脚本
4
0. 退出脚本
5
————————————————
6
1. 安装 x-ui
7
2. 更新 x-ui
8
3. 卸载 x-ui
9
————————————————
10
4. 重置用户名密码
11
5. 重置面板设置
12
6. 设置面板端口
13
7. 查看当前面板信息
14
————————————————
15
8. 启动 x-ui
17 collapsed lines
16
9. 停止 x-ui
17
10. 重启 x-ui
18
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
是否开机自启: 是
30
xray 状态: 运行
31
32
请输入选择 [0-17],查看面板登录信息请输入数字7:0

x-ui 面板

  安装成功后,需要登陆面板进行操作。鉴于目前对 http 访问的安全风险很重视,在初次没有配置好 https 时,需要先用 ssh 隧道进行访问。

  在本机上输入下列命令,让本机的 11080 端口和服务器的 11080 端口建立 ssh 隧道。

Terminal window
1
ssh -L 11080:localhost:11080 user@serverip

  在浏览器中输入 http://localhost:port​ 登陆 x-ui 面板,第一次登陆以后,点击面板设置,会自动更改根路径,后续登陆需要输入 http://localhost:port/新根路径​ 才能正常登陆。其中 port 在安装时由自己设置,本例子中为 11080。

Terminal window
1
http://localhost:port/5I1Q/xui/

​default​

  但这种方式不要长期使用,当我们登入面板后,就应该立即去设置中,将 http 明文访问,升级为 https。

  此处,填写已经申请到的 fullchain 证书,和密钥。保存后重启面板即可通过下面的网址访问

Terminal window
1
https://ip:port/5I1Q

  但这样访问,浏览器会提示不安全,因为 ip 并不符合证书中所认证的域名。所以,还需要在 cloudflare 中为 xui 面板单独设置一个三级域名单独用于访问 xui 面板,并且需要和后续的 nginx 分流配合起来,让访问 xui 域名的流量由 443 正确的分到 xui 端口。

  否则就需要在 cloudflare 中配置 Origin Rules 将 cloudflare 前端代理的 443 端口流量自动的分流到服务器的对应端口,服务器也因此要开放 xui 端口,有暴露服务的风险。

x-ui 搭建配置

  在面板添加节点。

​default​

  注:flow 在打开 4 和 5 后才会显示。

​default​

  还需要防火墙放行 xray 的端口。

  其中域名需要解析到服务器的ip地址,且 cloudflare 解析时,不能打开代理。

使用端配置

  直接复制面板中提供的链接可以导入到小火箭,但是不能导入到 clash,clash 需要手动配置,或者用 sub-store 转换。这里还没有搭建 sub-store,则手动填写。

  clash 端

Terminal window
1
proxies:
2
- name: "🇺🇸 vless"
3
type: vless
4
server: hvl.hyperdns.com # 解析到真实ip,不套用 CDN
5
port: 58505
6
udp: true
7
uuid: c19119d6-796d-4c4b-add6-8392jeusisk
8
flow: xtls-rprx-vision
9
packet-encoding: xudp
10
tls: true
11
servername: hvl.hyperdns.com
12
alpn:
13
- h2
14
- http/1.1
15
client-fingerprint: chrome
4 collapsed lines
16
skip-cert-verify: false
17
network: tcp
18
smux:
19
enabled: false

  上述节点导入后就可以正常访问了。

订阅服务搭建

  参考:通过VPS架设Sub-Store(新版)、SubStore 部署

  Sub-Store 项目分为前后端,前后端是分离的,部署在 VPS 上则需要前后端都部署,并且需要在前端访问之前套一个 Nginx,否则传输的都是 http 流量,不安全。部署后,可以在任意前端设置后端 api,即可使用。因此,在 mihomo-party 中,可以输入后端 api,以支持节点分享。

安装组件

  同样先进入 su​。

Terminal window
1
apt update -y && apt install unzip curl wget git -y

安装 FNM - Node 版本管理器

Terminal window
1
$ curl -fsSL https://fnm.vercel.app/install | bash
2
...
3
In order to apply the changes, open a new terminal or run the following command:
4
source /root/.bashrc

  按照回显的图示,运行命令保存生效

Terminal window
1
source /root/.bashrc #请按照你的回显提示命令进行输入

FNM 安装 Node

Terminal window
1
fnm install v20.18.0

  可以安装其他版本,但是后续服务配置文件需要同步修改版本。

安装 PNPM 软件包管理器

Terminal window
1
curl -fsSL https://get.pnpm.io/install.sh | sh -

  按照回显的图示,运行命令

Terminal window
1
source /root/.bashrc

安装 Sub-Store

创建文件夹并拉取项目

1
mkdir -p /root/sub-store #在 root 目录下面创建 sub-store 文件夹
2
cd /root/sub-store #进入 sub-store 文件夹

拉取项目并解压

1
# 拉取后端项目
2
curl -fsSL https://github.com/sub-store-org/Sub-Store/releases/latest/download/sub-store.bundle.js -o sub-store.bundle.js
3
4
# 拉取前端项目
5
curl -fsSL https://github.com/sub-store-org/Sub-Store-Front-End/releases/latest/download/dist.zip -o dist.zip

  解压前端文件,并改名为 frontend,而后删除源压缩文件

Terminal window
1
unzip 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]
2
Description=Sub-Store
3
After=network-online.target
4
Wants=network-online.target systemd-networkd-wait-online.service
5
6
[Service]
7
LimitNOFILE=32767
8
Type=simple
9
Environment="SUB_STORE_FRONTEND_BACKEND_PATH=/2cXaAxRGfddmGz2yx1wA"
10
Environment="SUB_STORE_BACKEND_CRON=0 0 * * *"
11
Environment="SUB_STORE_FRONTEND_PATH=/root/sub-store/frontend"
12
Environment="SUB_STORE_FRONTEND_HOST=0.0.0.0"
13
Environment="SUB_STORE_FRONTEND_PORT=3001"
14
Environment="SUB_STORE_DATA_BASE_PATH=/root/sub-store"
15
Environment="SUB_STORE_BACKEND_API_HOST=127.0.0.1"
12 collapsed lines
16
Environment="SUB_STORE_BACKEND_API_PORT=3000"
17
ExecStart=/root/.local/share/fnm/fnm exec --using v20.18.0 node /root/sub-store/sub-store.bundle.js
18
User=root
19
Group=root
20
Restart=on-failure
21
RestartSec=5s
22
ExecStartPre=/bin/sh -c ulimit -n 51200
23
StandardOutput=journal
24
StandardError=journal
25
26
[Install]
27
WantedBy=multi-user.target

  上面服务代码中的 2cXaAxRGfddmGz2yx1wA​ 为API请求密钥,请自行修改,推荐自动生成地址:点击访问

  启动服务,并设置开机自启。如果前面 fnm 安装 nodo 时,不是版本 v20.18.0,这里需要同步修改,否则执行不成功。

Terminal window
1
systemctl enable sub-store.service --now

  后端服务相关命令

1
systemctl start sub-store.service #启动服务
2
systemctl enable sub-store.service #设置为开机自启
3
systemctl status sub-store.service #查看服务状态
4
systemctl stop sub-store.service #停止服务
5
systemctl restart sub-store.service #重启服务

  正常情况下,运行服务状态,应该类似下图:( active:running​ )

​default​

Nginx

  前面搭建面板、订阅服务时,都需要在访问时,加上对应的端口号,如果暴露在公网,有安全风险。可以通过搭建 Nginx 服务,对外只暴露 443 80 端口,将 443 加密流量在 Nginx 内部分流到不同的本地端口,本地端口不需要暴露。就解决了这个问题。

安装 Nginx

Terminal window
1
sudo apt install libnginx-mod-stream nginx -y

配置分流

  在我的主机上,同时存在 x-ui面板​、hysteria2​,因此,希望 sub-store​ 可以和其他两个服务共存。且 hysteria2​ 伪装需要监听 80 443 端口,普通的 https 网络访问,也需要直接访问 443 端口。

  在拥有一个有 ssl 认证的域名,一台可用服务器时,有两种解决方式:

  1. 通过 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 端口。

  2. 设置 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 分流。

    示意图如下:

    ​default​

  因为一定需要 nginx 作反代,所以,采用第二种方式。

配置 nginx stream 分流和 nginx server

  在 /etc/nginx/nginx.conf​ 中的 http 块外部分,也就是顶层配置下,加入 include /etc/nginx/vps.conf;​,并删除 /etc/nginx/site-enabled​ 下的基础配置。

/etc/nginx/nginx.conf
1
user www-data;
2
worker_processes auto;
3
pid /run/nginx.pid;
4
error_log /var/log/nginx/error.log;
5
include /etc/nginx/modules-enabled/*.conf;
6
7
events {
8
worker_connections 768;
9
# multi_accept on;
10
}
11
12
http {
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: POODLE
21
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
30
include /etc/nginx/vps.conf;

  在 /etc/nginx​ 下创建文件 vps.conf​,并填入下列分流规则:

  1. 根据域名分流将 443 端口的 https 流量分流到不同的后端。其中 xui 本身支持 https,不需要对 https 解密再转发。而 substore 目前只支持 http,所以需要将 sub 流量转发到 nginx server,由 nginx server 解密再转发到 sub 的端口。除此之外的流量,都转发到 hysteria 的伪装端口。
  2. 后续会在 /etc/nginx/sites-enabled/vps.conf 中为 substore 配置一个 nginx 反代服务,其监听的是 8444 端口,因此这里需要将 sub 对应的流量分流至 8444。
  3. xui 端口为 11080,这在 xui 面板搭建一节中提到过,是用户安装时自行设置的。
  4. hysteria 则是在配置文件中设置了伪装服务端口为 8443。
/etc/nginx/vps.conf
1
stream {
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 server
13
}
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 流量。

/etc/nginx/sites-enabled/vps.conf
1
server {
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 启动,因此为了防止冲突,需要移除。

Terminal window
1
sudo nginx -t # 检测配置是否正确
2
sudo systemctl restart nginx
3
sudo nginx -s reload # 重新启动 nginx

  如果出现下列错误 unknown directive "stream"​,则是缺少 stream 的支持库,安装即可 sudo apt install libnginx-mod-stream​。这可能是由于 nginx v20.18.0 版本较低,v22.13.0 版本没有该问题。

Terminal window
1
$ sudo nginx -t
2
2024/12/19 16:53:58 [emerg] 1424878#1424878: unknown directive "stream" in /etc/nginx/vps.conf:2
3
nginx: configuration file /etc/nginx/nginx.conf test failed

访问服务

  在搭建好 nginx 反代后,就可以通过域名直接用 https 访问对应的服务了,不需要像之前一样,输入 ip+端口号的形式来访问。大大提高了安全性和易用性。

访问 SubStore

  设置好后,SubStore 地址为:https://sub.xyz.top​

  其后端 API 为(可以在 mihomo-party 中添加),也可以直接在前端的设置中填入。

1
https://sub.xyz.top/2cXaAxRGfddmGz2yx1wA

  浏览器访问带有后端功能的前端,输入

1
https://sub.xyz.top?api=https://sub.xyz.top/2cXaAxRGfddmGz2yx1wA

  或者访问前端,在设置中,保存后端的 api。

访问 xui

  首先在 cloudflare 中,设置一个三级域名,并解析到服务器 ip,且关闭代理。

  假设三级域名是:xui.hyperds.com,则现在可以通过

Terminal window
1
https://xui.hyperds.com/5I1Q

  直接访问。

访问其他网址

  除了上述 xui、sub以外的域名,都会被发送到 hysteria 伪装端口,返回的就是伪装的网站。

sub-store 的使用

  我在另一个贴子中有详细介绍:节点的订阅管理\分享-我的方案

  ‍

本文标题:年轻人的第一台 VPS 代理服务器
文章作者:Lyndra
发布时间:2024-12-20
总访问量次
总访客数人次
Copyright 2025
站点地图