cloudcone云服务器部署magic
1. 前言
如果你每月或每季度或每年还为magic交费用的话,那我劝你把那线省下来去购买配置好一点的云服务器更好。相对于购买magic,购买云服务器简直划算多了,云服务器一般轻轻松松一个月就有4T的流量,办公学习的电脑或手机可以全程开着,一点都不心疼。好现在我们的目标是使用云服务器搭建magic,自己动手丰衣足食。

2. 背景知识
2.1 VLESS与 TCP与WebSocket
VLESS 协议:是轻量、无额外加密、高性能的代理协议,本身不做加密,完全依赖外层 TLS 加密,性能比VMess好,搭配 TLS,否则明文裸奔。
TCP协议 :TCP 是底层原生传输,没有任何多余封装。
WebSocket协议:WebSocket是应用层协议,与HTTP类似,是对TCP的封装。
2.2 VLESS+TCP+TLS 与 VLESS+WebSocket+TLS
VLESS+TCP+TLS :延迟低;TLS 直接 TCP,cloudflare不代理,直连、不中转;不能隐藏源站IP,伪装为普通 TLS,网络行为特征明显。
VLESS+WebSocket+TLS :延迟略高,TLS 到 WebSocket到TCP;伪装成网页 WebSocket,能cloudflare代理,防 DDoS、中转,隐藏源站IP,网络行为像正常web流量;
哪一个好:WebSocket可以伪装网页流量,在严格网络环境下,推荐使用,几乎不会被拦截,但是消耗性能;如果机器性能差推荐直连TCP;
注意事项:cloudflare不能代理TCP,记住哦,只支持 HTTP/HTTPS/WebSocket。VLESS 任何时候都必须开 TLS(传输层安全加密,申请证书),否则完全不安全
VLESS + TCP + TLS(直连型):
应用层 VLESS
───────────────
加密层 TLS
───────────────
传输层 TCP
───────────────
网络层 IP
特点:非 HTTP 行为(不是请求/响应模型)。长时间保持的 TLS 连接,一个IP+固定端口,要专用通道
VLESS + WebSocket + TLS(Web 伪装型):
应用层 VLESS
───────────────
封装层 WebSocket
───────────────
应用层 HTTP/1.1
───────────────
加密层 TLS
───────────────
传输层 TCP
───────────────
网络层 IP
特点:HTTPS行为,长连接 WebSocket,与实时网站完全一致。像网站,能cdn,能域名挡IP。
3. 最后选定的协议
最后选定的协议是VLESS+WebSocket+TLS。本质是用一个“正常 HTTPS 网站”包住 VLESS 流量,进行伪装。
如何做到最安全风险最小:要求无直连代理,无明显代理协议,与真实 HTTPS 行为高度一致,采用标准 HTTPS + WebSocket + TLS,采用行为是正常网站访问的方案,不暴露特殊端口号,只能个人使用不对外提供服务不售卖。
4. 客户端的选择

5. 最后确定的服务框架
后端服务 + 网关的分层
Docker + NPM
协议固定:VLESS + WebSocket + TLS
客户端:客户端的选择 已确定
NPM 是唯一对外暴露的入口
X r a y 永远不直接碰 TLS、不直接暴露公网,交给npm负责
5.1 服务架构图:
graph LR
A[(VLESS + WS + TLS)] --> B((443 / HTTPS))
B --> C[NPM(TLS 终止 + WS 转发)]
C --> D((内网 HTTP / WS))
D --> E[X r a y(VLESS 入站)]
E --> F[Internet]
5.2 为什么不使用 x - u i / 3 x - u i 脚本部署UI面板,而选择内核程序
我既然已经使用NPM来做入口的管理(SSL+证书+反代)了,就不使用 x u i 来捣乱目前我配置好的入口配置了。况且我很不喜欢一键脚本部署,快速但过于简单,管理麻烦。
目前我倾向原生态 x r a y +容器化的部署方案。没有面板UI,没有账号管理页面,都必须手写 config.json配置文件,纯粹是一个网络内核程序,下载使用量超多。
镜像选择:

6. 配置部署
6.1 NPM 配置什么
启用443 端口,使能证书(Let’s Encrypt),使能WebSocket Support
配置Path /vless → 转发到容器端口 x r a y :10000
为什么要配置past:避免被误扫描,避免所有请求都进入 x r a y,避免浏览器访问发现行为异常,WebSocket 不是网页访问所以需要固定路径。
6.2 X r a y 配置什么
不使用可多实例化,仅使用多ID配置多用户多入口,放弃多端口多路径的方法
只监听 WebSocket,不监听443,不配置 TLS,不暴露公网端口
编写config.json配置文件
6.3 docker-compose

6.4 配置文件config.json



