V2Ray的Websocket模式使用CDN加速并隐藏VPS真实IP
刚看到一个评论,问443端口被博客占用,无法用V2Ray监听443端口来实现TLS怎么解决。
V2Ray的VMess协议支持三种模式,TCP,mKCP,以及WebSockets模式。V2ray的ws模式使用标准的WebSocket 来传输数据,因此可以被nginx的反代,能轻松解决这问题。
个人比较推崇这种方式,按自己理解,这样V2Ray可以彻底隐藏到内网,就算主动嗅探都只能看到一个正常的https网站,而不是什么未知协议运行在奇怪的端口,因为未知而被GFW或者运营商干扰。
由于V2Ray的ws模式采用标准的Websocket来传输数据,甚至可以使用CDN加速并隐藏VPS真实IP,我还木有测试过,如果有朋友测试了欢迎在评论区留下言
07.25 好吧,今天无聊测试了下用CDN反代服务器,使用的CloudFlare的免费服务,VPS用的搬瓦工凤凰城,CloudFlare设置好后,IP由138段的搬瓦工IP变成了104段的CloudFlare CDN IP,隐藏IP确实做到了。但是,搬瓦工UML+BBR加速后直连速度能跑到10Mb~20Mb,延迟200ms左右,加了CDN后,延迟变成250+,速度只有2~3M,估计买收费的CDN服务会好点,或者买国内的CDN?实名后反代翻墙VPS?呃,这是个笑话。不过还是验证了一个事,CDN能反代V2Ray的Websocket模式的流量,并且隐藏VPS IP,如果是海外收费CDN服务,应该体验不会太差,对匿名有要求的朋友可以试一试。
一、安装LNMP(其实只需要nginx)
这里主要需要一个nginx作为反代,比较熟悉的人直接apt-get/yum安装nginx就好,可以跳过这一步。但是LNMP作为解决方案对小白来说比较友好。(反正我是除了LNMP不会配置这些环境-_-)
LNMP1.4版 代码来源https://lnmp.org/
由于LNMP安装时间很长,所以我们先运行一下
screen
这样如果发生中断,可以重新连接VPS用
screen -r
来恢复之前的安装而不至于被中断。安装代码
wget -c http://soft.vpser.net/lnmp/lnmp1.4.tar.gz && tar zxf lnmp1.4.tar.gz && cd lnmp1.4 && ./install.sh lnmp
代码运行后开始配置选项,从上到下是
1.数据库MySQL版本,默认5.5
2.数据库root用户密码,默认root
3.默认
4.PHP版本,我自用的是PHP7.1.7
5.默认
根据自己需求选好后,回车确认就开始漫长的编译过程了,参考值Vultr5刀配置,30分钟,GCE5刀0.2核配置,3小时,阿里云基础配置,40分钟。
这时候可以嗑瓜子磨牙,如果之前运行了screen,也可以按Ctrl+A+C新建一个窗口做别的事,比如配置V2Ray,之后只需要Ctrl+A+数字就能在窗口间来回切换
二、配置Nginx
当然还是用LNMP的方式,如果是自己安装的nginx,修改配置文件就好
首先建一个虚拟机
lnmp vhost add
根据自己需求配置,推荐选项只适合本文开启V2Ray的WS模式
1.输入VPS绑定的域名,以www.yourdomain.com为例
2.没有其他的域名直接回车,也可以加个无www版本 yourdomain.com
3.默认目录,直接回车
4.重写规则,这里没用,选n
5.是否开启log,选n
6.是否创建数据库,选n
7.是否添加SSL,推荐选y
8.有自己证书选1,这里选择2使用LetEncrypt自动签发证书
9.输入自己邮箱
任意键开始建立网站虚拟机
虚拟机建好后,我们需要修改nginx的配置
lnmp安装的nginx配置文件位于/usr/local/nginx/conf/vhost目录下,文件名为www.yourdomain.com.conf
打开这个文件
vi /usr/local/nginx/conf/vhost/www.yourdomain.com.conf
在server443端口中添加一段
location /v2ray/ {
proxy_redirect off;
proxy_pass http://127.0.0.1:419;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
}
将网站目录/v2ray/目录的数据全部转发到本地419端口,之后配置的V2Ray需要监听这个端口。:wq保存退出后,重启nginx
service nginx restart
上图中第一个红框内是证书目录,自己安装nginx的应该这里把自己证书配置正确。
三、配置V2Ray
打开V2Ray的config.json文件,一键包安装的一般是位于/etc/v2ray/
vi /etc/v2ray/config.json
修改inbound配置
"inbound":
{
"port": 419,
"listen": "127.0.0.1",
"protocol": "vmess",
"allocate": {
"strategy": "always"
},
"settings": {
"udp": true,
"clients": [
{
"id": "UUID",
"alterId": 64,
"level": 1
}
]
},
"streamSettings": {
"network": "ws",
"security": "auto",
"wsSettings": {
"connectionReuse": true,
"path": "/v2ray/"
}
}
},


