Lan Tian @ Blog

在 DN42 中设置 IPv6 反向解析

DN42 全称 Decentralized Network 42(42 号去中心网络),是一个大型的 VPN 网络。但是与其它传统 VPN 不同的是,DN42 使用了大量在互联网骨干上应用的技术(例如 BGP),可以很好的模拟一个真实的网络环境。

我在先前的一篇文章中加入了 DN42 网络,并在另一篇文章中注册了自己的域名,设置了自己的 DNS 服务器。然后,我在这一篇文章设置了 IPv4 的反向解析。当时由于 DN42 Wiki 上的信息有点问题,导致我当时认为不能设置 IPv6 反向解析,但经过我尝试后发现是可以的。

因为设置的是大体相同的东西,所以本文会和之前 IPv4 的文章有比较多的内容重复(复制粘贴)。

设置 IP 段的解析服务器

第一步是将自己所有的 IP 段解析到自己的 DNS 服务器上,我的服务器是 ns[1-2].lantian.dn42,可以全填。

在 IPv4 文中我直接用了原先的设置,但是因为我 IPv6 的 DNS 设置有问题,不得不改,因此只能发一次 Pull Request 修改 IPv6 的 DNS 服务器,并顺手把 IPv4 的也改了。

在 git clone 下 DN42 的数据文件后,在自己的 IP 段文件中添加这样一句话:

nserver:            ns1.lantian.dn42
nserver:            ns2.lantian.dn42

整个文件就看起来像这个样子:

inet6num:           fdbc:f9dc:67ad:0000:0000:0000:0000:0000 - fdbc:f9dc:67ad:ffff:ffff:ffff:ffff:ffff
netname:            LANTIAN-IPV6
descr:              Peer with me at b980120@hotmail.com
country:            CN
admin-c:            LANTIAN-DN42
tech-c:             LANTIAN-DN42
mnt-by:             LANTIAN-MNT
nserver:            ns1.lantian.dn42
nserver:            ns2.lantian.dn42
status:             ASSIGNED
cidr:               fdbc:f9dc:67ad::/48
source:             DN42

接下来 git add,git commit,发 Pull Request 等待合并,等待递归 DNS 生效等等。

设置 PowerDNS

在等待的同时,就可以把解析服务器先搭起来。首先按照这篇文章,我们已经有了一个 PowerDNS 的服务器。而解析 IP,其实类似于解析一个特殊的域名。

因为 IPv6 地址够多,DN42 中人手一个 /48 块,因此不存在像 IPv4 一样,需要根据 IP 段的大小加上“/29”等内容。IPv6 的特殊域名就是 “[IP 顺序反过来].ip6.arpa”。例如我的 fdbc:f9dc:67ad::/48 对应的就是 d.a.7.6.c.d.9.f.c.b.d.f.ip6.arpa。

将这个域名添加到 PowerDNS 中,如图:

插图

然后就是为每个 IP 设置自己的反向解析记录,即 PTR 记录。例如 fdbc:f9dc:67ad::8b:c606:ba01 的就是 1.0.a.b.6.0.6.c.b.8.0.0.0.0.0.0.0.0.0.0.d.a.7.6.c.d.9.f.c.b.d.f.ip6.arpa,如图填写:

插图

但是这样手动转换很容易少 0,出现问题。偷懒的办法是找一台 Linux 或 Mac 机器运行 dig -x fdbc:f9dc:67ad::8b:c606:ba01,出现如图输出:

插图

其中 QUESTION SECTION 下面就会出现 IPv6 地址对应的 PTR 记录名:

;; QUESTION SECTION:
;1.0.a.b.6.0.6.c.b.8.0.0.0.0.0.0.0.0.0.0.d.a.7.6.c.d.9.f.c.b.d.f.ip6.arpa. IN PTR

此例中即为 1.0.a.b.6.0.6.c.b.8.0.0.0.0.0.0.0.0.0.0.d.a.7.6.c.d.9.f.c.b.d.f.ip6.arpa。

等待 DN42 的递归 DNS 生效之后,就可以用 dig -x [IP 地址] @172.23.0.53 的命令查询反向记录了。

在 DN42 中设置 IP 反向解析

DN42 全称 Decentralized Network 42(42 号去中心网络),是一个大型的 VPN 网络。但是与其它传统 VPN 不同的是,DN42 使用了大量在互联网骨干上应用的技术(例如 BGP),可以很好的模拟一个真实的网络环境。

我在先前的一篇文章中加入了 DN42 网络,并在另一篇文章中注册了自己的域名,设置了自己的 DNS 服务器。有了 DNS 服务器,我们就可以给自己的 IP 也设置上反向解析记录。反向解析记录的主要用途是反垃圾邮件,以及在 ping、traceroute 等网络工具中或许能好看一点。

设置 IP 段的解析服务器

