mirror of
https://github.com/cedar2025/hysteria.git
synced 2025-06-26 22:49:50 +00:00
feat: use local address from TCP connection for SOCKS5 UDP
This commit is contained in:
parent
c811b8e558
commit
50bee6c694
@ -52,9 +52,6 @@ func NewServer(hyClient *core.Client, transport transport.Transport, addr string
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if tAddr.IP == nil || tAddr.IP.IsUnspecified() {
|
|
||||||
return nil, errors.New("listen address must have a specified IP")
|
|
||||||
}
|
|
||||||
m := socks5.MethodNone
|
m := socks5.MethodNone
|
||||||
if authFunc != nil {
|
if authFunc != nil {
|
||||||
m = socks5.MethodUsernamePassword
|
m = socks5.MethodUsernamePassword
|
||||||
@ -274,12 +271,23 @@ func (s *Server) handleUDP(c *net.TCPConn, r *socks5.Request) error {
|
|||||||
}
|
}
|
||||||
defer hyUDP.Close()
|
defer hyUDP.Close()
|
||||||
// Send UDP server addr to the client
|
// Send UDP server addr to the client
|
||||||
atyp, addr, port, err := socks5.ParseAddress(udpConn.LocalAddr().String())
|
// Same IP as TCP but a different port
|
||||||
if err != nil {
|
tcpLocalAddr := c.LocalAddr().(*net.TCPAddr)
|
||||||
|
var atyp byte
|
||||||
|
var addr, port []byte
|
||||||
|
if ip4 := tcpLocalAddr.IP.To4(); ip4 != nil {
|
||||||
|
atyp = socks5.ATYPIPv4
|
||||||
|
addr = ip4
|
||||||
|
} else if ip6 := tcpLocalAddr.IP.To16(); ip6 != nil {
|
||||||
|
atyp = socks5.ATYPIPv6
|
||||||
|
addr = ip6
|
||||||
|
} else {
|
||||||
_ = sendReply(c, socks5.RepServerFailure)
|
_ = sendReply(c, socks5.RepServerFailure)
|
||||||
closeErr = err
|
closeErr = errors.New("invalid local addr")
|
||||||
return err
|
return closeErr
|
||||||
}
|
}
|
||||||
|
port = make([]byte, 2)
|
||||||
|
binary.BigEndian.PutUint16(port, uint16(udpConn.LocalAddr().(*net.UDPAddr).Port))
|
||||||
_, _ = socks5.NewReply(socks5.RepSuccess, atyp, addr, port).WriteTo(c)
|
_, _ = socks5.NewReply(socks5.RepSuccess, atyp, addr, port).WriteTo(c)
|
||||||
// Let UDP server do its job, we hold the TCP connection here
|
// Let UDP server do its job, we hold the TCP connection here
|
||||||
go s.udpServer(udpConn, localRelayConn, hyUDP)
|
go s.udpServer(udpConn, localRelayConn, hyUDP)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user