diff --git a/cmd/main.go b/cmd/main.go index 1c97595..8ad1cb9 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -31,7 +31,6 @@ var ( args = new(CmdArgs) - handlerCreator func() postFlagsInitFn []func() lwipWriter io.Writer @@ -41,14 +40,13 @@ var ( type CmdArgs struct { // Main - Version *bool - DelayICMP *int - TunName *string - TunAddr *string - TunGw *string - TunMask *string - TunDns *string - LogLevel *string + Version *bool + TunName *string + TunAddr *string + TunGw *string + TunMask *string + TunDns *string + LogLevel *string // Proxy ProxyServer *string @@ -79,7 +77,6 @@ func init() { args.TunGw = flag.String("tunGw", "240.0.0.1", "TUN interface gateway") args.TunMask = flag.String("tunMask", "255.255.255.0", "TUN interface netmask, it should be a prefix length (a number) for IPv6 address") args.TunDns = flag.String("tunDns", "1.1.1.1", "DNS resolvers for TUN interface (Windows Only)") - args.DelayICMP = flag.Int("delayICMP", 1, "Delay ICMP packets for a short period of time, in milliseconds") // Proxy args.ProxyServer = flag.String("proxyServer", "", "Proxy server address") @@ -127,13 +124,9 @@ func main() { } // Setup TCP/IP stack. - lwipWriter = core.NewLWIPStack().(io.Writer) - - // Wrap a writer to delay ICMP packets if delay time is not zero. - if *args.DelayICMP > 0 { - log.Infof("ICMP packets will be delayed for %dms", *args.DelayICMP) - lwipWriter = filter.NewICMPFilter(lwipWriter, *args.DelayICMP).(io.Writer) - } + // Wrap a writer to delay ICMP packets. + w := core.NewLWIPStack().(io.Writer) + lwipWriter = filter.NewICMPFilter(w).(io.Writer) // Register TCP and UDP handlers to handle accepted connections. proxyAddr, err := net.ResolveTCPAddr("tcp", *args.ProxyServer) @@ -153,8 +146,7 @@ func main() { // Copy packets from tun device to lwip stack, it's the main loop. go func() { - _, err := io.CopyBuffer(lwipWriter, tunDev, make([]byte, MTU)) - if err != nil { + if _, err := io.CopyBuffer(lwipWriter, tunDev, make([]byte, MTU)); err != nil { log.Fatalf("copying data failed: %v", err) } }() diff --git a/common/stats/session/session.go b/common/stats/session/session.go index 1406211..1f0357d 100644 --- a/common/stats/session/session.go +++ b/common/stats/session/session.go @@ -34,7 +34,7 @@ func NewSimpleSessionStater() stats.SessionStater { return &simpleSessionStater{} } -func (s *simpleSessionStater) Start() error { +func (s *simpleSessionStater) Start() { log.Debugf("Start session stater") sessionStatsHandler := func(resp http.ResponseWriter, req *http.Request) { // Make a snapshot. @@ -97,12 +97,11 @@ func (s *simpleSessionStater) Start() error { mux.HandleFunc(StatsPath, sessionStatsHandler) s.server = &http.Server{Addr: StatsAddr, Handler: mux} go s.server.ListenAndServe() - return nil } -func (s *simpleSessionStater) Stop() error { +func (s *simpleSessionStater) Stop() { log.Debugf("Stop session stater") - return s.server.Close() + s.server.Close() } func (s *simpleSessionStater) AddSession(key interface{}, session *stats.Session) { diff --git a/common/stats/stats.go b/common/stats/stats.go index 185449e..b26192e 100644 --- a/common/stats/stats.go +++ b/common/stats/stats.go @@ -8,8 +8,8 @@ import ( ) type SessionStater interface { - Start() error - Stop() error + Start() + Stop() AddSession(key interface{}, session *Session) GetSession(key interface{}) *Session RemoveSession(key interface{}) diff --git a/filter/filter.go b/filter/filter.go index c1742fb..7f338e8 100644 --- a/filter/filter.go +++ b/filter/filter.go @@ -4,7 +4,7 @@ import ( "io" ) -// Filter is used for filtering IP packets comming from TUN. +// Filter is used for filtering IP packets coming from TUN. type Filter interface { io.Writer } diff --git a/filter/icmp.go b/filter/icmp.go index 4220b35..f1e7786 100644 --- a/filter/icmp.go +++ b/filter/icmp.go @@ -2,7 +2,6 @@ package filter import ( "io" - "time" "github.com/xjasonlyu/tun2socks/common/log" "github.com/xjasonlyu/tun2socks/common/packet" @@ -10,26 +9,23 @@ import ( type icmpFilter struct { writer io.Writer - delay int } -func NewICMPFilter(w io.Writer, delay int) Filter { - return &icmpFilter{writer: w, delay: delay} +func NewICMPFilter(w io.Writer) Filter { + return &icmpFilter{writer: w} } -func (w *icmpFilter) Write(buf []byte) (int, error) { - if uint8(buf[9]) == packet.PROTOCOL_ICMP { +func (f *icmpFilter) Write(buf []byte) (int, error) { + if buf[9] == packet.PROTOCOL_ICMP { payload := make([]byte, len(buf)) copy(payload, buf) go func(data []byte) { - time.Sleep(time.Duration(w.delay) * time.Millisecond) - _, err := w.writer.Write(data) - if err != nil { + if _, err := f.writer.Write(data); err != nil { log.Fatalf("failed to input data to the stack: %v", err) } }(payload) return len(buf), nil } else { - return w.writer.Write(buf) + return f.writer.Write(buf) } } diff --git a/proxy/udp.go b/proxy/udp.go index aca9f24..bd6debd 100644 --- a/proxy/udp.go +++ b/proxy/udp.go @@ -42,6 +42,9 @@ func NewUDPHandler(proxyHost string, proxyPort uint16, timeout time.Duration, fa } func (h *udpHandler) handleTCP(conn core.UDPConn, c net.Conn) { + // keep tcp connection alive + tcpKeepAlive(c) + for { // clear timeout settings c.SetDeadline(time.Time{}) @@ -74,7 +77,7 @@ func (h *udpHandler) fetchUDPInput(conn core.UDPConn, input net.PacketConn) { return } - if n < 4 { + if n < 5 { log.Warnf("short udp packet length: %d", n) return } @@ -85,7 +88,7 @@ func (h *udpHandler) fetchUDPInput(conn core.UDPConn, input net.PacketConn) { return } - if _, err := conn.WriteFrom(buf[int(3+len(addr)):n], resolvedAddr); err != nil { + if _, err := conn.WriteFrom(buf[3+len(addr):n], resolvedAddr); err != nil { log.Warnf("failed to write UDP data: %v", err) return } @@ -94,7 +97,6 @@ func (h *udpHandler) fetchUDPInput(conn core.UDPConn, input net.PacketConn) { func (h *udpHandler) Connect(conn core.UDPConn, target *net.UDPAddr) error { if target == nil { - // return h.connectInternal(conn, "") log.Warnf("UDP target is invalid: %s", conn.LocalAddr().String()) return errors.New("UDP target is invalid") }