GOST是一個基于GO語言實(shí)現(xiàn)的多功能安全隧道工具,支持多端口監(jiān)聽、多級轉(zhuǎn)發(fā)鏈、多協(xié)議支持、TCP/UDP端口轉(zhuǎn)發(fā)、反向代理、透明代理、DNS解析與代理、TUN/TAP設(shè)備、負(fù)載均衡、路由控制、限速限流、準(zhǔn)入控制、插件系統(tǒng)、監(jiān)控指標(biāo)、動態(tài)配置、Web API和GUI/WebUI等功能。
特點(diǎn)
GOST是一個由GO語言編寫的安全隧道軟件,具備以下特性:
- 支持多端口監(jiān)聽和多級轉(zhuǎn)發(fā)鏈。
- 支持TCP/UDP端口轉(zhuǎn)發(fā),可以實(shí)現(xiàn)正向代理和反向代理。
- 實(shí)現(xiàn)了負(fù)載均衡和路由控制。
- 擁有一個插件系統(tǒng),方便擴(kuò)展。
- 提供了監(jiān)控指標(biāo),便于管理和調(diào)優(yōu)。
GOST作為隧道有三種主要使用方式。
正向代理
作為代理服務(wù)訪問網(wǎng)絡(luò),可以組合使用多種協(xié)議組成轉(zhuǎn)發(fā)鏈進(jìn)行轉(zhuǎn)發(fā)。
Proxy
端口轉(zhuǎn)發(fā)
將一個服務(wù)的端口映射到另外一個服務(wù)的端口,同樣可以組合使用多種協(xié)議組成轉(zhuǎn)發(fā)鏈進(jìn)行轉(zhuǎn)發(fā)。
Forward
反向代理
利用隧道和內(nèi)網(wǎng)穿透將內(nèi)網(wǎng)服務(wù)暴露到公網(wǎng)訪問。
Reverse Proxy
下載安裝
二進(jìn)制文件
https://github.com/go-gost/gost/releases
源碼編譯
git clone https://github.com/go-gost/gost.git
cd gost/cmd/gost
go build
Docker
docker run --rm gogost/gost -V
還有GUI支持。
實(shí)用功能
用戶級別的流量統(tǒng)計(jì)和動態(tài)限流方案
GOST 提供了一種用戶級別的流量統(tǒng)計(jì)和動態(tài)限流的解決方案,通過觀測器組件對服務(wù)的連接和流量進(jìn)行周期性統(tǒng)計(jì),同時通過限制器組件來限制服務(wù)的連接和流量。針對不同的認(rèn)證處理器,可以結(jié)合認(rèn)證器、觀測器和流量限制器來實(shí)現(xiàn)靈活的用戶級別動態(tài)限流。
Limiter
services:
- name: service-0
addr: :8080
handler:
type: http
auther: auther-0
observer: observer-0
limiter: limiter-0
listener:
type: tcp
authers:
- name: auther-0
plugin:
type: http
addr: http://localhost:8000/auther
observers:
- name: observer-0
plugin:
type: http
addr: http://localhost:8001/observer
limiters:
- name: limiter-0
plugin:
type: http
addr: http://localhost:8002/limiter
利用反向代理隧道實(shí)現(xiàn)k8s中服務(wù)的本地調(diào)試
Kubernetes等云原生技術(shù)使服務(wù)部署和管理更加靈活和便利,然而當(dāng)一個應(yīng)用運(yùn)行在Kubernetes集群中時,需要對其進(jìn)行調(diào)試則會很麻煩。目前比較主流的解決方案是使用Telepresence等工具,將服務(wù)的流量攔截并轉(zhuǎn)發(fā)到本地服務(wù),從而實(shí)現(xiàn)本地環(huán)境下的開發(fā)和調(diào)試。
通過gost的反向代理隧道將進(jìn)入反向代理的流量通過隧道轉(zhuǎn)發(fā)到對端。具體的方案實(shí)施就是是在Nginx服務(wù)的前面運(yùn)行一個反向代理隧道服務(wù)接管原本發(fā)給Nginx服務(wù)的所有流量,Nginx服務(wù)所在的Pod中通過Sidecar方式運(yùn)行反向代理隧道客戶端,通過隧道連接到反向代理隧道服務(wù)。默認(rèn)情況下所有流量會通過此隧道轉(zhuǎn)發(fā)給集群中的Nginx服務(wù)。
?Traffic Split
配置如下:
apiVersion: v1
kind: Service
metadata:
name: proxy
spec:
selector:
app: proxy
ports:
- name: tunnel
protocol: TCP
port: 8421
targetPort: tunnel
- name: entrypoint
protocol: TCP
port: 80
targetPort: entrypoint
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: proxy
spec:
replicas: 1
selector:
matchLabels:
app: proxy
template:
metadata:
name: proxy
labels:
app: proxy
spec:
restartPolicy: Always
containers:
- name: gost
image: gogost/gost
args:
- "-L"
- "tunnel+ws://:8421?entrypoint=:80&tunnel=nginx.local:10bc451e-59dc-4c70-999e-91a30813ac78&path=/proxy"
ports:
- name: tunnel
containerPort: 8421
protocol: TCP
- name: entrypoint
containerPort: 80
protocol: TCP
resources:
limits:
cpu: 1000m
memory: 1000Mi
requests:
cpu: 10m
memory: 10Mi
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
minReadySeconds: 10
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
restartPolicy: Always
containers:
- name: gost
image: gogost/gost
args:
- "-L"
- "rtcp://:0/:80"
- "-F"
- "tunnel+ws://proxy:8421?tunnel.id=10bc451e-59dc-4c70-999e-91a30813ac78&tunnel.weight=1&path=/proxy"
resources:
limits:
cpu: 1000m
memory: 1000Mi
requests:
cpu: 10m
memory: 10Mi
- name: nginx
image: nginx:alpine
resources:
limits:
cpu: 1000m
memory: 1000Mi
requests:
cpu: 10m
memory: 10Mi
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
minReadySeconds: 10
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx
spec:
rules:
- host: nginx.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: proxy
port:
name: entrypoint
- path: /proxy
pathType: Prefix
backend:
service:
name: proxy
port:
name: tunnel
反向代理隧道支持高可用性,可以通過權(quán)重參數(shù)weight
來控制流量分流,實(shí)現(xiàn)對流量的精細(xì)管理。通過配置 Deployment 和 Ingress 資源,可以將流量通過 Websocket 協(xié)議分流到本地的 Nginx 服務(wù)。此方法與 Telepresence 相比,具有簡單、侵入性低、動態(tài)無縫流量切換和對本地系統(tǒng)無限制等優(yōu)點(diǎn)。
挺有意思的小工具,你也可以試試。
項(xiàng)目地址: https://github.com/go-gost/gost
閱讀原文:原文鏈接
該文章在 2025/3/12 11:18:23 編輯過