mirror of
https://github.com/XTLS/Xray-core.git
synced 2026-07-03 02:08:45 +00:00
targetStrategy
This commit is contained in:
@@ -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
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user