神代綺凛の随波逐流

[ChinaDNS] 无污染的智能路由 DNS 折腾记 #3

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »

没想到这个系列还能有第三集,应该是完结篇了。这次是因为前不久试用了一下 Linux 的 Windows 子系统,发现意外的不错,与 Windows 本身契合度很高,于是在 Windows 里跑 DNSMasq + ChinaDNS 的设想得以实现√

Head Pic: 「夏コミグッズ…」/「三村ざじゃ」のイラスト [pixiv]

Windows 下的本机无污染 DNS 搭建方案

上一篇文章中,我讲到了在国内服务器上使用 DNSMasq + ChinaDNS 以能在任何支持自定义 DNS 的设备上解决 DNS 污染的方案,但这个方案也有缺点:如果平时你主要是自用,在 Windows 上做到无污染即可,那么为此专门去购买国内服务器(即使是很便宜的学生机)其实也有点大材小用。

不久前不小心才想起来还有一个 Windows 子系统的玩意没试过,说是可以在 Windows 上直接跑 Linux,这样是不是就可以解决没办法在 Windows 上跑 DNSMasq 的问题了?(当然能解决啦

!> Win10 必须是 1607 版本及以后的

这种解决方案还有一个好处,就是可以解决 IPv6 协议的 DNS 设置问题。
当你在 IPv6 下想用其他只支持 IPv4 的服务器做 DNS,IPv6 中的 DNS 地址就只能填写成 IPv4 镜像地址::ffff:1.2.3.4的形式使其立即 fallback 到 IPv4 去解析,虽然日常使用上不会感觉有什么大问题,但是在使用例如nslookup之类的工具时就会发生异常。
而在子系统 Linux 中使用 DNSMasq 可以同时监听 IPv6,因此就可以很好的解决这个问题。

开启 Windows 子系统

1. 开启子系统功能

  1. Win10 系统设置->更新与安全->开发者选项->勾选“开发人员模式”,然后会有文字提示你“正在搜索开发者软件包”之类的,无需理会

  2. 控制面板->程序和功能->启用或关闭 Windows 功能->勾选“适用于 Linux 的 Windows 子系统”->确定,然后等操作完成以后重启

2. 安装子系统 Linux

打开 Win10 应用商店,右上角搜索“Linux”,然后根据结果指引你很容易能找到这里

然后选择你喜欢的 Linux 系统安装即可,我比较喜欢 Debian 所以安装了 Debian

安装完成后打开系统,会让你输入新用户名,直接输入root即可,这样能默认就使用 root 登录,然后根据提示设置一个密码即可

完成后先替换软件源,因为在国内用国外的官方源会非常非常慢

我习惯用nano编辑器,因此之后的所有编辑命令都是nano,你可以用你自己习惯的编辑器命令

nano /etc/apt/sources.list

编辑完之后,nano编辑器是按Ctrl + X再按Y保存

将原来的软件源替换成阿里云的镜像源,以下示例是 Debian 9 的软件源,请你根据自己的系统发行版本来更换软件源

deb http://mirrors.aliyun.com/debian/ stretch main
deb http://mirrors.aliyun.com/debian/ stretch-updates main
deb http://mirrors.aliyun.com/debian-security/ stretch/updates main

然后例行的apt-get二连,并安装后续所需依赖软件

apt-get update
apt-get upgrade -y
apt-get install -y make gcc curl

至此子系统的部署就完成了

部署 ChinaDNS

  1. 下载 ChinaDNS 源码并解压编译
    cd /root
    wget --no-check-certificate  https://github.com/shadowsocks/ChinaDNS/releases/download/1.3.2/chinadns-1.3.2.tar.gz
    tar -zxvf chinadns-1.3.2.tar.gz
    mv chinadns-1.3.2 chinadns
    cd chinadns
    ./configure && make
  2. 更新 chnrouter
    # In /root/chinadns
    curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > chnroute.txt
  3. 配置 supervisor 进程守护
    # 安装 supervisor
    apt-get install -y supervisor
    # 写入配置(8053是ChinaDNS监听端口,你可以修改成其他的,但是请注意端口冲突问题以及后续DNSMasq配置的同步修改)
    echo "[program:chinadns]
    command = /root/chinadns/src/chinadns -p 8053 -m -c /root/chinadns/chnroute.txt -s 114.114.114.114,208.67.222.222:443
    user = root
    autostart = true
    autorestart = true" > /etc/supervisor/conf.d/chinadns.conf
  4. 启动 supervisor 服务
    service supervisor start
    # 然后检查下 ChinaDNS 是否有正常运行
    supervisorctl status

部署 DNSMasq

# 安装 DNSMasq
apt-get install -y dnsmasq
# 写入配置(使用ChinaDNS做上游DNS)
echo "port=53
no-resolv
no-poll
server=127.0.0.1#8053" > /etc/dnsmasq.conf

然后修改一下 DNSMasq 服务的启动命令(重要,请务必修改,否则 DNSMasq 会无法正常使用配置)

编辑 DNSMasq 服务

nano /etc/init.d/dnsmasq

找到start()函数,按照此图注释掉并修改对应语句,然后保存退出

启动 DNSMasq 服务

service dnsmasq start

修改系统 DNS 为本机

将 IPv4 DNS 改为仅127.0.0.1
将 IPv6 DNS 改为仅::1

然后用nslookup试一下,是不是无污染啦

让上面这一套开机自启

由于子系统 Linux 定制内核的特殊性无法运用rc.local那一套开机自启,因此需要曲线救国

新建/root/.boot.sh文件,写入以下内容

#!/bin/sh
service supervisor start
service dnsmasq start

然后打开 Windows 上的“启动”文件夹
路径是C:\Users\你的用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

在这里新建一个文本文件,写入以下代码

CreateObject("Wscript.Shell").run "bash ~/.boot.sh",vbhide

然后将这个文本文件改名为linux.vbs

Windows 上的bash命令实际上就是子系统 Linux 中的bash,进行到这里我相信你应该懂上面的操作是什么意思了√