杏泉网络:DNS篇

前情提要:
如何搭建自己的『暗网』

感觉这个可能会成为一个新的系列,记录每次折腾这个网络的内容

前言

DNS的重要性应该不言而喻,除非你想每次都敲一大串IP地址,还要记忆这个IP地址所对应的服务。

在基础篇里面提到了简单的域名解析服务,是通过Hosts文件来实现的。但现在为了还原真实体验,也为了各端方便使用起见,此处改用BIND作为DNS服务器,相比Host文件来说灵活性会更好,而且也支持更多的解析类型,例如MX,TXT,等等。当然如果你不想玩太深入的话,具体要采用什么DNS服务器其实并没有什么所谓,DNSMasq或者SmartDNS都是挺好的选择。

关于Hosts文件

现在是离题时间,如果对笔者的闲谈不感兴趣,可以直接跳到下一节。

Hosts文件最早其实可以追溯到ARPANet时期,当时并没有什么DNS服务,要想把主机名和互联地址关联起来,就得使用Hosts文件。其典型结构是被大家所熟知的:

#IP Hostname
127.0.0.1 localhost
::1 localhost

在今天来说,Hosts文件也没有完全消失,其目前的作用多多少少可以归类为以下几点:

  • 单机的少量固定域名解析(比如localhost => 127.0.0.1)
  • 阻止少量恶意域名访问(例如阻断广告域名,云端控制域名)
  • 绕过程度较低的DNS污染(例如以前很常见的改Hosts科学上网)
  • 滥用(比如被恶意软件用于重定向指定域名)

当然Hosts文件的缺点也是显而易见的,比如不支持泛域名,不支持其他解析类型,这也就限制了他的用途。DNS服务已经或多或少取代了Hosts文件的作用,可以很轻松做到多设备同步,细粒度解析,更多功能。

部署BIND

两台机器的配置请看上文,此处不再赘述。以下命令建议使用root用户运行。同时请注意,此处的配置仅仅是让你可以以最快的速度上线一个内网DNS服务器,如果你想进一步学习相关配置知识,可以自行查询其他教程,比如这个

因为笔者的US机器相对来说比较稳定,因此选择在US上安装Bind9:

# 关闭systemd-resolved
systemctl disable systemd-resolved --now

# 安装
apt update
apt install bind9 bind9utils

这里顺便列出一些常用命令:

rndc reconfig   #重读配置文件,加载新区域,删除旧区域,**不会**重读区域
rndc reload     #重读区域文件,添加子域名后用这个
named-checkconf #检查配置文件,无输出说明配置文件无语法错误

安装完之后,修改配置文件/etc/bind/named.conf.options,可以放心地清空原文件,然后填入以下内容:

options {
        directory "/var/cache/bind";

        dnssec-validation no; # 暂时用不上,所以关闭
        recursion yes;        # 最好还是打开递归查询

        # 因为同一台机器还跑了别的服务,因此此处需要对接上游DNS
        # 实现非内网域名的正确查询
        # 或者,如果你有SmartDNS或者DNSmasq之类的具备分流功能的软件
        # 那就更建议你先在DNS分流软件上做分流,让BIND单独解析内网域名
        forwarders {
            8.8.8.8;
            1.1.1.1;
        };

        allow-transfer   { "none"; }; # 关闭AXFR,防止被偷家

        # 只监听杏泉网络的地址(本质上就是Loopback口)
        listen-on port 53 { 127.0.0.1; 198.18.3.1; };
        listen-on-v6 port 53 { fd04:17:1::1; };

};

修改区域配置文件/etc/bind/named.conf.local,同样是清空并填入:

# 这其中,xq的你要用到的区域名称,域内的域名就会是以.xq结尾
zone "xq" {
    type master;
    file "/etc/bind/db.xq";
};

接着,新建文件/etc/bind/db.xq,开始编写区域配置文件,加上自己的解析内容:

