V2Ray 的 WebSocket 配置

V2Ray 的 WebSocket 配置

之前有报道称 Shadowsocks 协议已经被特征化识别且防火墙即将开始主动嗅探,并且拿了一份大学论文做证据:

Shadowsocks Sniffing.pdf

反正我是不信的,特别是我看到里面说“客户端和服务端使用 SOCKS5 协议连接”时,我更加清楚这是一篇造假或充数的论文(若维护长城防火墙的都是这种人的话我甚至觉得 Shadowosocks 可以至少再续两年命)

很快又有人申请了一个所谓可以嗅探 Shadowsocks 的专利:

一种针对特定网站类别的网页指纹识别方法

由于不清楚详细信息,这个检测方式我不好评论,但我仍然不认为 Shadowsocks 会在它主攻的 Shadowy 方面被人找出什么漏洞。

但事实证明我错了:2018年一月的某天,我的 Shadowosocks 突然变得奇慢无比,后来根本无法连接。在另一端口重新配置后可以重新连接,却很快又会莫名死掉,换成原端口仍无法连接,而每个新端口仅可勉强续命十几分钟。

(P.S. 尝试过使用 http-simple 混淆,加密一直使用 AES-128-GCM)

我立刻明白——被封端口了。

不管如何解释,但无法改变的事实是, Shadowsocks 协议好像真的被分析出特征了。

曾想过使用 ShadowsocksR 来代替,但是出于由 clowwindy 与 Breakwa11 的争吵产生的对 ShadowsocksR 的反感(我认为遵守 GPL 等协议是开源社区开发者最基本的素质),后来还是放弃了。

所以我需要一种新的代理工具和协议。

于是我发现了 V2Ray,一个模块化的代理软件包,它的目标是提供常用的代理软件模块,简化网络代理软件的开发。

伪装思路

通过 Nginx 监听 443 端口,将 V2Ray 的请求转发到内网的服务端,而普通请求则返回一个网页,从而将服务器伪装成一个网页服务器。由 WebSocket 技术实现。

安装步骤

首先你需要一个已经解析到你的服务器的域名,设置一个二级域名用作代理。

由于 V2Ray 正常工作需要服务端与客户端的时间一致,所以需要使用 NTPdate 进行时间校正。(具体原因参见《Effective V2Ray》

安装 NTPdate:

RedHat 系:

yum install ntpdate -y

Debian 系:

apt-get update && apt-get install ntpdate -y

进行时间校正:

systemctl stop ntp &>/dev/null
ntpdate time.nist.gov

安装依赖:

RedHat 系:

yum -y install wget curl lsof crontabs net-tools bc unzip socat nc nginx

Debian 系:

apt-get -y install wget curl lsof cron net-tools bc unzip socat netcat nginx

为了后期进行长期的维护,这里推荐使用官方安装脚本而非后文的直接下载:

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

下载 V2Ray-Core:

32位:

https://github.com/v2ray/v2ray-core/releases/download/v3.14/v2ray-linux-32.zip && unzip ./v2ray-linux-32.zip

64位:

https://github.com/v2ray/v2ray-core/releases/download/v3.14/v2ray-linux-64.zip && unzip ./v2ray-linux-64.zip

把 V2Ray 移动到 /etc/v2ray/

生成证书:

curl https://get.acme.sh | sh
~/.acme.sh/acme.sh --issue -d 你的域名 --standalone -k ec-256 --force
~/.acme.sh/acme.sh --installcert -d 你的域名 --fullchainpath /etc/v2ray/v2ray.crt --keypath /etc/v2ray/v2ray.key --ecc

写入配置文件到 /etc/v2ray/config.json:

{
"inbound": {
"port": 10000,
"listen":"127.0.0.1",
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "随机生成一个UUID填入",
"alterId": 64
}
]
},
"streamSettings":{
"network":"ws",
"wsSettings": {
"path": "/Proxy/"
}
}
},
"outbound": {
"protocol": "freedom",
"settings": {}
}
}

写入 Nginx 配置到 /etc/nginx/conf.d/v2ray.conf:

server {
if ( $request_uri !~ /Proxy/ ) {
rewrite ^/(.*)$ https://你的一级域名/$1 permanent;
}
listen 443 ssl;
ssl on;
ssl_certificate /etc/v2ray/v2ray.crt;
ssl_certificate_key /etc/v2ray/v2ray.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
server_name 你的完整二级域名;
location /Proxy/ {
proxy_redirect off;
proxy_pass http://127.0.0.1:10000;
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host \$http_host;
}
}

写入默认 Nginx 配置到 /etc/nginx/conf.d/default.conf:

server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;

location / {
root /usr/share/nginx/html;
index index.html index.htm;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

在 /usr/share/nginx/html 制作一个伪装页面。

重启 Nginx 并启动 V2Ray:

/usr/nginx/sbin/nginx -s reload
nohup /etc/v2ray/v2ray -config /etc/v2ray/config.json > /dev/null 2>&1 &

使用客户端连接即可,大功告成!

客户端配置:

地址:你的完整二级域名
端口:443
用户ID:生成的 UUID
AlterID:64
加密方式:随意(手机推荐 chacha20-ietf,电脑推荐 AES-128-GCM)
传输协议:WebSocket
伪装类型:无需伪装
伪装域名:/Proxy/
底层安全:TLS

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×

keyboard_arrow_up 回到顶端