mirror of
https://github.com/nadoo/glider.git
synced 2025-02-24 01:45:39 +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