第一步是将自己所有的 IP 段解析到自己的 DNS 服务器上,我的服务器是 ns[1-3].lantian.dn42,理论上可以全填,但是由于 DN42 现在修改配置需要发 Pull Request,流程比较长,我就保留了最初注册这个 IP 时设置的 DNS 服务器,只有 ns1.lantian.dn42。

在 git clone 下 DN42 的数据文件后,在自己的 IP 段文件中添加这样一句话:

nserver:            ns1.lantian.dn42

整个文件就看起来像这个样子:

inetnum:            172.22.76.184 - 172.22.76.191
netname:            LANTIAN-IPV4
remarks:            Peer with me at b980120@hotmail.com
descr:              Peer with me at b980120@hotmail.com
country:            CN
admin-c:            LANTIAN-DN42
tech-c:             LANTIAN-DN42
mnt-by:             LANTIAN-MNT
nserver:            ns1.lantian.dn42
status:             ASSIGNED
cidr:               172.22.76.184/29
source:             DN42

接下来 git add,git commit,发 Pull Request 等待合并,等待递归 DNS 生效等等。

设置 PowerDNS

在等待的同时,就可以把解析服务器先搭起来。首先按照这篇文章,我们已经有了一个 PowerDNS 的服务器。而解析 IP,其实类似于解析一个特殊的域名。

对于 /24 的 IP 段,这个特殊的域名就是 [IP 顺序反过来].in-addr.arpa,例如 192.168.0.0/24 的就是 0.168.192.in-addr.arpa。但多数 DN42 用户用不到 /24,只注册了 /26 至 /29 的 IP 段,就需要把 IP 最后一位连上“/26”等一起处理。以我的 IP 段 172.22.76.184/29 为例,对应域名就是 184/29.76.22.172.in-addr.arpa。

将这个域名添加到 PowerDNS 中,如图:

插图

然后就是为每个 IP 设置自己的反向解析记录,即 PTR 记录。例如 172.22.76.185 的就是 185.184/29.76.22.172.in-addr.arpa,如图填写:

插图

等待 DN42 的递归 DNS 生效之后,就可以用 dig -x [IP 地址] @172.23.0.53 的命令查询反向记录了,类似下图:

插图

另外 DN42 的 IPv6 反向解析可以在这篇文章看到。

在 DN42 中注册自己的域名

DN42 全称 Decentralized Network 42(42 号去中心网络),是一个大型的 VPN 网络。但是与其它传统 VPN 不同的是,DN42 使用了大量在互联网骨干上应用的技术(例如 BGP),可以很好的模拟一个真实的网络环境。