写在最后
这个系列稀里糊涂的写了一大堆,有时候懒癌犯了很久没更一篇,其实V2Ray后来几篇已经偏离了轻松翻墙的初衷。翻了一下第一篇的计划,居然写的是计划每日一更,终于知道为啥网文这么多太监了-_-,懒癌的力量果然很强大。看计划中还差一篇SSpanel部署,对个人用户没啥用决定把他咔嚓了,Wordpress部署近期准备填坑后结束这个系列。
===========
博客被墙后,有朋友建议把所有敏感关键字改为新切口,爱国工具,想想还是满有道理的么。试想当你搜索怎么爱国,怎么用正确姿势安装爱国软件,GFW都会不忍心封锁一个五讲四美三热爱的好公民。恩,那天闲了把关键字全改了
扯远了,扯回正题
V2Ray的WebSockets模式不管用域名分流还是路径分流,用浏览器直连的话,会显示硕大一个Bad Request,这个显然是不合理的。昨天有朋友提出了个解决办法,用Nginx的错误代码跳转
写在前面
本文的方法仅适用Nginx+Websocket+V2Ray的方式,具体怎么安装请参考
从零开始安装爱国工具指南(十一)V2Ray进阶三、WebSockets模式详解
另外多说两句,经常有朋友问我哪个模式更快?你推荐WS模式,怎么我用mKCP模式更快?这里我推荐两个帖子
适合自己的才是最好的
爱国协议的三要素
我这里考虑的更多是安全与伪装,至于速度,有一句话叫中国奠信,世界加钱可及,好线路比什么都重要。
解决Bad Request问题需要修改2个文件。这里还是只说用LNMP安装的Nginx的配置
1.修改nginx.conf
文件位于/usr/local/nginx/conf/
打开该文件
vi /usr/local/nginx/conf/nginx.conf
在代码http{}段里添加一句
proxy_intercept_errors on;
保存退出即可
2.修改vhost文件
文件位于/usr/local/nginx/conf/vhost/
打开该文件
vi /usr/local/nginx/conf/vhost/www.yourdomain.com.conf
在443端口的配置里加一句
error_page 400 = https://www.yourdomain.com/xxxx;
保存退出重启nginx
service nginx restart
这里是设置一旦碰到Bad Request错误,会跳转到哪个页面
你可以设置成主页,网盘入口,视频页,图片站都没啥问题,看起来有那么回事就好
比如我随手折腾得这个页面
2017.10.15 补充
yum/apt 直接安装的nginx,配置文件位置是/etc/nginx/nginx.conf。
==========
v2ray最新版本2.41更新了个功能,Github说明是WebSocket now supports customized HTTP header,可以自定义HTTP头部。
我的理解是可以通过自定义header参数,让反代工具比如nginx,caddy,能够将正常的网页访问流量和V2Ray Websocket流量区分开
而自定义的header,就像芝麻开门的口令,没有携带正确参数的流量,会被引导到正常的网页,而带了正确的参数,就会被nginx送入内网的V2Ray。
加了TLS后,HTTP header是隐藏在TLS加密后面,无法被某墙探测
相比以前常用的二级目录或者二级域名的方式,更加合理隐蔽,不会有Bad Request错误,也不需要跳转错误页面
当然还是有缺点:
- 因为是新功能,目前没有客户端支持,因此只能用内核来开启这个功能
- 必须有一个主页,不然没意义,安装配置比较麻烦
这里我只简略说下我实现的方式,应该还有别的方法,算是抛砖引玉吧,毕竟不是专业的
有更好方法的朋友,麻烦留言告知
V2Ray配置
我们需要对客户端和服务端的config.json进行调整,代码如下
"streamSettings": {
"network": "ws",
"security": "tls",
"wsSettings": {
"connectionReuse": true,
"path": "/",
"headers": {
"Host": "www.ivyseeds.com"
}
}
}
# 客户端服务端分别修改streamSettings段
# Websocket模式
# 客户端需要开启TLS,服务端因证书挂在nginx,security应设为auto
#
#
# 目录设置为根目录
# 自定义header参数
# 这里只定义了一个Host参数,当然也可以加入其他更多的参数
# 特别说明下,这里的参数是自定义的,用密码理解更合适
# 就是为nginx提供一个判定依据,可以设置为任意值
#
Nginx配置
我们需要对vhost文件进行修改,在443段里加入以下代码,如果本身有location / {}段,在原有的代码里添加下面{}里的代码
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
if ($http_host = "www.ivyseeds.com" ) {
proxy_pass http://127.0.0.1:419;
}
}
# 根目录
#
#
#
#
# 根据host判定流量
# 正确的host参数,就送入内网v2ray监听的419端口
#
#
配置完后重启Nginx
另外的思路,兼容老版本的办法
既然WS流量能通过Header分流,如果前台网站是用的http协议,后台V2Ray采用Websocket协议,那么nginx也能通过http和ws的不同来进行分流,这样不需要2.41版本的V2Ray就能实现,最大程度兼容已有的客户端。
Nginx配置修改为:
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
if ($http_upgrade = "websocket") {
proxy_pass http://127.0.0.1:419;
}
}
#
#
#
#
#
# 流量为Websocket,则转发内网V2Ray
老版本的V2Ray只需要将目录更改为根目录即可
实测这个思路可行,用V2RayN连接成功
但是还是有个问题,如果前台网页自身有ws流量,就会导致网站工作不正常
不过作为老版本的过渡办法是可行的,毕竟大多数人前台网页只是个伪装
感谢HyperAPP作者@Baye 大神提供思路
2017/10/20
测试了在各种不同的网站下按这种方式配置
博客:Wordpress,网盘:Pydio、Filerun,文件列表:h5ai
都测试通过
因为之前TG群里看有朋友说nginx不适合if语句,特意测试了下网站和V2Ray同时工作的情况,实测前台网页http和后台v2ray ws没有干扰,用私盘下载的同时,用同VPS的v2ray看油管8K,实际油管5w+,下载5MB+,基本跑满了我宽带带宽,nginx分流的效率足以保证使用
另外各种客户端也测试了一圈
Win:V2RayN
iOS:ShadowRocket,ShadowRay,Kitsunebi
Android:V2RayNG
以上的客户端都工作正常,值得一提的是Kitsunebi的TF版,立马更了基于2.41的版本,用自定义配置模式可以用header分流功能了
推荐采用之前二级目录、二级域名分流的朋友在客户端支持header参数之前改用这个办法
2017/10/23
有朋友用caddy配置Websocket分流成功了,贴个配置图,感谢@BM Lin
原文:https://www.ivyseeds.cf/websocket/ https://www.ivyseeds.cf/websockets2/ https://www.ivyseeds.cf/wssheader/
感谢作者提供的Bad Request错误隐藏方法,对2017/10/21这部分思路进行补充
#v2ray websocket
location /video_stream { # 与 V2Ray 配置中的 path 保持一致
proxy_redirect off;
proxy_pass http://127.0.0.1:10080;#假设WebSocket监听在环回地址的10000端口上
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;
proxy_set_header Host $http_host;
# Show realip in v2ray access.log
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
大神可否出个详细的教学
这个已经很详细了,网上您再找找,我最近没时间写。
事隔2年居然看到自己的博文了,还有点感动
I think what you published made a bunch of sense.
But, think on this, suppose you composed a catchier post title?
I ain’t suggesting your information is not solid, however suppose you added something to maybe grab a person’s attention? I mean iGFW » V2Ray的Websocket模式使用CDN加速并隐藏VPS真实IP is a little boring.
You could glance at Yahoo’s front page and watch how they
write article titles to grab viewers to click. You might try adding a video or a picture
or two to get readers interested about everything’ve written. In my opinion, it could make your blog
a little livelier.