targetStrategy

This commit is contained in:
Meo597
2026-05-20 03:56:56 +08:00
parent e33aad40d0
commit 6bc4d4a3e8
3 changed files with 58 additions and 34 deletions
+7 -4
View File
@@ -267,11 +267,14 @@ func (h *Handler) DestIpAddress() net.IP {
return internet.DestIpAddress() return internet.DestIpAddress()
} }
func (h *Handler) SocketSettings() *internet.SocketConfig { func (h *Handler) ResolveStrategy() internet.DomainStrategy {
if h.streamSettings == nil { if h.senderSettings != nil && h.senderSettings.TargetStrategy.HasStrategy() {
return nil return h.senderSettings.TargetStrategy
} }
return h.streamSettings.SocketSettings if h.streamSettings != nil && h.streamSettings.SocketSettings != nil {
return h.streamSettings.SocketSettings.DomainStrategy
}
return internet.DomainStrategy_AS_IS
} }
func (h *Handler) UsesProxySettings() bool { func (h *Handler) UsesProxySettings() bool {
+44 -21
View File
@@ -330,16 +330,19 @@ func (c *OutboundDetourConfig) Build() (*core.OutboundHandlerConfig, error) {
} }
if fc, ok := ts.(*freedom.Config); ok && fc.DomainStrategy != internet.DomainStrategy_AS_IS { if fc, ok := ts.(*freedom.Config); ok && fc.DomainStrategy != internet.DomainStrategy_AS_IS {
errors.PrintDeprecatedFeatureWarning("freedom.domainStrategy", "streamSettings.sockopt.domainStrategy") errors.PrintDeprecatedFeatureWarning("freedom.domainStrategy", "sockopt.domainStrategy or targetStrategy")
if senderSettings.StreamSettings == nil {
senderSettings.StreamSettings = &internet.StreamConfig{}
}
if senderSettings.StreamSettings.SocketSettings == nil {
senderSettings.StreamSettings.SocketSettings = &internet.SocketConfig{}
}
senderSettings.StreamSettings.SocketSettings.DomainStrategy = fc.DomainStrategy
if c.ProxySettings != nil && !c.ProxySettings.TransportLayerProxy { if c.ProxySettings != nil && !c.ProxySettings.TransportLayerProxy {
errors.LogWarning(context.Background(), `The deprecated "freedom" outbound "domainStrategy" cannot be migrated correctly when "proxySettings.transportLayer" is false. Please update your config(s); the current combination is misconfigured.`) if senderSettings.TargetStrategy == internet.DomainStrategy_AS_IS {
senderSettings.TargetStrategy = fc.DomainStrategy
}
} else {
if senderSettings.StreamSettings == nil {
senderSettings.StreamSettings = &internet.StreamConfig{}
}
if senderSettings.StreamSettings.SocketSettings == nil {
senderSettings.StreamSettings.SocketSettings = &internet.SocketConfig{}
}
senderSettings.StreamSettings.SocketSettings.DomainStrategy = fc.DomainStrategy
} }
} }
@@ -351,21 +354,41 @@ func (c *OutboundDetourConfig) Build() (*core.OutboundHandlerConfig, error) {
senderSettings.StreamSettings.SocketSettings = &internet.SocketConfig{} senderSettings.StreamSettings.SocketSettings = &internet.SocketConfig{}
} }
if fc.PrivacyGuard == nil { if fc.PrivacyGuard == nil {
if senderSettings.StreamSettings.SocketSettings.DomainStrategy == internet.DomainStrategy_AS_IS { if c.ProxySettings != nil && !c.ProxySettings.TransportLayerProxy {
senderSettings.StreamSettings.SocketSettings.DomainStrategy = internet.DomainStrategy_USE_IP46 if senderSettings.TargetStrategy == internet.DomainStrategy_AS_IS {
senderSettings.TargetStrategy = internet.DomainStrategy_USE_IP46
}
} else {
if senderSettings.TargetStrategy == internet.DomainStrategy_AS_IS &&
senderSettings.StreamSettings.SocketSettings.DomainStrategy == internet.DomainStrategy_AS_IS {
senderSettings.StreamSettings.SocketSettings.DomainStrategy = internet.DomainStrategy_USE_IP46
}
} }
} else if *fc.PrivacyGuard { } else if *fc.PrivacyGuard {
if senderSettings.StreamSettings.SocketSettings.DomainStrategy != internet.DomainStrategy_USE_IP4 &&
senderSettings.StreamSettings.SocketSettings.DomainStrategy != internet.DomainStrategy_USE_IP46 &&
senderSettings.StreamSettings.SocketSettings.DomainStrategy != internet.DomainStrategy_FORCE_IP4 &&
senderSettings.StreamSettings.SocketSettings.DomainStrategy != internet.DomainStrategy_FORCE_IP46 {
if senderSettings.StreamSettings.SocketSettings.DomainStrategy != internet.DomainStrategy_AS_IS {
errors.LogWarning(context.Background(), `The "freedom" outbound "privacyGuard" overrides the existing "streamSettings.sockopt.domainStrategy". Please update your config(s) if this is unintended.`)
}
senderSettings.StreamSettings.SocketSettings.DomainStrategy = internet.DomainStrategy_USE_IP46
}
if c.ProxySettings != nil && !c.ProxySettings.TransportLayerProxy { if c.ProxySettings != nil && !c.ProxySettings.TransportLayerProxy {
errors.LogWarning(context.Background(), `The "freedom" outbound "privacyGuard" cannot be applied correctly when "proxySettings.transportLayer" is false. Please update your config(s); the current combination is misconfigured.`) if senderSettings.TargetStrategy != internet.DomainStrategy_USE_IP4 &&
senderSettings.TargetStrategy != internet.DomainStrategy_USE_IP46 &&
senderSettings.TargetStrategy != internet.DomainStrategy_FORCE_IP4 &&
senderSettings.TargetStrategy != internet.DomainStrategy_FORCE_IP46 {
if senderSettings.TargetStrategy != internet.DomainStrategy_AS_IS {
errors.LogWarning(context.Background(), `The "freedom" outbound "privacyGuard" overrides the existing "targetStrategy". Please update your config(s) if this is unintended.`)
}
senderSettings.TargetStrategy = internet.DomainStrategy_USE_IP46
}
} else {
if senderSettings.StreamSettings.SocketSettings.DomainStrategy != internet.DomainStrategy_USE_IP4 &&
senderSettings.StreamSettings.SocketSettings.DomainStrategy != internet.DomainStrategy_USE_IP46 &&
senderSettings.StreamSettings.SocketSettings.DomainStrategy != internet.DomainStrategy_FORCE_IP4 &&
senderSettings.StreamSettings.SocketSettings.DomainStrategy != internet.DomainStrategy_FORCE_IP46 {
if senderSettings.StreamSettings.SocketSettings.DomainStrategy != internet.DomainStrategy_AS_IS {
errors.LogWarning(context.Background(), `The "freedom" outbound "privacyGuard" overrides the existing "streamSettings.sockopt.domainStrategy". Please update your config(s) if this is unintended.`)
}
senderSettings.StreamSettings.SocketSettings.DomainStrategy = internet.DomainStrategy_USE_IP46
}
if senderSettings.TargetStrategy != internet.DomainStrategy_AS_IS {
errors.LogWarning(context.Background(), `The "freedom" outbound "privacyGuard" overrides the existing "targetStrategy". Please update your config(s) if this is unintended.`)
senderSettings.TargetStrategy = internet.DomainStrategy_AS_IS
}
} }
} }
} }
+7 -9
View File
@@ -38,10 +38,8 @@ var defaultBlockAllRule *FinalRule
func init() { func init() {
common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
h := new(Handler) h := new(Handler)
if handler, ok := session.FullHandlerFromContext(ctx).(handlerWithSocketSettings); ok { if handler, ok := session.FullHandlerFromContext(ctx).(handlerWithResolveStrategy); ok {
if sockopt := handler.SocketSettings(); sockopt != nil { h.resolveStrategy = handler.ResolveStrategy()
h.socketStrategy = sockopt.DomainStrategy
}
} }
if handler, ok := session.FullHandlerFromContext(ctx).(handlerWithProxySettings); ok { if handler, ok := session.FullHandlerFromContext(ctx).(handlerWithProxySettings); ok {
h.usesProxySettings = handler.UsesProxySettings() h.usesProxySettings = handler.UsesProxySettings()
@@ -96,8 +94,8 @@ func init() {
} }
} }
type handlerWithSocketSettings interface { type handlerWithResolveStrategy interface {
SocketSettings() *internet.SocketConfig ResolveStrategy() internet.DomainStrategy
} }
type handlerWithProxySettings interface { type handlerWithProxySettings interface {
@@ -117,7 +115,7 @@ type Handler struct {
policyManager policy.Manager policyManager policy.Manager
config *Config config *Config
finalRules []*FinalRule finalRules []*FinalRule
socketStrategy internet.DomainStrategy resolveStrategy internet.DomainStrategy
usesProxySettings bool usesProxySettings bool
} }
@@ -307,7 +305,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
if dialDest.Address.Family().IsDomain() { if dialDest.Address.Family().IsDomain() {
if defaultRule != nil || len(h.finalRules) > 0 { if defaultRule != nil || len(h.finalRules) > 0 {
if strategy := h.socketStrategy; strategy.HasStrategy() { if strategy := h.resolveStrategy; strategy.HasStrategy() {
ips, err := internet.LookupForIP(dialDest.Address.Domain(), strategy, outGateway) ips, err := internet.LookupForIP(dialDest.Address.Domain(), strategy, outGateway)
if err != nil { // SRV/TXT if err != nil { // SRV/TXT
errors.LogInfoInner(ctx, err, "failed to get IP address for domain ", dialDest.Address.Domain()) errors.LogInfoInner(ctx, err, "failed to get IP address for domain ", dialDest.Address.Domain())
@@ -617,7 +615,7 @@ func (w *PacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
b.UDP.Address = ip b.UDP.Address = ip
} else { } else {
shouldUseSystemResolver := true shouldUseSystemResolver := true
if strategy := w.Handler.socketStrategy; strategy.HasStrategy() { if strategy := w.Handler.resolveStrategy; strategy.HasStrategy() {
ips, err := internet.LookupForIP(b.UDP.Address.Domain(), strategy, w.OutGateway) ips, err := internet.LookupForIP(b.UDP.Address.Domain(), strategy, w.OutGateway)
if err != nil { if err != nil {
// drop packet if resolve failed when forceIP // drop packet if resolve failed when forceIP