feat: add fake-ip-range6

This commit is contained in:
wonfen
2026-06-28 13:08:55 +08:00
parent 16e15ed9d4
commit 294955cb8c
22 changed files with 79 additions and 2 deletions
+3 -1
View File
@@ -10,12 +10,14 @@
- 修复前端连接页面导致的内存泄漏
- macOS 12(Monterey) 首页 IP 卡兼容性
- 代理卡可能显示的通信错误,但实际可用
- 修复 Fake-IP 模式开启 IPv6 后未生成 fake-ip-range6
<details>
<summary><strong> ✨ 新增功能 </strong></summary>
- 增加 TrustTunnel, OpenVPN, Tailscale, GostRelay 节点显示支持
- 全局扩展脚本增加恢复默认按钮、
- 全局扩展脚本增加恢复默认按钮
- DNS 添加 fake-ip-range6 可配置项
</details>
+1
View File
@@ -433,6 +433,7 @@ pub struct IClashDNS {
pub default_nameserver: Option<Vec<String>>,
pub enhanced_mode: Option<String>,
pub fake_ip_range: Option<String>,
pub fake_ip_range6: Option<String>,
pub use_hosts: Option<bool>,
pub fake_ip_filter: Option<Vec<String>>,
pub nameserver: Option<Vec<String>>,
+30 -1
View File
@@ -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");
}
+5
View File
@@ -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 {
+1
View File
@@ -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)),
@@ -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<DialogRef> }) {
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<DialogRef> }) {
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<DialogRef> }) {
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<DialogRef> }) {
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<DialogRef> }) {
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<DialogRef> }) {
/>
</Item>
<Item>
<ListItemText
primary={t('settings.modals.dns.fields.fakeIpRange6')}
/>
<TextField
size="small"
autoComplete="off"
spellCheck="false"
value={values.fakeIpRange6}
onChange={handleChange('fakeIpRange6')}
placeholder="fdfe:dcba:9876::1/64"
sx={{ width: 200 }}
/>
</Item>
<Item>
<ListItemText
primary={t('settings.modals.dns.fields.fakeIpFilterMode')}
+1
View File
@@ -502,6 +502,7 @@
"listen": "DNS Listen",
"enhancedMode": "Enhanced Mode",
"fakeIpRange": "Fake IP Range",
"fakeIpRange6": "نطاق Fake IP (IPv6)",
"fakeIpFilterMode": "Fake IP Filter Mode",
"ipv6": {
"label": "IPv6",
+1
View File
@@ -502,6 +502,7 @@
"listen": "DNS-Lauschangabe",
"enhancedMode": "Erweiterter Modus",
"fakeIpRange": "Fake-IP-Bereich",
"fakeIpRange6": "Fake-IP-Bereich (IPv6)",
"fakeIpFilterMode": "Fake-IP-Filtermodus",
"ipv6": {
"label": "IPv6",
+1
View File
@@ -502,6 +502,7 @@
"listen": "DNS Listen",
"enhancedMode": "Enhanced Mode",
"fakeIpRange": "Fake IP Range",
"fakeIpRange6": "Fake IP Range (IPv6)",
"fakeIpFilterMode": "Fake IP Filter Mode",
"ipv6": {
"label": "IPv6",
+1
View File
@@ -502,6 +502,7 @@
"listen": "Dirección de escucha de DNS",
"enhancedMode": "Modo mejorado",
"fakeIpRange": "Rango de Fake IP",
"fakeIpRange6": "Rango de Fake IP (IPv6)",
"fakeIpFilterMode": "Modo de filtrado de Fake IP",
"ipv6": {
"label": "IPv6",
+1
View File
@@ -502,6 +502,7 @@
"listen": "DNS Listen",
"enhancedMode": "Enhanced Mode",
"fakeIpRange": "Fake IP Range",
"fakeIpRange6": "Fake IP Range (IPv6)",
"fakeIpFilterMode": "Fake IP Filter Mode",
"ipv6": {
"label": "IPv6",
+1
View File
@@ -502,6 +502,7 @@
"listen": "DNS Listen",
"enhancedMode": "Enhanced Mode",
"fakeIpRange": "Fake IP Range",
"fakeIpRange6": "Fake IP Range (IPv6)",
"fakeIpFilterMode": "Fake IP Filter Mode",
"ipv6": {
"label": "IPv6",
+1
View File
@@ -502,6 +502,7 @@
"listen": "DNS監視アドレス",
"enhancedMode": "拡張モード",
"fakeIpRange": "Fake IP範囲",
"fakeIpRange6": "Fake IP範囲 (IPv6)",
"fakeIpFilterMode": "Fake IPフィルターモード",
"ipv6": {
"label": "IPv6",
+1
View File
@@ -502,6 +502,7 @@
"listen": "DNS 리슨",
"enhancedMode": "향상 모드",
"fakeIpRange": "가짜 IP 범위",
"fakeIpRange6": "가짜 IP 범위 (IPv6)",
"fakeIpFilterMode": "가짜 IP 필터 모드",
"ipv6": {
"label": "IPv6",
+1
View File
@@ -502,6 +502,7 @@
"listen": "Прослушивание DNS",
"enhancedMode": "Расширенный режим",
"fakeIpRange": "Диапазон FakeIP",
"fakeIpRange6": "Диапазон FakeIP (IPv6)",
"fakeIpFilterMode": "Режим фильтра FakeIP",
"ipv6": {
"label": "IPv6",
+1
View File
@@ -502,6 +502,7 @@
"listen": "DNS Dinleme",
"enhancedMode": "Geliştirilmiş Mod",
"fakeIpRange": "Sahte IP Aralığı",
"fakeIpRange6": "Sahte IP Aralığı (IPv6)",
"fakeIpFilterMode": "Sahte IP Filtre Modu",
"ipv6": {
"label": "IPv6",
+1
View File
@@ -502,6 +502,7 @@
"listen": "DNS Listen",
"enhancedMode": "Enhanced Mode",
"fakeIpRange": "Fake IP Range",
"fakeIpRange6": "Fake IP Range (IPv6)",
"fakeIpFilterMode": "Fake IP Filter Mode",
"ipv6": {
"label": "IPv6",
+1
View File
@@ -502,6 +502,7 @@
"listen": "DNS 监听地址",
"enhancedMode": "增强模式",
"fakeIpRange": "Fake IP 范围",
"fakeIpRange6": "Fake IP 范围 (IPv6)",
"fakeIpFilterMode": "Fake IP 过滤模式",
"ipv6": {
"label": "IPv6",
+1
View File
@@ -502,6 +502,7 @@
"listen": "DNS 監聽位址",
"enhancedMode": "增強模式",
"fakeIpRange": "Fake IP 範圍",
"fakeIpRange6": "Fake IP 範圍 (IPv6)",
"fakeIpFilterMode": "Fake IP 篩選模式",
"ipv6": {
"label": "IPv6",
+1
View File
@@ -617,6 +617,7 @@ export const translationKeys = [
'settings.modals.dns.fields.listen',
'settings.modals.dns.fields.enhancedMode',
'settings.modals.dns.fields.fakeIpRange',
'settings.modals.dns.fields.fakeIpRange6',
'settings.modals.dns.fields.fakeIpFilterMode',
'settings.modals.dns.fields.ipv6.label',
'settings.modals.dns.fields.ipv6.description',
+1
View File
@@ -842,6 +842,7 @@ export interface TranslationResources {
}
fakeIpFilterMode: string
fakeIpRange: string
fakeIpRange6: string
fallback: {
description: string
label: string
+1
View File
@@ -58,6 +58,7 @@ interface IConfigData {
listen?: string
'enhanced-mode'?: 'fake-ip' | 'redir-host'
'fake-ip-range'?: string
'fake-ip-range6'?: string
'fake-ip-filter'?: string[]
'fake-ip-filter-mode'?: 'blacklist' | 'whitelist'
'prefer-h3'?: boolean