1
1
# tcp-reverse-proxy
2
- 基于[ Vert.x] ( https://vertx.io/ ) 实现的HTTP反向代理与TCP反向代理、内网穿透
2
+ 基于[ Vert.x] ( https://vertx.io/ ) 实现的网络库。支持HTTP反向代理、TCP反向代理、TCP内网穿透、TCP单端口多路复用
3
3
4
4
开发环境
5
5
39
39
</dependency >
40
40
```
41
41
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反向代理
43
81
44
82
实现TCP反向代理:` 0.0.0.0:22 ` ↔️` 10.0.0.1:8080 `
45
83
@@ -49,7 +87,7 @@ ReverseTcpProxy.create(Vertx.vertx(), "10.0.0.1", 8080)
49
87
.start();
50
88
```
51
89
52
- ## 二 、TCP内网穿透
90
+ ## 三 、TCP内网穿透
53
91
54
92
虚线表示控制连接通信,实线表示非控制连接通信。
55
93
@@ -123,40 +161,84 @@ ReverseTcpProxyTunnelClient.create(Vertx.vertx())
123
161
.connect(" 192.168.0.200" , 44444 );
124
162
```
125
163
164
+ ## 四、TCPMux单端口多路复用
126
165
166
+ 参考[ RFC 1078 - TCP port service Multiplexer (TCPMUX)] ( https://datatracker.ietf.org/doc/html/rfc1078 )
127
167
128
- ## 三、HTTP反向代理
168
+ 现有场景如下
129
169
130
- 实现HTTP反向代理,代理路由优先级如下
131
170
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 `
137
171
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
139
179
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
+ 上述场景代码实践
147
199
148
200
``` 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)
159
213
.start();
160
214
```
161
215
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