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 }) {
/>
+ -
+
+
+
+
-