ss: support proxy chain in udp over tcp mode

This commit is contained in:
nadoo 2017-09-08 15:25:10 +08:00
parent 9fef98fd5b
commit 4fe5eb97bb
3 changed files with 13 additions and 31 deletions

27
conn.go
View File

@ -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
}
}
}

View File

@ -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
View File

@ -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