mirror of
https://github.com/cmz0228/hysteria-dev.git
synced 2025-06-10 14:29:54 +00:00
Merge pull request #566 from yinyue200/removeUnusedDnsLookup
Remove unnecessary DNS queries in case of SOCKS5 outbound
This commit is contained in:
commit
12cff70aac
@ -140,10 +140,13 @@ func (c *serverClient) handleMessage(msg []byte) {
|
|||||||
var err error
|
var err error
|
||||||
if c.ACLEngine != nil {
|
if c.ACLEngine != nil {
|
||||||
action, arg, isDomain, ipAddr, err = c.ACLEngine.ResolveAndMatch(dfMsg.Host, dfMsg.Port, true)
|
action, arg, isDomain, ipAddr, err = c.ACLEngine.ResolveAndMatch(dfMsg.Host, dfMsg.Port, true)
|
||||||
|
} else if c.Transport.ProxyEnabled() { // Case for SOCKS5 outbound
|
||||||
|
ipAddr, isDomain = c.Transport.ParseIPAddr(dfMsg.Host) // It is safe to leave ipAddr as nil since addrExToSOCKS5Addr will ignore it when there is a domain
|
||||||
|
err = nil
|
||||||
} else {
|
} else {
|
||||||
ipAddr, isDomain, err = c.Transport.ResolveIPAddr(dfMsg.Host)
|
ipAddr, isDomain, err = c.Transport.ResolveIPAddr(dfMsg.Host)
|
||||||
}
|
}
|
||||||
if err != nil && !(isDomain && c.Transport.ProxyEnabled()) { // Special case for domain requests + SOCKS5 outbound
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
switch action {
|
switch action {
|
||||||
@ -162,8 +165,16 @@ func (c *serverClient) handleMessage(msg []byte) {
|
|||||||
case acl.ActionBlock:
|
case acl.ActionBlock:
|
||||||
// Do nothing
|
// Do nothing
|
||||||
case acl.ActionHijack:
|
case acl.ActionHijack:
|
||||||
hijackIPAddr, isDomain, err := c.Transport.ResolveIPAddr(arg)
|
var isDomain bool
|
||||||
if err == nil || (isDomain && c.Transport.ProxyEnabled()) { // Special case for domain requests + SOCKS5 outbound
|
var hijackIPAddr *net.IPAddr
|
||||||
|
var err error
|
||||||
|
if c.Transport.ProxyEnabled() { // Case for domain requests + SOCKS5 outbound
|
||||||
|
hijackIPAddr, isDomain = c.Transport.ParseIPAddr(arg) // It is safe to leave ipAddr as nil since addrExToSOCKS5Addr will ignore it when there is a domain
|
||||||
|
err = nil
|
||||||
|
} else {
|
||||||
|
hijackIPAddr, isDomain, err = c.Transport.ResolveIPAddr(arg)
|
||||||
|
}
|
||||||
|
if err == nil {
|
||||||
addrEx := &transport.AddrEx{
|
addrEx := &transport.AddrEx{
|
||||||
IPAddr: hijackIPAddr,
|
IPAddr: hijackIPAddr,
|
||||||
Port: int(dfMsg.Port),
|
Port: int(dfMsg.Port),
|
||||||
@ -190,10 +201,13 @@ func (c *serverClient) handleTCP(stream quic.Stream, host string, port uint16) {
|
|||||||
var err error
|
var err error
|
||||||
if c.ACLEngine != nil {
|
if c.ACLEngine != nil {
|
||||||
action, arg, isDomain, ipAddr, err = c.ACLEngine.ResolveAndMatch(host, port, false)
|
action, arg, isDomain, ipAddr, err = c.ACLEngine.ResolveAndMatch(host, port, false)
|
||||||
|
} else if c.Transport.ProxyEnabled() { // Case for domain requests + SOCKS5 outbound
|
||||||
|
ipAddr, isDomain = c.Transport.ParseIPAddr(host) // It is safe to leave ipAddr as nil since addrExToSOCKS5Addr will ignore it when there is a domain
|
||||||
|
err = nil
|
||||||
} else {
|
} else {
|
||||||
ipAddr, isDomain, err = c.Transport.ResolveIPAddr(host)
|
ipAddr, isDomain, err = c.Transport.ResolveIPAddr(host)
|
||||||
}
|
}
|
||||||
if err != nil && !(isDomain && c.Transport.ProxyEnabled()) { // Special case for domain requests + SOCKS5 outbound
|
if err != nil {
|
||||||
_ = struc.Pack(stream, &serverResponse{
|
_ = struc.Pack(stream, &serverResponse{
|
||||||
OK: false,
|
OK: false,
|
||||||
Message: "host resolution failure",
|
Message: "host resolution failure",
|
||||||
@ -229,8 +243,16 @@ func (c *serverClient) handleTCP(stream quic.Stream, host string, port uint16) {
|
|||||||
})
|
})
|
||||||
return
|
return
|
||||||
case acl.ActionHijack:
|
case acl.ActionHijack:
|
||||||
hijackIPAddr, isDomain, err := c.Transport.ResolveIPAddr(arg)
|
var isDomain bool
|
||||||
if err != nil && !(isDomain && c.Transport.ProxyEnabled()) { // Special case for domain requests + SOCKS5 outbound
|
var hijackIPAddr *net.IPAddr
|
||||||
|
var err error
|
||||||
|
if c.Transport.ProxyEnabled() { // Case for domain requests + SOCKS5 outbound
|
||||||
|
hijackIPAddr, isDomain = c.Transport.ParseIPAddr(arg) // It is safe to leave ipAddr as nil since addrExToSOCKS5Addr will ignore it when there is a domain
|
||||||
|
err = nil
|
||||||
|
} else {
|
||||||
|
hijackIPAddr, isDomain, err = c.Transport.ResolveIPAddr(arg)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
_ = struc.Pack(stream, &serverResponse{
|
_ = struc.Pack(stream, &serverResponse{
|
||||||
OK: false,
|
OK: false,
|
||||||
Message: err.Error(),
|
Message: err.Error(),
|
||||||
|
@ -69,10 +69,18 @@ var DefaultServerTransport = &ServerTransport{
|
|||||||
ResolvePreference: ResolvePreferenceDefault,
|
ResolvePreference: ResolvePreferenceDefault,
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *ServerTransport) ResolveIPAddr(address string) (*net.IPAddr, bool, error) {
|
func (st *ServerTransport) ParseIPAddr(address string) (*net.IPAddr, bool) {
|
||||||
ip, zone := utils.ParseIPZone(address)
|
ip, zone := utils.ParseIPZone(address)
|
||||||
if ip != nil {
|
if ip != nil {
|
||||||
return &net.IPAddr{IP: ip, Zone: zone}, false, nil
|
return &net.IPAddr{IP: ip, Zone: zone}, false
|
||||||
|
}
|
||||||
|
return nil, true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (st *ServerTransport) ResolveIPAddr(address string) (*net.IPAddr, bool, error) {
|
||||||
|
ip, isDomain := st.ParseIPAddr(address)
|
||||||
|
if !isDomain {
|
||||||
|
return ip, false, nil
|
||||||
}
|
}
|
||||||
ipAddr, err := resolveIPAddrWithPreference(address, st.ResolvePreference)
|
ipAddr, err := resolveIPAddrWithPreference(address, st.ResolvePreference)
|
||||||
return ipAddr, true, err
|
return ipAddr, true, err
|
||||||
|
Loading…
x
Reference in New Issue
Block a user