v2ray 更安全的代理服务

代理

由于最近使用 vps 连续被封禁,不知是否是因为切换到 SSR 的缘故?我从网络上看到很多关于 SSR 被封禁的情况,好像是由于墙不需要去特意破解什么加密,而是根据 SSR 某些特征可以大概率查封。对于我而言,我还是信服这种说法,因为在我切换到 SSR 之后不到三天我的两台服务器连续被封禁了,这让我不知所措。因为在这之前没去好好了解实际情况,我面对这种情况真的显得很无奈,好好地两台 VPS 居然都被封了,只好忍痛又买了一台。

发现 V2ray

在论坛上看到很多人也遇到过这种情况,很多都推荐使用 V2ray,新的协议,伪装程度高,各种优点。而且现在 SS 和 SSR 停止更新了,从 V2ray github 上来看,更新很频繁,而且功能也在不停地增加。
对于这个时候的我,其实已经不在乎速度了,更加在乎的是安全和长久,因为我只是用来查查资料,基本很少看视频,对于速度要求不高。当然现在已经搭建的这台代理速度还是可以的,油管的 1080 很流畅。而且好几个人在用。

方案

本身 v2ray 服务支持很多种方案,具体有多少我都忘了。有兴趣的可以去查查博客。这里我只介绍我正在使用方案,也是大家普遍认可而且安全比较高的方案 。

v2ray + nginx + websocket + tls

当前你首先必须拥有一台 VPS,推荐肯定就是搬瓦工的 KVM 架构的了。安装请选择带有 BBR 的系统。BBR 是由 GOOGLE 提出的一个开源 TCP 拥塞控制的算法。这里有一篇文章作了详细的介绍,有兴趣的可以看看。还是你必须拥有一个域名,这是必须的。如果没有,那你可以先关闭该页面,申请完再来看了,或者找一下其他的 v2ray 的解决方案了。
这套方案的思路就是利用 nginx 作为中转来做伪装。相比于 SSR 的直连,在 v2ray 客户端发出 ws 的请求到 nginx,然后利用 nginx 的代理直接转发到 v2ray 的服务上面。这样就可以将请求伪装成正常 ws 的请求 。

安装 (Centos7 系统)

安装 v2ray

我还是推荐一键脚本,这也是由官方维护的,所以我认为你没必要再去自己搞什么编译啥的,也没多大意义。目前还是能成功安全起来为主。以后有兴趣了再去搞搞也还行。执行下面的命令就可以了

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

使用以下命令来控制 v2ray 服务

1
systemctl start|restart|stop|status v2ray

其配置文件放在 /etc/v2ray/config.json,是一个 Json 文件,在你安装完之后会有一个初始化的 Json 文件,文件会提供三个必要的信息 IP、端口(Port)、id(UUID), 尤其是这个 UUID,很重要。客户端会使用到,必须保持和服务端一致。当然你可以自己生成所需要的 UUID,到这个网站 Online UUID Generator 生成就可以了。

执行 systemctl start v2ray 然后执行 systemctl status v2ray 之后,如果看到绿色的 active(running) 就说明启动成功了,这里就先将所有服务先安装好,配置在最后一块配置就行了。

安装 nginx

1
2
3
4
5
6
7
8
9
10
11
yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel open openssl-devel

wget http://nginx.org/download/nginx-1.14.1.tar.gz

tar zxvf nginx-1.14.1.tar.gz

cd nginx-1.14.1

./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-file-aio

make && make install

五部 Nginx 就安装好了。最后加一下软连接

1
ln -s /usr/local/nginx/sbin/nginx /usr/bin/

安装证书

这里假设你已经拥有了域名,并且增加了 A 解析到该台 VPS。下面我们申请证书,证书过程也很简单。安装两个脚本便可以了。这里利用 Certbot 来申请。执行下面的命令

1
2
3
yum install epel-release
yum install -y certbot
curl https://get.acme.sh | sh

安裝成功后执行 source ~/.bashrc 以确保脚本所设置的命令別名生效。
如果安装报错,那么可能是因为系统缺少 acme.sh 所需要的依赖项, acme.sh 的依赖项主要是 netcat(nc), 我们通过以下命令来安装这些依赖,然后重新安装一遍

1
yum -y install netcat

生成证书之前,请确保宿主机上的 80 端口没有被占用,否则会安装失败

