天天看點

Reverst:基于QUIC協定和HTTP3的反向隧道工具

作者:FreeBuf

關于Reverst

Reverst是一款功能強大的反向隧道工具,Reverst由一個具備負載均衡功能的反向隧道伺服器和一個伺服器-用戶端庫組成,該工具使用Go語言開發,基于QUIC和HTTP/3實作其功能。

Reverst:基于QUIC協定和HTTP3的反向隧道工具

關于QUIC和HTTP/3

QUIC,即快速UDP網際網路連接配接協定。QUIC(Quick UDP Internet Connections)是由 Google 從2013年開始研究的基于UDP的可靠傳輸協定,它最早的原型是SPDY + QUIC-Crypto + Reliable UDP,後來經曆了SPDY轉型為2015年5月IETF 正式釋出的HTTP/2.0。考慮到HTTP/2.0和TLS/1.3的釋出,它的核心協定族逐漸進化為現在的HTTP/3.0 + TLS/1.3 + QUIC-Transport的組合。

而HTTP3則是在保持QUIC穩定性的同時使用UDP來實作高速度(選擇QUIC就是選擇UDP), 同時又不會犧牲TLS的安全性。HTTP/3的傳輸層不是TCP,而是UDP+QUIC。

工具特性

目前版本的Reverst具備以下特性:

1、Go語言驅動:基于純Go語言開發,使用了庫;

2、相容性;client包(Go)基于net/http标準庫抽象實作;

3、負載均衡:可以在同一個隧道運作多個服務執行個體;

4、高性能:基于QUIC和HTTP/3實作其功能;

使用場景

Reverst主要用于将受限網絡中的服務(例如受NAT網關保護的服務)公開并暴露到外網上。隧道檔案需要部署在外網上,然後用戶端伺服器與隧道建立通信,并在目标隧道組中進行注冊。隧道組是一組負載平衡的用戶端伺服器,通過反向隧道HTTP接口暴露在外網中。

下圖所示為隧道生命周期:

Reverst:基于QUIC協定和HTTP3的反向隧道工具

工具安裝

用戶端

用戶端安裝指令:

go get go.flipt.io/reverst/client           

代碼建構:

go install ./client/...           

伺服器端

代碼建構:

go install ./cmd/...           

測試

Reverst使用Dagger來配置并運作一個內建測試套件:

dagger call test --source=.           

測試套件會配置一個隧道,并在隧道中注冊一個伺服器-用戶端,并通過隧道HTTP接口請求服務。

工具運作

下列參數是隧道伺服器運作時的參數執行個體:

1、QUCI隧道監聽127.0.0.1:7171;

2、HTTP服務監聽127.0.0.1:8181;

3、日志記錄設定為debug級别;

配置指令如下:

go run ./cmd/reverst/... -l debug \

    -n flipt.dev.local \

    -g examples/simple/group.yml \

    -k examples/simple/server.key \

-c examples/simple/server.crt           

下列指令可以運作樣例伺服器:

go run ./examples/simple/main.go --username user --password pass           

下列指令可以向服務發送請求:

curl -H 'Host: flipt.dev.local' 127.0.0.1:8181/fo           

工具使用和配置

指令行參數選項與環境變量

reverst -h

COMMAND

  reverst

 

USAGE

  reverst [FLAGS]

 

FLAGS

  -l, --log LEVEL                      debug、info、warn或error (預設: INFO)

  -a, --tunnel-address STRING       接收隧道QUIC連接配接的位址 (預設: 127.0.0.1:7171)

  -s, --http-address STRING           處理HTTP請求的位址 (預設: 0.0.0.0:8181)

  -n, --server-name STRING           通過TLS識别隧道的伺服器名稱 (必須)

  -k, --private-key-path STRING      path to TLS private key PEM file (必須)

  -c, --certificate-path STRING      TLS證書PEM檔案路徑 (必須)

  -g, --tunnel-groups STRING       k8s配置映射辨別符或檔案路徑 (預設: groups.yml)

  -w, --watch-groups                  監控隧道組源以擷取更新

      --management-address STRING    管理API的HTTP位址

      --max-idle-timeout DURATION    連接配接可以空閑的最長時間 (預設: 1ms)

      --keep-alive-period DURATION   keep-alive事件間隔時間(預設: 30s)           

隧道組配置

reverst -g path/to/configuration.yml

// alternatively:

reverst -g file:///path/to/configuration.yml           

或:

reverst -g k8s://configmap/default/tunnelconfig/groups.yml           

配置多個身份驗證政策

groups:

  "group-name":

    hosts:

    - "some.host.address.dev" # Host for routing inbound HTTP requests to tunnel group

    authentication:

      basic:

        username: "user"

        password: "pass"

      bearer:

        token: "some-token"

      external:

        scheme: "JWT"

        endpoint: "http://some-external-endpoint/auth/ext"           

許可證協定

本項目的開發與釋出遵循開源許可協定。

項目位址

Reverst:https://github.com/flipt-io/reverst/

參考資料

https://github.com/quic-go/quic-go

繼續閱讀