From d8285161ba9526195657c30769ea7e164be2e54d Mon Sep 17 00:00:00 2001 From: SAPikachu Date: Fri, 25 Jan 2019 15:49:34 +0800 Subject: [PATCH] Properly handle TPROXY UDP connections --- proxy/dokodemo/dokodemo.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/proxy/dokodemo/dokodemo.go b/proxy/dokodemo/dokodemo.go index cabb4599e..f4e26203c 100644 --- a/proxy/dokodemo/dokodemo.go +++ b/proxy/dokodemo/dokodemo.go @@ -117,6 +117,7 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn in return nil } + var tReader buf.Reader responseDone := func() error { defer timer.SetTimeout(plcy.Timeouts.UplinkOnly) @@ -140,6 +141,13 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn in return err } writer = &buf.SequentialWriter{Writer: tConn} + tReader = buf.NewReader(tConn) + go func() { + defer tConn.Close() + if err := buf.Copy(tReader, link.Writer, buf.UpdateActivity(timer)); err != nil { + newError("failed to transport request (TPROXY conn)").Base(err).WriteToLog() + } + }() } } @@ -153,6 +161,9 @@ func (d *DokodemoDoor) Process(ctx context.Context, network net.Network, conn in if err := task.Run(ctx, task.OnSuccess(requestDone, task.Close(link.Writer)), responseDone); err != nil { common.Interrupt(link.Reader) common.Interrupt(link.Writer) + if tReader != nil { + common.Interrupt(tReader) + } return newError("connection ends").Base(err) }