杏泉网络: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解析,在底层操作上也不是直接塞进去的,而是需要先转换为一个特殊的域名。具体来说:
- 比如我想查询
198.18.3.1
的域名 - 先把地址反过来,变成
1.3.18.198
- 然后在后面拼接上
.in-addr.arpa
- 最后变成:
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
写在最后
有了域名,能干的事情就很多了,比如虚拟主机什么的,都很大程度上依赖域名
生命不息,折腾不止
(完)
请问是上海杏泉科技有限公司吗()
和那个没啥关系