目前 Windows/Linux 下(可用于防止污染的)最完美的 DNS 转发器是
DNSForwarder
https://github.com/holmium/dnsforwarder/ 你想到没想到的功能它都有了。
主要功能看看配置文件大概就知道了:
# DNS 转发器的配置文件
# Configure File for dnsforwarder
# 此配置文件最好是 ANSI 编码的
##################################################
#
# 本地
#
##################################################
# LocalInterface <IP>
# 设置在本地开启的界面,可以是本地回环地址 (127.0.0.1) ,本地局域网,以及互联网 (since 2.2)
# 如果是 IPv6 地址,请在地址两端加上方括号,例如 [::1] (本地回环)、[fe80::699c:f79a:9bb6:1] (since 2.3)
LocalInterface 127.0.0.1
# LocalPort <NUM>
# 本地开启的端口 (since 2.2)
LocalPort 53
# OpenLocalTCP <BOOLEAN>
# 在本地开启TCP,以便接收TCP协议的查询 (since 2.2)
# 可选值:`false' 或 `true'
OpenLocalTCP false
##################################################
#
# IP 选择策略
#
##################################################
#########################
# 服务器地址
#########################
# 您可以设置两组上游服务器,
# 一组是用 TCP 协议的服务器 (由 `TCPServer' 指定),
# 另一组是用 UDP 协议的服务器 (由 `UDPServer' 指定)
# 选项 `PrimaryServer' 用来指定首选的服务器(同时也指定了协议)
# 任何不在排除列表 (或者 GFW List) 中的域都会优先通过首选服务器及其协议来查询,
# 在排除列表 (或者 GFW List) 中的域会优先使用另一组服务器并通过另一种协议查询。
# PrimaryServer
# 首选服务器 (since 2.2)
# 可选值:`TCP' 或 `UDP'
PrimaryServer UDP
# TCPServer <IP[:PORT]>
# 指定用 TCP 协议查询的上游服务器 (since 2.2)
# 可以指定多个服务器,服务器之间用半角逗号隔开 (since 2.3)
# 如果不加端口号,则默认为 53 (since 2.3)
# 例如 192.168.1.2:300 以及 4.2.2.2 (since 2.3)
# 对于IPv6地址,请在地址两端加方括号,例如 [2001:4860:4860::8888] 以及加端口的形式 [2001:4860:4860::8888]:53 (since 2.3)
TCPServer 8.8.4.4,8.8.8.8
# UDPServer <IP[:PORT]>
# 指定用 UDP 协议查询的上游服务器 (since 2.2)
# 可以指定多个服务器,服务器之间用半角逗号隔开 (since 2.3)
# 如果不加端口号,则默认为 53 (since 2.3)
# 例如 192.168.1.2:300 以及 4.2.2.2 (since 2.3)
# 对于IPv6地址,请在地址两端加方括号,例如 [2001:4860:4860::8888] 以及加端口的形式 [2001:4860:4860::8888]:53 (since 2.3)
UDPServer 8.8.8.8,114.114.115.115
# DedicatedServer <DOMAIN1 SERVER_IP1>,<DOMAIN2 SERVER_IP2>,...
# 为某些域名指定专门的查询服务器,而不使用服务器列表(`TCPServer' 和 `UDPServer')中的服务器 (since 2.5 b1)
# 格式为:域名 服务器地址
#
# 例如:DedicatedServer
www.google.com 8.8.8.8
# 这样所有对域名
www.google.com 的查询都通过 8.8.8.8 这个服务器来进行
# 如果所指定的域名不在排除列表中,那么将通过 `PrimaryServer' 所指定的协议与服务器通讯,
# 否则将通过另一种协议与服务器通讯。
# 不同项之间用半角逗号 (`,') 分隔,同时注意最后不要有逗号
# 可以有多条 `DedicatedServer' 选项
DedicatedServer
#########################
# 服务器选项
#########################
# AllowFallBack <BOOLEAN>
# 如果第一次对某个域名(不在排除列表和 GFW List 中)查询失败,是否再次用另一种协议及其服务器查询 (since 2.5 b1)
# 对于已经指定专用服务器的域名,只切换协议
# 可选值:`false' 或 `true'
AllowFallBack false
# TimeToServer <NUM>
# 与服务器的超时时间,毫秒 (since 2.2)
TimeToServer 3000
# ParallelQuery <BOOLEAN>
# 是否启用 UDP 并发查询 (since 2.6 b1)
# 并发查询指的是,向所有指定的 UDP 服务器发送查询请求,取最先接受到的有效回复作为查询结果,并丢弃其余的回复
# 开启此选项必须保证 `UDPServer' 中的服务器都是 IPv4 或者都是 IPv6 的
# 此选项不影响 `DedicatedServer' 的设置,也就是说,对于已经指定专用服务器的域名,只通过专用服务器进行查询
# 可选值:`false' 或 `true'
ParallelQuery true
# UDPAntiPollution <BOOLEAN>
# 是否开启 UDP 防污染 (since 2.6 b1)
# “防污染”指的是过滤伪造的 DNS 数据包
# 开启时需要保证 `UDPServer' 中存在国外的 DNS 服务器,如果配合使用 `UDPBlock_IP' 选项将大大提高过滤的精确度
# 可选值:`false' 或 `true'
UDPAntiPollution true
# UDPBlock_IP <IP1>,<IP2>,.....
# 阻挡含有以下 IP 地址(只支持 IPv4 地址)的 UDP DNS 数据包 (since 2.6 b1)
# 以下列表中已经含有部分伪造的 IP 地址,可以执行 `dnsforwarder -P' 来获取更多伪造的 IP 地址
# 如果 `UDPAntiPollution' 为 `false',此选项无效
UDPBlock_IP 243.185.187.39,46.82.174.68,37.61.54.158,93.46.8.89,59.24.3.173,203.98.7.65,8.7.198.45,78.16.49.15,159.106.121.75
#########################
# 排除列表
#########################
# ExcludedDomain <DOMAIN1>,<DOMAIN2>,.....
# 排除列表,每个域之间用半角逗号 (`,') 分隔,同时注意最后不要有逗号 (since 2.2)
# 支持通配符。 (since 2.2.2)
# 一个项目如果不含通配符,则从域名尾部开始匹配,例如 `
123.com' 则会匹配所有以 `
123.com' 结尾的域名。
# 如果含通配符则严格按照通配符来匹配。
# 可以有多条 `ExcludedDomain' 选项 (since 2.2.2)
ExcludedDomain
# GfwList <STRING>
# 加载 GFW List (since 2.2.3)
# GFW List 中的域名将被添加到排除列表
# 只有当 `PrimaryServer' 的值为 `UDP' 才会加载 GFW List (否则排除掉全用 UDP 了)
# 如果保留为空,则不载入 GFW List
#GfwList
https://autoproxy-gfwlist.googlecode.com/svn/trunk/gfwlist.txt# GfwListBase64Decode <BOOLEAN>
# GFW List 是否需要 Base64 解码
# 可选值:`false' 或 `true'
GfwListBase64Decode true
# GfwListUpdateInterval <NUM>
# 重新载入 GFW List 的间隔时间,秒 (since 2.2.4)
# -1 表示不重新载入
# 如果保留为空。则使用默认值 (7200)
GfwListUpdateInterval 7200
# GfwListRetryInterval <NUM>
# 当下载 GFW List 失败后的重试时间,秒 (since 2.2.4)
# 如果保留为空,则使用默认值 (30)
GfwListRetryInterval 30
# GfwListDownloadPath <STRING>
# GFW List 下载到本地文件的路径 (since 2.3)
# 如果保留为空,则默认在与程序所在相同的文件夹内
GfwListDownloadPath
#########################
# Hosts
#########################
# Hosts <STRING>
# Hosts 文件路径 (绝对路径),可以是本地 Hosts 文件,也可以是网络上的 Hosts 文件 (以 http:// 或者 https:// 开头)。 (since 2.2)
# 例如 C:\Windows\System32\drivers\etc\hosts 或 /etc/hosts 或
http://xxx.com/hosts# 在 Hosts 文件中,支持通配符 (`*' 和 `?') (只能在域名中出现通配符)
# 路径两头不要加引号
# Hosts 文件必须是原始格式,不能是压缩文件或者 HTML 文件
# Hosts 文件最好是 ANSI 编码的
# Hosts 中的 IPv6 地址不用加方括号
# 如果保留为空,则不从文件载入 Hosts
Hosts
# HostsUpdateInterval <NUM>
# 重新载入 Hosts 文件的间隔时间,秒 (since 2.2)
# -1 表示不重新载入
# 如果保留为空,则使用默认值 (600)
HostsUpdateInterval 1800
# HostsDownloadPath <STRING>
# 当 Hosts 为网络 Hosts 时,Hosts 文件的下载到本地文件的路径 (不是文件夹路径) (since 2.2)
# 例如 C:\Windows\Temp\hosts 或者 /tmp/hosts
# 绝对路径,路径两头不要加引号
# 如果文件存在则覆盖
# 对本地 Hosts 文件此选项无效
# 如果保留为空,则使用默认路径 (默认在与程序所在相同的文件夹内 (since 2.3) )
HostsDownloadPath
# HostsScript <STRING>
# 当 Hosts 为网络 Hosts 时,在每次下载完 Hosts 文件后、加载 Hosts 文件之前执行的脚本 (since 2.2)
# 绝对路径,路径两头不要加引号
# 对本地 Hosts 文件此选项无效
# 如果保留为空,则不执行脚本
HostsScript
# HostsRetryInterval <NUM>
# 当网络 Hosts 下载失败后的重试时间,秒 (since 2.2.2)
# 仅对网络 Hosts 有效
# 如果保留为空,则使用默认值 (30)
HostsRetryInterval 30
# AppendHosts <HOSTS>,<HOSTS>,<HOSTS>,...
# 附加的 Hosts,即使 `Hosts' 选项为空也照样载入 (since 2.2.2)
# <HOSTS>的写法与文件中的一样,同样支持通配符
# IPv6 地址不用加方括号
# 多条 Hosts 可以用半角逗号分隔开,也可以写多条 `AppendHosts'
# 比如可以写成:
# AppendHosts 127.0.0.1
123.com,127.0.0.1
456.com,1.2.3.4 foobar.*
# 也可以分多条写:
# AppendHosts 127.0.0.1
123.com# AppendHosts 127.0.0.1
456.com# AppendHosts 1.2.3.4 foobar.*
#
# 也可以定义 CName 的 Hosts 项,例如:
# AppendHosts
www.google.cn *.google.com
# 这样所有匹配 *.google.com 的域名都将指向
www.google.cn 的 IP 地址 (since 2.3)
#
# 如果使某些域名跳过在 Hosts 中的查询,可以
# AppendHosts @@ *.012345.com
# 这样所有匹配 *.012345.com 的域名都不会在 Hosts 中查询
AppendHosts
##################################################
#
# 缓存控制
#
##################################################
# UseCache <BOOLEAN>
# 是否使用缓存(默认为文件缓存) (since 2.2)
# 可选值:`false' 或 `true'
UseCache true
# CacheSize <NUM>
# 缓存大小 (字节)
# 缓存大小不能小于 102400 (100KB) (since 2.3)
CacheSize 1048576
# MemoryCache <BOOLEAN>
# 是否使用内存缓存,而不是文件缓存 (since 2.3.2)
# 可选值:`false' 或 `true'
MemoryCache true
# CacheFile <STRING>
# 手工指定缓存文件 (不是文件夹) (since 2.3)
# 如果保留为空,则默认在与程序所在相同的文件夹内
# 如果 `MemoryCache' 为 `true',此选项无效
CacheFile
# IgnoreTTL <BOOLEAN>
# 是否忽略 TTL (since 2.2)
# 可选值:`false' 或 `true'
# 为 `true' 时将忽略 TTL,此时所有的缓存条目将不会被移除
# 为 `false' 时不忽略 TTL,缓存条目将会按照 TTL 的时间来移除
# 当 `UseCache' 的值为 `false' 时,此选项无效
IgnoreTTL false
# OverrideTTL <NUM>
# 强制使所有缓存的条目的 TTL 为 <NUM> (since 2.2)
# 若 <NUM> 为 -1,则表示不进行强制
# 当 `UseCache' 的值为 `false' 时,此选项无效
# 当 `IgnoreTTL' 的值为 `true' 时,此选项无效
OverrideTTL -1
# MultipleTTL <NUM>
# 将所有缓存条目的 TTL 加倍,倍数为 <NUM> (since 2.2)
# 当 `UseCache' 的值为 `false' 时,此选项无效
# 当 `IgnoreTTL' 的值为 `true' 时,此选项无效
# 当 `OverrideTTL' 的值不为 -1 时,此选项无效
MultipleTTL 3
# ReloadCache <BOOLEAN>
# 当程序启动后是否重新载入已有的文件缓存 (since 2.2.3)
# 已有的缓存大小必须和 `CacheSize' 所指定的大小相等
# 可选值:`false' 或 `true'
# 如果 `MemoryCache' 的值为 `true',此选项无效
ReloadCache false
# OverwriteCache <BOOLEAN>
# 如果已有的文件缓存无法重载,是否直接将其覆盖掉 (since 2.3)
# 可选值:`false' 或 `true'
# 如果 `MemoryCache' 的值为 `true',此选项无效
# 如果 `ReloadCache' 的值为 `false',此选项无效
OverwriteCache false
##################################################
#
# 杂项
#
##################################################
# UDPThreads <NUM>
# 在本地进行 UDP 监听的线程数 (since 2.2)
UDPThreads 3
# DisabledType <NUM1>,<NUM2>,.....
# 禁止查询的 DNS 类型列表,每个类型(用数字代表)之间用半角逗号 (`,') 分隔 (since 2.2)
# 所有的 DNS 类型:
# A 1 IPv4 地址
# AAAA 28 IPv6 地址
# APL 42
# CERT 37
# CNAME 5
# DHCID 49
# DLV 32769
# DNAME 39
# DNSKEY 48
# DS 43
# HIP 55
# IPSECKEY 45
# KEY 25
# KX 36
# LOC 29
# MX 15
# NAPTR 35
# NS 2 Name Server
# NSEC 47
# NSEC3 50
# NSEC3PARAM 51
# PTR 12 Domain pointer
# RRSIG 46
# RP 17
# SIG 24
# SOA 6 start of authority record
# SPF 99
# SRV 33
# SSHFP 44
# TA 32768
# TKEY 249
# TSIG 250
# TXT 16
# ANY 255
# AXFR 252
# IXFR 251
# OPT 41
DisabledType
# DisabledDomain <DOMAIN1>,<DOMAIN2>,.....
# 禁止查询的域列表,每个域之间用半角逗号 (`,') 分隔 (since 2.2)
# 支持通配符。 (since 2.2.2)
# 一个项目如果不含通配符,则从域名尾部开始匹配,例如 `
123.com' 则会匹配所有以 `
123.com' 结尾的域名。
# 如果含通配符则严格按照通配符来匹配。
# 可以有多条DisabledDomain (since 2.2.2)
DisabledDomain
# RefusingResponseCode <NUM>
# 当拒绝一次查询(`DisabledType' 或者 `DisabledDomain')的时候所返回的状态码 (since 2.6 b1)
# 参见 RFC 1035,`4.1.1. Header section format',`Response code'
RefusingResponseCode 0
# DomainStatistic <BOOLEAN>
# 是否启用域名统计 (since 2.5 b1)
# 可选值:`false' 或 `true'
DomainStatistic false
# StatisticUpdateInterval <NUM>
# 域名统计刷新时间间隔(秒) (since 2.5 b1)
StatisticUpdateInterval 29