diff --git a/common/consts/control.go b/common/consts/control.go index b295ceb..b6a7d3e 100644 --- a/common/consts/control.go +++ b/common/consts/control.go @@ -10,13 +10,14 @@ import "fmt" type DialMode string const ( - DialMode_Ip DialMode = "ip" - DialMode_Domain DialMode = "domain" + DialMode_Ip DialMode = "ip" + DialMode_Domain DialMode = "domain" + DialMode_DomainPlus DialMode = "domain+" ) func ParseDialMode(mode string) (DialMode, error) { switch mode { - case "ip", "domain": + case "ip", "domain", "domain+": return DialMode(mode), nil default: return "", fmt.Errorf("unsupported dial mode: %v", mode) diff --git a/control/control_plane.go b/control/control_plane.go index cc0d888..7ac9811 100644 --- a/control/control_plane.go +++ b/control/control_plane.go @@ -408,15 +408,20 @@ func (c *ControlPlane) finishInitDnsUpstreamResolve(raw common.UrlOrEmpty, dnsUp func (c *ControlPlane) ChooseDialTarget(outbound consts.OutboundIndex, dst netip.AddrPort, domain string) (dialTarget string) { mode := consts.DialMode_Ip - if c.dialMode == consts.DialMode_Domain && - !outbound.IsReserved() && // Direct, block, etc. should be skipped. - domain != "" { - dstIp := common.ConvergeIp(dst.Addr()) - cache := c.lookupDnsRespCache(domain, common.AddrToDnsType(dstIp)) - if cache != nil && cache.IncludeIp(dstIp) { + + if !outbound.IsReserved() && domain != "" { + switch c.dialMode { + case consts.DialMode_Domain: + dstIp := common.ConvergeIp(dst.Addr()) + cache := c.lookupDnsRespCache(domain, common.AddrToDnsType(dstIp)) + if cache != nil && cache.IncludeIp(dstIp) { + mode = consts.DialMode_Domain + } + case consts.DialMode_DomainPlus: mode = consts.DialMode_Domain } } + switch mode { case consts.DialMode_Ip: dialTarget = dst.String()