udptun: support direct mode

This commit is contained in:
nadoo 2018-01-13 22:31:22 +08:00
parent 5b2518fac0
commit b33127fba5
4 changed files with 41 additions and 5 deletions

View File

@ -12,9 +12,6 @@ var Direct = &direct{}
func (d *direct) Addr() string { return "DIRECT" } func (d *direct) Addr() string { return "DIRECT" }
func (d *direct) Dial(network, addr string) (net.Conn, error) { func (d *direct) Dial(network, addr string) (net.Conn, error) {
if network == "uot" {
network = "udp"
}
c, err := net.Dial(network, addr) c, err := net.Dial(network, addr)
if c, ok := c.(*net.TCPConn); ok { if c, ok := c.(*net.TCPConn); ok {
c.SetKeepAlive(true) c.SetKeepAlive(true)

2
ss.go
View File

@ -217,7 +217,7 @@ func (s *SS) Dial(network, addr string) (net.Conn, error) {
switch network { switch network {
case "tcp": case "tcp":
return s.DialTCP(target) return s.DialTCP(target)
case "uot": case "udp":
target[0] = target[0] | 0x8 target[0] = target[0] | 0x8
return s.DialTCP(target) return s.DialTCP(target)
// case "udp": // case "udp":

View File

@ -35,6 +35,45 @@ func (s *UDPTun) ListenAndServe() {
logf("proxy-udptun listening UDP on %s", s.addr) 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 // var nm sync.Map
buf := make([]byte, udpBufSize) buf := make([]byte, udpBufSize)
tgt := ParseAddr(s.raddr) tgt := ParseAddr(s.raddr)

View File

@ -46,7 +46,7 @@ func (s *UoTTun) ListenAndServe() {
} }
go func() { go func() {
rc, err := s.sDialer.Dial("uot", s.raddr) rc, err := s.sDialer.Dial("udp", s.raddr)
if err != nil { if err != nil {
logf("proxy-uottun failed to connect to server %v: %v", s.raddr, err) logf("proxy-uottun failed to connect to server %v: %v", s.raddr, err)
return return