diff --git a/direct.go b/direct.go index d8f7775..a83a2a9 100644 --- a/direct.go +++ b/direct.go @@ -12,9 +12,6 @@ var Direct = &direct{} func (d *direct) Addr() string { return "DIRECT" } func (d *direct) Dial(network, addr string) (net.Conn, error) { - if network == "uot" { - network = "udp" - } c, err := net.Dial(network, addr) if c, ok := c.(*net.TCPConn); ok { c.SetKeepAlive(true) diff --git a/ss.go b/ss.go index 2647d84..f31a949 100644 --- a/ss.go +++ b/ss.go @@ -217,7 +217,7 @@ func (s *SS) Dial(network, addr string) (net.Conn, error) { switch network { case "tcp": return s.DialTCP(target) - case "uot": + case "udp": target[0] = target[0] | 0x8 return s.DialTCP(target) // case "udp": diff --git a/udptun.go b/udptun.go index aaeb8a5..e21dcc9 100644 --- a/udptun.go +++ b/udptun.go @@ -35,6 +35,45 @@ func (s *UDPTun) ListenAndServe() { logf("proxy-udptun listening UDP on %s", s.addr) + if s.sDialer.Addr() == "DIRECT" { + s.ServeDirect(c) + } else { + s.ServeSS(c) + } + +} + +// ServeDirect . +func (s *UDPTun) ServeDirect(c net.PacketConn) { + buf := make([]byte, udpBufSize) + + for { + n, clientAddr, err := c.ReadFrom(buf) + if err != nil { + logf("proxy-udptun read error: %v", err) + continue + } + + rc, err := s.sDialer.Dial("udp", s.raddr) + if err != nil { + logf("proxy-udptun failed to connect to server %v: %v", s.raddr, err) + return + } + + if urc, ok := rc.(*net.UDPConn); ok { + urc.Write(buf[:n]) + go func() { + timedCopy(c, clientAddr, urc, 5*time.Minute, false) + urc.Close() + }() + } + + logf("proxy-udptun %s <-> %s", clientAddr, s.raddr) + } +} + +// ServeSS . +func (s *UDPTun) ServeSS(c net.PacketConn) { // var nm sync.Map buf := make([]byte, udpBufSize) tgt := ParseAddr(s.raddr) diff --git a/uottun.go b/uottun.go index fce3874..fabf99a 100644 --- a/uottun.go +++ b/uottun.go @@ -46,7 +46,7 @@ func (s *UoTTun) ListenAndServe() { } go func() { - rc, err := s.sDialer.Dial("uot", s.raddr) + rc, err := s.sDialer.Dial("udp", s.raddr) if err != nil { logf("proxy-uottun failed to connect to server %v: %v", s.raddr, err) return