From 294955cb8cb820ed9ed2ed4c50b55622128a62e4 Mon Sep 17 00:00:00 2001 From: wonfen Date: Sun, 28 Jun 2026 13:08:42 +0800 Subject: [PATCH] feat: add fake-ip-range6 --- Changelog.md | 4 ++- src-tauri/src/config/clash.rs | 1 + src-tauri/src/enhance/mod.rs | 31 +++++++++++++++++++++- src-tauri/src/enhance/tun.rs | 5 ++++ src-tauri/src/utils/init.rs | 1 + src/components/setting/mods/dns-viewer.tsx | 23 ++++++++++++++++ src/locales/ar/settings.json | 1 + src/locales/de/settings.json | 1 + src/locales/en/settings.json | 1 + src/locales/es/settings.json | 1 + src/locales/fa/settings.json | 1 + src/locales/id/settings.json | 1 + src/locales/jp/settings.json | 1 + src/locales/ko/settings.json | 1 + src/locales/ru/settings.json | 1 + src/locales/tr/settings.json | 1 + src/locales/tt/settings.json | 1 + src/locales/zh/settings.json | 1 + src/locales/zhtw/settings.json | 1 + src/types/generated/i18n-keys.ts | 1 + src/types/generated/i18n-resources.ts | 1 + src/types/global.d.ts | 1 + 22 files changed, 79 insertions(+), 2 deletions(-) diff --git a/Changelog.md b/Changelog.md index c4684ad57..bf35ba453 100644 --- a/Changelog.md +++ b/Changelog.md @@ -10,12 +10,14 @@ - 修复前端连接页面导致的内存泄漏 - macOS 12(Monterey) 首页 IP 卡兼容性 - 代理卡可能显示的通信错误,但实际可用 +- 修复 Fake-IP 模式开启 IPv6 后未生成 fake-ip-range6
✨ 新增功能 - 增加 TrustTunnel, OpenVPN, Tailscale, GostRelay 节点显示支持 -- 全局扩展脚本增加恢复默认按钮、 +- 全局扩展脚本增加恢复默认按钮 +- DNS 添加 fake-ip-range6 可配置项
diff --git a/src-tauri/src/config/clash.rs b/src-tauri/src/config/clash.rs index 63f954292..6e92503e1 100644 --- a/src-tauri/src/config/clash.rs +++ b/src-tauri/src/config/clash.rs @@ -433,6 +433,7 @@ pub struct IClashDNS { pub default_nameserver: Option>, pub enhanced_mode: Option, pub fake_ip_range: Option, + pub fake_ip_range6: Option, pub use_hosts: Option, pub fake_ip_filter: Option>, pub nameserver: Option>, diff --git a/src-tauri/src/enhance/mod.rs b/src-tauri/src/enhance/mod.rs index b38a0fd52..409e02aed 100644 --- a/src-tauri/src/enhance/mod.rs +++ b/src-tauri/src/enhance/mod.rs @@ -547,6 +547,31 @@ fn cleanup_proxy_groups(mut config: Mapping) -> Mapping { config } +/// 当 DNS 处于 fake-ip 模式且启用 IPv6 时,补充缺失的 `fake-ip-range6`, +/// 否则 AAAA 查询无法获得 fake-ip,导致 IPv6 解析失败(见 issue #7373)。 +/// 兼容旧版本生成的、缺少该字段的 dns_config.yaml。 +fn ensure_fake_ip_range6(dns: &mut Mapping) { + use serde_yaml_ng::Value; + + let ipv6_enabled = dns.get("ipv6").and_then(|v| v.as_bool()).unwrap_or(false); + let is_fake_ip = dns + .get("enhanced-mode") + .and_then(|v| v.as_str()) + .map(|m| m == "fake-ip") + .unwrap_or(true); + + // 缺失或为空字符串(可能来自手动编辑的 YAML)时都需要补充 + let range6_missing = dns + .get("fake-ip-range6") + .and_then(|v| v.as_str()) + .map(|s| s.trim().is_empty()) + .unwrap_or(true); + + if ipv6_enabled && is_fake_ip && range6_missing { + dns.insert(Value::from("fake-ip-range6"), Value::from("fdfe:dcba:9876::1/64")); + } +} + async fn apply_dns_settings(mut config: Mapping, enable_dns_settings: bool) -> Mapping { if enable_dns_settings && let Ok(app_dir) = dirs::app_home_dir() { let dns_path = app_dir.join(constants::files::DNS_CONFIG); @@ -564,10 +589,14 @@ async fn apply_dns_settings(mut config: Mapping, enable_dns_settings: bool) -> M if let Some(dns_value) = dns_config.get("dns") { if let Some(dns_mapping) = dns_value.as_mapping() { - config.insert("dns".into(), dns_mapping.clone().into()); + let mut dns_mapping = dns_mapping.clone(); + ensure_fake_ip_range6(&mut dns_mapping); + config.insert("dns".into(), dns_mapping.into()); logging!(info, Type::Core, "apply dns_config.yaml (dns section)"); } } else { + let mut dns_config = dns_config; + ensure_fake_ip_range6(&mut dns_config); config.insert("dns".into(), dns_config.into()); logging!(info, Type::Core, "apply dns_config.yaml"); } diff --git a/src-tauri/src/enhance/tun.rs b/src-tauri/src/enhance/tun.rs index 9a59e4235..e84c0fe58 100644 --- a/src-tauri/src/enhance/tun.rs +++ b/src-tauri/src/enhance/tun.rs @@ -57,6 +57,11 @@ pub fn use_tun(mut config: Mapping, enable: bool) -> Mapping { revise!(dns_val, "fake-ip-range", "198.18.0.1/16"); } + // 当启用 IPv6 时,补充 IPv6 的 fake-ip 范围 + if ipv6_val && !dns_val.contains_key(Value::from("fake-ip-range6")) { + revise!(dns_val, "fake-ip-range6", "fdfe:dcba:9876::1/64"); + } + #[cfg(target_os = "macos")] { AsyncHandler::spawn(move || async move { diff --git a/src-tauri/src/utils/init.rs b/src-tauri/src/utils/init.rs index d4fbdcdac..56ee88119 100644 --- a/src-tauri/src/utils/init.rs +++ b/src-tauri/src/utils/init.rs @@ -132,6 +132,7 @@ async fn init_dns_config() -> Result<()> { ("listen".into(), Value::String(":53".into())), ("enhanced-mode".into(), Value::String("fake-ip".into())), ("fake-ip-range".into(), Value::String("198.18.0.1/16".into())), + ("fake-ip-range6".into(), Value::String("fdfe:dcba:9876::1/64".into())), ("fake-ip-filter-mode".into(), Value::String("blacklist".into())), ("prefer-h3".into(), Value::Bool(false)), ("respect-rules".into(), Value::Bool(false)), diff --git a/src/components/setting/mods/dns-viewer.tsx b/src/components/setting/mods/dns-viewer.tsx index 449d6a9c6..5d081f895 100644 --- a/src/components/setting/mods/dns-viewer.tsx +++ b/src/components/setting/mods/dns-viewer.tsx @@ -134,6 +134,7 @@ const DEFAULT_DNS_CONFIG = { listen: ':53', 'enhanced-mode': 'fake-ip' as 'fake-ip' | 'redir-host', 'fake-ip-range': '198.18.0.1/16', + 'fake-ip-range6': 'fdfe:dcba:9876::1/64', 'fake-ip-filter-mode': 'blacklist' as 'blacklist' | 'whitelist', 'prefer-h3': false, 'respect-rules': false, @@ -195,6 +196,7 @@ export function DnsViewer({ ref }: { ref?: Ref }) { listen: string enhancedMode: 'fake-ip' | 'redir-host' fakeIpRange: string + fakeIpRange6: string fakeIpFilterMode: 'blacklist' | 'whitelist' preferH3: boolean respectRules: boolean @@ -219,6 +221,7 @@ export function DnsViewer({ ref }: { ref?: Ref }) { listen: DEFAULT_DNS_CONFIG.listen, enhancedMode: DEFAULT_DNS_CONFIG['enhanced-mode'], fakeIpRange: DEFAULT_DNS_CONFIG['fake-ip-range'], + fakeIpRange6: DEFAULT_DNS_CONFIG['fake-ip-range6'], fakeIpFilterMode: DEFAULT_DNS_CONFIG['fake-ip-filter-mode'], preferH3: DEFAULT_DNS_CONFIG['prefer-h3'], respectRules: DEFAULT_DNS_CONFIG['respect-rules'], @@ -279,6 +282,8 @@ export function DnsViewer({ ref }: { ref?: Ref }) { enhancedMode: validEnhancedMode, fakeIpRange: dnsConfig['fake-ip-range'] ?? DEFAULT_DNS_CONFIG['fake-ip-range'], + fakeIpRange6: + dnsConfig['fake-ip-range6'] ?? DEFAULT_DNS_CONFIG['fake-ip-range6'], fakeIpFilterMode: validFakeIpFilterMode, preferH3: dnsConfig['prefer-h3'] ?? DEFAULT_DNS_CONFIG['prefer-h3'], respectRules: @@ -335,6 +340,8 @@ export function DnsViewer({ ref }: { ref?: Ref }) { listen: values.listen, 'enhanced-mode': values.enhancedMode, 'fake-ip-range': values.fakeIpRange, + 'fake-ip-range6': + values.fakeIpRange6 || DEFAULT_DNS_CONFIG['fake-ip-range6'], 'fake-ip-filter-mode': values.fakeIpFilterMode, 'prefer-h3': values.preferH3, 'respect-rules': values.respectRules, @@ -388,6 +395,7 @@ export function DnsViewer({ ref }: { ref?: Ref }) { listen: DEFAULT_DNS_CONFIG.listen, enhancedMode: DEFAULT_DNS_CONFIG['enhanced-mode'], fakeIpRange: DEFAULT_DNS_CONFIG['fake-ip-range'], + fakeIpRange6: DEFAULT_DNS_CONFIG['fake-ip-range6'], fakeIpFilterMode: DEFAULT_DNS_CONFIG['fake-ip-filter-mode'], preferH3: DEFAULT_DNS_CONFIG['prefer-h3'], respectRules: DEFAULT_DNS_CONFIG['respect-rules'], @@ -741,6 +749,21 @@ export function DnsViewer({ ref }: { ref?: Ref }) { /> + + + + +