我在先前的一篇文章中加入了 DN42 网络,并连接了大部分自己拥有的 VPS。(剩下几台是没有 Tun/Tap 的 OpenVZ VPS,无法加入)之前我就知道 DN42 拥有自己的域名体系,例如 DN42 的 Wiki 站(https://wiki.dn42.us/Home)就可以在 DN42 中以 https://internal.dn42 的域名访问,但是之前没有时间去完成域名注册,并且当时对 DN42 的了解还不够。这个月我完成了域名注册,就来分享一下过程。

搭建权威 DNS 服务器

权威 DNS 服务器,就是指管理某个域名记录的服务器。例如本站主域名 lantian.pub 的权威服务器是 lv3ns[1-4].ffdns.net,就是 CloudXNS。在互联网上注册域名时,我们可以用现成的 CloudXNS、Cloudflare 等免费 DNS 服务,但是在 DN42 中,虽然有人提供这样的服务,但是需要在 IRC 上与他们交流申请,我觉得太麻烦,就干脆自建了。

Linux 下自建 DNS 一般使用 Bind 或 PowerDNS 两款软件。Bind 以文件形式保存 DNS 记录,跨服务器同步有些麻烦,而 PowerDNS 不仅可以用文件保存,还可以用 MySQL 等数据库形式保存,同时自己也提供记录同步功能。

由于我配置 PowerDNS 自带的记录同步功能总是失败,查不出原因,我就干脆设置了 MySQL 主从复制来进行同步。

搭建 DNS:设置 MySQL 主从同步

首先,在每台服务器中安装一个 MySQL,并且在 my.cnf 设置上这些内容:

# 每台服务器的编号,随便设置,但不能重复
server-id=1
# 每台服务器的名称,设置后可以在 phpMyAdmin 中看到从服务器的名字
report-host=Master
# MySQL 日志文件的位置,主从复制的核心文件
log_bin=mysql-bin
log_error=mysql-bin.err

然后用 phpMyAdmin 登录主 MySQL 服务器,在“Replication / 主从复制”页面将这台服务器设置为 Master / 主服务器,并创建一个用于主从复制的用户(拥有 REPLICATION SLAVE 和 REPLICATION CLIENT 权限)。由于这一步我已经做过了,所以我没法截图。

设置完后你应该可以看到类似这样的状态:

插图

其中的“File / 文件名”就是日志文件名,“Position / 位置”就是当前记录的行数。记下这两个值。

然后,关闭所有服务器上的 MySQL,用 rsync 之类方法把数据库复制到从服务器上,覆盖掉各自的数据目录,再打开所有的 MySQL。如果是没什么数据库写入操作的站,例如个人小博客,可以尝试不关主服务器 MySQL,但是可能会造成复制出去的数据损坏。

然后,用 phpMyAdmin 登录从 MySQL 服务器。因为 phpMyAdmin 在设置从服务器时有奇怪的 bug,所以我没用它的向导来设置,而是直接执行 SQL:

change master to master_host='服务器 IP',
master_user='主从复制用户名',
master_password='主从复制用户密码',
master_log_file='主服务器日志文件名',
master_log_pos=主服务器记录行数;
start slave;

然后进入“Replication / 主从复制”页面,点击“See slave status table / 查看从服务器状态表”,确认 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes,主从同步就已经开始了。

插图

搭建 DNS:设置 PowerDNS

设置完数据库,我们就可以设置 PowerDNS 了。先在 MySQL 给 PowerDNS 建立一个用户和数据库。因为我是 Docker 用户,所以在主服务器上,直接用 docker-compose 下载镜像并启动:

powerdns:

image: psitrax/powerdns
container_name: powerdns
restart: always
entrypoint: "/entrypoint.sh --cache-ttl=120 --master=yes --slave=yes"
environment:
  - MYSQL_HOST=数据库服务器地址
  - MYSQL_USER=数据库用户名
  - MYSQL_PASS=数据库密码
  - MYSQL_DB=数据库名字
ports:
  - "DN42 内的 IP 地址:53:53"
  - "DN42 内的 IP 地址:53:53/udp"

然后 PowerDNS 可能会启动失败,提示在创建 comments 表时某些列过长。这是因为 MySQL 的一些配置被修改了,导致数据表的行为发生了变化,而这些列最长可达 64000 Bytes,修改后的数据表存不下。

解决这个问题不需要再改数据库配置,只需要把 64000 改小,例如 16000,然后手动创建表即可:

CREATE TABLE domains (
  id                    INT AUTO_INCREMENT,
  name                  VARCHAR(255) NOT NULL,
  master                VARCHAR(128) DEFAULT NULL,
  last_check            INT DEFAULT NULL,
  type                  VARCHAR(6) NOT NULL,
  notified_serial       INT DEFAULT NULL,
  account               VARCHAR(40) DEFAULT NULL,
  PRIMARY KEY (id)
) Engine=InnoDB;

CREATE UNIQUE INDEX name_index ON domains(name);

CREATE TABLE records (
  id                    INT AUTO_INCREMENT,
  domain_id             INT DEFAULT NULL,
  name                  VARCHAR(255) DEFAULT NULL,
  type                  VARCHAR(10) DEFAULT NULL,
  content               VARCHAR(64000) DEFAULT NULL,
  ttl                   INT DEFAULT NULL,
  prio                  INT DEFAULT NULL,
  change_date           INT DEFAULT NULL,
  disabled              TINYINT(1) DEFAULT 0,
  ordername             VARCHAR(255) BINARY DEFAULT NULL,
  auth                  TINYINT(1) DEFAULT 1,
  PRIMARY KEY (id)
) Engine=InnoDB;

CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
CREATE INDEX recordorder ON records (domain_id, ordername);

CREATE TABLE supermasters (
  ip                    VARCHAR(64) NOT NULL,
  nameserver            VARCHAR(255) NOT NULL,
  account               VARCHAR(40) NOT NULL,
  PRIMARY KEY (ip, nameserver)
) Engine=InnoDB;

CREATE TABLE comments (
  id                    INT AUTO_INCREMENT,
  domain_id             INT NOT NULL,
  name                  VARCHAR(255) NOT NULL,
  type                  VARCHAR(10) NOT NULL,
  modified_at           INT NOT NULL,
  account               VARCHAR(40) NOT NULL,
  comment               VARCHAR(16000) NOT NULL,
  PRIMARY KEY (id)
) Engine=InnoDB;

CREATE INDEX comments_domain_id_idx ON comments (domain_id);
CREATE INDEX comments_name_type_idx ON comments (name, type);
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);

CREATE TABLE domainmetadata (
  id                    INT AUTO_INCREMENT,
  domain_id             INT NOT NULL,
  kind                  VARCHAR(32),
  content               TEXT,
  PRIMARY KEY (id)
) Engine=InnoDB;

CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind);

CREATE TABLE cryptokeys (
  id                    INT AUTO_INCREMENT,
  domain_id             INT NOT NULL,
  flags                 INT NOT NULL,
  active                BOOL,
  content               TEXT,
  PRIMARY KEY(id)
) Engine=InnoDB;

