V2ray websocket(ws)+tls+宝塔(网站)+CDN(加速)+BBR

背景

前段时间境外的一台VPS的IP被封了,由于有免费换IP的政策,就换了下,结果没用两天又被封了,这下热闹了,彻底报废了,要等5周才能再次免费换IP,当然花钱也是可以换IP的,但对于我们来说就不是很划算了,毕竟不是每个人都是土豪。于是做了这个域名+CDN+服务器的上网组合,既可以避开GFW的封锁,还能CDN加速网站,上网的话也是灵活方便,IP直连服务器,或者域名+CDN连接服务器。(也可以另外申请个域名,直接用ws,可以不走CDN,避免减速,直接用IP的话还是比较暴露的)
原理:我们用的是V2ray的WebSocket协议,这个协议我们可以简单理解为tcp协议的封装版本,和HTTP是差不多的就可以了,这样的话我们正常搭建一个网站,就可以很好的伪装我们的流量了。我先大致的介绍下网络的工作原理,当我们要访问一个网站的时候,我们输入的是网站的域名,这个域名不是唯一的,比如我们一个域名可以指向很多的网站,就拿我们比较熟悉的腾讯来说,官网是www.qq.com,邮箱是mail.qq.com,腾讯视频却是v.qq.com,他们所指向的服务器都是不一样的,所以我们访问一个网站的时候,电脑会把我们的域名发送给DNS服务器,问一下这个域名所对应的IP是多少,DNS服务器查到记录就会把IP地址返回给你,这时候电脑会拿着这个IP地址去访问你的网站了,连接上之后你就可以正常访问了。这期间,如果DNS服务器给你一个假的地址,那么你就没法正常的访问你要访问的网站了,比如我想访问的是腾讯的网站,结果DNS服务器返回给我一个百度的IP,那么我所打开的网站就成了百度的网站了,这种现象就叫做DNS劫持,这个原理也是墙的一种手段。

我们再说一下什么是CDN,CDN全称是内容分发网络,比如我人在上海,想访问北京的一个网站,通常情况下,我们是要连接到北京的服务器,然后从北京的服务器上下载图片视频音频等素材,大家都知道,占用流量的都是这些媒体素材,真正的程序只占用很少的一部分,再加上这个距离太远,中间传输的不确定因素太多,所以访问速度很慢;CDN呢就是在全国各个地方都搭建CDN服务器,然后把你网站上的素材,比如视频音频图片等,都拷贝到这个CDN服务器上,当我们的客户在上海访问我们的网站时,就会就近的搜寻有你网站素材的CDN服务器,恰好呢,杭州有一台CDN服务器上有你的网站素材,这时候我们需要的素材就不会再去北京官网服务器下载了,而是从就近的杭州CDN服务器下载,下载的同时呢会和逛网服务器同步查询,有不一样的才会从官网服务器下载,这样一来,我们浏览网站的速度就快了很多。当然怎么把网站上的素材拷贝到CDN服务器上就是另外一个话题了,我们这里不做解释。

事前准备

一台VPS(系统随便,推荐Debian或者centos),一个域名(提前做好DNS解析,推荐直接用CDN解析,后期直接打开CDN加速即可),SSH工具

部署过程

安装V2Ray
19%

项目地址:https://github.com/v2fly/fhs-install-v2ray
SSH连接上远程VPS后,下载安装脚本:

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

这里推荐用官方的安装脚本,不是其他大神做的脚本不好用,而是脚本有些冲突,比如233大神的脚本,安装快捷管理方便,但是会自动安装Caddy服务器,这无疑会和我们需要的lnmp环境相冲突。如果需要一键脚本的请看下面的教程
最好用的 V2Ray 一键安装脚本 & 管理脚本
在安装完V2Ray之后,会有一个PORT和UUID,即表示安装成功,

设为开机启动

systemctl enable v2ray

开启V2RAY服务

systemctl start v2ray
安装宝塔BT面板
25%

Centos安装命令:

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && bash install.sh

Debian安装命令:

wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && bash install.sh

安装时,一路默认即可,该输入Y的输入Y,没什么难度
安装完成,会出现面板地址及默认账号与密码。(注意新版本在端口号后面还有一个字符串,一定要全部保存)

访问BT-Panel的地址,输入账号与密码即可使用宝塔

安装LNMP环境+Nignx配置
50%

登录BT面板后,可一键部署源码,选择安装LNMP环境;耐心等待,速度很慢
一切都安装完后,点击「网站」——「添加站点」

成功添加完站点后,点击「设置」——SSL——Let’s Encrypt,成功申请SSL后,保存

