使用说明 - 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 为例)
- 安装依赖项
$ sudo apt-get install build-essential git
- 获取源代码
$ git clone https://github.com/GangZhuo/CleanDNS.git
- 编译
$ cd CleanDNS
$ make
- 安装到 /usr/local/bin
$ sudo cp cleandns /usr/local/bin/
- 创建配置目录
$ mkdir /etc/cleandns
- 复制配置文件
$ 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/
- 修改配置项
$ 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'
- 测试
$ /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
- 安装为服务(以 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