# 虚拟 DNS 服务器

# FakeDnsObject

FakeDnsObject 对应配置文件 fakedns 项的一个子元素。(4.38.1+)

{
    "ipPool": "198.18.0.0/15",
    "poolSize": 65535
}
{
    "ipPool": "fc00::/18",
    "poolSize": 65535
}

ipPool: string: CIDR

虚拟 DNS 服务器分配 IP 的地址空间。由虚拟 DNS 服务器分配的地址会符合这个 CIDR 表达式。IPv4 网络下,默认值为 198.18.0.0/15;IPv6 网络下,默认值为 fc00::/18

poolSize: number

虚拟 DNS 服务器所记忆的「IP - 域名映射」数量。当域名数量超过此数值时,会依据 LRU (opens new window) 规则淘汰老旧域名。默认为 65535

WARNING

poolSize 必须小于或等于 ipPool 的地址总数,否则 core 将无法启动。

TIP

自 v4.38.1 起,若配置文件中的 dns 项显式设置了 fakedns,而配置文件中没有显式设置 fakedns 项,V2Ray 会根据 DNS 模块中 queryStrategy 项的值来初始化 fakedns 项的配置,即 FakeDNS 是否支持对不同类型 DNS 查询(A 记录和 AAAA 记录)返回相应的 IPv4 或 IPv6 类型的 IP 地址。

# 运行机制及配置方式

虚拟 DNS,一般也被称为 Fake DNS 或者 Fake IP,是解决 DNS 污染、防止 DNS 泄露、减低延时的技术手段(RFC3089 (opens new window))。对于透明代理和三层代理(例如 Android VPNService)而言,在数据发送之前,被代理的程序需要先发出 DNS 请求,以获取目标主机/域名的 IP 地址。

WARNING

虚拟 DNS 尽管有很多优点,但是会污染本地程序的 DNS 缓存,当代理断开之后的一段时间内设备可能无法访问网络。

# 步骤一:导入 DNS 流量

{
    "dns": {
        "servers": [
            "fakedns", // fakedns 排在首位
            "8.8.8.8"
        ]
    },
    "inbounds": [
        {
            "protocol": "dokodemo-door",
            "tag": "dns-in"
        }
    ],
    "outbounds": [
        {
            "protocol": "dns",
            "tag": "dns-out"
        }
    ],
    "routing": {
        "rules": [
            {
                "inboundTag": [
                    "dns-in"
                ],
                "outboundTag": "dns-out"
            }
        ]
    }
}

当外部 DNS 请求导入虚拟 DNS 服务器时,它会返回位于自己 ipPool 内的 IP 地址作为域名的虚构解析结果,并记录该域名与虚构解析结果之间的映射关系。

# 步骤二:还原虚构地址

{
    "inbounds": [
        {
            "protocol": "dokodemo-door", // 流量入口,可以是其他协议
            "sniffing": {
                "enabled": true,
                "destOverride": [
                    "fakedns",       // 二选一
                    "fakedns+others" // 二选一
                ],
                "metadataOnly": false
            }
        }
    ]
}

当客户端程序基于之前解析结果请求连接这个 IP 所指向的主机时,对应 入站连接fakedns 流量侦测模块会将目标地址还原为对应的域名。

TIP

如果在使用虚拟 DNS 时遇到了直连空解析的问题,可以尝试在 freedom 出站设置 domainStrategyUseIPUseIPv4UseIPv6

# 与其他类型 DNS 搭配使用

# 与 DNS 分流共存

当使用 DNS 分流时,为了让 fakedns 拥有高优先级,需要增加与其他类型 DNS 相同的 domains 配置。

{
    "servers": [
        {
            "address": "fakedns",
            "domains": [
                "geosite:cn"
            ]
        },
        {
            "address": "223.5.5.5",
            "domains": [
                "geosite:cn"
            ],
            "expectIPs": [
                "geoip:cn"
            ]
        },
        "8.8.8.8"
    ]
}

# 虚拟 DNS 黑名单机制

若希望某些域名不使用虚拟 DNS,则可在其他类型的 DNS 中增加 domains 配置,使其在匹配该域名时,拥有比虚拟 DNS 更高的优先级,从而实现虚拟 DNS 的黑名单机制。

{
    "servers": [
        "fakedns",
        {
            "address": "223.5.5.5",
            "domains": [
                "domain:not-use-fakedns.com",
                "geosite:cn"
            ]
        },
        "8.8.8.8"
    ]
}

# 虚拟 DNS 白名单机制

若只希望某些域名使用虚拟 DNS,则可在虚拟 DNS 中增加 domains 配置,使虚拟 DNS 在匹配该域名时,拥有比其他类型的 DNS 更高的优先级,从而实现虚拟 DNS 的白名单机制。

{
    "servers": [
        "8.8.8.8",
        {
            "address": "fakedns",
            "domains": [
                "domain:use-fakedns.com",
                "geosite:geolocation-!cn"
            ]
        }
    ]
}