本文转载自V2Ray高级技巧:流量伪装,因为原地址需要翻墙。

前提条件

本文假设读者已经具备以下条件:

  1. 一台境外的vps,购买可参考:一些VPS商家整理;
  2. 一个域名,无备案要求(备案可使用国内CDN加速,但意味着万一有事,被喝茶更容易)。域名购买可参考:Namesilo域名注册和使用教程 或从 适合国人的域名注册商推荐 选购;
  3. 为域名申请一个证书,请参考:从Let’s Encrypt获取免费证书从阿里云获取免费SSL证书(伪装域名用来做站推荐使用);
  4. 有基本linux技巧,能使用vim/nano等编辑器。

理论上来说,证书不是必须的。但没有tls加持或不做加密,防火墙直接能看出来流量真实意图从而进行干扰,这也是为什么不建议伪装http流量的原因。本文给出的方法采用合法机构签发的证书对流量进行加密,不是做特征混淆得到的TLS流量,从而更难被检测和干扰。

关于伪装技术的选择,V2ray web+websocket+tls 和 V2ray web+http2+tls 常用来做对比。理论上http2省去了upgrade的请求,性能更好。但实际使用中两者没有明显区别,加之某些web服务器(例如Nginx)不支持后端服务器为http2,所以websocket的方式更流行。如果你要上http2,记得web服务器不能用Nginx,要用支持反代http2的Caddy等软件。

下文介绍流量伪装的配置步骤,演示域名为tlanyan.me,服务器为Linux(CentOS),web服务器软件用Nginx,web+websocket+tls组合,最终效果为:http/https方式打开域名,显示正常的网页;V2Ray客户端请求特定的路径,例如https://tlanyan.me/awesomepath,能科学上网;浏览器直接请求https://tlanyan.me/awesomepath,返回”400 bad request”。即外部看起来完全是一个人畜无害的正规网站,特定手段请求特定网址才是科学上网的通道。

配置DNS

先设置dns将域名解析到vps的ip,例如www.tlanyan.pp.ua解析到xxx.xxx.xx.xx。
如果你上了CDN,则dns要解析到cdn给的ip或者别名网址(cname)。使用cdn能隐藏真实vps的ip,避免vps被墙或能拯救被封锁ip的vps。上cdn有好处,但国内cdn要求域名备案,国外cdn基本上会降低网速,而且配置起来稍显麻烦。建议新手先摸透https流量伪装,有特殊需求再考虑上cdn。

注意: 如果你要用Let’s Encrypt签发的证书,并且希望上cdn,那么应该先解析到vps的ip,获取到证书后再解析到cdn。

更新: 上cdn可参考:v2ray使用cloudflare中转流量,拯救被墙ip,请务必记得先让伪装正常工作再上cdn!

配置Nginx

如果你的域名并正确配置了SSL证书,可忽略这一步。
Nginx是市面上占有率最高的网站服务器软件,Centos 7系统安装nginx命令:yum install -y epel-release && yum install -y nginx

Linux系统上Nginx默认站点配置文件是/etc/nginx/conf.d/目录下的default.conf,我们对伪装网站进行全站https配置,示例内容如下:

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
server {
listen 80;
server_name xxxxx; # 改成你的域名
rewrite ^(.*) https://$server_name$1 permanent;
}

server {
listen 443 ssl http2;
server_name xxxxx;
charset utf-8;

# ssl配置
ssl_protocols TLSv1.2 TLSv1.3; # tls 1.3要求nginx 1.13.0及以上版本
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_certificate xxxxx; # 改成你的证书地址
ssl_certificate_key xxxx; # 改成证书密钥文件地址

access_log /var/log/nginx/xxxx.access.log;
error_log /var/log/nginx/xxx.error.log;

root /usr/share/nginx/html;
location / {
index index.html;
}
}

配置好用nginx -t命令查看有无错误,没问题的话systemctl restart nginx启动Nginx。打开浏览器在地址栏输入域名,应该能看到https访问的Nginx欢迎页。

新域名如何快速做一个像模像样的网站?最简单的办法是从网上下载网站模板,上传到web服务器的根目录(默认是/usr/share/nginx/html)。对于伪装站来说,静态站足够。如果你的境外流量比较大,建议用爬虫或者其他手段做一个看起来受欢迎、流量大的站点,例如美食博客,图片站等。

安装配置V2Ray

详细过程可参考上篇:V2Ray教程。为了让V2ray能正常运行,请确认防火墙已放行对应端口,并且关闭了selinux:setenforce 0

到此为止,Nginx和V2ray应该都能各自独立正常工作。如果有一个出现问题,应该先解决再继续下面的操作。

Nginx配置websocket

接下来我们让Nginx和v2ray结合,完成服务端的配置。
首先我们选择一个伪装路径,建议为二级或者较长的一级路径,例如/abc/def/awesomepath

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

1
2
3
4
5
6
7
8
9
10
location /awesomepath { # 与 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;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

配置好后重启Nginx:systemctl restart nginx

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

注意:

  1. json文件不支持注释,上述配置中”#”号及后续内容都要删掉
  2. 因为使用tls加密,强烈建议alterId改成0,以节省cpu加快v2ray的速度

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

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

客户端设置

最后是配置客户端,本文以Windows平台的V2RayN软件为例说明使用方法。

打开V2RayN,点击服务器。在弹框中选择添加[VMess]服务器,新建服务器,输入服务器ip,端口写443,把用户id、额外id信息填上。 底层传输方式(transport) 下方,接着点传输协议(network) ,找到ws,路径一栏输入nginx和v2ray中的路径,例如伪装域名(host) 输入:www.tlanyan.me路径(path) 输入:/awesomepath
截图如下:
客户端设置

接着下拉底层传输安全(tls) ,选择tls
注意:选择加密会影响上网速度

信息填写正确后,点击确定。打开浏览器访问google.comyoutube.com等网站,配置无误的话应该都能正常打开。