Skip to content

Commit b39a754

Browse files
committed
docs: update readme
1 parent 99cfe09 commit b39a754

File tree

1 file changed

+111
-29
lines changed

1 file changed

+111
-29
lines changed

README.md

Lines changed: 111 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# tcp-reverse-proxy
2-
基于[Vert.x](https://vertx.io/)实现的HTTP反向代理与TCP反向代理、内网穿透
2+
基于[Vert.x](https://vertx.io/)实现的网络库。支持HTTP反向代理、TCP反向代理、TCP内网穿透、TCP单端口多路复用
33

44
开发环境
55

@@ -39,7 +39,45 @@
3939
</dependency>
4040
```
4141

42-
## 一、TCP反向代理
42+
## 一、HTTP反向代理
43+
44+
实现HTTP反向代理,代理路由优先级如下
45+
46+
1. `/local/*`↔️`http://127.0.0.1:888`
47+
* `http://127.0.0.1:8080/local/1`↔️`http://127.0.0.1:888/1`
48+
* `http://127.0.0.1:8080/local/1/2/3`↔️`http://127.0.0.1:888/1/2/3`
49+
2. `/*`↔️`https://reqres.in`
50+
* `http://127.0.0.1:8080/api/users?page=2`↔️`https://reqres.in/api/users?page=2`
51+
52+
HTTP反向代理支持如下配置
53+
54+
1. 请求头转发客户端IP: 默认值F
55+
2. 保留响应头Cookie: 默认值T
56+
3. 保留请求头Host: 默认值F
57+
4. 跟随跳转: 默认值T
58+
5. 长连接: 默认值T
59+
6. 日志及日志格式自定义
60+
7. 代理服务完全接管跨域控制: 默认值F
61+
62+
```java
63+
// addRoute第二个参数表示优先级,值越小、优先级越高
64+
ReverseHttpProxy.create(vertx).port(8080)
65+
.addRoute(new ProxyRoute()
66+
.setName("proxy")
67+
.setSourceUrl("/local/*")
68+
.setTargetUrl("http://127.0.0.1:888"),-1)
69+
.addRoute(new ProxyRoute()
70+
.setName("proxy")
71+
.setSourceUrl("/*")
72+
.setTargetUrl("https://reqres.in"),1)
73+
.start();
74+
```
75+
76+
77+
78+
79+
80+
## 二、TCP反向代理
4381

4482
实现TCP反向代理:`0.0.0.0:22`↔️`10.0.0.1:8080`
4583

@@ -49,7 +87,7 @@ ReverseTcpProxy.create(Vertx.vertx(), "10.0.0.1", 8080)
4987
.start();
5088
```
5189

52-
## 、TCP内网穿透
90+
## 、TCP内网穿透
5391

5492
虚线表示控制连接通信,实线表示非控制连接通信。
5593

@@ -123,40 +161,84 @@ ReverseTcpProxyTunnelClient.create(Vertx.vertx())
123161
.connect("192.168.0.200", 44444);
124162
```
125163

164+
## 四、TCPMux单端口多路复用
126165

166+
参考[RFC 1078 - TCP port service Multiplexer (TCPMUX)](https://datatracker.ietf.org/doc/html/rfc1078)
127167

128-
## 三、HTTP反向代理
168+
现有场景如下
129169

130-
实现HTTP反向代理,代理路由优先级如下
131170

132-
1. `/local/*`↔️`http://127.0.0.1:888`
133-
* `http://127.0.0.1:8080/local/1`↔️`http://127.0.0.1:888/1`
134-
* `http://127.0.0.1:8080/local/1/2/3`↔️`http://127.0.0.1:888/1/2/3`
135-
2. `/*`↔️`https://reqres.in`
136-
* `http://127.0.0.1:8080/api/users?page=2`↔️`https://reqres.in/api/users?page=2`
137171

138-
HTTP反向代理支持如下配置
172+
```mermaid
173+
flowchart LR
174+
subgraph Network-A
175+
TMC-1[<b>TCPMux Client-1</b><br>Listen :6666]
176+
TMC-2[<b>TCPMux Client-2</b><br>Listen :6667]
177+
TMC-3[<b>TCPMux Client-3</b><br>Listen :6668]
178+
end
139179
140-
1. 请求头转发客户端IP: 默认值F
141-
2. 保留响应头Cookie: 默认值T
142-
3. 保留请求头Host: 默认值F
143-
4. 跟随跳转: 默认值T
144-
5. 长连接: 默认值T
145-
6. 日志及日志格式自定义
146-
7. 代理服务完全接管跨域控制: 默认值F
180+
TMS[<b>TCPMux Server</b></br>Listen :44444]
181+
182+
subgraph Network-B
183+
SSH[<b>SSH</b><br>Listen :22]
184+
PSQL[<b>PostgreSQL</b><br>Listen :5432]
185+
MYSQL[<b>MySQL</b><br>Listen :3306]
186+
HTTP-1[<b>HTTP-1</b><br>Listen :80]
187+
HTTP-2[<b>HTTP-2</b><br>Listen :80]
188+
end
189+
190+
191+
TMC-1 -->|service HTTP-1|TMS -->HTTP-1
192+
TMC-2 -->|service HTTP-2|TMS -->HTTP-2
193+
TMC-3 -->|service SSH|TMS -->SSH
194+
```
195+
196+
197+
198+
上述场景代码实践
147199

148200
```java
149-
// addRoute第二个参数表示优先级,值越小、优先级越高
150-
ReverseHttpProxy.create(vertx).port(8080)
151-
.addRoute(new ProxyRoute()
152-
.setName("proxy")
153-
.setSourceUrl("/local/*")
154-
.setTargetUrl("http://127.0.0.1:888"),-1)
155-
.addRoute(new ProxyRoute()
156-
.setName("proxy")
157-
.setSourceUrl("/*")
158-
.setTargetUrl("https://reqres.in"),1)
201+
// TCPMux Server
202+
ReverseTcpProxyMuxServer.create(Vertx.vertx())
203+
.port(44444)
204+
.start();
205+
206+
// TCPMux Client
207+
Map<MuxNetAddress, NetAddress> map = new LinkedHashMap<>();
208+
map.put(new MuxNetAddress(6666, "HTTP-1"), new NetAddress("HTTP-1", 80));
209+
map.put(new MuxNetAddress(6667, "HTTP-2"), new NetAddress("HTTP-2", 80));
210+
map.put(new MuxNetAddress(6668, "SSH"), new NetAddress("SSG", 22));
211+
NetAddress muxServerAddress = new NetAddress("10.0.0.1", 44444);
212+
ReverseTcpProxyMuxClient.create(Vertx.vertx(), map, muxServerAddress)
159213
.start();
160214
```
161215

162-
216+
217+
218+
TCPMux实现思路
219+
220+
```mermaid
221+
sequenceDiagram
222+
participant u as User
223+
participant c as TcpMuxClient
224+
participant s as TcpMuxServer
225+
participant b1 as Backend1
226+
participant b2 as Backend2
227+
228+
autonumber
229+
230+
s->>s: 监听44444端口
231+
c->>c: 监听22222端口
232+
u->>c: 1. 建立用户连接 2. 发送数据
233+
c->>s: 1. 建立数据连接 2. 发送数据(包括加密的mux配置信息、用户连接的数据包)
234+
note left of c: 用户连接和数据连接绑定双向生命周期、双向数据传输
235+
s->>s: 对mux配置信息进行解密,获取实际的后端地址
236+
s->>b2: 1. 建立后端连接 2. 转发用户连接的数据包
237+
note left of s: 数据连接和后端连接绑定双向生命周期、双向数据传输
238+
b2->>s:
239+
s->>c:
240+
c->>u:
241+
```
242+
243+
244+

0 commit comments

Comments
 (0)