$TTL    86400
@       IN      SOA     ns.xq. admin.xq. (
                              2025050901 ; 串号,自己改
                              3600       ; Refresh
                              1800       ; Retry
                              1209600    ; Expire
                              86400 )    ; Minimum TTL

        IN      NS      ns.xq.

; 这里往下的内容根据你的需要修改
; 其中,NS记录是必须要有的,指向你的DNS服务器地址
; 其余内容就按需添加了,此处笔者就添加了两条A记录,两条AAAA记录
; 对应美国(1.us.xq)和香港(1.hk.xq)两台机器
ns      IN      A       198.18.3.1
1.us    IN      A       198.18.3.1
1.hk    IN      A       198.18.4.1

1.us    IN      AAAA    fd04:17:1:0::1
1.hk    IN      AAAA    fd04:17:1:1::1

文件中的IN不是『在』的意思,而是表示一个类,叫做Internet类。至于你问我其他的类在哪,只能说他们都消失在历史的长河里了....

保存好之后,执行named-checkconf确认一下配置是否正确,无误之后就可以运行rndc reconfig或者直接重启BIND,刷新配置。同时,建议检查一下53端口的监听情况,看看有没有监听到正确的地址上,免得你的DNS暴露到公网,出现不必要的损失

运行起来后,可以修改/etc/resolv.conf,让机器上所有DNS查询都指向这个BIND服务器:

nameserver 127.0.0.1

检查效果:

# ping -4 1.hk.xq
PING 1.hk.xq (198.18.4.1) 56(84) bytes of data.
64 bytes from 198.18.4.1 (198.18.4.1): icmp_seq=1 ttl=64 time=301 ms
64 bytes from 198.18.4.1 (198.18.4.1): icmp_seq=2 ttl=64 time=150 ms

# ping 1.hk.xq
PING 1.hk.xq(fd04:17:1:1::1 (fd04:17:1:1::1)) 56 data bytes
64 bytes from fd04:17:1:1::1 (fd04:17:1:1::1): icmp_seq=1 ttl=64 time=301 ms
64 bytes from fd04:17:1:1::1 (fd04:17:1:1::1): icmp_seq=2 ttl=64 time=151 ms

反向域名解析

有了正向域名解析,自然想要玩玩反向域名解析(rDNS),重点就是添加PTR记录

要注意的是,反查一个IP地址的域名不是直接把IP地址交给DNS服务器,包括添加PTR解析,在底层操作上也不是直接塞进去的,而是需要先转换为一个特殊的域名。具体来说:

  1. 比如我想查询198.18.3.1的域名
  2. 先把地址反过来,变成1.3.18.198
  3. 然后在后面拼接上.in-addr.arpa
  4. 最后变成:1.3.18.198.in-addr.arpa,用这个来发起反查

理论上来说,IPv6的操作方式也是类似的,但是笔者在这里不是很想做IPv6的PTR(至少不想在没有辅助脚本的情况下做),这是因为IPv6 PTR实在是太过鬼畜,笔者在这里高低得偷个懒。就这么说吧,假如我们要给US机器的地址fd04:17:1:0::1做PTR,那么他按规则拆开后的arpa域名将会是1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0.7.1.0.0.4.0.d.f.ip6.arpa,所以......算了

要添加PTR记录,就需要先添加一个反向区域。修改/etc/bind/named.conf.local,在后面继续添加:

# 你可能已经注意到了,反查域名的分割单位是类,就是有类网络的那个类
# 毕竟,DNS协议设计的时候,还没有CIDR这种玩意
# 如果你想实现无类IP上的PTR,请参阅RFC 2317
# 笔者这个配置实际上对应的是`198.18.0.0/16`,也就是`198.18.0.0/15`的前半部分
# 至于后半部分,`198.19.0.0/16`,笔者打算用于杏泉网络的中国大陆区域,所以在此略过
zone "18.198.in-addr.arpa" {
    type master;
    file "/etc/bind/db.198.18";
};

然后新建文件/etc/bind/db.198.18

