mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-11-04 22:52:23 +08:00
feat: add fake-ip-range6
This commit is contained in:
+3
-1
@@ -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>
|
||||
|
||||
|
||||
@@ -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>>,
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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')}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -502,6 +502,7 @@
|
||||
"listen": "DNS監視アドレス",
|
||||
"enhancedMode": "拡張モード",
|
||||
"fakeIpRange": "Fake IP範囲",
|
||||
"fakeIpRange6": "Fake IP範囲 (IPv6)",
|
||||
"fakeIpFilterMode": "Fake IPフィルターモード",
|
||||
"ipv6": {
|
||||
"label": "IPv6",
|
||||
|
||||
@@ -502,6 +502,7 @@
|
||||
"listen": "DNS 리슨",
|
||||
"enhancedMode": "향상 모드",
|
||||
"fakeIpRange": "가짜 IP 범위",
|
||||
"fakeIpRange6": "가짜 IP 범위 (IPv6)",
|
||||
"fakeIpFilterMode": "가짜 IP 필터 모드",
|
||||
"ipv6": {
|
||||
"label": "IPv6",
|
||||
|
||||
@@ -502,6 +502,7 @@
|
||||
"listen": "Прослушивание DNS",
|
||||
"enhancedMode": "Расширенный режим",
|
||||
"fakeIpRange": "Диапазон FakeIP",
|
||||
"fakeIpRange6": "Диапазон FakeIP (IPv6)",
|
||||
"fakeIpFilterMode": "Режим фильтра FakeIP",
|
||||
"ipv6": {
|
||||
"label": "IPv6",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -502,6 +502,7 @@
|
||||
"listen": "DNS 监听地址",
|
||||
"enhancedMode": "增强模式",
|
||||
"fakeIpRange": "Fake IP 范围",
|
||||
"fakeIpRange6": "Fake IP 范围 (IPv6)",
|
||||
"fakeIpFilterMode": "Fake IP 过滤模式",
|
||||
"ipv6": {
|
||||
"label": "IPv6",
|
||||
|
||||
@@ -502,6 +502,7 @@
|
||||
"listen": "DNS 監聽位址",
|
||||
"enhancedMode": "增強模式",
|
||||
"fakeIpRange": "Fake IP 範圍",
|
||||
"fakeIpRange6": "Fake IP 範圍 (IPv6)",
|
||||
"fakeIpFilterMode": "Fake IP 篩選模式",
|
||||
"ipv6": {
|
||||
"label": "IPv6",
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -842,6 +842,7 @@ export interface TranslationResources {
|
||||
}
|
||||
fakeIpFilterMode: string
|
||||
fakeIpRange: string
|
||||
fakeIpRange6: string
|
||||
fallback: {
|
||||
description: string
|
||||
label: string
|
||||
|
||||
Vendored
+1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user