v2ray + nginx 实现 traffic_mask

本文介绍的是将穿墙流量用常见的 https/tls 方式包装,大大降低 vps 被 block 的几率,在敏感时期保持稳如狗的外网访问通道。

v2ray 介绍

V2Ray 是近几年十分流行的网络工具,其功能强大,用途不限于突破防火墙,但因其能有效翻墙而广为人知。V2Ray 有如下大放异彩的特点:

开源。V2Ray 是 Project V 的核心工具,源代码开源;
多协议支持。传输层支持 TCP、mKCP、WebSocket 等,上层协议支持 Socks、Shadowsocks、以及自定义的 VMess 等;
多入口和多出口。V2Ray 可同时支持多个入站和出站协议,每个协议独立工作;
多平台支持。原生支持 Windows、Linux、MacOS 三大常用平台,安卓、iOS 两大移动平台有丰富的第三方工具;
隐蔽性。V2Ray 流量可伪装成网页流量,更难被检测和干扰。
与另一个知名的翻墙工具 Shadowsocks(R)相比,两者区别在于:

V2Ray 是一个框架/平台,而 Shadowsocks(R)是一个代理工具;
V2Ray 功能强大配置复杂,Shadowsocks(R)简单易用;
V2Ray 性能更好,协议支持更完善。
一句话总结:V2Ray 更好更强大,但更难上手和用好。

工具准备

  • 一台外网 vps
  • 一个域名(备案不备案均可,备案可以提升访问速度)
  • ssh 工具
  • 为域名申请一个证书
  • 基本的 linux 技巧

前提

伪装技术的选择:websocket+tls+web

演示域名: artray.cf

最终实现效果: http/https 方式打开域名,显示正常的网页;V2Ray 客户端请求特定的路径,例如 https:/artray.cf//awesomepath,能科学上网;浏览器直接请求https://artray.cf/awesomepath,返回”400 bad request”。即外部看起来完全是一个人畜无害的正规网站,特定手段请求特定网址才是科学上网的通道。

服务端配置步骤

dns 解析

首先将你申请的域名解析到你的 vps 的 ip 上.可以尝试在freenom上申请一个免费域名.免费的域名有效期一年,一年后可以免费续期(如果没有人付费和你抢的话)

dns 解析可以选择 dnspod 或者 dnsla 等服务商,我选择的是 dnsla.

WX20200312-144255@2x.png

如上图,添加两条 A 记录,记录值为你的主机的 ip.

WX20200312-144433@2x

接着在你的域名控制台添加 dnsla 的 dns 服务器(这里以 freenom 为例.)

接着等待域名解析生效即可.

使用 Let’s Encrypt 获取免费证书

安装 certbot

首先安装 certbot:yum install -y python36 && pip3 install certbot(注意:该安装方式不是官方推荐的,但一直都很好使)

安装完毕后,运行 certbot –help 可以查看该工具的命令详情。

获取证书

运行命令 certbot certonly –standalone -d artray.cf -d www.artray.cf 为域名获取证书。如果你要获取多个站点,继续添加-d 参数即可。certbot 会检测 80 和 443 端口是否已经占用,如果已被占用需要先停止 web 服务器(例如停止 Nginx:systemctl stop nginx)再运行命令。如果域名的 A 记录未指向该服务器,会报错提示域名解析问题。

运行 certbot certificates命令可查看获取到所有申请的证书及所在目录。

WX20200312-144955@2x.png

配置 nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
server {
listen 80;
server_name www.artray.cf artray.cf;
rewrite ^(.*) https://$server_name$1 permanent;
}

server {
listen 443 ssl;
server_name www.artray.cf artray.cf;
charset utf-8;

ssl_certificate /etc/letsencrypt/live/artray.cf/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/artray.cf/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3; # TLSv1.3需要nginx 1.13.0以上版本
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE
-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
keepalive_timeout 70;

# 这里填写其他配置
}

配置分为两个 server 段,第一段是所有 http 请求都导向 https;第二段以 ssl 开头的配置都和证书相关:设置证书和私钥的位置、证书采用的协议、证书的加密算法等信息。

为了增强安全性,ssl_protocols、ssl_ciphers 和 ssl_perfer_server_ciphers 的配置建议采用以上配置。