~/.acme.sh/acme.sh –issue -d mydomain.me –standalone -k ec-256

-k 表示秘钥长度,后面的值可以是 ec-256ec-384、2048、3072、4096、8192,带有 ec 表示生成的是 ECC 证书,沒有则是 RSA 证书。在安全性上 256 位的 ECC 证书等同于 3072 位的 RSA 证书。

Let’s Encrypt 的证书有效期只有 3 個月,因此需要 90 天至少要更新一次证书,acme.sh脚本会每 60 天自动更新证书,。也可以手动更新。

手动更新 ECC 证书,执行:

sudo ~/.acme.sh/acme.sh –renew -d mydomain.com –force –ecc

如果是 RSA 证书则执行:

sudo ~/.acme.sh/acme.sh –renew -d mydomain.com –force

配置

v2ray服务端配置

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
{
"log": {
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log",
"loglevel": "debug"
},
"inbound": {
"listen": "127.0.0.1",
"port": ***, // 你的实际端口号
"protocol": "vmess",
"settings": {
"clients": [
{
"id": ### uuid,
"alterId": 64,
"level": 1
}
]
},
"streamSettings": {
"network": "ws",
"security": "auto",
"wsSettings": {
"path": "path", // 自定义
"headers": {
"Host": "yourDomain" // 你的域名地址
}
}
}
},
"outbound": {
"protocol": "freedom",
"settings": { }
},
"outboundDetour": [
{
"protocol": "blackhole",
"settings": { },
"tag": "blocked"
}
],
"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"
}
]
}
}
}

nginx 配置

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
server {
# 禁用不需要的请求方式 以下只允许 get、post
if ($request_method !~ ^(POST|GET)$) {
return 444;
}

listen 80;
server_name yourDomain; #注:填写自己的域名
return 301 yourDomain;
}

upstream v2ray {
server 127.0.0.1:端口; #注:v2ray后端监听地址、端口
keepalive 2176; # 链接池空闲链接数
}

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
#要开启 HTTP/2 注意nginx版本
#可以使用 nginx -V 检查
listen 443 ssl http2 backlog=1024 so_keepalive=120s:60s:10 reuseport; # backlog是nginx 监听队列 默认是511 使用命令 ss -tnl查看(Send-Q);
#设置编码
charset utf-8;

#证书配置
ssl_certificate path; #注:填写自己证书路径
ssl_certificate_key path; #注:填写密钥路径

ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets off;

# https://nginx.org/en/docs/http/ngx_http_ssl_module.html
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#openssl ciphers
#注:懒人配置 https://mozilla.github.io/server-side-tls/ssl-config-generator/
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

#安全设定
#屏蔽请求类型
if ($request_method !~ ^(POST|GET)$) {
return 444;
}
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options nosniff;
add_header Strict-Transport-Security max-age=15 always;
root /var/www/html;

# Add index.php to the list if you are using PHP
index index.html index.htm index.php ;

server_name yourDomain; #注: 将domain.Name 替换成你的域名


location /path { #注:修改路径,上述服务端 ws 配置的 path
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade"; #此处与<map>对应
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_requests 25600;
keepalive_timeout 300 300;
proxy_buffering off;
proxy_buffer_size 8k;

#后端错误重定向
proxy_intercept_errors on;
error_page 400 = "yourDomain";
if ($http_host = "yourDomain" ) {
proxy_pass http://127.0.0.1:端口; // 设置 v2ray 监听的地址
}
}
}

客户端推荐使用 v2rayN, 这是一款 window 界面的产品,配置很简单。

补充

  • v2rayN 这款客户端无法代理 go get,原因不详,wireshark 无法抓到包,本身的 shadowsocks 客户端正常
  • 添加 shadowsocks 服务
1
2
3
4
5
6
7
8
9
10
11
"inboundDetour": [
{
"protocol": "shadowsocks",
"port": 10086, // 自行设置
"settings": {
"method": "aes-256-cfb", // 和客户端设置的加密方式一样,自行设置
"password": "****", // 密码设置
"udp": false
}
}
],

最后

以上便是安装的全部过程,可能过程有疏漏,也可能你在配置的过程中最后访问不了,问题有很多,可能是版本,也可能是环境问题。遇到问题请自行 google。
还有千万不要 粘贴复制 粘贴复制 粘贴复制