CREATE INDEX domainidindex ON cryptokeys(domain_id);

CREATE TABLE tsigkeys (
  id                    INT AUTO_INCREMENT,
  name                  VARCHAR(255),
  algorithm             VARCHAR(50),
  secret                VARCHAR(255),
  PRIMARY KEY (id)
) Engine=InnoDB;

CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);

这下 PowerDNS 就能成功启动了,但是它还没有任何记录。

搭建 DNS:安装 PowerAdmin

PowerAdmin 是一个 PowerDNS 的控制面板,可以去 https://github.com/poweradmin/poweradmin 下载安装。安装过程只需要跟着向导走即可,在此略过。

安装完后,进入主界面:

插图

点“Add Master Zone / 添加主区域”,这里是添加你要解析的域名的地方。在“Zone Name / 域名”中填入域名,然后直接确定。

返回主界面,点“List Zones / 域名列表”,点击域名左边的编辑按钮进行管理,进入如下界面,这里以我的 DN42 域名 lantian.dn42 为例:

插图

最开始装完 PowerAdmin 之后,创建的 SOA 记录开头可能是没有类似 ns1.lantian.dn42 一类的内容的,这样的 SOA 记录就不符合规范。我的 SOA 记录是“ns1.lantian.dn42 lantian.lantian.dn42 0 28800 7200 604800 60”,解释如下:

  • ns1.lantian.dn42:主要 DNS 服务器的名字,一般就是你现在在操作的服务器之后要取的域名。
  • lantian.lantian.dn42:DNS 服务器管理者的邮箱,但是 @ 符号被句点代替了,例如这里就是 lantian@lantian.dn42。在 DN42 中不一定需要真实地址。
  • 0:记录编号,如果使用 AXFR 等进行 DNS 记录同步,从 DNS 服务器可能会根据这个编号判断记录有没有更改。我们使用 MySQL 主从复制,所以这里不重要。这里设置为 0 代表 PowerDNS 会自动管理这一项,无需人工操作。
  • 28800:刷新时间,AXFR 从服务器两次拉取的间隔,同样不重要。
  • 7200:重试时间,AXFR 从服务器拉取失败后,再次拉取的时间,同样不重要。
  • 604800:过期时间,AXFR 从服务器拉取失败后,最多用先前最后一次拉取成功的记录继续提供服务这么长时间,之后停止应答。同样不重要。
  • 60:最小 TTL,所有记录的最小刷新时间,至少过了这么长时间才会刷新。

点击 SOA 记录左边的编辑按钮,对应着设置好,保存。

接下来要设置 NS 记录,指明你的域名由这几台 DNS 服务器提供服务。我这次设置 3 台服务器,分别是 ns[1-3].lantian.dn42,需要分别创建相应的 NS 记录,这样填写即可:

插图

一一提交即可。

最后设置 A 记录 指明域名指向某台服务器,这样填写即可:

插图

主 PowerDNS 服务器到此设置完成。因为设置了 MySQL 主从同步,所以你的配置也已经同步到了其它服务器上,在相应的服务器上安装 PowerDNS 即可。

最后 dig 一下自己的服务器测试:

插图

在 DN42 注册域名

DN42 最近进行了一次升级,弃用了原来的 Monotone 管理界面,改用 Git 管理。首先去 https://git.dn42.us/explore/repos 上面注册一个账号,Fork dn42/registry,Clone 到本地。

首先,DN42 要求 Git Commit 经过 GPG 数字签名。我在 Mac 上使用的软件是 GPG Keychain,Windows / Linux 下使用什么软件我并不了解。大致流程是:创建密钥,将公钥提交到 SKS 等公开 GPG 服务器上供查询,然后复制下 Fingerprint。

然后设置 git,打开自动签名每次 commit 的功能:

git config --global user.signingKey [你的 Fingerprint]
git config --global commit.gpgSign true

因为我是 DN42 老用户,已经有了自己的 MNT Handle,就打开 data/mntner/LANTIAN-MNT,加入相应的指纹信息,类似如下:

mntner:             LANTIAN-MNT
admin-c:            LANTIAN-DN42
tech-c:             LANTIAN-DN42
mnt-by:             LANTIAN-MNT
source:             DN42
auth:               pgp-fingerprint 23067C13B6AEBDD7C0BB567327F31700E751EC22

然后创建 data/dns/lantian.dn42:

domain:             lantian.dn42
admin-c:            LANTIAN-DN42
tech-c:             LANTIAN-DN42
mnt-by:             LANTIAN-MNT
nserver:            ns1.lantian.dn42 172.22.76.186
nserver:            ns1.lantian.dn42 fdbc:f9dc:67ad::8b:c606:ba01
nserver:            ns2.lantian.dn42 172.22.76.185
nserver:            ns2.lantian.dn42 fdbc:f9dc:67ad::dd:c85a:8a93
nserver:            ns3.lantian.dn42 172.22.76.187
nserver:            ns3.lantian.dn42 fdbc:f9dc:67ad::18:ca0f:741d
status:             CONNECT
source:             DN42

