no message
This commit is contained in:
@ -561,6 +561,7 @@ func (s *Socks) proxyUDP(inConn *net.Conn, methodReq socks.MethodsRequest, reque
|
|||||||
isClosedErr = func(err error) bool {
|
isClosedErr = func(err error) bool {
|
||||||
return err != nil && strings.Contains(err.Error(), "use of closed network connection")
|
return err != nil && strings.Contains(err.Error(), "use of closed network connection")
|
||||||
}
|
}
|
||||||
|
destAddr *net.UDPAddr
|
||||||
)
|
)
|
||||||
var clean = func(msg, err string) {
|
var clean = func(msg, err string) {
|
||||||
raddr := ""
|
raddr := ""
|
||||||
@ -601,7 +602,18 @@ func (s *Socks) proxyUDP(inConn *net.Conn, methodReq socks.MethodsRequest, reque
|
|||||||
time.Sleep(time.Second * 5)
|
time.Sleep(time.Second * 5)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
useProxy := true
|
||||||
if *s.cfg.Parent != "" {
|
if *s.cfg.Parent != "" {
|
||||||
|
dstHost, _, _ := net.SplitHostPort(request.Addr())
|
||||||
|
if utils.IsIternalIP(dstHost, *s.cfg.Always) {
|
||||||
|
useProxy = false
|
||||||
|
} else {
|
||||||
|
var isInMap bool
|
||||||
|
useProxy, isInMap, _, _ = s.checker.IsBlocked(request.Addr())
|
||||||
|
if !isInMap {
|
||||||
|
s.checker.Add(request.Addr(), s.Resolve(request.Addr()))
|
||||||
|
}
|
||||||
|
}
|
||||||
//parent proxy
|
//parent proxy
|
||||||
outconn, err := s.getOutConn(nil, nil, "", false)
|
outconn, err := s.getOutConn(nil, nil, "", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -624,9 +636,12 @@ func (s *Socks) proxyUDP(inConn *net.Conn, methodReq socks.MethodsRequest, reque
|
|||||||
}()
|
}()
|
||||||
//forward to parent udp
|
//forward to parent udp
|
||||||
s.log.Printf("parent udp address %s", client.UDPAddr)
|
s.log.Printf("parent udp address %s", client.UDPAddr)
|
||||||
|
destAddr, _ = net.ResolveUDPAddr("udp", client.UDPAddr)
|
||||||
} else {
|
} else {
|
||||||
//local proxy
|
useProxy = false
|
||||||
|
}
|
||||||
|
s.log.Printf("use proxy %v , udp %s", useProxy, request.Addr())
|
||||||
|
//relay
|
||||||
for {
|
for {
|
||||||
buf := utils.LeakyBuffer.Get()
|
buf := utils.LeakyBuffer.Get()
|
||||||
defer utils.LeakyBuffer.Put(buf)
|
defer utils.LeakyBuffer.Put(buf)
|
||||||
@ -646,8 +661,11 @@ func (s *Socks) proxyUDP(inConn *net.Conn, methodReq socks.MethodsRequest, reque
|
|||||||
}
|
}
|
||||||
|
|
||||||
port, _ := strconv.Atoi(p.Port())
|
port, _ := strconv.Atoi(p.Port())
|
||||||
destAddr := &net.UDPAddr{IP: net.ParseIP(p.Host()), Port: port}
|
|
||||||
if v, ok := s.udpRelatedPacketConns.Get(srcAddr.String()); !ok {
|
if v, ok := s.udpRelatedPacketConns.Get(srcAddr.String()); !ok {
|
||||||
|
if destAddr == nil {
|
||||||
|
destAddr = &net.UDPAddr{IP: net.ParseIP(p.Host()), Port: port}
|
||||||
|
}
|
||||||
outUDPConn, err = net.DialUDP("udp", localAddr, destAddr)
|
outUDPConn, err = net.DialUDP("udp", localAddr, destAddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.log.Printf("create out udp conn fail , %s , from : %s", err, srcAddr)
|
s.log.Printf("create out udp conn fail , %s , from : %s", err, srcAddr)
|
||||||
@ -669,10 +687,19 @@ func (s *Socks) proxyUDP(inConn *net.Conn, methodReq socks.MethodsRequest, reque
|
|||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var dlen = n
|
||||||
|
if useProxy {
|
||||||
|
//forward to local
|
||||||
|
_, err = udpListener.WriteTo(buf[:n], srcAddr)
|
||||||
|
} else {
|
||||||
rp := socks.NewPacketUDP()
|
rp := socks.NewPacketUDP()
|
||||||
rp.Build(srcAddr.String(), buf[:n])
|
rp.Build(srcAddr.String(), buf[:n])
|
||||||
d := rp.Bytes()
|
d := rp.Bytes()
|
||||||
|
dlen = len(d)
|
||||||
_, err = udpListener.WriteTo(d, srcAddr)
|
_, err = udpListener.WriteTo(d, srcAddr)
|
||||||
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.udpRelatedPacketConns.Remove(srcAddr.String())
|
s.udpRelatedPacketConns.Remove(srcAddr.String())
|
||||||
s.log.Printf("write out data to local fail , %s , from : %s", err, srcAddr)
|
s.log.Printf("write out data to local fail , %s , from : %s", err, srcAddr)
|
||||||
@ -681,7 +708,7 @@ func (s *Socks) proxyUDP(inConn *net.Conn, methodReq socks.MethodsRequest, reque
|
|||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
} else {
|
} else {
|
||||||
s.log.Printf("send udp data to local success , len %d, for : %s", len(d), srcAddr)
|
s.log.Printf("send udp data to local success , len %d, for : %s", dlen, srcAddr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
@ -689,7 +716,12 @@ func (s *Socks) proxyUDP(inConn *net.Conn, methodReq socks.MethodsRequest, reque
|
|||||||
outUDPConn = v.(*net.UDPConn)
|
outUDPConn = v.(*net.UDPConn)
|
||||||
}
|
}
|
||||||
//local->out io copy
|
//local->out io copy
|
||||||
|
if useProxy {
|
||||||
|
//forward to parent
|
||||||
|
_, err = outUDPConn.Write(buf[:n])
|
||||||
|
} else {
|
||||||
_, err = outUDPConn.Write(p.Data())
|
_, err = outUDPConn.Write(p.Data())
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if isClosedErr(err) {
|
if isClosedErr(err) {
|
||||||
return
|
return
|
||||||
@ -700,7 +732,7 @@ func (s *Socks) proxyUDP(inConn *net.Conn, methodReq socks.MethodsRequest, reque
|
|||||||
s.log.Printf("send udp data to remote success , len %d, for : %s", len(p.Data()), srcAddr)
|
s.log.Printf("send udp data to remote success , len %d, for : %s", len(p.Data()), srcAddr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
func (s *Socks) proxyTCP(inConn *net.Conn, methodReq socks.MethodsRequest, request socks.Request) {
|
func (s *Socks) proxyTCP(inConn *net.Conn, methodReq socks.MethodsRequest, request socks.Request) {
|
||||||
var outConn net.Conn
|
var outConn net.Conn
|
||||||
|
|||||||
Reference in New Issue
Block a user