科学上网

V2Ray(WebSocket+TLS+Web+CDN)安装配置教程含ipv6/MTProto

1. 背景知识

以下示例中的域名均为www.example.tk,域名、证书、UUID以及MTProto的密钥请记得替换成自己的

1.1 代理原理

pc-firewall-cdn-vps

v2ray 的代理原理和配置项的关系上图为 v2ray v4.0 之前的代理原理图。v2ray v4.1+ 合并了输入输出配置项:

  • inbounds = inbound + inboundDetour
  • outbounds = outbound + outboundDetour
  • 为便于理解,你可以将上图 inboundinboundDetour 视为各种不同的代理方式,全部定义在新版配置文件的 inbounds 配置项中,outbounds 亦同理。

1.2 VMess协议

V2Ray 使用 inbound(传入) 和 outbound(传出) 的结构,这样的结构非常清晰地体现了数据包的流动方向,同时也使得 V2Ray 功能强大复杂的同时而不混乱,清晰明了。形象地说,我们可以把 V2Ray 当作一个盒子,这个盒子有入口和出口(即 inbound 和 outbound),我们将数据包通过某个入口放进这个盒子里,然后这个盒子以某种机制(这个机制其实就是路由,后面会讲到)决定这个数据包从哪个出口吐出来。以这样的角度理解的话,V2Ray 做客户端,则 inbound 接收来自浏览器数据,由 outbound 发出去(通常是发到 V2Ray 服务器);V2Ray 做服务器,则 inbound 接收来自 V2Ray 客户端的数据,由 outbound 发出去(通常是如 Google 等想要访问的目标网站)。

无论是客户端还是服务器,配置文件都由两部分内容组成: inboundsoutbounds。V2Ray 没有使用常规代理软件的 C/S(即客户端/服务器)结构,它既可以当做服务器也可以作为客户端。于是我们可以从另一个角度来理解,认为每一个 V2Ray 都是一个节点,inbound 是关于如何与上一个节点连接的配置,outbound 是关于如何与下一个节点连接的配置。对于第一个节点,inbound 与浏览器连接;对于最后一个节点,outbound与目标网站连接。inboundsoutboundsinboundoutbound的集合,意味着每一个 V2Ray 节点都可以有多个入口和出口。

1
{浏览器} <--(socks)--> {V2Ray 客户端 inbound <-> V2Ray 客户端 outbound} <--(VMess)-->  {V2Ray 服务器 inbound <-> V2Ray 服务器 outbound} <--(Freedom)--> {目标网站}

2. 参考文档

V2Ray官方文档 V2Ray白话文教程 MTProxy官方文档

3. 安装部署WebSocket+TLS+Web+CDN

3.1 准备

3.1.1 端口规划

Port Listen IP Use
443 0.0.0.0 Nginx Https
10000 127.0.0.1 V2Ray WebSocket
8000 0.0.0.0 V2Ray MTProto

3.1.2 服务器准备

BandwagonHOST搬瓦工

搬瓦工非官方中文网

Plan:SPECIAL 20G KVM PROMO V5 - LOS ANGELES - CN2 GIA ECOMMERCE

OS:Centos-7-x86_64-bbr(自带bbr加速)

VPS Type: KiwiVM

3.1.3 申请免费域名

Freenom - A Name for Everyone .tk .ml不需要实名 免费一年

域名基本概念

首先说明一下域名的基本概念,你购买的域名是一个二级域名,形式类似于 xxx.后缀,比如 baidu.comgoogle.com 就是二级域名,com 是后缀。

你可以在你的二级域名基础上添加三级域名,比如 haha.baidu.comheihei.google.com。甚至是四级或者更多级,比如 haha.heihei.baidu.comhehe.hehe.hehe.google.com,因为二级域名已经是你的了,所以你想添加什么就添加什么。

光设置一个三级域名还不行,你得把你的域名和你的 IP 地址结合起来,这个 IP 就叫做域名的解析记录,解析记录有许多不同的类型,常用的有 A、AAAA、CNAME 等等。

  • A 类型:解析到一个 IPv4 地址
  • AAAA 类型:解析到一个 IPv6 地址
  • CNAME 类型:解析到另一个域名,由该域名来提供 IP 地址

假设要将三级域名 haha.baidu.com 解析到 IP 地址 123.123.123.123 上,那么通常的做法是,选择添加解析记录,名称设置为 haha,类型设置为 A,解析记录填入 123.123.123.123,设置好之后 haha.baidu.com 就会解析到 123.123.123.123 了

3.1.4 使用免费CDN

