前文 "V2Ray 教程" 介绍了 V2Ray 的基本用法, 本文介绍 V2Ray 的高级使用技巧: 流量伪装.
为何需要流量伪装
从设立墙以来, 我国的网络封锁技术一直是全球领先的. 加上方校长等人持续做贡献, 封锁和干扰技术在不断演化和进步. 传统的 VPN,SSH 隧道等方式渐渐被墙识别和干扰, 访问境外网站越来越难, 倒逼网民不断推动穿墙技术的发展.
科学上网这些年来, 见证了诸多技术的兴起和消沉, 自架服务器被绊者更是数不胜数. 经历过谈笑风生的岁月, 才知闷声发大财是人生真理. 翻墙技术同样如此, 一是不要高调和张扬, 否则大概率被打击; 其次流量尽量与常用流量接近, 不要特立独行. 伪装正是将穿墙流量用常见的 https/tls 等方式包装, 降低 VPS 被 block 的几率.
前提条件
本文假设读者已经具备以下条件:
一台境外的 VPS, 购买可参考: 一些 VPS 商家整理;
一个域名, 无备案要求(备案了流量来往更顺畅, 但意味着万一有事, 被喝茶更容易了);
为域名申请一个证书, 可以用免费的 Let's Encrypt 证书, 参考: 使用 Let's Encrypt 的免费证书 https://tlanyan.me/use-lets-encrypt-certificate/
有基本 Linux 技巧, 能使用 VIM/nano 等编辑器.
理论上来说, 证书不是必须的. 但没有 tls 加持的流量, 墙一眼就能看出想干什么. 这也是为什么不建议在 tcp 基础上伪装 http 流量的原因. 需要注意的是本文中采用合法机构签发的证书对流量进行加密, 不是对流量做特征混淆得到的 tls 流量.
关于伪装技术的选择, websocket+tls+Web 和 http2+tls+Web 常用来做对比. 理论上 http2 省去了 upgrade 的请求, 性能更好. 但实际使用中两者没有明显区别, 加之某些 Web 服务器不支持 http2 反向代理(例如 nginx), 故而 ws 的方式比较流行和普遍. 如果你要上 http2, 记得 Web 服务器用 caddy 等, 不能用 nginx.
接下来介绍流量伪装的配置步骤. 以域名 tlanyan.me 为例, 采用 Linux+nginx+websocket+tls+Web 组合, 搭建的最终效果是: http/https 方式打开域名, 显示正常的网页; V2Ray 客户端请求特定的路径, 例如 /awesomepath , 能科学上网; 直接请求 https://tlanyan.me/awesomepath , 返回 "400 bad request". 总结起来就是: 搭建的网站 (域名) 看起来完全是一个人畜无害的正规网站, 只有用特定手段请求特定网址才是科学上网.
操作步骤
服务端涉及到了 nginx 和 v2ray, 分别介绍其配置.
1. 配置 dns
首先设置 dns 解析, 将域名解析到 VPS 的 ip, 例如 www.tlanyan.me 解析到 xxx.xxx.xx.xx.
2. 配置 nginx
如果你已有域名并正确配置了 ssl 证书, 可忽略这一步.
配置 nginx 让域名打开后是一个正常的网站, 其要点是:
将 http 全部重定向到 https, 全站加密;
配置域名使用 ssl 加密.
Linux 系统上 /etc/nginx/conf.d/ 目录下的 default.conf 文件是 nginx 默认的站点配置文件, 对其进行 https 配置:
- server {
- listen 80;
- server_name xxxxx; # 改成你的域名
- rewrite ^(.*) https://$server_name$1 permanent;
- }
- server {
- listen 443 ssl http2;
- server_name xxxxx;
- charset utf-8;
- # ssl 配置
- ssl_protocols TLSv1.2 TLSv1.3;
- ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
- ssl_ecdh_curve secp384r1;
- ssl_prefer_server_ciphers on;
- ssl_session_cache shared:SSL:10m;
- ssl_session_timeout 10m;
- ssl_session_tickets off;
- ssl_certificate xxxxx; # 改成你的证书地址
- ssl_certificate_key xxxx; # 改成证书密钥文件地址
- access_log /var/log/nginx/xxxx.access.log;
- error_log /var/log/nginx/xxx.error.log;
- root /usr/share/nginx/html;
- location / {
- index index.HTML;
- }
- }
改完后用 nginx -t 命令查看有无配置错误, 没问题的话 systemctl restart nginx 启动 nginx. 打开浏览器在地址栏输入域名, 应该能看到配置好的 https 网站.
如果你是一个新域名, 如何快速做一个网站? 最简单的办法是从网上下载一个网站模板, 上传 Web 服务器的根目录(默认是 /usr/share/nginx/HTML ). 这样不管有意还是无意访问网站, 都是一个非常正规的 https 网站.
3. 安装配置 V2Ray
详细过程可参考上篇: V2Ray 教程
到此为止, nginx 和 V2ray 应该都能各自独立正常工作. 如果有一个出现问题, 应该先解决再继续下面的操作.
4. 服务端配置 websocket
这节中我们将 nginx 和 v2ray 结合.
首先我们选择一个路径, 建议为二级或者较长的一级路径, 例如 /abc/def 或 /awesomepath .
接着配置 nginx 将这个路径的访问都转发到 v2ray. 在 /etc/nginx/conf.d/default.conf 的 server 段中增加以下转发配置:
- location /awesomepath { # 与 V2Ray 配置中的 path 保持一致
- proxy_redirect off;
- proxy_pass http://127.0.0.1:12345; # 假设 v2ray 的监听地址是 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: systemctl restart nginx .
配置 v2ray 接受 nginx 传来的数据. 在 "inbounds" 中新增 "streamSetting" 配置, 传输协议使用 "websocket". 配置好后 config.JSON 文件看起来是:
- {
- "log": {
- "loglevel": "warning",
- access":"/var/log/v2ray/access.log",
- error":"/var/log/v2ray/error.log"
- },
- "inbounds": [{
- "port": 12345,
- "protocol": "vmess",
- "settings": {
- "clients": [
- {
- "id": "xxxxx", # 可以使用 v2ctl uuid 生成
- "level": 1,
- "alterId": 64
- }
- ]
- },
- "streamSettings": { # 载体配置段, 设置为 websocket
- "network": "ws",
- "wsSettings": {
- "path": "/awesomepath" # 与 nginx 中的路径保持一致
- }
- },
- "listen": "127.0.0.1" # 出于安全考虑, 建议只接受本地链接
- }],
- "outbounds": [{
- "protocol": "freedom",
- "settings": {}
- },{
- "protocol": "blackhole",
- "settings": {},
- "tag": "blocked"
- }],
- "routing": {
- "rules": [
- {
- "type": "field",
- "ip": ["geoip:private"],
- "outboundTag": "blocked"
- }
- ]
- }
- }
注意: JSON 文件不支持注释, 上述配置中 "#" 号及后续内容都要删掉.
配置无误后, 重启 v2ray 服务: systemctl restart v2ray .
如何测试 nginx 与 v2ray 结合没有问题? 打开浏览器, 输入域名及其他路径, 应该显示正常网页或者页面不存在, 说明 nginx 在正常工作; 输入域名加 v2ray 路径, 例如 https://tlanyan.me/awesomepath , 应该出现 "Bad Request", 说明 nginx 将流量转发给了 v2ray, 并且 v2ray 收到了请求.
客户端设置
最后是配置客户端, 以 Windows 平台的 V2RayW 软件为例说明使用方法.
打开 V2RayW , 右键托盘图标, 点击 "配置". 在弹框中新建或修改已有的服务器, 输入服务器 ip, 端口写 443, 把用户 id, 额外 id 信息填上, 网络类型选择 "ws". 接着点 "传输设置", 找到 "websocket", 路径一栏输入 nginx 和 v2ray 中的路径, 例如 "/awesomepath";http 头部输入:
- {
- "Host":"你的域名, 例如 www.tlanyan.me"
- }
截图如下:
接着点击 "tls", 勾选 "启用传输层加密 tls", 在 "服务器域名" 的输入框中输入域名, 截图如下:
信息填写正确后, 点击 "保存". 打开浏览器访问 google.com,YouTube.com 等网站, 配置无误的话都应该能正常打开.
总结
https/tls 会加密路径信息, 仅靠中间环节捕捉到的流量包极难区分是正常请求还是夹带私货的流量. 这也显示了 v2ray 的强大之处: 通过配置不同的协议和载体, 就能随意控制流量的进出, 做各种定制操作. 从流量伪装, 反向代理的功能上看, v2ray 毫无疑问的是一个强大的网络框架 / 工具, 比 shadowsocks 更显优势.
比较让人遗憾的是 v2ray 的 iOS 客户端均收费, 各平台 V2ray 客户端下载 https://tlanyan.me/v2ray-clients-download .
参考
新 V2Ray 白话文指南 https://guide.v2fly.org/advanced/advanced.html
Use HTTP/2.0 between nginx reverse-proxy and backend webserver
来源: http://www.tuicool.com/articles/ZBNbeuv