@@ -148,55 +148,71 @@ func (g *Glutton) Init() error {
148
148
}
149
149
150
150
func (g * Glutton ) udpListen (wg * sync.WaitGroup ) {
151
- defer wg .Done ()
151
+ defer func () {
152
+ wg .Done ()
153
+ }()
152
154
buffer := make ([]byte , 1024 )
153
155
for {
154
- n , srcAddr , dstAddr , err := tproxy .ReadFromUDP (g .Server .udpListener , buffer )
156
+ select {
157
+ case <- g .ctx .Done ():
158
+ if err := g .Server .udpConn .Close (); err != nil {
159
+ g .Logger .Error ("Failed to close UDP listener" , producer .ErrAttr (err ))
160
+ }
161
+ return
162
+ default :
163
+ }
164
+ g .Server .udpConn .SetReadDeadline (time .Now ().Add (1 * time .Second ))
165
+ n , srcAddr , dstAddr , err := tproxy .ReadFromUDP (g .Server .udpConn , buffer )
155
166
if err != nil {
156
- g .Logger .Error ("failed to read UDP packet" , producer .ErrAttr (err ))
167
+ if nerr , ok := err .(net.Error ); ok && nerr .Timeout () {
168
+ continue
169
+ }
170
+ g .Logger .Error ("Failed to read UDP packet" , producer .ErrAttr (err ))
157
171
}
158
172
159
173
rule , err := g .applyRules ("udp" , srcAddr , dstAddr )
160
174
if err != nil {
161
- g .Logger .Error ("failed to apply rules" , producer .ErrAttr (err ))
175
+ g .Logger .Error ("Failed to apply rules" , producer .ErrAttr (err ))
162
176
}
163
177
if rule == nil {
164
178
rule = & rules.Rule {Target : "udp" }
165
179
}
166
180
md , err := g .connTable .Register (srcAddr .IP .String (), strconv .Itoa (int (srcAddr .AddrPort ().Port ())), dstAddr .AddrPort ().Port (), rule )
167
181
if err != nil {
168
- g .Logger .Error ("failed to register UDP packet" , producer .ErrAttr (err ))
182
+ g .Logger .Error ("Failed to register UDP packet" , producer .ErrAttr (err ))
169
183
}
170
184
171
185
if hfunc , ok := g .udpProtocolHandlers [rule .Target ]; ok {
172
186
data := buffer [:n ]
173
187
go func () {
174
188
if err := hfunc (g .ctx , srcAddr , dstAddr , data , md ); err != nil {
175
- g .Logger .Error ("failed to handle UDP payload" , producer .ErrAttr (err ))
189
+ g .Logger .Error ("Failed to handle UDP payload" , producer .ErrAttr (err ))
176
190
}
177
191
}()
178
192
}
179
193
}
180
194
}
181
195
182
- func (g * Glutton ) tcpListen (wg * sync.WaitGroup ) {
183
- defer wg .Done ()
196
+ func (g * Glutton ) tcpListen () {
184
197
for {
185
198
select {
186
199
case <- g .ctx .Done ():
200
+ if err := g .Server .tcpListener .Close (); err != nil {
201
+ g .Logger .Error ("Failed to close TCP listener" , producer .ErrAttr (err ))
202
+ }
187
203
return
188
204
default :
189
205
}
190
206
191
207
conn , err := g .Server .tcpListener .Accept ()
192
208
if err != nil {
193
- g .Logger .Error ("failed to accept connection" , producer .ErrAttr (err ))
209
+ g .Logger .Error ("Failed to accept connection" , producer .ErrAttr (err ))
194
210
continue
195
211
}
196
212
197
213
rule , err := g .applyRulesOnConn (conn )
198
214
if err != nil {
199
- g .Logger .Error ("failed to apply rules" , producer .ErrAttr (err ))
215
+ g .Logger .Error ("Failed to apply rules" , producer .ErrAttr (err ))
200
216
continue
201
217
}
202
218
if rule == nil {
@@ -205,21 +221,21 @@ func (g *Glutton) tcpListen(wg *sync.WaitGroup) {
205
221
206
222
md , err := g .connTable .RegisterConn (conn , rule )
207
223
if err != nil {
208
- g .Logger .Error ("failed to register connection" , producer .ErrAttr (err ))
224
+ g .Logger .Error ("Failed to register connection" , producer .ErrAttr (err ))
209
225
continue
210
226
}
211
227
212
228
g .Logger .Debug ("new connection" , slog .String ("addr" , conn .LocalAddr ().String ()), slog .String ("handler" , rule .Target ))
213
229
214
230
g .ctx = context .WithValue (g .ctx , ctxTimeout ("timeout" ), int64 (viper .GetInt ("conn_timeout" )))
215
231
if err := g .UpdateConnectionTimeout (g .ctx , conn ); err != nil {
216
- g .Logger .Error ("failed to set connection timeout" , producer .ErrAttr (err ))
232
+ g .Logger .Error ("Failed to set connection timeout" , producer .ErrAttr (err ))
217
233
}
218
234
219
235
if hfunc , ok := g .tcpProtocolHandlers [rule .Target ]; ok {
220
236
go func () {
221
237
if err := hfunc (g .ctx , conn , md ); err != nil {
222
- g .Logger .Error ("failed to handle TCP connection" , producer .ErrAttr (err ), slog .String ("handler" , rule .Target ))
238
+ g .Logger .Error ("Failed to handle TCP connection" , producer .ErrAttr (err ), slog .String ("handler" , rule .Target ))
223
239
}
224
240
}()
225
241
}
@@ -228,13 +244,7 @@ func (g *Glutton) tcpListen(wg *sync.WaitGroup) {
228
244
229
245
// Start the listener, this blocks for new connections
230
246
func (g * Glutton ) Start () error {
231
- quit := make (chan struct {}) // stop monitor on shutdown
232
- defer func () {
233
- quit <- struct {}{}
234
- g .Shutdown ()
235
- }()
236
-
237
- g .startMonitor (quit )
247
+ g .startMonitor ()
238
248
239
249
sshPort := viper .GetUint32 ("ports.ssh" )
240
250
if err := setTProxyIPTables (viper .GetString ("interface" ), g .publicAddrs [0 ].String (), "tcp" , uint32 (g .Server .tcpPort ), sshPort ); err != nil {
@@ -249,9 +259,7 @@ func (g *Glutton) Start() error {
249
259
250
260
wg .Add (1 )
251
261
go g .udpListen (wg )
252
-
253
- wg .Add (1 )
254
- go g .tcpListen (wg )
262
+ go g .tcpListen ()
255
263
256
264
wg .Wait ()
257
265
@@ -350,18 +358,13 @@ func (g *Glutton) ProduceUDP(handler string, srcAddr, dstAddr *net.UDPAddr, md c
350
358
func (g * Glutton ) Shutdown () {
351
359
g .cancel () // close all connection
352
360
353
- g .Logger .Info ("Shutting down listeners" )
354
- if err := g .Server .Shutdown (); err != nil {
355
- g .Logger .Error ("failed to shutdown server" , producer .ErrAttr (err ))
356
- }
357
-
358
- g .Logger .Info ("FLushing TCP iptables" )
361
+ g .Logger .Info ("Flushing TCP iptables" )
359
362
if err := flushTProxyIPTables (viper .GetString ("interface" ), g .publicAddrs [0 ].String (), "tcp" , uint32 (g .Server .tcpPort ), uint32 (viper .GetInt ("ports.ssh" ))); err != nil {
360
- g .Logger .Error ("failed to drop tcp iptables" , producer .ErrAttr (err ))
363
+ g .Logger .Error ("Failed to drop tcp iptables" , producer .ErrAttr (err ))
361
364
}
362
- g .Logger .Info ("FLushing UDP iptables" )
365
+ g .Logger .Info ("Flushing UDP iptables" )
363
366
if err := flushTProxyIPTables (viper .GetString ("interface" ), g .publicAddrs [0 ].String (), "udp" , uint32 (g .Server .udpPort ), uint32 (viper .GetInt ("ports.ssh" ))); err != nil {
364
- g .Logger .Error ("failed to drop udp iptables" , producer .ErrAttr (err ))
367
+ g .Logger .Error ("Failed to drop udp iptables" , producer .ErrAttr (err ))
365
368
}
366
369
367
370
g .Logger .Info ("All done" )
0 commit comments