Cloudflare

127.0.0.1、localhost、0.0.0.0、本机IP地址区别

IP类型
IP address class

在A类、B类、C类IP地址中,如果主机号是全1,那么这个地址为直接广播地址,它是用来使路由器将一个分组以广播形式发送给特定网络上的所有主机。32位全为1的IP地址“255.255.255.255”为受限广播地址("limited broadcast" destination address),用来将一个分组以广播方式发送给本网络中的所有主机路由器则阻挡该分组通过,将其广播功能限制在本网内部。

IPv4地址分类
localhost

首先,localhost 就是一个域名,域名指向 127.0.0.1,两者是一样的,如果是 mac,可以在 /etc/hosts 文件中看到这一行。

1
2
> 127.0.0.1     localhost
>
127.0.0.1

127.0.0.1 这个地址通常分配给 loopback 接口,用来测试本机的 TCP/IP 协议栈。loopback 是一个特殊的网络接口(可理解成虚拟网卡),用于本机中各个应用之间的网络交互。只要操作系统的网络组件是正常的,loopback 就能工作。只要使用这个地址发送数据,则数据包不会出现在网络传输过程中。

0.0.0.0

这个 IP 相当于 java 中的 this,代表当前设备的 IP,可以代表本机的所有 IP 地址。

比如你的一个 tomcat 配置文件中,如果监听的 IP 地址设置了 0.0.0.0,就表示你的这个 tomcat 服务器监听在你本机的所有 IP 地址上,通过任何一个 IP地址 都可以访问到。

如果你本地的 IP 地址有 192.168.1.10,172.16.2.10,那么访问你这个 tomcat 就可以。 http://192.168.1.10:8080/,http://172.16.2.10:8080/ 都可以访问。

如果你的监听地址设置了 192.168.1.10 ,那么将无法通过 http://172.16.2.10:8080/ 进行访问。

本机 IP

至于本机 IP,你可以理解为本机有三块网卡,一块网卡叫做 loopback(这是一块虚拟网卡),另外一块网卡叫做 ethernet (这是你的有线网卡),另外一块网卡叫做 wlan(这是你的无线网卡)。

你的本机 IP 是你真实网卡的 IP,具体来说有线无线各有一个,而 127.0.0.1 是那块叫做 loopback 的虚拟网卡的 IP。

3.1.5 开启SSL

SSL For Free - Free SSL Certificate in Minutes

生成www.example.tk_chain.crt www.example.tk_key.key

3.1.6 免费获得IPv6访问byr北邮人bt站

工具

参考搬瓦工VPS KVM 方案如何使用IPv6 思路]

3.2 安装部署V2Ray

3.2.1 安装Nginx

sudo yum install nginx

使用 systemctl start|stop|restart|status nginx 控制 Nginx 的运行

3.2.2 配置Nginx