然后 git add,git commit,git push,然后发 Pull Request 等待合并,并根据管理员的提示修改可能出现的错误。

插图

因为 DN42 中采用 Anycast DNS,每个人都能建立递归 DNS 服务器,而每个人从中心库拉取配置的频率不一,因此可能要等最长一个星期的时间,你的域名才能生效。

插图

到此 DN42 域名就注册成功了,接下来就可以在上面配置网站、邮件、IRC、游戏服务器等等了。

用Pdnsd,给你的DNS解析缓存加速

你向浏览器里输入了一串网址后,浏览器并不能马上找到这个网站。它会先把网址发送给DNS服务器,DNS服务器再向其它服务器一层层查询,直到根服务器,查出网站的IP地址,浏览器才能进行连接。

因此,每次你打开一个新的网站,这个过程都要重复一次,速度比较慢。而且,天朝电信的DNS还会劫持你到114导航之类的地方。

所以,我们可以在自己电脑上搭建一个DNS服务器,用来加速浏览,并有抗解析干扰等附加效果。

在Linux和Mac下,Pdnsd就是一个这样的小软件。它通过向其它DNS服务器以TCP或UDP形式发出请求,查询到域名对应的IP,并进行缓存,以便达到加速目的。

1.安装

如果是Linux,以Ubuntu为例:

sudo apt-get install pdnsd
sudo gedit /etc/pdnsd.conf

如果是Mac,需要先安装Homebrew:

ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
brew install pdnsd
sudo nano /Library/LaunchDaemons/pdnsd.plist

写入如下内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
      <key>Label</key>
      <string>pdnsd</string>
      <key>Program</key>
      <string>/usr/local/sbin/pdnsd</string>
      <key>RunAtLoad</key>
      <true/>
      <key>ServiceDescription</key>
      <string>pdnsd dns caching daemon</string>
  </dict>
</plist>
</pre>

然后在终端继续操作:

<pre class="prettypaint">
sudo nano /usr/local/etc/pdnsd.conf

操作完成后,应该打开了Pdnsd的配置文件,我们要进行修改。

2.开始配置DNS服务器。

首先把整个配置文件清空,当然有可能本来就是空的。然后我们要先进行基本设置。

global {
        perm_cache=16384;
        cache_dir="/var/pdnsd";
        run_as="nobody";
        server_ip=127.0.0.1;
        status_ctl=on;
        paranoid=off;
        # 优先TCP方式查询抗干扰
        query_method=tcp_udp;
        min_ttl=600;
        timeout=10;
}

在国内查询某些网站的IP地址时,会受到某些故障服务器的干扰,返回的IP地址会不对,导致打不开这个网站。但是这是对于基于UDP 53端口的DNS来说的,如果改用TCP查询,就不会受到干扰。而Win、Mac、Linux默认使用UDP 53端口查询。利用Pdnsd,可以把TCP的DNS转换到UDP来使用。

min_ttl是域名解析的最短生效时间,单位是秒。比如这个设置成600,那么你在第一次请求一个网站的IP之后600秒(10分钟)内,Pdnsd可以起到缓存效果。一般这个设置不宜过小也不宜过大,设置在600-3600之间较合理。

然后,我们就可以开始设置上级DNS服务器了。

国内最干净安全的DNS服务器应该是114DNS,它在各个省份都有节点,速度很快。因此我们可以先配置一个来使用。

server{
        # 优先走国内的114DNS解析
        label="114 DNS";
        ip=114.114.114.114;
        # 检测到干扰就跳过
        reject=4.36.66.178,8.7.198.45,37.61.54.158,46.82.174.68,59.24.3.173,
                64.33.88.161,64.33.99.47,64.66.163.251,65.104.202.252,65.160.219.113,
                66.45.252.237,72.14.205.99,72.14.205.104,78.16.49.15,93.46.8.89,
                128.121.126.139,159.106.121.75,169.132.13.103,192.67.198.6,202.106.1.2,
                202.181.7.85,203.98.7.65,203.161.230.171,207.12.88.98,208.56.31.43,
                209.36.73.33,209.145.54.50,209.220.30.174,211.94.66.147,213.169.251.35,
                216.221.188.182,216.234.179.13,243.185.187.39;
        edns_query=on;
        reject_policy=fail;
}

网民们发现那些故障服务器返回的IP有一个规律,就是属于上面那张表之中,而那些IP不指向任何已知网站,不会干扰正常访问。

114DNS由于同样受到干扰,因此从上游服务器查询时也会返回错误IP,我们予以过滤即可。

另一个著名的DNS是谷歌提供的,优点是十分干净,TCP下不会受到任何干扰。但是为什么我们不直接用谷歌DNS呢?

