先决条件
在开始操作之前,建议你先了解以下基础知识:
- 使用 ssh 命令或 ssh 客户端登录远程服务器
- 使用 vim 或其他编辑器的最基本的操作
购买 VPS
购买 VPS 的说明(点击以展开)
Hmmm… 本人学生党(穷 ➕ 没有办理国际信用卡),买境外的 VPS 不太方便。我找了相对便宜的(没有活动时的价格最低为 $3.71 / 月)且支持使用支付宝的 VPS 提供商 —— CloudCone。
注册登录没太多好说的,唯一的建议就是注册的时候填写国外的邮箱(Cloudcone 将会通过这个邮箱告知你 VPS 的 IP 地址和 root 用户的初始密码)。
这里简单说下如何通过支付宝进行充值:
填写完支付宝关联的邮箱地址(如支付宝未与任何邮箱关联,请自行搜索相关内容),会跳转至支付宝扫码付款的页面,付款成功就可新建 VPS 实例了。
新建实例部分,本文以 Debian 10 为例,您也可以使用其他 Linux 发行版本。如您使用其他 Linux 发行版本,本教程后续的部分命令或许会有些许差异(如软件包的安装等),当然本文对您仍具有参考意义。
主机名按照框内灰色字体的格式填写即可。
新建实例成功后,请注意查看你注册账号时的邮箱,是否收到包含服务器公网 IPv4 地址和 root 用户初始密码的电子邮件。
初始化 VPS
具体步骤
ssh 登录到远程服务器的 root 用户后再完成以下操作:
- 更新系统已知的软件包列表、升级系统上的所有软件包、移除不再需要的依赖软件包:
1 | apt update && apt upgrade && apt autoremove |
正经的 Linux 用户不会用 root 干所有的事情,如果这么做的话将会很危险。创建一个普通的用户,并让它可以通过 sudo 指令用 root 权限执行命令是一般的解决方案。
- 在用 sudo 之前,我们需要先安装 sudo 这个软件包:
1 | apt install sudo |
- 新建一个普通用户,本文新建名为
eric
的用户(-m
为用户创建相应的 home 目录,-s
选项使用 /bin/bash 作为用户的 shell,-G
并将其添加到 sudo 用户组中),创建好后第2行命令给 eric 用户设置一个密码:
1 | useradd -m -s /bin/bash -G sudo eric |
- 相关建议(可选操作)
为了安全起见,建议你完成下列操作:
- 禁止通过 SSH 登录到 root 用户
- 限制 SSH 通过用户密码来登录,并实现 SSH 仅能通过密钥登录服务器
在操作之前,你需要先将本机公钥添加到远程服务器
- 首先确认下本机是否生成过 SSH 密钥。Git Bash 上执行命令
ls ~/.ssh
查看是否有id_*
和id_*.pub
这两个文件(其中*
是生成密钥的签名类型),如果没有则需要通过 ssh-keygen 生成,在 Git Bash 中执行命令:
1 | ssh-keygen -t ecdsa |
- 如果已生成过 SSH 密钥,你现在就可以通过命令将本机的公钥信息添加到远程服务器中,执行命令后会让你确认信息,输入
yes
,然后输入服务器用户的登录密码:
1 | $ ssh-copy-id eric@服务器IP地址 |
完成该操作之后就可以免密登录服务器了,如果要禁用远程登录 root 用户和使用密码登录的方式,点击下面的『操作要点』展开
操作要点
- 禁止通过 SSH 登录到 root 用户
- 编辑
/etc/ssh/sshd_config
- 编辑
1 | ...... |
- 限制 SSH 通过用户密码来登录
- 编辑
/etc/ssh/sshd_config
- 编辑
1 | ...... |
- 编辑完配置文件后,
sudo systemctl restart sshd
重启下服务器的 sshd 服务
安装 V2Ray 前的准备
正经的 Linux 用户不会用 root 干所有的事情,如果这么做的话将会很危险。所以使用普通用户,再通过 sudo 指令用 root 权限执行命令是坠吼的。
使用普通用户通过 ssh 登录到你的远程服务器后再完成以下操作:
时间校准
对于 V2Ray,它的验证方式包含时间,就算是配置没有任何问题,如果时间不正确,也无法连接 V2Ray 服务器的,服务器会认为你这是不合法的请求。所以系统时间一定要正确,只要保证时间误差在 90 秒 之内就没问题。
1 | sudo timedatectl set-ntp true # 启用 NTP 服务 |
执行完之后,终端显示的时间如果正确,那么就没问题了。
防火墙初始化
- 本文将使用 ufw 来管理系统的防火墙
1 | sudo apt install ufw |
安装相关软件包
- 更新系统已知的软件包列表、升级系统上的所有软件包、移除不再需要的依赖软件包:
1 | sudo apt update && sudo apt upgrade && sudo apt autoremove |
- 安装编辑器 vim(后续编写配配置文件需要,当然你也可以使用其他编辑器)
1 | sudo apt install vim |
- 安装所需要的依赖软件包:
1 | sudo apt install curl openssl |
安装并配置 V2Ray
下载 V2Ray 安装脚本
1 | curl -O https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh |
安装 V2ray 主程序
1 | sudo bash install-release.sh |
安装最新发行的 geoip.dat 和 geosite.dat
geoip.dat
:IP 数据文件geosite.dat
:域名数据文件
1 | sudo bash install-dat-release.sh |
配置 V2Ray
使用 vim 编辑 V2Ray 的配置文件:
1 | sudo vim /usr/local/etc/v2ray/config.json |
清空文件原有内容,然后输入以下内容:
1 | { |
port
:V2Ray 的 WebSocket 所监听的内网端口,取值范围是 1 ~ 65535,但为了避免端口占用,所以不能填常用的端口号(如 22 是 ssh 的端口号,80 是 HTTP 的端口号,443 是 HTTPS 的端口号等),此处设我为10000
id
:用户的主 ID。可通过 UUID 生成器 - v2fly 或者 Online UUID Generator 生成(任选其中一个网站生成就行),此处我设为9dfe7fee-d08f-44f8-ad2d-300d4c9c3a0e
alterId
:根据新 V2Ray 白话文指南 – VMess,推荐值为 0,代表启用 VMessAEADnetwork
:传输协议。设为 WebSocket,即ws
path
:WebSocket 所使用的 HTTP 协议路径。可自定义,例如我设为/ray
咳咳,上面的配置文件想要照抄的话至少 id 取不一样的值就好 🤣
注册域名
注册域名的说明
域名可通过网站 NameSilo 进行申请注册,这个站点最低可花 $0.99 即可注册申请一年的域名,同时还支持免费启用 WHOIS privacy(WHOIS 隐私服务大致的意思是:从 WHOIS 记录中删除您的个人联系信息)。
- 在 NameSilo 注册完登录账号,然后搜索你想要的域名,选择域名。选择最便宜的就行(至于续费域名的费用比较高,所以建议是域名过期后再换就行):
- 点击 Add 之后,会跳转如下界面(此处注意关掉自动续费,打开 WHOIS 隐私服务):
- 支付方面,NameSilo 也是支持支付宝进行支付的,填写支付宝相关联的邮箱地址,然后进行扫码支付。
- 付款成功后点击页面里的「Account Domains 账户所属域名」栏里的数字
- 然后跳转到信息填写页面,这些信息可以通过美国虚拟信息生成器生成然后进行填写(其中带
*
号的为必填项)
- 填写完信息后,点击 🌏 图标管理域名的 DNS,然后在 DNS 管理页面点击 ❌ 删除所有的记录
注册完域名记得前往您的电子邮箱查收来自 NameSilo 的邮件,必须点击 WHOIS 的邮箱验证链接,否则您的域名可能将被注销。
Cloudflare 接管域名解析
完成前面的步骤后,我们将在这一步使用 Cloudflare 来接管域名的解析。
具体步骤
- 注册 Cloudflare 的账号,注册完账号之后,请前往邮箱查看来自 Cloudflare 的邮件,点击验证链接以验证您的电子邮箱。
- 添加站点,输入先前注册的域名即可。
- 选择「免费计划」
- 暂不添加 DNS 记录
- 前往域名提供商(如前面介绍的 NameSilo),点击图示部分进行域名服务器的管理
- 移除域名提供商预置的「域名服务器」,用 Cloudflare 提供的「域名服务器」替换之。
- 「Submit 提交」完上述变更之后,等待若干分钟后域名的状态转为「active 激活」。然后点击「Done, check nameservers」。
- 点击「Finish later」,然后再回到 Cloudflare 首页,等待若干分钟后「Pending Nameserver Update」会转为「active」,这时点进去。
- 添加 DNS 记录
- 如下图表添加 2 条记录就可以了。
Type | Name | IPv4 address | Proxy status |
---|---|---|---|
A | @ | x.x.x.x | ☁ Proxied |
A | www | x.x.x.x | ☁ Proxied |
- 云朵被点亮(即
☁ Proxied
)意味着你的网站流量必须经过 Cloudflare,也可以说使用了 Cloudflare 的 CDN 节点。
安装 Nginx 及其初始配置
具体步骤
请将本文中的 ericclose.xyz
替换成您注册的域名
安装 Nginx
1 | sudo apt install nginx |
配置防火墙
1 | sudo ufw allow 'Nginx Full' |
配置 Nginx
- Nginx 在安装过程中会创建一个默认的服务器块。如果它仍然存在,请将其删除,因为你后面将为你注册的域名配置一个自定义服务器块
1 | sudo rm /etc/nginx/sites-enabled/default |
- 使用如下命令,为你的域名创建目录
1 | sudo mkdir -p /var/www/ericclose.xyz/html |
- 接下来,用
$USER
环境变量给当前的系统用户分配目录的所有权
1 | sudo chown -R $USER:$USER /var/www/ericclose.xyz/html |
- 使用命令确保 web root 具有正确的权限
1 | sudo chmod -R 755 /var/www/ericclose.xyz |
- 接下来,使用
vim
或其他编辑器创建index.html
页面文件
1 | vim /var/www/ericclose.xyz/html/index.html |
文件写入以下内容:
1 | <html> |
- 我们需要创建一个服务器块,指向我们自定义的 web root。我们不直接修改默认的配置文件,而是新建一个文件
1 | sudo vim /etc/nginx/sites-available/ericclose.xyz |
填写以下内容:
1 | server { |
- 注意要记得修改配置文件中的
root
项和server_name
项中的ericclose.xyz
,更改为您的域名即可。
- 接下来,让我们通过在
sites-enabled
目录下创建一个符号链接来启用这个服务器块,Nginx 在启动时会在这个目录下读取配置文件:
1 | sudo ln -s /etc/nginx/sites-available/ericclose.xyz /etc/nginx/sites-enabled/ |
- 为了防止可能出现的内存问题,有必要调整
/etc/nginx/nginx.conf
文件中的一个值。
1 | sudo vim /etc/nginx/nginx.conf |
找到 server_names_hash_bucket_size
,将 #
符号去掉,取消这一行的注释。
1 | ... |
- 接下来,测试一下 Nginx 文件中是否有语法错误。
1 | sudo nginx -t |
- 最后,若你的配置测试没有遇到问题,重启 Nginx 来启用你的更改。
1 | sudo systemctl restart nginx |
- 现在可以访问您注册的域名了,如下:
使用 Cloudflare 生成 TLS 证书和私钥、部署 Authenticated Origin Pulls
生成 TLS 证书和私钥
生成证书的方法有很多,新 V2Ray 白话文指南使用 acme.sh 生成证书,我这里的话则是通过 Cloudflare 网站生成🤣。
注意:「Cloudflare Origin Certificate」是一个只被 Cloudflare 信任的证书,不被浏览器所信任,所以使用「Cloudflare Origin Certificate」就必须在前面使用 Cloudflare 添加 DNS 记录时将云朵点亮,即 ☁ Proxied
。如果不点亮云朵,您的网站将无法安全访问,同时代理也会无法正常连接。 – from HTTPS certificate not trusted with Cloudflare Origin Certificate
具体步骤
Cloudflare Origin CA 可以让你生成由 Cloudflare 签署的免费 TLS 证书,安装在你的 Nginx 服务器上,以此可以保护 Cloudflare 的服务器和你的 Nginx 服务器之间的连接。
- 要使用 Origin CA 生成证书,请在浏览器中登录 Cloudflare 账户。选择您要保护的域名,并导航到 Cloudflare 仪表板的「SSL/TLS」部分。然后再从导航到「Origin Server」选项卡,然后单击「Create Certificate 创建证书」按钮。
- 保留选择「Let Cloudflare generate a private key and a CSR」,「Private key type 私钥类型」我们选择「ECDSA」,关于 ECDSA 相较于 RSA 的优点请自行搜索。其余选项默认,「Next 下一步」即可
- 然后你会看到一个对话框,里面有「Origin Certificate 源证书」和「Private key 私钥」。你需要将证书和私钥的内容写到你的服务器上。出于安全考虑,私钥信息仅显示一次,之后不会再显示,所以在点击「OK」之前,最好先将相关内容复制后妥善保管。
你将使用服务器上的 /etc/ssl
目录来存放源证书和私钥文件。
关于 Nginx 的相关配置将在后面讲解。
- 在服务器上,使用用 vim 或其他文本编辑器编辑
/etc/ssl/cert.pem
:
1 | sudo vim /etc/ssl/cert.pem |
将先前保存的证书内容添加到文件中,然后保存并退出编辑器。
- 在服务器上,使用用 vim 或其他文本编辑器编辑
/etc/ssl/key.pem
:
1 | sudo vim /etc/ssl/key.pem |
将先前保存的私钥内容添加到文件中,然后保存并退出编辑器。
现在进入 Cloudflare 仪表板的「SSL/TLS」部分,导航到「Overview」选项卡,并将 SSL/TLS 加密模式改为「 Full (strict) 」。这将确保 Cloudflare 始终加密 Cloudflare 和你的 Nginx 服务器之间的连接。
然后 Cloudflare 仪表板的「SSL/TLS」部分,导航到「Edge Certificates」选项卡,并将「Minimum TLS Version」改为「TLS 1.2」:
部署 Authenticated Origin Pulls
如果在 Nginx 服务器上设置了「Authenticated Origin Pulls」,就可以确保它只接受来自 Cloudflare 服务器的请求,防止任何其他人直接连接到 Nginx 服务器。
要使「Authenticated Origin Pulls」正常工作,需要在 Cloudflare 中使用完全 SSL,并更新源 Web 服务器 SSL 配置。下载 authenticated_origin_pull_ca.pem,或者复制下文证书内容, 并将证书 authenticated_origin_pull_ca.pem
的内容写入到服务器的 /etc/ssl/cloudflare.crt
中。关于 Nginx 的相关配置下一节会讲解
- 点击 Cloudflare 仪表板中的「SSL/TLS」部分,导航到「Origin Server」选项卡并打开「Authenticated Origin Pulls」选项 。
- 将证书
authenticated_origin_pull_ca.pem
的内容写入到服务器的/etc/ssl/cloudflare.crt
中
你可以选择下载证书 authenticated_origin_pull_ca.pem,或者直接复制证书的内容:
1 | -----BEGIN CERTIFICATE----- |
使用 vim 编辑 /etc/ssl/cloudflare.crt
,将证书内容粘贴进去即可:
1 | sudo vim /etc/ssl/cloudflare.crt |
Nginx 证书和密钥、反向代理的配置
请将本文中的 ericclose.xyz
替换成您注册的域名
前面只是把证书和私钥的内容写入到服务器,Nginx 的相关配置并没有写,所以这一节就让我们完成它:
使用 vim 编辑文件 /etc/nginx/sites-available/ericclose.xyz
:
1 | sudo vim /etc/nginx/sites-available/ericclose.xyz |
修改后的文件如下:
1 | server { |
- 注意要记得修改配置文件中的
server_name
项和root
项的ericclose.xyz
,更改为您的域名即可。- 配置文件中
proxy_pass http://127.0.0.1:10000;
的10000
必须和前面 V2Ray 配置文件(/usr/local/etc/v2ray/config.json
)中的port
一致。location /ray { ... }
这里的/ray
必须与前面 V2Ray 配置文件中的path
一致(相互对应)。
然后重启 nginx 服务:
1 | sudo systemctl restart nginx |
现在您可以再次访问您注册的域名来判断配置是否正确,如无误将会看到您之前访问域名的页面,同时可以注意到浏览器已经显示是 HTTPS
链接了。
- 为了更具真实的网站伪装效果,您可以自行寻找些前端模板套上去(本文将不会赘述)
自启并启动相关服务
1 | sudo systemctl enable v2ray nginx --now # 自启并启动 V2ray 和 Nginx 的服务 |
VMess MD5 认证信息淘汰机制
VMessAEAD 协议已经经过同行评议并已经整合了相应的修改。 VMess MD5 认证信息 的淘汰机制已经启动。
自 2022 年 1 月 1 日起,服务器端将默认禁用对于 MD5 认证信息 的兼容。任何使用 MD5 认证信息的客户端将无法连接到禁用 VMess MD5 认证信息的服务器端。
在服务器端可以通过设置环境变量
v2ray.vmess.aead.forced
=true
以关闭对于 MD5 认证信息的兼容。 或者v2ray.vmess.aead.forced
=false
以强制开启对于 MD5 认证信息 认证机制的兼容 (不受到 2022 年自动禁用机制的影响) 。 (v4.35.0+)
– from 新 V2Ray 白话文指南 – VMess MD5 认证信息淘汰机制
为了禁用旧的 MD5 认证信息 的兼容,强制使用 VMessAEAD,我们可以这么做来给 v2ray.service 添加个环境变量:
1 | # 给 v2ray.service 创建个 override,而不是直接修改 v2ray.service 本身,以防止更新 V2Ray 后修改的内容失效 |
用 vim 编辑器写入如下内容,:wq
保存并退出:
1 | [Service] |
然后重启 v2ray 服务生效:
1 | sudo systemctl restart v2ray |
TCP BBR
- TCP BBR(Bottleneck Bandwidth and Round-trip propagation time)是由 Google 设计的一种拥塞控制算法。自从 Linux Kernel 4.9 开始就引入了该算法,但默认没有启用,所以需要手动开启。
启用该算法仅需在 /etc/sysctl.conf
文件末尾追加两行内容:
1 | sudo bash -c "echo 'net.core.default_qdisc=fq' >> /etc/sysctl.conf" |
接下来你需要重启系统或者直接使用 systemctl 重载变更。
1 | sudo sysctl --system |
您可以使用以下 sysctl 命令验证配置是否生效,如下:
1 | sudo sysctl net.core.default_qdisc |
- 若输出结果为
net.core.default_qdisc = fq
,则配置已生效
1 | sudo sysctl net.ipv4.tcp_congestion_control |
- 若输出结果为
net.ipv4.tcp_congestion_control = bbr
,则配置已生效
客户端配置(懒人方法)
关于客户端配置的说明
关于客户端配置文件的编写,可以先用 v2rayN 生成 vmess://
链接,之后再通过 Subscription Converter 进行转换即可🤣。
- 前往 V2RayN 下载页 找到
v2rayN-Core.zip
下载,然后解压后找到主程序v2rayN.exe
双击运行。双击 v2rayN 的托盘图标,然后就会弹出主界面窗口。
- 「服务器」 -> 「添加 Vmess 服务器」,然后请根据服务端的配置对内容进行填写。
- 地址(
address
):可以填写您注册的域名(也可以是 Cloudflare 的 CDN IP,关于这个后面会讲)- 端口(
port
):HTTPS 端口号,即填写443
- 用户 ID(
id
):与 V2Ray 服务端的配置一致,也就是之前生成的 UUID,即9dfe7fee-d08f-44f8-ad2d-300d4c9c3a0e
- 额外 ID(
alterId
):与 V2Ray 服务端的配置一致,即0
- 加密方式(
security
):自动,即auto
- 别名(
remarks
):节点名称,可自定义,这里我取名为node
- 传输协议(
network
):WebSocket,即ws
- 伪装类型(
type
):none
- 伪装域名(
host
):填写您注册的域名,我的是ericclose.xyz
- 路径(
path
):与 V2Ray 服务端的配置一致,即/ray
- 底层传输安全(
tls
):tls
- 跳过证书验证(
allowInsecure
):是否允许不安全连接(用于客户端)。当值为true
时,V2Ray 不会检查远端主机所提供的 TLS 证书的有效性,所以为了安全起见我们选择false
。
填写完成确认即可。
- 如果你想要直接使用 v2rayN 进行代理上网的话,只需要鼠标右键点击 v2rayN 的托盘图标,启用 HTTP 代理,可以是全局或 PAC(proxy auto-config,代理自动配置) 模式,取决于你个人需求。
此时如果你配置没出问题的话,那么你已经能够科学上网了。
- 如果你想使用其他客户端,如 clash,Quantumult X 等。那么你需要在 v2rayN 主界面选中节点
node
,点击「分享」,即可生成vmess://
链接。访问 Subscription Converter 网站,选择「基础模式」,复制生成的vmess://
链接到指定位置,选择你想要使用的客户端,最后「生成订阅链接」即可。
- 为了支持 VMessAEAD 请将您的客户端更新到最新版本!截至 2022 年 1 月 16 日,各平台客户端均已提供对 VMessAEAD 的支持:
- Clash for Windows v0.19.5 +
- ClashX v1.90.0 +
- Clash for Android v2.5.4 +
- Quantumult X v1.0.27 +
上述 Clash 各客户端版本,Clash 内核均升级至 v1.9.0 +,客户端的配置
ws-opts
处有所变动,请注意修改后使用,详见 Clash Wiki - All Configuration Options 。Quantumult X v1.0.27 + 默认启用 Vmess AEAD(即
aead=true
),配置可以不用修改
- 关于各个客户端的具体使用方法,不属于本文讨论的范畴。
优选 Cloudflare CDN 节点 IP
直接通过本地的 DNS 解析您注册域名得到的 Cloudflare CDN 的 IP,有时可能速度很不理想,尤其是我使用的中国电信宽带到了晚上高峰期(20:00 ~ 24:00)的时候特别差劲。通过一个测试工具 CloudflareSpeedTest 优选出几个 Cloudflare 的 CDN 节点 IP,可以相对缓解这种情况。由于不同的运营商、不同的地域或不同的时间段,相同的 CDN 节点 IP 表现具有差异,所以建议就是各自在自己的网络环境下进行测试。
优选 Cloudflare CDN 节点 IP 的说明
根据您的操作系统和处理器架构进行选择下载,以我这边 Windows x64 为例子,我下载的是
CloudflareST_windows_amd64.zip
,下载后进行解压。首先 cmd 切换到
CloudflareST.exe
所在的目录,如F:\Downloads\CloudflareST_windows_amd64
:
1 | cd /d F:\Downloads\CloudflareST_windows_amd64 |
- 此处我以我平常使用的命令加几个选项为例子:
如需要找到 20 个平均延迟低于 300 ms 且下载速度高于 5 MB/s 的 IP 才会停止测速。
1 | CloudflareST.exe -tl 300 -sl 5 -dn 20 |
-tl
: 平均延迟上限,只输出低于指定平均延迟的 IP-sl
: 下载速度下限,输出高于指定下载速度的 IP-dn
: 符合条件的 IP 数量,即指定输出符合延迟和下载速度要求的 IP 数量- 完整的使用方法请参考项目 README。
当我们得到了一组优选 IP 后,如何使用这些 CDN 节点呢?我们只需要在 v2rayN 填写的地址(address
)处,分别填写排名靠前的几个 IP 就行。具体操作:
- v2rayN 主界面鼠标右键选中原有的节点
node
,选择「克隆所选服务器」,然后双击克隆得到的节点,将地址(address
)修改为优选得到的 IP,如104.31.79.91
,别名(remarks
)取自己喜欢的就好,如node1
。
如想添加多几个节点,就多克隆几个。
至于其他客户端的配置转换依然可以使用 Subscription Converter,将生成得到的数个 vmess://
链接分行粘贴到 Subscription Converter 中,最后再生成订阅链接就完事了。
P.S. 一条一条的生成 vmess://
链接还是挺麻烦的,所以建议各位学会自己编写你所使用的客户端的配置文件 🤣