# FakeDNS

# FakeDnsObject

FakeDnsObject 对应配置文件的 fakedns 项。(4.38.1+)

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

ipPool: string: CIDR

FakeDNS 分配 IP 的地址空间。由 FakeDNS 分配的地址会符合这个 CIDR 表达式。

poolSize: number

FakeDNS 所记忆的「IP - 域名映射」数量。当域名数量超过此数值时,会依据 LRU (opens new window) 规则淘汰老旧域名。

WARNING

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

TIP

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

queryStrategyUseIPv4 时,默认的 ipPool198.18.0.0/15poolSize65535

queryStrategyUseIPv6 时,默认的 ipPoolfc00::/18poolSize65535

queryStrategyUseIP 时,默认用于 IPv4 的 ipPool198.18.0.0/15poolSize32768;用于 IPv6 的 ipPoolfc00::/18poolSize32768

# 运行机制及配置方式

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

WARNING

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

# 步骤一:拦截 DNS 流量

{
    "dns": {
        "servers": [
            "fakedns", // fakedns 排在首位
            "8.8.8.8"
        ]
    },
    "outbounds": [
        {
            "protocol": "dns",
            "tag": "dns-out"
        }
    ],
    "routing": {
        "rules": [
            {
                "type": "field",
                "inboundTag": [
                    "tproxy-in" // 只劫持来自透明代理入站的 DNS 流量。
                ],
                "port": 53,
                "outboundTag": "dns-out"
            }
        ]
    }
}

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

# 步骤二:还原虚构地址

{
    "inbounds": [
        {
            "listen": "::",
            "port": 3346,
            "protocol": "dokodemo-door", // 流量入口,可以是其他协议
            "sniffing": {
                "enabled": true,
                "destOverride": [
                    "fakedns",       // 二选一
                    "fakedns+others" // 二选一
                ],
                "metadataOnly": false
            },
            "settings": {
                "network": "tcp,udp",
                "followRedirect": true
            },
            "streamSettings": {
                "sockopt": {
                    "tproxy": "tproxy"
                }
            },
            "tag": "tproxy-in"
        }
    ]
}

上面给出了一个透明代理入站使用 FakeDNS 的例子。你也可以将其他入站协议配合 FakeDNS 使用。

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

TIP

如果在使用 FakeDNS 时遇到了直连空解析的问题,可以尝试在 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"
    ]
}

# FakeDNS 黑名单机制

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

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

# FakeDNS 白名单机制

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

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