这是由于大型网站一般采用CDN,如果直接用谷歌DNS,部分网站会把你带到外国节点去,速度很慢。所以能用国内114DNS解析的就解析掉,受到故障影响再去谷歌DNS。

配置如下:

server {
        # Google DNS 基于TCP解析
        label="Google DNS";
        ip=8.8.8.8,8.8.4.4;
        # 检测到干扰就跳过
        reject=4.36.66.178,8.7.198.45,37.61.54.158,46.82.174.68,59.24.3.173,
                64.33.88.161,64.33.99.47,64.66.163.251,65.104.202.252,65.160.219.113,
                66.45.252.237,72.14.205.99,72.14.205.104,78.16.49.15,93.46.8.89,
                128.121.126.139,159.106.121.75,169.132.13.103,192.67.198.6,202.106.1.2,
                202.181.7.85,203.98.7.65,203.161.230.171,207.12.88.98,208.56.31.43,
                209.36.73.33,209.145.54.50,209.220.30.174,211.94.66.147,213.169.251.35,
                216.221.188.182,216.234.179.13,243.185.187.39;
        edns_query=on;
        reject_policy=fail;
}

但是我们无法确定故障今后会不会波及谷歌DNS,因此还是予以过滤。对于接下来的DNS同理。

下一个著名的是V2EX DNS,如果你把google.com敲成google.cmo,它能自动帮你纠正,或者直接把你带到谷歌进行搜索。由于它支持非标准端口,所以一般也不会受到故障影响。

server {
        # V2EX DNS 进行域名拼写纠正
        label="V2EX DNS";
        ip=199.91.73.222,178.79.131.110;
        port=3389;
        # 检测到干扰就跳过
        reject=4.36.66.178,8.7.198.45,37.61.54.158,46.82.174.68,59.24.3.173,
                64.33.88.161,64.33.99.47,64.66.163.251,65.104.202.252,65.160.219.113,
                66.45.252.237,72.14.205.99,72.14.205.104,78.16.49.15,93.46.8.89,
                128.121.126.139,159.106.121.75,169.132.13.103,192.67.198.6,202.106.1.2,
                202.181.7.85,203.98.7.65,203.161.230.171,207.12.88.98,208.56.31.43,
                209.36.73.33,209.145.54.50,209.220.30.174,211.94.66.147,213.169.251.35,
                216.221.188.182,216.234.179.13,243.185.187.39;
        edns_query=on;
        reject_policy=fail;
}

然后是OpenDNS,通过5353端口,也不会受到影响。

server {
        # OpenDNS 走5353端口反干扰
        label="OpenDNS";
        ip=208.67.222.222,208.67.220.220;
        port=5353;
        # 检测到干扰就跳过
        reject=4.36.66.178,8.7.198.45,37.61.54.158,46.82.174.68,59.24.3.173,
                64.33.88.161,64.33.99.47,64.66.163.251,65.104.202.252,65.160.219.113,
                66.45.252.237,72.14.205.99,72.14.205.104,78.16.49.15,93.46.8.89,
                128.121.126.139,159.106.121.75,169.132.13.103,192.67.198.6,202.106.1.2,
                202.181.7.85,203.98.7.65,203.161.230.171,207.12.88.98,208.56.31.43,
                209.36.73.33,209.145.54.50,209.220.30.174,211.94.66.147,213.169.251.35,
                216.221.188.182,216.234.179.13,243.185.187.39,
                # 拒绝OpenDNS域名导航
                208.69.32.0/24,208.69.34.0/24,208.67.219.0/24,208.67.217.0/24,
                208.67.216.0/24,67.215.82.0/24,67.215.65.0/24;
        edns_query=on;
        reject_policy=fail;
}

NameCoin大家听说过没?这是和BitCoin差不多的东西,大家可以自己搜索。使用NameCoin可以注册.BIT域名,但是由于属于私下组织的域名,DNS根服务器不认可,不给你解析。因此,有些网友就自己搭建了BIT域名的根服务器。

但是由于BIT域名不多(几乎没人用),这个属于可选项目,不对其它域名产生任何影响。另外,如果要添加,这个就要直接放在第一块global的下面,放在别的地方是不行的。

server {
        # BIT域名专用服务器
        label="Bit DNS";
        ip=192.249.59.89,192.184.89.74,64.31.48.60,192.3.27.117;
        # 检测到干扰就跳过
        reject=4.36.66.178,8.7.198.45,37.61.54.158,46.82.174.68,59.24.3.173,
                64.33.88.161,64.33.99.47,64.66.163.251,65.104.202.252,65.160.219.113,
                66.45.252.237,72.14.205.99,72.14.205.104,78.16.49.15,93.46.8.89,
                128.121.126.139,159.106.121.75,169.132.13.103,192.67.198.6,202.106.1.2,
                202.181.7.85,203.98.7.65,203.161.230.171,207.12.88.98,208.56.31.43,
                209.36.73.33,209.145.54.50,209.220.30.174,211.94.66.147,213.169.251.35,
                216.221.188.182,216.234.179.13,243.185.187.39;
        reject_policy=fail;
        policy=excluded;
        include=".bit";
}

