GOST:内网穿透、端口转发、多级代理一站搞定!
|
admin
2025年3月11日 19:20
本文热度 126
|
GOST是一个基于GO语言实现的多功能安全隧道工具,支持多端口监听、多级转发链、多协议支持、TCP/UDP端口转发、反向代理、透明代理、DNS解析与代理、TUN/TAP设备、负载均衡、路由控制、限速限流、准入控制、插件系统、监控指标、动态配置、Web API和GUI/WebUI等功能。
特点
GOST是一个由GO语言编写的安全隧道软件,具备以下特性:
- 支持TCP/UDP端口转发,可以实现正向代理和反向代理。
GOST作为隧道有三种主要使用方式。
正向代理
作为代理服务访问网络,可以组合使用多种协议组成转发链进行转发。
Proxy
端口转发
将一个服务的端口映射到另外一个服务的端口,同样可以组合使用多种协议组成转发链进行转发。
Forward
反向代理
利用隧道和内网穿透将内网服务暴露到公网访问。
Reverse Proxy
下载安装
二进制文件
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支持。
实用功能
用户级别的流量统计和动态限流方案
GOST 提供了一种用户级别的流量统计和动态限流的解决方案,通过观测器组件对服务的连接和流量进行周期性统计,同时通过限制器组件来限制服务的连接和流量。针对不同的认证处理器,可以结合认证器、观测器和流量限制器来实现灵活的用户级别动态限流。
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
利用反向代理隧道实现k8s中服务的本地调试
Kubernetes等云原生技术使服务部署和管理更加灵活和便利,然而当一个应用运行在Kubernetes集群中时,需要对其进行调试则会很麻烦。目前比较主流的解决方案是使用Telepresence等工具,将服务的流量拦截并转发到本地服务,从而实现本地环境下的开发和调试。
通过gost的反向代理隧道将进入反向代理的流量通过隧道转发到对端。具体的方案实施就是是在Nginx服务的前面运行一个反向代理隧道服务接管原本发给Nginx服务的所有流量,Nginx服务所在的Pod中通过Sidecar方式运行反向代理隧道客户端,通过隧道连接到反向代理隧道服务。默认情况下所有流量会通过此隧道转发给集群中的Nginx服务。
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
反向代理隧道支持高可用性,可以通过权重参数weight
来控制流量分流,实现对流量的精细管理。通过配置 Deployment 和 Ingress 资源,可以将流量通过 Websocket 协议分流到本地的 Nginx 服务。此方法与 Telepresence 相比,具有简单、侵入性低、动态无缝流量切换和对本地系统无限制等优点。
挺有意思的小工具,你也可以试试。
项目地址: https://github.com/go-gost/gost
阅读原文:原文链接
该文章在 2025/3/12 11:18:23 编辑过