当前位置: 欣欣网 > 码农

Rust语言实现基于 WebSocket 和 HTTP2 的流量隧道

2024-04-30码农

在当下的网络环境下,我们常常会遇到访问限制,比如防火墙或者代理限制了我们使用某些协议或访问互联网的某个部分。 wstunnel 是一个基于 WebSocket HTTP2 协议来转发流量的工具,其主要目的就是为了绕过这些限制,让用户自由的访问所需资源。

wstunnel 简介

wstunnel 是一个使用 WebSocket 协议穿透防火墙和代理的工具。它允许你隧道化任意流量,无论是 TCP、UDP 还是 Unix 套接字,并支持 HTTP2 作为传输协议(尽管 WebSocket 更为高效)。更为便利的是, wstunnel 提供了静态二进制文件,你可以轻易地将其复制到任何地方使用。

功能特性

  • 支持静态前向和反向隧道化(TCP, UDP, Unix 套接字)

  • 支持动态隧道化(TCP, UDP Socks5 代理和透明代理)

  • 支持 HTTP 代理服务器的使用

  • 支持使用 TLS/HTTPS,并且可以自动重载证书

  • 支持 IPv6

  • 支持 WebSocket 和 HTTP2 作为传输协议

  • 提供独立的二进制文件

  • 客户端与服务端命令行使用示例

    客户端命令

    # 使用 WebSocket 协议隧道化 TCP 或 UDP 流量
    wstunnel client --local-to-remote <隧道类型>://<本地绑定的 IP>:<本地端口>:<目标主机 IP>:<目标主机端口> <ws[s]|http[s]://wstunnel.server.com[:port]>

    举个具体的例子:

    wstunnel client -L tcp://1212:google.com:443 ws://wstunnel.example.com

    上述命令创建了一个本地 TCP 服务监听在 1212 端口,并将流量转发至 google.com:443

    服务端命令

    # 在服务端创建一个 WebSocket 服务
    wstunnel server <ws[s]://0.0.0.0[:port]>

    一个简单的服务端命令行案例:

    wstunnel server wss://0.0.0.0:8080

    这条命令在任何接口上的 8080 端口创建了一个 WebSocket 服务器监听。

    支持的隧道类型

  • tcp : 静态 TCP 隧道

  • udp : 静态 UDP 隧道

  • socks5 : SOCKS5 代理,可以动态隧道化

  • unix : Unix 套接字隧道

  • stdio : 用于 ssh -o ProxyCommand 的标准输入输出隧道

  • tproxy+tcp/udp : 透明代理

  • SSH 代理命令案例

    使用 wstunnel 作为 SSH 的代理命令:

    ssh -o ProxyCommand="wstunnel -L stdio://%h:%p ws://myRemoteHost:8080" my-server

    透明代理(仅限 Linux)

    sudo wstunnel -L 'tproxy+tcp://[::1]:1212' -L 'tproxy+udp://[::1]:1212' wss://my.server.com:443

    使用上述命令,你可以透明地代理任何程序的流量。

    其他信息

    如何构建

    如果你对如何从源码构建 wstunnel 感兴趣,可以安装 Rust 开发环境并编译源代码:

    curl https://sh.rustup.rs -sSf | sh
    cargo build --release

    理解命令行语法

    wstunnel 的命令行语法类似于 SSH 隧道,你可以参考 SSH 隧道的文档来获取更多帮助。

    加固 wstunnel 服务器安全的方法

    你可以通过启用自己的 TLS 证书、使用自定义的 HTTP 升级路径前缀、限制只接受带有这个前缀的升级请求等方式来保护你的 wstunnel 服务器。

    文章精选

    「Rust

    关注公众号并回复 「 wstunnel 」 立即获取项目地址