配置好以后,运行 nginx -t 命令查看有无错误。如果没有可运行 systemctl restart nginx 重新开启 web 服务.

证书自动更新

通过 certbot certificates 命令可以看到证书的有效期是三个月,超过期限则需要续签。证书续期可以手动完成,例如:

systemctl stop nginx
certbot renew
systemctl restart nginx
也可以配置 crontab 任务自动续签,在/etc/crontab文件末添加一行:

0 0 0 */2 0 root nginx -s stop; /usr/bin/certbot renew; nginx -s start
证书将每两个月自动续签一次。如果你的证书快到期了还没有续签,贴心的 EFF(电子前哨基金会)会发邮件提醒,记得到期前续签就行。

安装 v2ray

服务端安装与配置

bash <(curl -L -s https://install.direct/go.sh)

安装完成后,配置文件为/etc/v2ray/config.json,cat 命令可查看内容:cat /etc/v2ray/config.json。一个安装时自动生成的配置文件示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{
"inbounds": [
{
"port": 23581,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "ceb793e6-49cf-25d8-e4de-ae542e62748e",
"level": 1,
"alterId": 64
}
]
}
}
],
"outbounds": [
{
"protocol": "freedom",
"settings": {}
},
{
"protocol": "blackhole",
"settings": {},
"tag": "blocked"
}
],
"routing": {
"rules": [
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "blocked"
}
]
}
}

配置文件中”inbounds”下的这几项信息需要留意:port(端口)、clients 中的 id(用户 id)和 alterId(额外 id),它们将在配置客户端时用到。

配置文件无需任何改动即可正常使用,但注意防火墙要放行监听的端口。接下来启动 V2Ray 并设置开机启动:

systemctl enable v2ray
systemctl start v2ray

客户端的配置和使用放在最后,讲完结合 nginx 和 v2ray 以后

到这里,v2ray 的安装就完成了.

组合 v2ray 和 nginx,配置服务端 websocket

选择一个比较长的路径,这里我选择的是 /ray/ray

nginx 添加配置

配置 nginx 将这个路径的访问都转发到 v2ray。编辑/etc/nginx/nginx.conf的第二个server段,增加以下转发配置:

1
2
3
4
5
6
7
8
9
10
11
location /ray/ray { # 与 V2Ray 配置中的 path 保持一致
proxy_redirect off;
proxy_pass http://127.0.0.1:12345; # 假设v2ray的监听地址是12345
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
# Show real IP in v2ray access.log
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

配置好后重启 nginx:nginx -s reload

v2ray 修改配置

配置 v2ray 接受 nginx 传来的数据。编辑 /etc/v2ray/config.json 文件,在“inbounds”中新增“streamSetting”配置,设置传输协议为“websocket”。配置好后 config.json 文件看起来是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

{
"log": {
"loglevel": "warning",
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log"
},
"inbounds": [{
"port": 12345,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "xxxxx", # 可以使用v2ctl uuid生成
"level": 1,
"alterId": 64
}
]
},
"streamSettings": { # 载体配置段,设置为websocket
"network": "ws",
"wsSettings": {
"path": "/ray/ray" # 与nginx中的路径保持一致
}
},
"listen": "127.0.0.1" # 出于安全考虑,建议只接受本地链接
}],
"outbounds": [{
"protocol": "freedom",
"settings": {}
},{
"protocol": "blackhole",
"settings": {},
"tag": "blocked"
}],
"routing": {
"rules": [
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "blocked"
}
]
}
}

注意:json 文件不支持注释,上述配置中”#”号及后续内容都要删掉。

配置无误后,重启 v2ray 服务:systemctl restart v2ray。

如何测试 nginx 与 v2ray 结合没有问题?打开浏览器,输入域名及其他路径,应该显示正常网页或者页面不存在,说明 nginx 正常工作;输入域名加 v2ray 路径,例如https://artray.cf/ray/ray,应该出现”Bad Request”,说明 nginx 将流量转发给了 v2ray,并且 v2ray 收到了请求。

这样就完成了 nginx 和 v2ray 的组合.

客户端配置

mac 客户端(V2RayU)

首先设置模式为 pac,接着打开服务器设置,新增服务器并配置:

WX20200312-152016@2x.png

thank u !