再点击站点「设置」的「配置文件」选项,在最后一个“ } ”前添加如下代码:

  location /ws {          //  ws不是固定的,可以根据自己的情况修改,只要和v2ray的配置文件config.json中一致即可
        proxy_redirect off;
        proxy_pass http://127.0.0.1:8080;      //端口号不是固定的,自定义
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        }

大家可以直接复制,最后把 //汉字 全部删掉,不然有的提示无法保存

回到「首页」,重启「Nignx服务」,有的首页没有显示安装了那些程序,可以到[软件管理]中管理

BT面板「安全」,防火墙端口放行,新增你的V2Ray端口,如果下面端口号改变,这里也相应的添加

修改V2Ray配置文件
75%

由于我们安装了BT面板,所以在面板里面编辑v2ray的配置文件config.json即可
打开面板「文件」,在路径中输入/etc/v2ray/,编辑文件,复制下面代码做适当修改并保存,新版路径在/usr/local/etc/v2ray

{
  "log" : {
    "access": "/var/log/v2ray/access.log",
    "error": "/var/log/v2ray/error.log",
    "loglevel": "warning"
  },
  "inbound": {
    "port": 8080, #自动生成的端口,须与Nignx设置的相一致,可自定义
    "protocol": "vmess",
    "settings": {
      "clients": [
        {
          "id": "85b4aeab-5b53-475b-b9ad-dd18b4dd4ceb", #自动生成的UUID,不是随便写的,可以到https://intmainreturn0.com/v2ray-config-gen/#生成
          "level": 1,
          "alterId": 64 #额外ID 自定义,理论上 alterId 越大越好,但越大就约占内存,0 到 100 之间应该是比较合适的
        }
      ]
    },
	"streamSettings": {
	"network":"ws",
	"wsSettings": {
	"path": "/ws", #path可自定义,这里是/ws,须与Nginx和客户端的path相一致
	"headers": {
	"Host": " " #Host可自定于任意域名,此处没有添加
	}
	}
	}
  },
//ss服务设置开始   如果不需要ss连接,可以删掉
"inboundDetour": [
   {
     "protocol": "shadowsocks",
     "port": 8081,#端口自己修改
     "settings": {
      "method": "chacha20",  #加密协议自己选择aes-256-cfb、aes-128-cfb、chacha20、chacha20-ietf、aes-256-gcm、aes-128-gcm、chacha20-poly1305 或称 chacha20-ietf-poly1305
      "password": "password",#密码自己修改
      "udp": false
     }
    }
  ],
//ss服务设置结束
  "outbound": {
    "protocol": "freedom",
    "settings": {}
  },
  "routing": {
    "strategy": "rules",
    "settings": {
      "rules": [
        {
          "type": "field",
          "ip": [
            "0.0.0.0/8",
            "10.0.0.0/8",
            "100.64.0.0/10",
            "127.0.0.0/8",
            "169.254.0.0/16",
            "172.16.0.0/12",
            "192.0.0.0/24",
            "192.0.2.0/24",
            "192.168.0.0/16",
            "198.18.0.0/15",
            "198.51.100.0/24",
            "203.0.113.0/24",
            "::1/128",
            "fc00::/7",
            "fe80::/10"
          ],
          "outboundTag": "blocked"
        }
      ]
    }
  }
}

这里也可以直接复制,但是复制之后把#和汉字全部删掉,不然会报错,无法运行

重启V2Ray服务,每次修改完配置文件都需要重启才能生效,然后验证是否允许成功。
100%
service v2ray restart #重启
service v2ray status #通过该命令,可查看v2ray是否运行成功(出现绿色的running即允许成功)

其他管理命令

停止运行 V2Ray:

$ sudo systemctl stop v2ray

卸载V2ray(没有找到官方卸载教程,我一直用的这个)

