Pre
VLESS协议
VLESS 是一种无状态的轻量级数据传输协议,使用 UUID 进行身份验,其协议不再依赖系统时间,配置灵活。但其本身协议不带加密,因此需要配合 TLS 等加密手段。
VPS
国内需要使用香港、台湾地区的服务器,如GCP在台湾的节点、softshellweb,国外的推荐vultr、搬瓦工等主流厂商,支持支付宝付款。服务器部署后,可以通过以下方法检查主机IP是否能用来搭建代理:
- ping命令
- nmap端口扫描:如:
nmap IP地址 -Pn --reason -p 22,80,443 - 通过平台检测,国内:站长Ping工具,国外:yougetsignal。如果国内能ping通,说明该服务器可用,可以开始搭建了。如果国外能ping通,国内无法ping通,则说明被拦截了,需要换一台服务器。如果国内国外都无法ping通,则说明服务器还未部署好,需等待几分钟后再重试。
域名
域名推荐去 NameSilo、Godaddy 购买,顶级域名.com一般第一年只需要59元左右,域名.cn域名一般35元,最便宜的如.live第一年不到14元。
拿到的域名通过NS记录/修改NameServer托管到cloudflare进行解析(直接在cloudflare买域名更贵),方便使用cloudflare的边缘CDN服务,通常需要添加的DNS记录主要是以下两条:
Type Name Content TTL
A @ IP地址 Auto
CNAME www 域名 AutoSSL/TLS证书
SSL/TLS证书可以从以下平台免费获取,证书有效期一般为90天,90天后需要更换,也可以使用一些脚本自动更新
- letsencrypt:https://letsencrypt.org/
- zerossl:https://zerossl.com/
- FreeSSL:https://freessl.org/
- SSL For Free:https://www.sslforfree.com/
- 自动更新证书脚本地址:https://github.com/acmesh-official/acme.sh
apt update
apt install certbot python3-certbot-nginx
+ CentOS / Rocky Linux:
dnf install epel-release
dnf install certbot python3-certbot-nginx
2. 运行Certbot填入域名以获取并配置证书,--nginx选项会自动配置Nginx配置文件
certbot --nginx -d 域名.com -d www.域名.com
3.检测自动续期的流程是否能够正常执行
certbot renew --dry-run
BBR与FQ支持
TCP BBR(Bottleneck Bandwidth and Round-trip propagation time)是由Google于2016年发布的一种拥塞控制算法,可以显著地提高Linux服务器吞吐量并减少TCP连接的延迟。
FQ(Fair Queueing,公平队列)是一种为每个数据流独立排队并轮转服务的调度算法,它通过计算数据包的虚拟完成时间来决定发送顺序,旨在让所有流量公平共享带宽,防止单一连接占据全部资源。
客户端下载地址
客户端需要使用4.23.2以上内核
v2fly
v2fly是源于v2ray的开源网络代理项目,用于打造专属基础通信网络,Github开源项目地址:https://github.com/v2fly/v2ray-core
安装v2fly
安装/更新 v2fly命令:
bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)
该安装脚本的开源项目地址:https://github.com/v2fly/fhs-install-v2ray
v2ray常用命令
- v2ray uuid 生成一个uuid
- v2ray test -c 配置文件检测配置文件是否正确
- v2ray version查看当前版本
VLESS+TLS+WS
服务端配置
使用vim/nano在/usr/local/etc/v2ray/config.json配置文件中添加配置设置,并移除注释。
{
"log": {
"loglevel": "warning",
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log" //日志输出路径
},
"inbounds": [{
"port": 8180 , //监听端口
"protocol": "vless",//主传入协议
"settings": {
"decryption": "none",
"clients": [
{
"id": "41803377-xxxx-xxxx-xxxx-ddaad659554c",//UUID
"level": 0
}
]
},
"streamSettings": {
"network":"ws", //传输协议
"security": "tls", //传输层安全
"wsSettings":{
"path":"/", //路径
"headers":{}
},
"tlsSettings": {
"serverName": "xxxx.xyz", //域名
"certificates": [{
"certificateFile": "/etc/ssl/certificate.crt",//SSL证书路径
"keyFile": "/etc/ssl/private.key" //密钥路径
}]
}
}
}],
"outbounds": [{
"protocol": "freedom",//主传出协议
"settings": {}
},{
"protocol": "blackhole",
"settings": {},
"tag": "blocked"
}],
"routing": {
"rules": [
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "blocked"
}
]
}
}
检测配置文件是否正确命令:
/usr/local/bin/v2ray test -c /usr/local/etc/v2ray/config.json
文件正确会返回值:
客户端配置
| 配置项 | 值 |
|---|---|
| 别名 | 任意 |
| 地址 | VPS的IP地址 |
| 端口 | 配置文件中的端口号 |
| 用户ID | UUID,需要和配置文件一致 |
| 传输协议 | ws |
| 伪装域名 | 解析的域名 |
| 路径 | 配置文件中的路径 |
| 传输层安全 | tls |
VLESS+TLS+WS+伪装
服务器的入站流量由Nginx接收,配置一个特殊的路径/somepath,将访问该路径的流量通过Nginx反向代理给v2ray,其余流量正常由Nginx处理
Nginx配置
向Nginx配置文件/etc/nginx/nginx.conf的http块内添加以下配置,并通过nginx -s reload命令重新载入配置
#对于80端口,通过IP和域名的访问都重定向到https
server {
listen 80;
server_name _;
return 301 https://$host$request_uri;
}
#处理https
server {
listen 443 ssl;#对443端口启用ssl监听
server_name xxx.com www.xxx.com 22.33.44.55;#接受的域名和IP
ssl_certificate /etc/nginx/ssl/fullchain.pem;#TLS证书
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
root /var/www/xxx.com; #放置网站路径
index index.html;
# 主页
location = / {
try_files /index.html =404;
}
#转发到V2Ray
location ^~ /somepath {
# 如果请求不是ws,返回404
if ($http_upgrade != "websocket") {
return 404;
}
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 86400;
}
# 其他路径全部404
location / {
return 404;
}
}
v2ray配置
使用vim/nano在/usr/local/etc/v2ray/config.json配置文件中添加配置设置,并移除注释。
{
"log": {
"loglevel": "error",
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log"
},
"inbounds": [{
"listen": "127.0.0.1", #建议只监听本地
"port": 8080, #监听端口
"protocol": "vless",
"settings": {
"decryption": "none",
"clients": [
{
"id": "0c03a292-xxxx-xxxx-xxxx-xxxxxxxxx" #UUID
}
]
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/somepath" #需要与nginx配置的路径一致
}
}
}],
"outbounds": [{
"protocol": "freedom",
"settings": {}
},{
"protocol": "blackhole",
"settings": {},
"tag": "blocked"
}],
"routing": {
"rules": [
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "blocked"
}
]
}
}
客户端配置
- 别名(remarks):任意
- 服务器地址:IP地址
- 服务端口:Nginx监听的端口
- 用户ID:UUID
- 流控:空
- 加密方式(decryption): none(需要显式指定为none)
- 传输协议:ws
- ws host:域名
- ws path:配置的路径/somepath
- 传输层安全:tls
Xray
介绍
Xray-core是在V2Ray基础上发展而来的项目,兼容v2fly-core的配置格式,并额外支持XTLS等新特性。
早期 V2Fly社区认为XTLS的实现方式在协议与代码结构上不符合项目所遵循的MIT License规范,因此将XTLS从v2fly-core中移除。随后rprx(VLESS协议和XTLS的设计者)Fork了v2fly-core并重新整合与完善了XTLS等功能,由此形成了新的项目Xray,Xray的Github开源地址:https://github.com/XTLS/Xray-core
- XTLS:Xray项目提出的一种优化TLS代理的数据传输机制,通过内核splice以及减少不必要的加密和数据拷贝,来大幅降低CPU使用率并提高吞吐量
安装Xray
安装/更新 Xray命令:
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
该安装脚本的开源项目地址:https://github.com/XTLS/Xray-install
Xray常用命令
- xray uuid生成一个uuid
- xray run -test -c 配置文件检测配置文件是否正确
- xray version查看当前版本
- xray x25519生成密钥对,用于REALITY加密
VLESS+TCP+XTLS+flow
由Xray接收入站流量,如果是VLESS协议流量,则由Xray处理,非VLESS流量则回落到所指定的端口,交给Nginx处理。此外流控方式XTLS-RPRX-Vision(flow)会使代理流量在外部表现为普通TLS连接,提升传输效率并降低协议特征
服务端配置
使用vim/nano在/usr/local/etc/xray/config.json配置文件中添加配置并移除注释
{
"log": {
"loglevel": "error",
"access": "/var/log/xray/access.log",
"error": "/var/log/xray/error.log"
},
"dns": {
"servers": [
"https+local://1.1.1.1/dns-query",
"localhost"
]
},
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"ip": [
"geoip:private"
],
"outboundTag": "block"
},
{
"ip": ["geoip:cn"],
"outboundTag": "block"
},
{
"domain": [
"geosite:category-ads-all"
],
"outboundTag": "block"
}
]
},
"inbounds": [
{
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "0c03a292-xxxx-xxxx-xxxx-375cab768a57", //UUID
"flow": "xtls-rprx-vision",
"level": 0
}
],
"decryption": "none",
"fallbacks": [
{
"dest": 8080 //回落端口
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"alpn": "http/1.1",
"certificates": [
{
"certificateFile": "/etc/letsencrypt/live/xxxx.com/fullchain.pem", //证书
"keyFile": "/etc/letsencrypt/live/xxxx.com/privkey.pem" //密钥
}
]
}
}
}
],
"outbounds": [
{
"tag": "direct",
"protocol": "freedom"
},
{
"tag": "block",
"protocol": "blackhole"
}
]
}
Nginx接收回落
添加HTML文件
在/var/www/域名.com目录下上传html文件,并确保Nginx的默认用户www-data对该目录有访问权限,对html文件有r读取权限
添加Nginx配置
/etc/nginx/nginx.conf,在http块中添加
#重定向80端口的访问,443由Xray监听
server {
listen 80;
server_name _;
return 301 https://$host$request_uri;
}
# Xray回落的流量由Nginx处理
server {
listen 127.0.0.1:8080;
server_name xxxx.top www.xxxx.top;
root /var/www/xxxx.top;
index index.html;
}
客户端配置
- 别名(remarks):任意
- 服务器地址:IP地址
- 服务端口:Xray监听的端口
- 用户ID:UUID
- 流控(flow):xtls-rprx-vision
- 加密方式(decryption): none(需要显式指定为none)
- 传输协议:tcp
- 伪装类型:none
- http host:域名
- 传输层安全:tls
- SNI:域名
VLESS+TCP+REALITY+flow
REALITY是Xray-core提供的一种传输安全机制,该方案中用来替代TLS,它不需要域名,也不需要部署TLS证书,而是利用X25519等TLS常用的密钥交换算法生成密钥对,在客户端与服务器之间建立加密会话。在连接建立过程中,REALITY会模拟并复用所配置目标网站(target)的TLS握手特征作为伪装,使客户端访问服务器的流量在外部网络看来与访问该目标网站的TLS流量具有相似特征,从而提高流量的隐蔽性
REALITY有以下几个特殊配置:
- target:服务端配置,旧称dest,这两个字段互为alias。用来指定一个目标网站,REALITY会参考并模拟该网站的TLS握手特征,使Xray客户端在连接服务器时看起来像是在访问该网站。同时,服务器会将非Xray客户端的请求转发到该网站,使得主动嗅探返回结果为与该网站的真实连接。
- serverNames:服务端配置,一般与target保持一致即可,可以配置多个,客户端配置的SNI是该配置列表中的其中一个即可,值可以参考target目标网站域名所返回证书的SAN
- shortIds:客户端&服务端配置,服务端可配置多个用于识别不同Xray REALITY客户端,客户端使用其中之一。shortIds的值需要是8个字节(16个字符)的十六进制数(0-f)组成的字符串,长度可以小于16字符,程序会后补0,但长度必须是偶数 (因为一个字节有2位16进制数),如:aa1234会被自动补全为 aa12340000000000, 但是aaa1234则会导致错误。
- privateKey:服务器私钥,通过执行命令xray x25519生成
- password:客户端公钥,其实就是publicKey,但在Reality 的设计中需要客户端持有,不能公开,通过命令xray x25519 -i “服务器私钥”生成
REALITY的工作流程
- 客户端发起TLS握手,在ClientHello中写入shortId、publicKey等信息,并使用客户端配置的SNI填入TLS的SNI字段,使连接在网络层看起来像是访问该域名对应的HTTPS服务。
- 服务器在接收到连接请求后,会根据shortId、privateKey等信息验证该连接是否来自合法Xray客户端。
- 如果是Xray合法客户端,则Xray继续完成后续握手,使用服务器配置中的privateKey与客户端配置中的publicKey进行密钥协商,从而建立安全的加密通道使用VLESS协议通信。
- 如果不是Xray客户端,服务器会将该连接转发到所配置的target网站,让访问者与真实网站建立连接,从而使服务器在主动扫描或探测时通常表现为一个普通的HTTPS服务。
target目标网站的选择
target目标网站需要满足以下规则:
- 国外网站
- 支持TLSv1.3与H2
- 域名作为非跳转使用,如:从xxx.com跳转到www.xxx.com
推荐使用稳定、成熟的大型网站,如:python.org、www.microsoft.com、www.cloudflare.com等,然后通过以下命令查询target网站证书中的SAN列表(以微软官网为例):
openssl s_client -connect www.microsoft.com:443 -servername www.microsoft.com </dev/null 2>/dev/null | openssl x509 -noout -text | grep -A1 "Subject Alternative Name"
返回值示例:
服务端的serverNames配置可以挑选该SAN列表中的一个或多个(分配给多个Xray客户端),客户端的SNI值需要是该serverNames中的其中一个。
服务端配置
使用vim/nano在/usr/local/etc/xray/config.json配置文件中添加配置并移除注释
{
"log": {
"access": "/var/log/xray/access.log",
"error": "/var/log/xray/error.log",
"loglevel": "error"
},
"inbounds": [
{
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "0c-xxxx-xxx-8a57", #UUID
"flow": "xtls-rprx-vision"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "tcp",
"security": "reality",
"realitySettings": {
"show": false,
"target": "www.microsoft.com:443",#target网站
"xver": 0,
"serverNames": [
"www.microsoft.com" #客户端SNI需要是该列表之一
],
"privateKey": "-MfX-xxx-xxxWo", #私钥
"shortIds": [
"0312abcd6201" #shortIds
]
}
}
}
],
"outbounds": [
{
"protocol": "freedom"
}
]
}
客户端配置
- 用户ID:UUID
- 流控(flow):xtls-rprx-vision
- 加密方式:none
- 传输协议:tcp
- 伪装类型:none
- 传输层安全(TLS):reality
- SNI:服务端serverNames之一,如:www.microsoft.com
- PublicKey:公钥
- Shortld:服务端Shortlds之一,如:0312abcd6201