pdnsd的优秀替代方案——dnsforwarder

使用pdnsd的目的一般在于将UDP的DNS请求转换为TCP进行发送,虽然TCP协议的DNS在效率上不及UDP协议,但是可以实现一些UDP很难做到的功能,比如通过Socks5代理端口进行透明代理。所以TCP的DNS在一些领域还是很有市场。

 

早期的方案一般是使用Pdnsd建立本地的DNS服务器,然后将请求该服务器的UDP请求转换为TCP请求向上游服务器进行发送,同时还可进行DNS缓存,而且可以设置超长时间的缓存时间。更厉害的是,Pdnsd可以设置DNS结果黑名单自动使用备用DNS服务器进行“二次请求”,是应对DNS污染的大杀器。Pdnsd虽然运行很稳定,但是也已经五六年没有好好更新过了,目前源码可以在https://github.com/SAPikachu/pdnsd.git 上获得。一般来说是不推荐使用过气的开源项目的,所以我们要寻找一个可靠的继任者来接替Pdnsd的工作。这个继任的软件要有Pdnsd原来的主要功能,而且又要易于编译使用和维护。开发者还要活跃,要经过长时间的使用测试证明其稳定性。

在初步的探索之后,觉得dnsforwarder这个新颖的工具不错,源码地址:https://github.com/holmium/dnsforwarder

 

由于没有Linux编译好的release,所以这个项目需要我们去编译。编译也不麻烦,首先clone代码到本地,然后执行如下命令

(注:

Windows版可直接下载执行文件,无需编译,

下载地址:https://github.com/holmium/dnsforwarder/wiki/%E5%AE%89%E8%A3%85%E5%92%8C%E9%83%A8%E7%BD%B2-%7C-Deployment

我编译的Linux版本(V6)下载地址:http://download.csdn.net/download/lvshaorong/10023744

然后执行编译配置

 

方案一(推荐,需安装wget):

 

./configure --enable-downloader=wget

 

 

 

这一句主要是指定下载 Hosts 时调用的库或者程序,有两种方案,一个是libcurl(默认),一个是wget,还有no,但是no将不能使用网络 Hosts 功能,其实对我们来说网络HOST不是一个必须的功能。所以不要也无所谓。因为如果你要使用wget或者libcurl需要安装相关的依赖包,其中libcurl不光需要安装libcurl.x86_64,而且还需要安装libcurl-devel.x86_64。和相关依赖包,比较麻烦。而wget一般的Linux发行版都含有,所以编译基本不会碰到依赖的问题,又可以使用全部的功能,所以推荐用wget

 

方案二(需要安装libcurl 和 libcurl-devel及其依赖包):

 

./configure


方案三(无需任何依赖,但没有网上下载HOST功能):

 

 

./configure --enable-downloader=no

 

 

然后就可以开始编译了

 

make

 

 

编译完之后会在当前目录下出现一个名为dnsforwarder的可执行文件,还可以找到一个名为config的配置文件,把这两个文件拷贝出来,就可以使用了。

 

如果你运行dnsforwarder这个文件,那么它会在当前目录下自动寻找config配置文件加载,也可以使用-f 配置文件路径进行加载。

 

默认的config文件没有什么特殊的功能,需要在此基础上进行修改

首先最重要的就是把UDP的DNS请求转换为TCP,这样才能方便代理转发。改起来也非常容易,只需找到

 

UDPGroup 1.2.4.8:53,114.114.114.114 * on

这一行并且#注释掉,新加一行

 

 

TCPGroup 8.8.8.8,8.8.4.4,208.67.222.222:443 * no


可以指定多个上游DNS服务器,不同服务器之间使用逗号分割,可以指定端口,如5353,443等不容易被污染的端口。

 

 

Pdnsd的二次查询功能也可以轻松实现,通过设置BlockIP列表,把常见的垃圾IP地址填进去,dnsforwarder就会在你设置的多个DNS服务器中请求多次,如果某个上游DNS返回被污染的地址就弃用,如果不是就作为结果。这个列表就是修改下面这一行

 

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

 

另外dnsforwarder还有很多优秀的新功能,

比如动态替换上游DNS的查询结果,可以把某些网站的DNS结果指定为我们想要的其他结果,方便内网服务器测试;

设置日志文件的位置,而且日志文件还可以自动归档,日志文件非常清晰便于纠错和统计;

手动指定HOST文件,用来手工指定DNS查询的结果,可以搭建内网DNS服务器(HOST路径可以为HTTP格式,自动下载网上的HOST文件直接用);

使用文件缓存+内存缓存,加快某些经常访问网站的查询速度;

还可以限定查询IP地址的类型,比如屏蔽IPv4的DNS结果,只保留IPv6的结果,可以测试网站的IPv6表现;

对于网络工程师来说非常有用。

 

 

改完之后的config文件如下,其他功能可以根据注释进行修改,由于都是中文注释,而且异常详尽,所以改起来很方便,在此就不多赘述了。

 

# 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)
# 服务器组文件的写法请参阅:https://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:// 或者 https:// 开头)。 (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

运行方法,首先将编译出来的dnsforwarder赋予可执行权限,然后使用root用户(开启1000以内端口必须用root,如果是1000之外的端口可以使用普通用户)运行,-f 参数后跟配置文件路径,-d参数后台执行,所以执行命令

sudo ./dnsforwarder -f ./config -d

 

官方的注释太复杂,下面贴出一个精简版的,可以直接改名为dnsforwarder.config,然后和dnsforwarder.exe放在同一个目录下,然后直接使用cmd命令执行dnsforwarder.exe即可把你的windows电脑编程一个抗污染DNS服务器。

LogOn true
LogFileThresholdLength 102400
LogFileFolder 
UDPLocal 192.168.2.105:53
TCPGroup 208.67.222.222,208.67.222.222,208.67.220.220 * no
GroupFile
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,69.63.187.12,31.13.76.8,31.13.64.49
IPSubstituting
BlockNegativeResponse false
Hosts
HostsUpdateInterval 18000
HostsDownloadPath
HostsScript
HostsRetryInterval 30
AppendHosts
BlockIpv6WhenIpv4Exists false
UseCache true
CacheSize 1048576
MemoryCache true
CacheFile
IgnoreTTL false
OverrideTTL -1
MultipleTTL 1
ReloadCache false
OverwriteCache false
DisabledType
DisabledDomain
DisabledList
DomainStatistic false
DomainStatisticTempletFile
StatisticUpdateInterval 29

如果你想要通过socks5,HTTP代理转发DNS请求,那么dnsforwarder可能无法满足你了,这时你需要一个功能同样丰富的windows工具Pcap_DNSProxy,我有一篇文章专门介绍《一分钟快速搭建Windows防污染DNS服务器——Pcap_DNSProxy

 

 


 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值