From e33aad40d0d761f79fdceddf95d9105af12e9465 Mon Sep 17 00:00:00 2001 From: Meo597 <197331664+Meo597@users.noreply.github.com> Date: Tue, 19 May 2026 19:06:34 +0800 Subject: [PATCH] privacy guard --- infra/conf/freedom.go | 1 + infra/conf/xray.go | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/infra/conf/freedom.go b/infra/conf/freedom.go index 1d2020e3..a9241d2b 100644 --- a/infra/conf/freedom.go +++ b/infra/conf/freedom.go @@ -27,6 +27,7 @@ type FreedomConfig struct { ProxyProtocol uint32 `json:"proxyProtocol"` IPsBlocked *StringList `json:"ipsBlocked"` FinalRules []*FreedomFinalRuleConfig `json:"finalRules"` + PrivacyGuard *bool `json:"privacyGuard"` } type Fragment struct { diff --git a/infra/conf/xray.go b/infra/conf/xray.go index b431386e..24236624 100644 --- a/infra/conf/xray.go +++ b/infra/conf/xray.go @@ -343,6 +343,33 @@ func (c *OutboundDetourConfig) Build() (*core.OutboundHandlerConfig, error) { } } + if fc, ok := rawConfig.(*FreedomConfig); ok && (fc.PrivacyGuard == nil || *fc.PrivacyGuard) { + if senderSettings.StreamSettings == nil { + senderSettings.StreamSettings = &internet.StreamConfig{} + } + if senderSettings.StreamSettings.SocketSettings == nil { + senderSettings.StreamSettings.SocketSettings = &internet.SocketConfig{} + } + if fc.PrivacyGuard == nil { + if senderSettings.StreamSettings.SocketSettings.DomainStrategy == internet.DomainStrategy_AS_IS { + senderSettings.StreamSettings.SocketSettings.DomainStrategy = internet.DomainStrategy_USE_IP46 + } + } 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 { + 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.`) + } + } + } + return &core.OutboundHandlerConfig{ SenderSettings: serial.ToTypedMessage(senderSettings), Tag: c.Tag,