apt-get install build-essential libcurl4-openssl-dev automake-1.15
git clone http://github.com/holmium/dnsforwarder.git
cd dnsforwarder
make && make install
配置文件内容如下:
# DNS 转发器的配置文件
# Configuration File for dnsforwarder
# 此配置文件最好是 ANSI 编码的
# 相对路径的写法
# Windows:
# 支持用 `% %’ 包围起来的相对路径,比如 `%SYSTEMROOT%\System32\drivers\etc\hosts’。
# `%PROGRAMDIRECTORY%’ 表示程序所在的文件夹。
# `%CONFIGFILEDIRECTORY%’ 表示配置文件所在的文件夹。 (since 6.1.3)
#
# Linux:
# 支持类似 `${HOME}’ 的变量,比如 `${HOME}/hosts’。
# `${PROGRAMDIRECTORY}’ 表示程序的配置文件夹,一般为 `/root/.dnsforwarder/’,执行 `dnsforwarder -p’ 可以获得具体的位置。
# `${CONFIGFILEDIRECTORY}’ 表示配置文件所在的文件夹。 (since 6.1.3)
##################################################
#
# 日志文件设置
#
##################################################
# LogOn <BOOLEAN>
# 是否打开文件日志输出 (since 5.0.4)
LogOn on
# LogFileThresholdLength <NUM>
# 单个日志文件大小的临界值(字节)(since 5.0.4)
# 当日志文件大小超过这个临界值后,当前的日志文件将会被重命名,然后建立一个新的日志文件,继续记录日志
LogFileThresholdLength 102400
# LogFileFolder <PATH>
# 设定日志文件所在的文件夹 (since 5.0.4)
# 日志文件初始的文件名为 `dnsforwarder.log’,当超过临界值之后,将会被重命名为 `dnsforwarder.log.1’、`dnsforwarder.log.2′ 等等,然后重新建立一个 dnsforwarder.log’ 文件
# 此路径的默认值为程序所在的文件夹(Windows)或程序的配置文件夹(Linux)
LogFileFolder
##################################################
#
# 本地
#
##################################################
# UDPLocal <IP[:PORT]>,<IP[:PORT]>,…
# 设置在本地开启的接口的IP地址和端口,可以是本地回环地址 (127.0.0.1) ,本地局域网,以及互联网 (since 6.0.0)
# 如果是 IPv6 地址,请在IP两端加上方括号(不包含端口部分),例如 [::1]:53 (本地回环)、[fe80::699c:f79a:9bb6:1]:5353 (since 6.0.0)
# 可以设置多个地址,用半角逗号(`,’)分割
# 如果不指定端口,则默认为 53
#
# 示例:
# UDPLocal 127.0.0.1:53,[::1]:53
UDPLocal 127.0.0.1:53
# 这一版本暂时不支持在本地开启 TCP 端口,以后会加上
##################################################
#
# IP 选择策略
#
##################################################
#########################
# 服务器地址
#########################
# UDPGroup <IP1[:PORT],IP2[:PORT],…> <DOMAIN1,DOMAIN2,…> <on|off>
# 设置一个 UDP 上游服务器组,并指定通过这些上游服务器查询的域名 (since 6.0.0)
# 第一部分参数“<IP1[:PORT],IP2[:PORT],…>”,用于指定 UDP 上游服务器,不写端口则默认使用 53 端口
# 第二部分参数“<DOMAIN1,DOMAIN2,…>”,用于指定通过这些 UDP 上游服务器查询的域名,可以包含通配符
# 第三部分参数“<on|off>”,用于指定是否开启并发查询,`on’ 为开启,`off’ 为不开启
# 并发查询指的是,向所有指定的 UDP 服务器发送查询请求,取最先接受到的未屏蔽的回复作为查询结果,并丢弃其余的回复
# 可以有多条 `UDPGroup’ 选项
#UDPGroup 1.2.4.8:53,114.114.114.114 * on
# TCPGroup <IP1[:PORT],IP2[:PORT],…> <DOMAIN1,DOMAIN2,…> <no|PROXY1[:PORT],PROXY2[:PORT],…>
# 设置一个 TCP 上游服务器组,并指定通过这些上游服务器查询的域名 (since 6.0.0)
# 第一部分参数“<IP1[:PORT],IP2[:PORT],…>”,用于指定 TCP 上游服务器,不写端口则默认使用 53 端口
# 第二部分参数“<DOMAIN1,DOMAIN2,…>”,用于指定通过这些 TCP 上游服务器查询的域名,可以包含通配符
# 第三部分参数“<no|PROXY1[:PORT],PROXY2[:PORT],…>”,用于指定查询时使用的 Socks5 代理,不写端口则默认使用 1080 端口。`no’ 代表不使用代理
# 可以有多条 `TCPGroup’ 选项
#
# 示例一:
# TCPGroup 1.2.4.8:53,114.114.114.114 *.example.com 192.168.50.5:8080,192.168.50.6:8080
# `*.example.com’ 将通过 192.168.50.5:8080 或 192.168.50.6:8080 两个 Socks5 代理,使用 TCP 协议向 1.2.4.8:53 或 114.114.114.114 进行查询
# 示例二:
# TCPGroup 8.8.8.8,114.114.114.114:53 * no
# `*.example.com’ 将使用 TCP 协议直接向 8.8.8.8 或 114.114.114.114:53 进行查询,不使用代理
TCPGroup 8.8.8.8,8.8.4.4,208.67.222.222:443 * no
# GroupFile <PATH>
# 从文件加载服务器组 (since 6.1.3)
# 服务器组文件的写法请参阅:http://github.com/holmium/dnsforwarder/wiki/GroupFile-%E7%9A%84%E5%86%99%E6%B3%95-%7C-How-to-write-GroupFiles
# 可以有多条 `GroupFile’ 选项
#
# 示例一:
# GroupFile D:\group.txt
#
# 示例二:
# GroupFile /etc/group.txt
GroupFile
# 注意:
# 1.对于没有指定服务器的域名,会随机选择一个服务器组进行查询。
# 2.如果某域名匹配多个服务器组,则选择的顺序如下:
# (1) 优先选择不含通配符的匹配项,如果仍然有多条匹配,则选择匹配度最高的那个,
# 如果匹配度相同的情况下仍然有多条匹配,则选择最后一个。
# (例如 `ipv6.microsoft.com’ 比 `microsoft.com’ 对于域名 `teredo.ipv6.microsoft.com’ 的匹配度更高)
# (2) 然后选择包含通配符的匹配项,如果有多条匹配,则选择第一个;
# 组合示例:
# 一、以 microsoft.com 或 office.com 结尾的域名通过 UDP 服务器 1.2.4.8 查询,其它域名通过 TCP 服务器 8.8.4.4 查询:
# UDPGroup 1.2.4.8 microsoft.com,office.com on
# TCPGroup 8.8.4.4 * no
# 两行顺序请保持一致
#########################
# 服务器选项
#########################
# BlockIP <IP1>,<IP2>,…..
# 阻挡含有以下 IP 地址(支持 IPv4 和 IPv6 地址)的 DNS 数据包 (since 6.0.0)
# IPv6 地址不用加方括号
BlockIP 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
# IPSubstituting <IP1 IP’1>,<IP2 IP’2>,…..
# 替换 DNS 数据包中的 IP 地址(只支持 IPv4 地址) (since 5.0.1)
# 例如:
# IPSubstituting 127.0.0.1 1.2.0.127
# 的效果是把 DNS 数据包中所有的 127.0.0.1 地址替换为 1.2.0.127
# 仅替换通过服务器(TCP 和 UDP)查询而来的 DNS 数据包,对于缓存中和 Hosts 中的结果无效
# 多条替换项目用半角逗号 (`,’) 分隔,也可以写多行 `IPSubstituting’
IPSubstituting
# BlockNegativeResponse <BOOLEAN>
# 是否过滤来自上游服务器的查询未成功的响应 (since 6.1.1)
# 查询未成功指:格式错误、服务器错误、域名不存在和服务器拒绝请求等
# 参见 RFC 6895,`2.3. RCODE Assignment’
BlockNegativeResponse false
#########################
# IP 列表(仅支持 IPv4 地址)
#########################
# IP 列表用于自动检测一组 IP 地址,将相应最快的 IP 地址甄选出来
# GoodIPList <NAME> <INTERVAL>
# 定义一个 IP 列表,<NAME> 为改列表的名称,<INTERVAL> 为检测列表中 IP 地址有效性的间隔时间(毫秒)
# 例如:
# GoodIPList list1 60000
# GoodIPListAddIP <LIST_NAME> <IP:PORT>
# 向一个 IP 列表中添加 IP 地址
# 例如:
# GoodIPListAddIP list1 120.0.0.1:80
#########################
# Hosts
#########################
# Hosts <STRING>
# Hosts 文件的 URL,可以是本地 Hosts 文件 (以 file:// 开头,支持相对路径),也可以是网络上的 Hosts 文件 (以 http:// 或者 http:// 开头)。 (since 5.0.5)
# 例如 file://C:/Windows/System32/drivers/etc/hosts 或 file:///etc/hosts 或 http://xxx.com/hosts
# 写多条 `Hosts’ 可以指定多个 Hosts 文件,路径两头不要加引号
# 在 Hosts 文件中,支持通配符 (`*’ 和 `?’) (只能在域名中出现通配符)
# Hosts 文件必须是原始格式,不能是压缩文件或者 HTML 文件
# Hosts 文件最好是 ANSI 编码的
# Hosts 中的 IPv6 地址不用加方括号
# 如果保留为空,则不从文件载入 Hosts
Hosts
# HostsUpdateInterval <NUM>
# 重新载入 Hosts 文件的间隔时间,秒 (since 2.2)
# -1 表示不重新载入
# 如果保留为空,则使用默认值 (18000)
HostsUpdateInterval 18000
# HostsDownloadPath <PATH>
# Hosts 文件的下载到本地文件的路径 (不是文件夹路径) (since 2.2)
# 例如 C:\Windows\Temp\hosts 或者 /tmp/hosts
# 支持相对路径 (since 5.0.3)
# 如果文件存在则覆盖
# 如果保留为空,则默认在与程序所在相同的文件夹内(Windows)或程序的配置文件夹内(Linux)
HostsDownloadPath
# HostsScript <PATH>
# 在每次下载完 Hosts 文件后、加载 Hosts 文件之前执行的脚本 (since 2.2)
# 支持相对路径 (since 5.0.3)
# 如果保留为空,则不执行脚本
HostsScript
# HostsRetryInterval <NUM>
# 当网络 Hosts 下载失败后的重试时间,秒 (since 2.2.2)
# 仅对网络 Hosts 有效
# 如果保留为空,则使用默认值 (30)
HostsRetryInterval 30
# AppendHosts <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.*
#
# 也可以定义指向一个 IP 列表的 Hosts 项(仅支持 IPv4 地址),例如:
# AppendHosts <list1> www.123.com
# 此时 www.123.com 将会指向 list1 中最快的 IP 地址。
#
# 也可以定义 CName 的 Hosts 项,例如:
# AppendHosts www.google.cn *.google.com
# 这样所有匹配 *.google.com 的域名都将指向 www.google.cn 的 IP 地址 (since 2.3)
#
# 如果使某些域名跳过在 hosts 中的查询,可以
# AppendHosts @@ *.012345.com
# 这样所有匹配 *.012345.com 的域名都不会在 hosts 中查询
#
# 各种 hosts 的优先级从高到低
# 带 `@@’ 的禁止项
# 一般 hosts 项
# CName hosts 项
AppendHosts
# BlockIpv6WhenIpv4Exists <BOOLEAN>
# 如果一个域名在 Hosts 被指定了一个 IPv4 地址(包括文件 Hosts 和 `AppendHosts’ 指定的 Hosts),那么拒绝对这个域名的 IPv6 地址查询 (since 5.0.12, renamed after 6.0.0)
BlockIpv6WhenIpv4Exists false
##################################################
#
# 缓存控制
#
##################################################
# UseCache <BOOLEAN>
# 是否使用缓存(默认为文件缓存) (since 2.2)
# 可选值:`false’ 或 `true’
UseCache false
# CacheSize <NUM>
# 缓存大小 (字节)
# 缓存大小不能小于 102400 (100KB) (since 2.3)
CacheSize 1048576
# MemoryCache <BOOLEAN>
# 是否使用内存缓存,而不是文件缓存 (since 2.3.2)
# 如果 `UseCache’ 为 `false’,此选项无效
# 可选值:`false’ 或 `true’
MemoryCache true
# CacheFile <PATH>
# 手工指定缓存文件 (不是文件夹) (since 2.3)
# 支持相对路径 (since 5.0.3)
# 如果保留为空,则默认在与程序所在相同的文件夹内(Windows)或程序的配置文件夹内(Linux)
# 如果 `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’ 时,此选项无效
# 此选项等同于 `CacheControl * fixed <NUM>’ (since 5.0.18)
OverrideTTL -1
# MultipleTTL <NUM>
# 将所有缓存条目的 TTL 加倍,倍数为 <NUM> (since 2.2)
# 当 `UseCache’ 的值为 `false’ 时,此选项无效
# 当 `IgnoreTTL’ 的值为 `true’ 时,此选项无效
# 此选项等同于 `CacheControl * vari <NUM>x+0′ (since 5.0.18)
MultipleTTL 1
# CacheControl <DOMAIN> [$[$]]<TYPE> [ARGUMENT]
# 控制域名 <DOMAIN> 的缓存行为 (since 5.0.18)
# 如果缓存未开启,则此选项无效
# <DOMAIN> 是域名;[$[$]] 是传染设定;<TYPE> 是类型;[ARGUMENT] 是参数
# <DOMAIN> 支持通配符,支持尾部匹配
# <TYPE> 有以下可选项(均为小写):
# orig : 使用原先的 TTL,即不改变指定域名记录的 TTL,此类型无需 [ARGUMENT] 参数
# nocache : 不缓存指定域名记录,此类型无需 [ARGUMENT] 参数
# fixed : 将指定域名记录的 TTL 修改为一个预先指定的常数值,这个值通过 [ARGUMENT] 参数指定
# vari : 将指定域名记录的 TTL 修改为一个预先规定的变量,这个变量通过 [ARGUMENT] 参数指定,此时 [ARGUMENT] 参数的格式为 `ax+b’,其中 a、b 为非负整数(需用户手工指定),x 为记录原先的 TTL 值(不需要用户指定)。此选项必须为 `ax+b’ 的形式,不能是 `ax-b’ 或者其它的变体形式
#
# 示例:
# CacheControl baidu.com orig # 不改变以 `baidu.com’ 结尾的域名的 TTL
# CacheControl 163.com nocache # 不缓存以 `163.com’ 结尾的域名
# CacheControl qq.com fixed 500 # 把所有以 `qq.com’ 结尾的域名的 TTL 修改为 500
# CacheControl sina.com.cn vari 2x+200 # 把所有以 `sina.com.cn’ 结尾的域名的 TTL 的值修改为 2x+200,其中 x 是域名记录原先的 TTL 值
#
# 传染机制:
# 某些域名有 CName 记录,例如 www.windowsupdate.com:
# ;; QUESTION SECTION:
# ;www.windowsupdate.com. IN A
#
# ;; ANSWER SECTION:
# www.windowsupdate.com. 3585 IN CNAME windowsupdate.microsoft.nsatc.net. (记录一)
# windowsupdate.microsoft.nsatc.net. 285 IN CNAME www.update.microsoft.com.nsatc.net. (记录二)
# www.update.microsoft.com.nsatc.net. 285 IN A 134.170.58.222 (记录三)
# www.update.microsoft.com.nsatc.net. 285 IN A 65.55.50.157 (记录四)
#
# 如果仅仅指定了 `www.windowsupdate.com’ 的缓存控制,那么 `windowsupdate.microsoft.nsatc.net’ 和 `www.update.microsoft.com.nsatc.net’ 的记录以什么规则进行处理?是继承 `www.windowsupdate.com’ 的缓存设置,还是使用自己专门的设置(如果有的话)?
# 可以指定传染机制来解决这个问题
# 有以下传染机制(以 `www.windowsupdate.com’ 为例):
# 主动传染 : 所有的域名记录不论是否存在单独指定的控制条目,均使用 `www.windowsupdate.com’ 的控制条目
# 被动传染 : 如果存在单独指定的控制条目,那么使用单独指定的控制条目,否则使用 `www.windowsupdate.com’ 的控制条目
# 不传染 : 如果存在单独指定的控制条目,那么使用单独指定的控制条目,如果没有则不修改记录的 TTL 值
# 只有被查询的域名控制条目才具有传染性质
# 写法:
# 主动传染 (此为默认情况):
# CacheControl www.windowsupdate.com fixed 1000
# CacheControl 163.com orig
# 被动传染(<TYPE> 前加一个 `$’):
# CacheControl www.windowsupdate.com $fixed 1500
# CacheControl sina.com.cn $nocache
# 不传染(<TYPE> 前加两个 `$’):
# CacheControl www.windowsupdate.com $$fixed 2000
# CacheControl windowsupdate.microsoft.nsatc.net $$vari 2x+100
#
# 示例(仍然以 `www.windowsupdate.com’ 为例):
# CacheControl www.windowsupdate.com fixed 1000
# CacheControl windowsupdate.microsoft.nsatc.net fixed 500
# 效果是:记录一、二、三和四的 TTL 都会被修改为 1000
#
# CacheControl www.windowsupdate.com $fixed 1000
# CacheControl windowsupdate.microsoft.nsatc.net fixed 500
# 效果是:记录一、三和四的 TTL 会被修改为 1000,记录二的 TTL 会被修改为 500
#
# CacheControl www.windowsupdate.com $$fixed 1000
# CacheControl windowsupdate.microsoft.nsatc.net fixed 500
# 效果是:记录一的 TTL 会被修改为 1000,记录二的 TTL 会被修改为 500,记录三和四的 TTL 不会被修改
# 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
##################################################
#
# 杂项
#
##################################################
# 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
# DisabledList <PATH>
# 从文件载入到禁用列表 (since 5.0.3)
# 写多条 `DisabledList’ 可以加载多个文件,路径两头不要加引号
DisabledList
# DomainStatistic <BOOLEAN>
# 是否启用域名统计 (since 2.5 b1)
# 域名信息统计会依照模板文件记录域名的查询情况
# 记录的结果在与程序所在相同的文件夹内(Windows)或程序的配置文件夹内(Linux)的`statistic.html’文件内
# 可选值:`false’ 或 `true’
DomainStatistic false
# DomainStatisticTempletFile <PATH>
# 域名统计的模板文件路径 (since 5.0.23)
# 如果保留为空,则默认为与程序所在相同的文件夹内(Windows)或程序的配置文件夹内(Linux)的`StatisticTemplate.html’文件
DomainStatisticTempletFile
# StatisticInsertionPosition <STRING>
# 指定在模板文件中写入的位置 (since 5.0.23)
# 如果保留为空,则默认为`<!– INSERT HERE –>’
# StatisticInsertionPosition <!– INSERT HERE –>
# StatisticUpdateInterval <NUM>
# 域名统计刷新时间间隔(秒) (since 2.5 b1)
StatisticUpdateInterval 29