用v2ray的WebSocket 拯救被墙IP (以及防止被墙)
去年农历年尾一直折腾到近来才算是终于解决了所有遇到的问题,也灵机一动地把伪装的流量反代到一个神秘而不奇怪的地方,稍作一下记录来充实一下这个博客。
基本原理:
把V2ray的流量伪装成正常的流量,并用TLS证书加密,用以瞒天过海。
本操作用本人自制的V2ray docker 镜像(ubuntu + 官方安装脚本)来运行V2ray 实例,然后用Nginx反代把流量转发给V2ray。
对于流量的判断,以及TLS都布署在Nginx上,V2ray本身无须布署,保持清爽而简洁的官方设置,方便日后管理。
去年农历年尾一直折腾到近来才算是终于解决了所有遇到的问题,也灵机一动地把伪装的流量反代到一个神秘而不奇怪的地方,稍作一下记录来充实一下这个博客。
基本原理:
把V2ray的流量伪装成正常的流量,并用TLS证书加密,用以瞒天过海。
本操作用本人自制的V2ray docker 镜像(ubuntu + 官方安装脚本)来运行V2ray 实例,然后用Nginx反代把流量转发给V2ray。
对于流量的判断,以及TLS都布署在Nginx上,V2ray本身无须布署,保持清爽而简洁的官方设置,方便日后管理。
1,镜像制作(略)
2,运行镜像并挂载配置文件到容器中。命令如下:
docker run -d \
--name v2ray \
-v /root/dk/v2ray:/etc/v2ray \ # 挂载本地目录,内含服务器配置文件。
--network=webnet \
-p 21000:21000 \ 用于调戏V2ray的端口映射,可有可无。
--restart=always \
cowade/v2ray
配置文件从以下网址生成:v2.ziyls.com
参照指示生成ID,端口等等,无须配置TLS等,模式选WS。
3,域名与证书申请(略),并把DNS服务器改为cloudflare的,方便启用它的CDN拯救被墙的IP。SSL/TLS模式选full.
4,Nginx反代:
用的还是自制的docker LNMP镜像,在nginx的设置文件中添加文件(v2ray.conf)并加入以下内容:
server {
listen 80;
server_name ab.cd.ef; #申请好的域名
rewrite ^ https://$http_host$request_uri? permanent; 强制转到https以启用TLS。
} #以上可有可无。
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate 。。。。/fullchain.cer; ##第3步得来的证书地址
ssl_certificate_key 。。/xxx.key; #第3步得来的密钥地址
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2;
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 ab.cd.ef; #申请好的域名
location / {
if ($http_upgrade != "websocket") {
return 404;
proxy_pass http://shenmi.place.com; #转发到一个神秘的地方
} #关键之举
proxy_redirect off;
proxy_pass http://v2ray:21000; #流量经过判断后转发给v2ray实现小梯子功能。
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;
}
}
5,若是IP被墙,还要在cloudflare上把相关域名的CDN打开,在速度会受影响,但至少活过来了。
6,客户端配置(V2rayN):地址填域名,端口填443,用户ID和额外ID用上面第2 步生成的配置文件中的内容。
加密方式auto,传输协议ws,底层安全传输tls,后面选True。
以上设置后基本可以救活被墙IP,并且后续并墙的可能性无限接近于0. 当然以上这句话是基于现在的墙而言。
1,镜像制作(略)
2,运行镜像并挂载配置文件到容器中。命令如下:
docker run -d \
--name v2ray \
-v /root/dk/v2ray:/etc/v2ray \ # 挂载本地目录,内含服务器配置文件。
--network=webnet \
-p 21000:21000 \ 用于调戏V2ray的端口映射,可有可无。
--restart=always \
cowade/v2ray
配置文件从以下网址生成:v2.ziyls.com
参照指示生成ID,端口等等,无须配置TLS等,模式选WS。
3,域名与证书申请(略),并把DNS服务器改为cloudflare的,方便启用它的CDN拯救被墙的IP。SSL/TLS模式选full.
4,Nginx反代:
用的还是自制的docker LNMP镜像,在nginx的设置文件中添加文件(v2ray.conf)并加入以下内容:
server {
listen 80;
server_name ab.cd.ef; #申请好的域名
rewrite ^ https://$http_host$request_uri? permanent; 强制转到https以启用TLS。
} #以上可有可无。
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate 。。。。/fullchain.cer; ##第3步得来的证书地址
ssl_certificate_key 。。/xxx.key; #第3步得来的密钥地址
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2;
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 ab.cd.ef; #申请好的域名
location / {
if ($http_upgrade != "websocket") {
return 404;
proxy_pass http://shenmi.place.com; #转发到一个神秘的地方
} #关键之举
proxy_redirect off;
proxy_pass http://v2ray:21000; #流量经过判断后转发给v2ray实现小梯子功能。
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;
}
}
5,若是IP被墙,还要在cloudflare上把相关域名的CDN打开,在速度会受影响,但至少活过来了。
6,客户端配置(V2rayN):地址填域名,端口填443,用户ID和额外ID用上面第2 步生成的配置文件中的内容。
加密方式auto,传输协议ws,底层安全传输tls,后面选True。
以上设置后基本可以救活被墙IP,并且后续并墙的可能性无限接近于0. 当然以上这句话是基于现在的墙而言。
发表评论: