Blog

将 TCP 流量通过 WebSocket 传输至本机并还原

发布时间: ,大约 300 字 ,阅读时间:2 分钟,

前几天在接触 noVNC 的时候发现 WebSockify 可以将任意 TCP 流量转换成 WebSocket 的时候突发奇想,想试试 CloudFlare 免费版 WebSocket 的速度有多快(🌚)

安装

于是,参照 WebSockify 项目页 ,搞起。

服务端我用的是 Debian/Ubuntu,apt search websockify 发现居然有这个包,所以我直接 sudo apt install websockify -y 了,然后让我们来看看帮助:

$ websockify --help
Usage:
    websockify [options] [source_addr:]source_port [target_addr:target_port]
    websockify [options] [source_addr:]source_port -- WRAP_COMMAND_LINE

Options:
  -h, --help            show this help message and exit
  -v, --verbose         verbose messages
  --traffic             per frame traffic
  --record=FILE         record sessions to FILE.[session_number]
  -D, --daemon          become a daemon (background process)
  --run-once            handle a single WebSocket connection and exit
  --timeout=TIMEOUT     after TIMEOUT seconds exit when not connected
  --idle-timeout=IDLE_TIMEOUT
                        server exits after TIMEOUT seconds if there are no
                        active connections
  --cert=CERT           SSL certificate file
  --key=KEY             SSL key file (if separate from cert)
  --ssl-only            disallow non-encrypted client connections
  --ssl-target          connect to SSL target as SSL client
  --unix-target=FILE    connect to unix socket target
  --web=DIR             run webserver on same port. Serve files from DIR.
  --wrap-mode=MODE      action to take when the wrapped program exits or
                        daemonizes: exit (default), ignore, respawn
  -6, --prefer-ipv6     prefer IPv6 when resolving source_addr
  --target-config=FILE  Configuration file containing valid targets in the
                        form 'token: host:port' or, alternatively, a directory
                        containing configuration files of this form
  --libserver           use Python library SocketServer engine

服务端

虽说这么复杂,不过我们只想测个速所以 SSL 什么的都可以忽略,总结一下就是:

websockify 监听地址:监听端口 远程地址:远程端口

所以我用 websockify 127.0.0.1:12345 127.0.0.1:$SHADOWSOCKS_PORT 来启动它。因为服务器的 80 端口被 Nginx 占了,所以还得弄个反代,配置如下:

$ cat /etc/nginx/conf.d/websocket-ss-test.conf
server {
        listen 80;
        server_name domain.and.ip.hidden.example.org;

        location /asdfghjkl {
                proxy_pass http://127.0.0.1:12345;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }
}

这样,Nginx 反代的 WebSocket 服务就搭好了,然后让我们 Google 一下客户端该怎么配。

客户端

经过我努力 Google ,怎么也找不到 WebSockify 转换成本地端口的轮子(也可能是我姿势水平不过关),所以只好自己写一个了🌚

使用上也是很简单,大概就是

./websockify-client.py \
--remote-address ws://domain.and.ip.hidden.example.org/asdfghjkl \
--listen-address 127.0.0.1 \
--bind-port 10086

测速

然后把 SS 的地址和端口分别改去 127.0.0.1 和 10086,最后,激动人心的时刻到了:

Shadowsocks over WebSocket over CloudFlare

Shadowsocks over WebSocket over CloudFlare

速度感人,再让我们看看裸连的速度

Shadowsocks over WebSocket without CloudFlare

Shadowsocks over WebSocket without CloudFlare

速度明显比穿 CloudFlare 快,稍有常识的人都能看出, CloudFlare 免费版对 WebSocket 限速了


License

如未明确声明,所有文章皆以

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。如果您需要商用,您可以通过电子邮件( [email protected] )联系。