mirror of
				https://github.com/nadoo/glider.git
				synced 2025-11-04 07:42:38 +08:00 
			
		
		
		
	ss: support proxy chain in udp over tcp mode
This commit is contained in:
		
							parent
							
								
									9fef98fd5b
								
							
						
					
					
						commit
						4fe5eb97bb
					
				
							
								
								
									
										27
									
								
								conn.go
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								conn.go
									
									
									
									
									
								
							@ -52,30 +52,3 @@ func relay(left, right net.Conn) (int64, int64, error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	return n, rs.N, err
 | 
						return n, rs.N, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
// copy from src to dst at target with read timeout
 | 
					 | 
				
			||||||
func timedCopy(dst net.PacketConn, target net.Addr, src net.PacketConn, timeout time.Duration, srcIncluded bool) error {
 | 
					 | 
				
			||||||
	buf := make([]byte, udpBufSize)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for {
 | 
					 | 
				
			||||||
		src.SetReadDeadline(time.Now().Add(timeout))
 | 
					 | 
				
			||||||
		n, raddr, err := src.ReadFrom(buf)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if srcIncluded { // server -> client: add original packet source
 | 
					 | 
				
			||||||
			srcAddr := ParseAddr(raddr.String())
 | 
					 | 
				
			||||||
			copy(buf[len(srcAddr):], buf[:n])
 | 
					 | 
				
			||||||
			copy(buf, srcAddr)
 | 
					 | 
				
			||||||
			_, err = dst.WriteTo(buf[:len(srcAddr)+n], target)
 | 
					 | 
				
			||||||
		} else { // client -> user: strip original packet source
 | 
					 | 
				
			||||||
			srcAddr := SplitAddr(buf[:n])
 | 
					 | 
				
			||||||
			_, err = dst.WriteTo(buf[len(srcAddr):n], target)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								rule.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								rule.go
									
									
									
									
									
								
							@ -63,7 +63,7 @@ func (p *RuleDialer) NextDialer(dstAddr string) Dialer {
 | 
				
			|||||||
	host, _, err := net.SplitHostPort(dstAddr)
 | 
						host, _, err := net.SplitHostPort(dstAddr)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		// TODO: check here
 | 
							// TODO: check here
 | 
				
			||||||
		logf("SplitHostPort ERROR: %s", err)
 | 
							// logf("proxy-rule SplitHostPort ERROR: %s", err)
 | 
				
			||||||
		return p.gDialer
 | 
							return p.gDialer
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										15
									
								
								ss.go
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								ss.go
									
									
									
									
									
								
							@ -71,8 +71,12 @@ func (s *SS) Serve(c net.Conn) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// udp over tcp
 | 
						dialer := s.sDialer.NextDialer("")
 | 
				
			||||||
	if UoT(tgt[0]) {
 | 
					
 | 
				
			||||||
 | 
						// udp over tcp?
 | 
				
			||||||
 | 
						uot := UoT(tgt[0])
 | 
				
			||||||
 | 
						if uot && dialer.Addr() == "DIRECT" {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		rc, err := net.ListenPacket("udp", "")
 | 
							rc, err := net.ListenPacket("udp", "")
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			logf("UDP remote listen error: %v", err)
 | 
								logf("UDP remote listen error: %v", err)
 | 
				
			||||||
@ -102,7 +106,12 @@ func (s *SS) Serve(c net.Conn) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rc, err := s.sDialer.Dial("tcp", tgt.String())
 | 
						network := "tcp"
 | 
				
			||||||
 | 
						if uot {
 | 
				
			||||||
 | 
							network = "udp"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rc, err := dialer.Dial(network, tgt.String())
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		logf("proxy-ss failed to connect to target: %v", err)
 | 
							logf("proxy-ss failed to connect to target: %v", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user