使用说明 - GangZhuo/CleanDNS GitHub Wiki

CleanDNS 用于在本地提供一个无污染的 DNS 服务,她通过 socks5 代理来转发 DNS 请求。CleanDNS 还支持 ECS, 这对需先获取 IP 然后根据 IP 选择是否需要通过代理访问的情况下非常有用,例如,与 http-proxy 结合使用。

注意和限制:

  • 仅支持 socks5 协议的代理,且上游 socks5 代理必须无认证。可以使用 shadowsocks-libev 作为上游代理。

配置和使用

前置条件

  • 根据 shadowsocks-libev 文档,部署和配置好 socks5 代理,假设我们配置好的 socks5 代理为 127.0.0.1:1080。

安装和配置 (以 Debian 为例)

  1. 安装依赖项
$ sudo apt-get install build-essential git
  1. 获取源代码
$ git clone https://github.com/GangZhuo/CleanDNS.git
  1. 编译
$ cd CleanDNS
$ make
  1. 安装到 /usr/local/bin
$ sudo cp cleandns /usr/local/bin/
  1. 创建配置目录
$ mkdir /etc/cleandns
  1. 复制配置文件
$ sudo cp openwrt/files/cleandns.chnroute /etc/cleandns/chnroute.txt
$ sudo cp openwrt/files/cleandns.chnroute6 /etc/cleandns/chnroute6.txt
$ sudo cp openwrt/files/cleandns.config /etc/cleandns/
  1. 修改配置项
$ sudo vim /etc/cleandns/cleandns.config # 也可使用其他文本编辑工具

# 各配置项的说明如下:

config cfg

	# 以下两行配置绑定的 IP:PORT。

	option bind_addr '127.0.0.1'
	option bind_port '5354'

	# chnroute 配置国内 IP 的网段。
	# CleanDNS 根据此配置来选择最优 IP。

	option chnroute '/etc/cleandns/chnroute.txt,/etc/cleandns/chnroute6.txt'

	# china_ip 配置为本机的外网网段。
	# ECS 会带上此网段来请求服务器,因此可获得离本机最近的 IP。
	# 最多可配置两个,以英文逗号分隔,其中一个为 IPv4 网段,另一个为 IPv6 网段。

	option china_ip '203.208.32.0/24'

	# foreign_ip 配置为代理服务器的网段。
	# ECS 会带上此网段来请求服务器,因此可获得离代理服务器最近的 IP。
	# 最多可配置两个,以英文逗号分隔,其中一个为 IPv4 网段,另一个为 IPv6 网段。

	option foreign_ip '172.217.12.0/24'

	# dns_server 配置为上游 DNS 服务器。
	# 可配置多个上游,以英文逗号分隔,CleanDNS 将向每一个服务器发送请求,
	# 当已经获取到最优 IP,或超时时间到达后,未回应的解析结果将被忽略。
	# 可加入 tcp:// 前缀,表示使用 TCP 协议来发送请求,例如:tcp://8.8.8.8:53。

	option dns_server '8.8.8.8:53'

	# 配置向国外服务器发送请求时,是否启用压缩指针。
	# 此配置仅对国外 DNS 服务器起效,如果 DNS 服务器的 IP 为国内 IP,
	# 即使设置了此项,也不启用压缩指针。
	# 当启用代理时,此项应配置为 0,可提高性能。

	option compression '1'

	# timeout 配置的是超时时间(秒)。
	# 超时时间到达后,从已经接收到的解析结果中优选一个返回给请求方。

	option timeout '2'

	# 写入日志到 log_file 指定的文件中。
	# 如果不配置,则以 daemon 运行时,写入到系统日志,
	# 非 daemon 运行时,直接写入到控制台。

	option log_file '/var/log/cleandns.log'

	# log_level 为日志级别,最大 7,越大记录的日志越详细。

	option log_level '5'

	# 默认情况下,CleanDNS 或判定接收到的结果是否已经被污染,如果被污染,将忽略此解析结果,
	# 当此项配置为 1 后,将不启用此污染判定逻辑,认为所有的结果都是正确的。
	# 当启用代理时,此项应配置为 1,可提高性能。

	option lazy '0'

	# proxy 指定上游 socks5 代理。仅支持无认证的 socks5 代理。
	# 如果配置此项,则通过此代理向国外 DNS 服务器发送解析请求。
	# (启用代理时,建议设置 compression 为 0,同时设置 lazy 为 1。)
	# 国内 DNS 服务器,永不会通过代理来访问。

	option proxy 'socks5://127.0.0.1:1080'
  1. 测试
$ /usr/local/bin/clean --config=/etc/cleandns/cleandns.config
# CTRL + C 可停止程序

另起一个 terminal,然后执行如下命令:

$ dig www.google.com @127.0.0.1 -p 5354

如果控制台输出正确的解析结果,则表示代理配置成功,否则请检查以上步骤。

如果提示未找到 dig 命令,可通过如下命令来安装。

$ sudo apt-get install dnsutils
  1. 安装为服务(以 systemd 为例)
$ sudo cp debian/cleandns.service /etc/systemd/system/
$ sudo systemctl start cleandns.service    # 启动服务
$ sudo systemctl status cleandns.service   # 打印服务状态
$ sudo systemctl enable cleandns.service   # 开机运行

更新 chnroute

$ curl -O 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest'
$ cat delegated-apnic-latest | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > chnroute.txt
$ cat delegated-apnic-latest | grep ipv6 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, $5) }' > chnroute6.txt
$ sudo cp chnroute.txt /etc/cleandns/
$ sudo cp chnroute6.txt /etc/cleandns/
$ rm chnroute.txt
$ rm chnroute6.txt
$ rm delegated-apnic-latest