但是如果以上服务器全挂掉了,我们就干脆自己去查询根服务器吧。

server {
        # 实在不行就走根服务器查询
        label="Root DNS Servers";
        root_server=discover;
        randomize_servers=on;
        ip=198.41.0.4,192.228.79.201,192.33.4.12,199.7.91.13,192.203.230.10,
                192.5.5.241,192.112.36.4,128.63.2.53,192.36.148.17,192.58.128.30,
                193.0.14.129,199.7.83.42,202.12.27.33;
        # 检测到欺骗就跳过
        reject=4.36.66.178,8.7.198.45,37.61.54.158,46.82.174.68,59.24.3.173,
                64.33.88.161,64.33.99.47,64.66.163.251,65.104.202.252,65.160.219.113,
                66.45.252.237,72.14.205.99,72.14.205.104,78.16.49.15,93.46.8.89,
                128.121.126.139,159.106.121.75,169.132.13.103,192.67.198.6,202.106.1.2,
                202.181.7.85,203.98.7.65,203.161.230.171,207.12.88.98,208.56.31.43,
                209.36.73.33,209.145.54.50,209.220.30.174,211.94.66.147,213.169.251.35,
                216.221.188.182,216.234.179.13,243.185.187.39;
        edns_query=on;
        reject_policy=fail;
}

然后再加一段本地解析,诸如localhost之类的:

source {
        owner=localhost;
        file="/etc/hosts";
}

rr {
        name=localhost;
        reverse=on;
        a=127.0.0.1;
        owner=localhost;
        soa=localhost,root.localhost,42,86400,900,86400,86400;
}

这样,我们的配置就完成了,然后重启电脑,把电脑的DNS设置改成127.0.0.1就可以了。

附完整配置文件:(赠送HiNet备用解析)

global {
	perm_cache=16384;
	cache_dir="/var/pdnsd";
	run_as="nobody";
	server_ip=127.0.0.1;
	status_ctl=on;
  	paranoid=off;
	# 优先TCP方式查询抗干扰
	query_method=tcp_udp;
	min_ttl=600;
	timeout=10;
}

server {
	# BIT域名专用服务器
	label="Bit DNS";
	ip=192.249.59.89,192.184.89.74,64.31.48.60,192.3.27.117;
	# 检测到干扰就跳过
	reject=4.36.66.178,8.7.198.45,37.61.54.158,46.82.174.68,59.24.3.173,
		64.33.88.161,64.33.99.47,64.66.163.251,65.104.202.252,65.160.219.113,
		66.45.252.237,72.14.205.99,72.14.205.104,78.16.49.15,93.46.8.89,
		128.121.126.139,159.106.121.75,169.132.13.103,192.67.198.6,202.106.1.2,
		202.181.7.85,203.98.7.65,203.161.230.171,207.12.88.98,208.56.31.43,
		209.36.73.33,209.145.54.50,209.220.30.174,211.94.66.147,213.169.251.35,
		216.221.188.182,216.234.179.13,243.185.187.39;
	reject_policy=fail;
	policy=excluded;
	include=".bit";
}


server{
	# 优先走国内的114DNS解析
	label="114 DNS";
	ip=114.114.114.114;
	# 检测到干扰就跳过
	reject=4.36.66.178,8.7.198.45,37.61.54.158,46.82.174.68,59.24.3.173,
		64.33.88.161,64.33.99.47,64.66.163.251,65.104.202.252,65.160.219.113,
		66.45.252.237,72.14.205.99,72.14.205.104,78.16.49.15,93.46.8.89,
		128.121.126.139,159.106.121.75,169.132.13.103,192.67.198.6,202.106.1.2,
		202.181.7.85,203.98.7.65,203.161.230.171,207.12.88.98,208.56.31.43,
		209.36.73.33,209.145.54.50,209.220.30.174,211.94.66.147,213.169.251.35,
		216.221.188.182,216.234.179.13,243.185.187.39;
	edns_query=on;
	reject_policy=fail;
}

server {
	# Google DNS 基于TCP解析
	label="Google DNS";
	ip=8.8.8.8,8.8.4.4;
	# 检测到干扰就跳过
	reject=4.36.66.178,8.7.198.45,37.61.54.158,46.82.174.68,59.24.3.173,
		64.33.88.161,64.33.99.47,64.66.163.251,65.104.202.252,65.160.219.113,
		66.45.252.237,72.14.205.99,72.14.205.104,78.16.49.15,93.46.8.89,
		128.121.126.139,159.106.121.75,169.132.13.103,192.67.198.6,202.106.1.2,
		202.181.7.85,203.98.7.65,203.161.230.171,207.12.88.98,208.56.31.43,
		209.36.73.33,209.145.54.50,209.220.30.174,211.94.66.147,213.169.251.35,
		216.221.188.182,216.234.179.13,243.185.187.39;
	edns_query=on;
	reject_policy=fail;
}