配置文件config.json:
{
"log": {
"loglevel": "warning" //部分开启日志
},
"inbounds": [
{
"port": 10000, //端口
"protocol": "vless", //协议类型:VLESS
"settings": {
"clients": [
{
"id": "1d683893-916e-424e-8cc7-5d6f4ca2bcxx", //uuidgen命令
"email": "user-phone"
},
{
"id": "bff1b35c-0326-4244-9619-c44a45fc1fxx", //
"email": "user-laptop"
}
],
"decryption": "none" //解密:VLESS 必须为 none
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/vless" //客户端必须完全一致
}
}
}
],
"outbounds": [
{
"protocol": "freedom"
}
]
}
6.5 config.json配置讲解
log:不全开
api / stats / policy:不用api
inbounds.settings配置为"decryption": "none",是VLESS 强制
streamSettings字段无tlsSettings字段:TLS 已经被 NPM 解包,X r a y 不监听443,只有接收内网WS的包。
inbounds字段settings字段的fallbacks字段:为空;回落配置字段;fallbacks 只在 X r a y 自己监听 TLS 端口443时才有意义,目前NPM 用 Path 分流,X r a y 只接 /vless流量
streamSettings.security为"none";TLS 已在 NPM完成,X r a y 只接 WS 明文
streamSettings.tlsSettings为空
streamSettings.realitySettings为空
不使用:"transport": null;"observatory": null ;"burstObservatory": null
dns:使用公共dns,不做 fake-ip
routing:为空数组,任何规则
outbounds:freedom:正常出网;blackhole:为将来 routing 预留
不用 alterId
6.6 多用户方案
基础多用户管理:UUID + email;确定选择
多 Path:每个用户一个 Path,NPM 分 Location 不选择
多 inbound(强隔离):port: 10001;port: 10002;可限速、可统计 不选择
7. 开始部署
7.1 运行部署+部署检查
docker-compose up- d:

执行 docker logs x r a y #查看日志:(docker ps):配置文件成功加载:
警告信息:WebSocket 和不带 Flow 的 VLESS 已经开始不推荐使用,建议将来迁移到 VLESS with Flow 和 XHTTP(H2/H3)

docker exec -it x r a y netstat -tulpn #查看tcp/udp监听的端口:

docker exec -it x r a y ps #查看容器进程:

docker exec -it x r a y ping nginx-proxy-manager #查看容器网络连通性:

PS:进入容器执行shell : docker exec -it x r a y bash
在手机连接后,在服务器执行查看日志记录:

PS:显示手机用户已经连接上了
成功现象的日志显示:
我们手机访问谷歌时候,在服务器端查看日志,显示是手机用户user-phone通过443端口访问了google.com
X r a y 接受了一个通过 TCP 协议(WebSocket )的连接,并将该流量转发到目标网站 的 443端口

7.2 NPM 里怎么填
在 Proxy Host / Custom Location:
- Scheme:
http - Forward Hostname:
x r a y - Forward Port:
10000 - WebSocket Support:
开启 - Path:
/vless


7.3 客户端里怎么填:


8. 部署成功
8.1 在手机客户端配置后测试IP:

8.2 在电脑客户端配置后测试IP:


9. 更好的伪装
目的:给域名一个假页面一个好的伪装页面,他人访问就会发现,哦,这是个普通 HTTPS 网站,哈哈被骗了
行动:那我们搞一个静态站点
方案选择:nginx:alpine轻量化nginx容器,无数据库,无证书,适合静态页面,可serve html文件
docker-compose:
version: "3.8"
services:
nginx:
image: nginx:alpine
container_name: web_static
restart: unless-stopped
volumes:
- /root/data/docker_data/web_static/html:/usr/share/nginx/html:ro
- /root/data/docker_data/web_static/conf/nginx.conf:/etc/nginx/nginx.conf:ro
networks:
- my_npm_prj_npm_network
expose:
- "80" #容器网络的内部端口声明,不同于ports
networks:
my_npm_prj_npm_network:
external: true
nginx.conf: 配置conf文件,完成多域名+多path+多html
events {}
http {
## vless.eehaiou.com
server {
listen 80;
server_name vless.eehaiou.com;
root /usr/share/nginx/html/vless;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
## blog.eehaiou.com 也给blog挂一个静态页面
server {
listen 80;
server_name blog.eehaiou.com;
location /love {
root /usr/share/nginx/html;
try_files /blog/love.html =404;
}
location /mylove {
root /usr/share/nginx/html;
try_files /blog/mylove.html =404;
}
}
}
index.html静态页面:
<!DOCTYPE html>
<html>
<head>
<title>Welcome index</title>
</head>
<body>
<h1>Welcome index page</h1>
<p>This site is under construction.</p>
</body>
</html>
9.1 增加伪装页(根路径下)


9.2 增加blog挂载静态页面( /love 与 /mylove 路径)


10. 最后
最后我们完成了在服务器部署magic,要正当使用不做有风险的事,自己搭建其实是可以学到整个链路过程,还省下不菲的费用,把钱花在刀刃上。
在现今的网络环境下,想要学习新技术或者体验高质量音视频娱乐,在干净自由的网络环境下,我们可以获得更多的知识与资讯。

文章评论