關于Reverst
Reverst是一款功能強大的反向隧道工具,Reverst由一個具備負載均衡功能的反向隧道伺服器和一個伺服器-用戶端庫組成,該工具使用Go語言開發,基于QUIC和HTTP/3實作其功能。
關于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接口暴露在外網中。
下圖所示為隧道生命周期:
工具安裝
用戶端
用戶端安裝指令:
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