经过2年的试用, 可以获得比较稳定的科学上网体验.
总的思路其实很简单, 就是把代理服务器隐藏在域名后面, 客户端访问代理服务器通过 https 域名, 和访问一个网站并无二致.
安装 v2ray
fhs-install-v2ray
配置 v2ray
默认配置路径: /usr/local/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
|
{
"inbounds": [
{
"port": 12345,
"listen": "127.0.0.1",
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "guid",
"alterId": 0
}
]
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/ray" // 路径需要和 web server 中的一致
}
}
}
],
"outbounds": [
{
"protocol": "freedom",
"settings": {}
}
]
}
|
该配置可以让 v2ray 监听本地 12345 端口, 然后需要 nginx 反向代理将 https 请求转发给 12345 端口.
这里 alterId
被设置为 0, 如果能够保证服务端和客户端时间同步, 也是可以设置成其他值的.
最后, 启动 v2ray, 这部分的工作就完成了.
1
2
3
4
5
6
|
# start
sudo systemctl start v2ray
# enable auto start upon startup
sudo systemctl enable v2ray
# debug
sudo netstat -anp | grep v2ray
|
申请合法域名 + SSL证书
申请域名
申请一个域名, 添加一个 A Record 指向部署的 VPS 的 IP 地址. (我用了 Namecheap 购买域名, 添加 A Record 为 @ 即可), 同时可以使用 dnschecker 检查 A record 是否生效.
注意: 如果发现遭到运营商的 DNS 污染, 请使用第三方 DNS, 比如阿里云 DNS.
申请证书
1
2
3
4
5
6
7
8
9
10
11
12
|
# 安装 acme.sh
sudo apt install -y openssl cron socat curl
curl https://get.acme.sh | sh
# 注册邮箱
sudo ~/.acme.sh/acme.sh --register-account -m my_email --force
# 申请证书
sudo ~/.acme.sh/acme.sh --issue -d your.domain --standalone -k ec-256 --force
# 安装证书和密钥到 v2ray 目录下
sudo ~/.acme.sh/acme.sh --installcert -d your.domain --fullchainpath /etc/v2ray/v2ray.crt --keypath /etc/v2ray/v2ray.key --ecc --force
|
注意事项: 由于 acme 申请或更新证书需要访问 80 端口
- 虚拟机需要开放 80 端口的访问权限.
- nginx 默认 http 服务会占用 80 端口, 需要在
/etc/nginx/sites-enabled/default
下修改默认端口为其他端口
- 重启 nginx 服务:
sudo systemctl reload nginx
, sudo systemctl restart nginx
- 如果同一个域名更换了虚拟机 ip 地址, 需要先刷新虚拟机的 dns 缓存, 不然证书下载时会出问题. 刷新方法:
sudo resolvectl flush-caches
更新证书
由于每过三个月证书会自动失效, 所以需要及时更新
1
2
3
4
5
6
|
# 更新证书
sudo ~/.acme.sh/acme.sh --renew -d your.domain --ecc --force
# 安装证书到 v2ray 目录下
sudo ~/.acme.sh/acme.sh --installcert -d your.domain --fullchainpath /etc/v2ray/v2ray.crt --keypath /etc/v2ray/v2ray.key --ecc --force
# 检查证书到期时间
openssl x509 -in /path/to/your.crt -noout -enddate
|
完成后可以通过 SSL Server Test 来检查证书
最后, 注册 crontab 来自动更新:
1
2
3
4
|
# 注册 crontab 自动更新
sudo ~/.acme.sh/acme.sh --cron --force
# 检查 crontab
crontab -l
|
也可以手动更新:
1
|
sudo ~/.acme.sh/acme.sh --renew -d your.domain --force
|
配置 nginx web server
在 /etc/nginx/conf.d
目录下创建一个文件 Default.conf
作为默认配置.
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
|
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/v2ray/v2ray.crt;
ssl_certificate_key /etc/v2ray/v2ray.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
server_name your.domain;
location /ray { # 与 V2Ray 配置中的 path 保持一致
if ($http_upgrade != "websocket") { # WebSocket协商失败时返回404
return 404;
}
proxy_redirect off;
proxy_pass http://127.0.0.1:12345; # 反向代理转发给 localhost: 12345 端口
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
# Show real IP in v2ray access.log
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
|
启动 nginx
1
|
sudo systemctl start nginx
|
配置本地客户端
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
|
{
"inbounds": [
{
"port": 1080,
"protocol": "socks",
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
},
"settings": {
"auth": "noauth",
"udp": false,
"ip": "127.0.0.1"
}
}
],
"outbounds": [
{
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "your.domain",
"port": 443,
"users": [
{
"id": "guid",
"alterId": 0
}
]
}
]
},
"streamSettings": {
"network": "ws",
"security": "tls",
"wsSettings": {
"path": "/ray"
},
"tlsSettings": {
"serverName": "",
"allowInsecure": false
}
}
}
]
}
|
直接配置 outbounds 发送给你注册好的域名即可, 本地就和其他方法一样暴露 socks5 1080 端口给其他应用, 例如 chrome.
ClashX 客户端
不过 ClashX 删库跑路了, 目前还没找到替代品, 凑合用呗.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
- name: "v2ray-tls-ws"
type: vmess
server: your.domain
port: 443
uuid: guid
alterId: 0
cipher: auto
# udp: true
tls: true
# skip-cert-verify: true
# servername: example.com # priority over wss host
network: ws
ws-opts:
path: /ray
headers:
Host: your.domain
# max-early-data: 2048
# early-data-header-name: Sec-WebSocket-Protocol
|
Ref
- V2Ray进阶指南:WSS组合配置(WebSocket + TLS + Nginx + CDN)
- https://toutyrater.github.io/advanced/tls.html
- V2Ray高级技巧:流量伪装
- 使用TLS+WS方式的V2Ray简单搭建说明:一个目前较为稳定的科学上网方式