科学上网-v2ray-plugin协议混淆插件部署记录

声明:科学上网的目的是学习国外科学技术,不涉及任何违法活动

涉及工具

v2ray: 开源的网络代理工具,类似于shadowsocks工具,仅用于学习国外科学技术。
v2ray-plugin: 流量混淆插件,类似于simple-obfs工具,目的是避免代理流量特征被识别而拦截,提高隐匿性。

技术原理

原始的基于Websocket的数据传输,特征非常明显:有大量数据传递是在Websocket协议包里。
使用HTTP协议的数据传输:第一个包是HTTP协议包,后面的数据传递都是普通的TCP包。
流量混淆伪装成HTTP:Websocket协议只用来协商必要的内容同步信息,真实的数据传递都是用普通的TCP包(看起来像是http协议在传递数据)

抓包查看到websocket协议的协商过程

#----------------------------------REQUEST--------------------------------#
GET / HTTP/1.1
Host: bing.com
User-Agent: Go-http-client/1.1
Connection: Upgrade
Sec-WebSocket-Key: 9Hee2ejpy7tBnCcxXcGJNg==
Sec-WebSocket-Version: 13
Upgrade: websocket
#----------------------------------RESPONSE--------------------------------#
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: iQCxTMLlPjRMTJN36aAZ/IthOTE=
#----------------------------------REQUEST--------------------------------#
....Y...Y...X...Y...Y..q.$a.%..A."+Q....}...k...3...d
.....s.8....FE....u.b.....l..9..,...=..<(.I...%...z..~....]....g.......A...4.e.P..A...D.N..M6....0.2o...X.n.@'[email protected].@.#.,..K...L......+..r.I........N.\[email protected]+...{...
.......p...y.X.C-|.V..Th.4.Z@gM.
..vy7nr...9..$...!...R......e...7,...z<..oab.PEX^..`,...$.U...G#..8CY....=...R%.[..o......*yD.+..*.~|.ZqP..>V..'.J.\52v.qdo.r7a}_.\.5...=....y......EPX2..l-&./.`."[.4.
%....^.4.iy."=.G.a....I.8.......-.....DW>..8P.Q....%..B.........Nq......sDP..^.|#...
..za.E>.nT.....j.V.

部署架构

流量混淆流程图
在原有ss-local和ss-server之间,通过插件进行流量混淆,混淆的动作是在obfs-local和obfs-server之间代理的,对于使用方是无感知的。
通过抓包可以看到,obfs-local与obfs-server之间是先通过websocket形式

部署步骤

服务端

使用v2ray进行服务端部署,无需改变原有部署配置,对于ss-server端的透明的
配置文件如下:

{
  "inbounds": [
    {
      "port": 16823,
      "protocol": "vmess",
      "settings": {
        "clients": [
          {
            "id": "b831e82d-6324-4d53-ad4f-8ada48b60811",
            "alterId": 64
          }
        ]
      }
    },
     {
      "port": 9999,
      "protocol": "shadowsocks",
      "settings": {
        "method": "aes-128-gcm",
        "ota": true,
        "password": "xxxxx"
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "settings": {}
    }
  ]
}

使用v2ray-plugin最新的release版本进行服务端部署,命令行如下

/opt/v2ray-plugin_linux_amd64 -server -localAddr 10.0.0.1 -localPort 1985 -remotePort 16823

PS:
-server 服务端模式
-localAddr 绑定地址,使用网卡实际ip地址,内网服务器需要绑定内网ip而不是外网ip(公有云提供商的vps一般都是有内网机器和外网ip随机分配的)
-localPort 对外监听的端口,用于接收obfs-client的数据,因此需要在防火墙把开启这个端口
-remoteAddr 远程地址,默认127.0.0.1,这里想要的就是obfs-server出来的数据转到本机的ss-server
-remotePort 远程端口,这里想要的就是obfs-server出来的数据转到本机ss-server的vmess端口

客户端

它是直接与obfs-server连接进行通信,因此它的远程端口为代理服务器的obfs-server监听端口;它的数据请求来源于ss-client,因此需要在本机监听一个端口,让ss-client来链接通信。命令行如下

/opt/v2ray-plugin_linux_amd64 -localPort 1984 -remoteAddr 101.101.101.101 -remotePort 1985 -host bing.com

ps:
-localAddr 绑定地址,默认127.0.0.1,只接收本地ss-client的连接
-localPort 本地监听端口,用于接收obfs-client的数据
-remoteAddr 远程代理服务器地址
-remotePort 远程代理服务端口
-host 伪装的域名地址
ss-client的改造主要是outbound,从原本直接指向代理服务器修改为指向本机obfs-client,配置文件如下

{
    "log": {
        "loglevel": "warning"
    },
    "inbounds": [
        {
            "port": 1080,
            "listen": "xx.xx.xx.xx",
            "tag": "socks-inbound",
            "protocol": "socks",
            "settings": {
                "auth": "noauth"
            },
            "sniffing": {
                "enabled": true,
                "destOverride": [
                    "http",
                    "tls"
                ]
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "vmess",
            "settings": {
                "vnext": [
                    {
                        "address": "127.0.0.1",
                        "port": 1984,
                        "users": [
                            {
                                "id": "b831e82d-6324-4d53-ad4f-8ada48b60811",
                                "alterId": 64
                            }
                        ]
                    }
                ]
            },
            "tag": "direct"
        }
    ]
}

参考阅读

更多详细配置如https代理可参考科学上网2:shadowsocks+v2ray-plugin+TLS