V2Ray的Websocket模式使用CDN加速并隐藏VPS真实IP

2017年11月24日 | 分类: 乱七八糟 | 标签: ,

刚看到一个评论,问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/"
}
}
},

:wq保存退出,V2Ray服务端配置完成,重启V2Ray加载新的配置。

至此服务端配置完成

四、客户端配置

由于V2Ray监听的是本地端口,我们需要连接nginx监听的443端口,并且由于nginx开启了TLS证书,所以客户端配置需要打开TLS选项。

同样的,windows版推荐使用V2RayN,iOS端ShadowRocket最新的TF版已经支持了,商店版还需要等更新,Android手里没机器,没法测试,请自行搜索。配置见下图

 

 

写在最后

这个系列稀里糊涂的写了一大堆,有时候懒癌犯了很久没更一篇,其实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

写在最后

测试的时候是在我的网盘VPS按这种方式配置的,Nginx代码直接写进了Pydio网盘的配置文件。实测打开域名,网盘工作正常,同时通过V2Ray也能正常访问Youtube,完美。

客户端支持

支持Header功能的客户端

2017/10/21 更新

Windows:目前只能用内核

iOS:Kitsunebi TF版(需要手动修改配置),ShadowRay TF版

Android:V2RayGO应该支持,不过我没测试

另外的思路,兼容老版本的办法

既然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:ShadowRocketShadowRayKitsunebi

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/

  1. sover
    2020年2月14日10:40

    感谢作者提供的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. 你好
    2020年2月13日22:27

    大神可否出个详细的教学

    • iGFW
      2020年2月14日09:49

      这个已经很详细了,网上您再找找,我最近没时间写。

  3. 啊啊
    2020年1月18日00:58

    事隔2年居然看到自己的博文了,还有点感动

  4. 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.