server {
	# OpenDNS 走5353端口反干扰
	label="OpenDNS";
	ip=208.67.222.222,208.67.220.220;
	port=5353;
	# 检测到干扰就跳过
	reject=4.36.66.178,8.7.198.45,37.61.54.158,46.82.174.68,59.24.3.173,
		64.33.88.161,64.33.99.47,64.66.163.251,65.104.202.252,65.160.219.113,
		66.45.252.237,72.14.205.99,72.14.205.104,78.16.49.15,93.46.8.89,
		128.121.126.139,159.106.121.75,169.132.13.103,192.67.198.6,202.106.1.2,
		202.181.7.85,203.98.7.65,203.161.230.171,207.12.88.98,208.56.31.43,
		209.36.73.33,209.145.54.50,209.220.30.174,211.94.66.147,213.169.251.35,
		216.221.188.182,216.234.179.13,243.185.187.39,
		# 拒绝OpenDNS域名导航
		208.69.32.0/24,208.69.34.0/24,208.67.219.0/24,208.67.217.0/24,
		208.67.216.0/24,67.215.82.0/24,67.215.65.0/24;
	edns_query=on;
	reject_policy=fail;
}

server {
	# V2EX DNS 进行域名拼写纠正
	label="V2EX DNS";
	ip=199.91.73.222,178.79.131.110;
	port=3389;
	# 检测到干扰就跳过
	reject=4.36.66.178,8.7.198.45,37.61.54.158,46.82.174.68,59.24.3.173,
		64.33.88.161,64.33.99.47,64.66.163.251,65.104.202.252,65.160.219.113,
		66.45.252.237,72.14.205.99,72.14.205.104,78.16.49.15,93.46.8.89,
		128.121.126.139,159.106.121.75,169.132.13.103,192.67.198.6,202.106.1.2,
		202.181.7.85,203.98.7.65,203.161.230.171,207.12.88.98,208.56.31.43,
		209.36.73.33,209.145.54.50,209.220.30.174,211.94.66.147,213.169.251.35,
		216.221.188.182,216.234.179.13,243.185.187.39;
	edns_query=on;
	reject_policy=fail;
}

server {
	# 台湾HiNet DNS备用
	label="HiNet DNS";
	ip=168.95.1.1,168.95.192.1,168.95.192.2;
	# 检测到干扰就跳过
	reject=4.36.66.178,8.7.198.45,37.61.54.158,46.82.174.68,59.24.3.173,
		64.33.88.161,64.33.99.47,64.66.163.251,65.104.202.252,65.160.219.113,
		66.45.252.237,72.14.205.99,72.14.205.104,78.16.49.15,93.46.8.89,
		128.121.126.139,159.106.121.75,169.132.13.103,192.67.198.6,202.106.1.2,
		202.181.7.85,203.98.7.65,203.161.230.171,207.12.88.98,208.56.31.43,
		209.36.73.33,209.145.54.50,209.220.30.174,211.94.66.147,213.169.251.35,
		216.221.188.182,216.234.179.13,243.185.187.39;
	edns_query=on;
	reject_policy=fail;
}

server {
	# 实在不行就走根服务器查询
	label="Root DNS Servers";
	root_server=discover;
	randomize_servers=on;
	ip=198.41.0.4,192.228.79.201,192.33.4.12,199.7.91.13,192.203.230.10,
		192.5.5.241,192.112.36.4,128.63.2.53,192.36.148.17,192.58.128.30,
		193.0.14.129,199.7.83.42,202.12.27.33;
	# 检测到干扰就跳过
	reject=4.36.66.178,8.7.198.45,37.61.54.158,46.82.174.68,59.24.3.173,
		64.33.88.161,64.33.99.47,64.66.163.251,65.104.202.252,65.160.219.113,
		66.45.252.237,72.14.205.99,72.14.205.104,78.16.49.15,93.46.8.89,
		128.121.126.139,159.106.121.75,169.132.13.103,192.67.198.6,202.106.1.2,
		202.181.7.85,203.98.7.65,203.161.230.171,207.12.88.98,208.56.31.43,
		209.36.73.33,209.145.54.50,209.220.30.174,211.94.66.147,213.169.251.35,
		216.221.188.182,216.234.179.13,243.185.187.39;
	edns_query=on;
	reject_policy=fail;
}

source {
	owner=localhost;
	file="/etc/hosts";
}

rr {
	name=localhost;
	reverse=on;
	a=127.0.0.1;
	owner=localhost;
	soa=localhost,root.localhost,42,86400,900,86400,86400;
}