mirror of
https://github.com/nadoo/glider.git
synced 2025-02-23 17:35:40 +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
|
||||
}
|
||||
|
||||
// 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)
|
||||
if err != nil {
|
||||
// TODO: check here
|
||||
logf("SplitHostPort ERROR: %s", err)
|
||||
// logf("proxy-rule SplitHostPort ERROR: %s", err)
|
||||
return p.gDialer
|
||||
}
|
||||
|
||||
|
15
ss.go
15
ss.go
@ -71,8 +71,12 @@ func (s *SS) Serve(c net.Conn) {
|
||||
return
|
||||
}
|
||||
|
||||
// udp over tcp
|
||||
if UoT(tgt[0]) {
|
||||
dialer := s.sDialer.NextDialer("")
|
||||
|
||||
// udp over tcp?
|
||||
uot := UoT(tgt[0])
|
||||
if uot && dialer.Addr() == "DIRECT" {
|
||||
|
||||
rc, err := net.ListenPacket("udp", "")
|
||||
if err != nil {
|
||||
logf("UDP remote listen error: %v", err)
|
||||
@ -102,7 +106,12 @@ func (s *SS) Serve(c net.Conn) {
|
||||
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 {
|
||||
logf("proxy-ss failed to connect to target: %v", err)
|
||||
return
|
||||
|
Loading…
Reference in New Issue
Block a user