/etc/nginx/conf.d/example.tk.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 443 ssl;
ssl on;
ssl_certificate /etc/nginx/conf.d/www.example.tk_chain.crt;
ssl_certificate_key /etc/nginx/conf.d/www.example.tk_key.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
server_name example.tk;
location /ray/ { # 与 V2Ray 配置中的 path 保持一致
proxy_redirect off;
proxy_pass http://127.0.0.1:10000;#假设WebSocket监听在环回地址的10000端口上
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

3.2.3 安装V2Ray

参考V2Ray官方文档

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

此脚本会配置自动运行脚本。自动运行脚本会在系统重启之后,自动运行 V2Ray。目前自动运行脚本只支持带有 Systemd 的系统,以及 Debian / Ubuntu 全系列。

脚本运行完成后,你需要:

  1. 编辑 /etc/v2ray/config.json 文件来配置你需要的代理方式;
  2. 运行 service v2ray start来启动 V2Ray 进程;
  3. 之后可以使用 service v2ray start|stop|status|reload|restart|force-reload 控制 V2Ray 的运行。

3.2.4 配置V2Ray

3.2.4.1 为V2Ray生成一个UUID
  • UUID Generator

  • Linux 使用命令 cat /proc/sys/kernel/random/uuid 生成

  • 使用V2Ray自带的v2ctl工具生成一个新的uuid。

  • 1
    2
    $ /usr/bin/v2ray/v2ctl uuid
    27e0efcc-8e13-fef1-9e82-febebc469b2b
3.2.4.2 为MTProto生成一个密钥

使用此命令生成 MTProto 代理所需要的用户密钥:openssl rand -hex 16

3.2.4.3 服务器 V2Ray 配置

修改/etc/v2ray/config.json

可以使用 $ /usr/bin/v2ray/v2ray -test -config /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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
{
"log": {
"loglevel": "warning",//日志级别debug|info|warning|error|none
"access": "/var/log/v2ray/access.log",//将访问的记录保存到文件中,这个选项的值是要保存到的文件的路径
"error": "/var/log/v2ray/error.log"//将错误的记录保存到文件中,这个选项的值是要保存到的文件的路径
},
"inbounds": [
{//主端口配置
"port": 10000,// 监听端口
"listen": "127.0.0.1",//只监听 127.0.0.1,避免除本机外的机器探测到开放了 10000 端口
"protocol": "vmess",// 入口协议为vmess
"settings": {
"clients": [
{
"id": "27e0efcc-8e13-fef1-9e82-febebc469b2b",//换成自己的UUID
"alterId": 64
}
]
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/ray/"
}
}
},
{
"tag": "tg-in",
"port": 8000,//telegram访问端口
"protocol": "mtproto",
"settings": {
"users": [
{
"secret": "80e2e037610bac1444ac02979364f666"//用户密钥
}
]
}
}
],
"outbounds": [
{
"protocol": "freedom",// 出口协议
"settings": {}
},
{
"protocol": "blackhole",
"settings": {
"response": {
"type": "none"
}
},
"tag": "blocked"
},
{
"tag": "tg-out",
"protocol": "mtproto",
"settings": {}
}
],
"routing": {
"domainStrategy": "IPOnDemand",
"settings": {
"rules": [
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "blocked"
},
{
"type": "field",
"inboundTag": [
"tg-in"
],
"outboundTag": "tg-out"
}
]
}
}
}
3.2.4.4 客户端配置文件(供参考)
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
{
"inbounds": [
{
"port": 1087,
"listen": "127.0.0.1",
"protocol": "http",
"settings": {
"allowTransparent": true
}
},
{
"port": 1086,
"listen": "127.0.0.1",
"protocol": "socks",
"domainOverride": [
"tls",
"http"
],
"settings": {
"auth": "noauth",
"udp": true
}
}
],
"outbounds": [
{
"protocol": "vmess",// 出口协议为vmess
"settings": {
"vnext": [
{
"address": "www.example.tk",// 服务器地址,请修改为你自己的服务器 IP 或域名
"port": 443,// 服务器端口
"users": [
{
"id": "27e0efcc-8e13-fef1-9e82-febebc469b2b",// 用户 ID,必须与服务器端配置相同
"alterId": 64,// 此处的值也应当与服务器相同
"security": "auto"
}
]
}
]
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/wss"// 此处的值也应当与服务器相同
},
"security": "tls"
},
"mux": {
"enabled": false,
"concurrency": 8
},
"tag": "proxy"
},
{
"protocol": "freedom",
"settings": {},
"tag": "direct"
},
{
"protocol": "blackhole",
"settings": {},
"tag": "block"
}
],
"log": {
"loglevel": "none",
"access": "D:/v2ray_access.log",
"error": "D:/v2ray_error.log"
},
"dns": {
"hosts": {
"example.com": "127.0.0.1"
},
"servers": [
"223.5.5.5",
"8.8.8.8",
"localhost"
]
},
"routing": {
"strategy": "rules",
"settings": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": [
"dropbox",
"github",
"google",
"instagram",
"netflix",
"pinterest",
"pixiv",
"tumblr",
"twitter",
"domain:facebook.com",
"domain:fbcdn.net",
"domain:fivecdm.com",
"domain:ggpht.com",
"domain:gstatic.com",
"domain:line-scdn.net",
"domain:line.me",
"domain:medium.com",
"domain:naver.jp",
"domain:pximg.net",
"domain:t.co",
"domain:twimg.com",
"domain:youtube.com",
"domain:ytimg.com"
],
"outboundTag": "proxy"
},
{
"type": "field",
"ip": [
"125.209.222.0/24",
"149.154.167.0/24",
"149.154.175.0/24",
"91.108.56.0/24"
],
"outboundTag": "proxy"
},
{
"type": "field",
"domain": [
"cctv",
"geosite:cn",
"umeng",
"domain:apple.com",
"domain:crashlytics.com",
"domain:icloud.com",
"domain:ixigua.com",
"domain:pstatp.com",
"domain:snssdk.com",
"domain:toutiao.com"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:cn",
"geoip:private"
],
"outboundTag": "direct"
},
{
"type": "field",
"domain": [
"domain:doubleclick.net"
],
"outboundTag": "block"
}
]
}
}
}