$TTL    86400
@       IN      SOA     ns.xq. admin.xq. (
                              2025050901 ; 串号,自己改
                              3600       ; Refresh
                              1800       ; Retry
                              1209600    ; Expire
                              86400 )    ; Minimum TTL

        IN      NS      ns.xq.

; 此处的IP地址依然需要反着写,确保正确拼接
1.3      IN      PTR     ns.xq.
1.3      IN      PTR     1.us.xq.
1.4      IN      PTR     1.hk.xq.

检查效果:

#dig -x 198.18.4.1 +noall +answer
1.4.18.198.in-addr.arpa. 86400  IN      PTR     1.hk.xq.

# ping -4 1.hk.xq
PING 1.hk.xq (198.18.4.1) 56(84) bytes of data.
64 bytes from 1.hk.xq (198.18.4.1): icmp_seq=1 ttl=64 time=302 ms
64 bytes from 1.hk.xq (198.18.4.1): icmp_seq=2 ttl=64 time=150 ms
64 bytes from 1.hk.xq (198.18.4.1): icmp_seq=3 ttl=64 time=150 ms

可以看到正确的主机名

其他节点实现分流

现在回到HK机。

如果你的VPS不用于配置其他服务,单纯作为内网的机器,那么大可直接把DNS服务器(本例中是198.18.3.1)写到相关配置里面,然后直接使用。由于上面已经配置了转发器,所以如果碰到非内网域名,远端BIND也会转交给公网DNS服务器进行解析,服务不会中断。

但是,笔者没啥钱,HK机是用代理的落地机兼任的,也就是说会有大量的出公网需求。如果DNS请求绕远端,除非你需要绕过代理区域限制,否则一方面会增大解析延迟,另一方面也会让公网DNS返回一个并不适合你的地址(比如香港请求就返回香港CDN地址,美国请求就返回美国CDN地址),总之就是拖慢了你机器上的其他服务。为了解决这个问题,笔者选择使用DNSMasq进行分流,只有内网域名才会送远端解析。

首先安装DNSMasq

#关闭systemd-resolved
systemctl disable systemd-resolved --now

#安装DNSmasq
apt update 
apt install dnsmasq

接着,修改/etc/dnsmasq.conf,清空并填入

# 设置侦听的IP
listen-address=127.0.0.1,198.18.4.1

# 内网域名解析
# 只有后缀为xq的才会送远端
server=/.xq/198.18.3.1
server=/.xq/fd04:17:1:0::1

# 别忘了设置指定IP段的也送远端做PTR
rev-server=198.18.0.0/15,198.18.3.1

# 其余域名继续走公网
server=8.8.8.8
server=1.1.1.1

保存,重启,测试可以正常分流解析,也可以拿到对应的PTR结果

# ping -4 google.com
PING  (142.250.71.142) 56(84) bytes of data.
64 bytes from nchkga-aa-in-f14.1e100.net (142.250.71.142): icmp_seq=1 ttl=117 time=1.02 ms
64 bytes from nchkga-aa-in-f14.1e100.net (142.250.71.142): icmp_seq=2 ttl=117 time=1.61 ms

# ping -4 1.us.xq
PING  (198.18.3.1) 56(84) bytes of data.
64 bytes from ns.xq (198.18.3.1): icmp_seq=1 ttl=64 time=150 ms
64 bytes from ns.xq (198.18.3.1): icmp_seq=2 ttl=64 time=150 ms

写在最后

有了域名,能干的事情就很多了,比如虚拟主机什么的,都很大程度上依赖域名

生命不息,折腾不止

(完)


木头箱子脆脆,但是这样正好

如无特殊声明,本站内容均遵循 CC BY-NC-SA 4.0 协议

转载请注明出处并保留作者信息,谢谢!

none
最后修改于:2025年05月17日 02:04

已有 2 条评论

  1. awacido awacido

    请问是上海杏泉科技有限公司吗()

    1. 墨枫梧桐 墨枫梧桐

      和那个没啥关系

添加新评论

提醒:站长手头紧,没有配备『评论回复邮件提醒』功能
评论后,劳烦您隔一段时间回到本页面查看站长回复(一般都会回)