當前位置: 妍妍網 > 碼農

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 」 立即獲取計畫地址