source <(curl -sL https://git.io/fNgqx) --remove

安装加速

开启CDN,推荐CloudFlare
优点:隐藏真实IP地址,同时可以绕过GFW的封锁,即使你的IP已经被封,同样可以使用
缺点:国内解析速度较慢,会影响速度
安装BBR:推荐一键安装最新内核并开启BBR脚本

客户端使用

根据自己的配置填写,如果使用域名+CDN的话地址填写域名即可,端口为443,因为TLS的端口是443,加密方式等根据自己的配置添加,伪装域名就是你的域名,因为这个域名确实是有网站的,路径和V2ray配置文件中的保持一致,注意底层传输要选择tls,不然连不上的,这种方式网速和CDN息息相关,如果IP没有被墙,可以直接使用V2ray配置文件中的IP+端口直接连接

附件

最后附上一个带电报代理的配置,自己酌情修改,记得不要有汉字,不要有汉字,不要有汉字,两个//也要删掉!!!别傻傻的直接复制。

{
	"log": {
		"access": "/var/log/v2ray/access.log",
		"error": "/var/log/v2ray/error.log",
		"loglevel": "warning"
	},
	"inbounds": [
		{
			"port": 8080,
			"protocol": "vmess",
			"settings": {
				"clients": [
					{
						"id": "8d094b8f-86b1-41e1-aaa3-e5410c5ba43f",     //换成自己的,可以去https://www.veekxt.com/utils/v2ray_gen生成
						"level": 1,
						"alterId": 98
					}
				]
			},
			"streamSettings": {
	"network":"ws",
	"wsSettings": {
	"path": "/ws",    //地址一定要和网站配置中的一致
	"headers": {
	"Host": "你自己的域名 "
	}
	}
	}
		}
		,
        {
            "protocol": "shadowsocks",
            "port": 8081,//换成自己的端口
            "settings": {
                "method": "chacha20",    //换成自己的加密方式
                "password": "密码",         //换成自己的密码
                "network": "tcp,udp",
                "level": 1,
                "ota": false
            }
        }
		//include_socks
		,
        {
            "protocol": "mtproto",
            "port": 8089,    //换成自己的端口
            "tag": "tg-in",
            "settings": {
                "users": [
                    {
                        "secret": "2b8edd1857fe1939446afccb6700a523"    //换成自己的,可以去https://www.veekxt.com/utils/v2ray_gen生成
                    }
                ]
            }
        }
		//include_in_config
		//
	],
	"outbounds": [
		{
			"protocol": "freedom",
			"settings": {}
		},
		{
			"protocol": "blackhole",
			"settings": {},
			"tag": "blocked"
		},
		{
			"protocol": "freedom",
			"settings": {},
			"tag": "direct"
		},
		{
			"protocol": "mtproto",
			"settings": {},
			"tag": "tg-out"
		}
		//include_out_config
		//
	],
	"dns": {
		"server": [
			"1.1.1.1",
			"1.0.0.1",
			"8.8.8.8",
			"8.8.4.4",
			"localhost"
		]
	},
	"routing": {
		"domainStrategy": "IPOnDemand",
		"rules": [
			{
				"type": "field",
				"ip": [
					"0.0.0.0/8",
					"10.0.0.0/8",
					"100.64.0.0/10",
					"127.0.0.0/8",
					"169.254.0.0/16",
					"172.16.0.0/12",
					"192.0.0.0/24",
					"192.0.2.0/24",
					"192.168.0.0/16",
					"198.18.0.0/15",
					"198.51.100.0/24",
					"203.0.113.0/24",
					"::1/128",
					"fc00::/7",
					"fe80::/10"
				],
				"outboundTag": "blocked"
			},
			{
				"type": "field",
				"inboundTag": ["tg-in"],
				"outboundTag": "tg-out"
			}
			,
			{
				"type": "field",
				"domain": [
					"domain:epochtimes.com",
					"domain:epochtimes.com.tw",
					"domain:epochtimes.fr",
					"domain:epochtimes.de",
					"domain:epochtimes.jp",
					"domain:epochtimes.ru",
					"domain:epochtimes.co.il",
					"domain:epochtimes.co.kr",
					"domain:epochtimes-romania.com",
					"domain:erabaru.net",
					"domain:lagranepoca.com",
					"domain:theepochtimes.com",
					"domain:ntdtv.com",
					"domain:ntd.tv",
					"domain:ntdtv-dc.com",
					"domain:ntdtv.com.tw",
					"domain:minghui.org",
					"domain:renminbao.com",
					"domain:dafahao.com",
					"domain:dongtaiwang.com",
					"domain:falundafa.org",
					"domain:wujieliulan.com",
					"domain:ninecommentaries.com",
					"domain:shenyun.com"
				],
				"outboundTag": "blocked"
			}			,
                {
                    "type": "field",
                    "protocol": [
                        "bittorrent"
                    ],
                    "outboundTag": "blocked"
                }
			//include_ban_ad
			//include_rules
			//
		]
	},
	"transport": {
		"kcpSettings": {
            "uplinkCapacity": 100,
            "downlinkCapacity": 100,
            "congestion": true
        },
		"sockopt": {
			"tcpFastOpen": true
		}
	}
}

v2ray启动报code=exited, status=218/CAPABILITIES错误的解决方法

如果通过service v2ray start命令启动后,没有提示任何错误。但是通过service v2ray status查看状态后,发现启动失败,报这个错误:code=exited, status=218/CAPABILITIES
解决方法如下:

1、编辑v2ray的服务配置文件

vi /etc/systemd/system/v2ray.service

2、对文件内容做如下修改:

将:
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
改为:
CapabilityBoundingSet=~
AmbientCapabilities=

3、运行systemctl daemon-reload

4、检查v2ray的端口号,必须设定为大于 1024的端口号才行

做好以上修改后,执行:service v2ray restart 即可启动成功。