Appearance
DNS
什么是 DNS
域名系统(英语:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
简单来说就是用域名请求服务器换回来 ip 地址
这个网站可以看 dns 请求的结果、同理还有 linux 或者 windows 的 nslookup 命令
DNS records for dn11.top ↓
A records
IPv4 address | Revalidate in |
---|---|
104.21.27.178 | 5m |
172.67.143.107 | 5m |
DNS 服务器使人们无需存储复杂记不住的 ip 地址,而是记住有规律的域名来方便的访问互联网
DNS 记录
DNS 记录是位于权威 DNS 服务器中的指令,提供一个域的相关信息,包括哪些 IP 地址与该域关联,以及如何处理对该域的请求。
常见的 DNS 记录
SOA 记录 - 存储域的管理信息。
bash
;; ANSWER SECTION:
dn11.top. 1800 IN SOA ophelia.ns.cloudflare.com. dns.cloudflare.com. 2322082117 10000 2400 604800 1800
NS 记录 - 存储 DNS 条目的名称服务器。
bash
;; ANSWER SECTION:
dn11.top. 21600 IN NS ophelia.ns.cloudflare.com.
dn11.top. 21600 IN NS phil.ns.cloudflare.com.
A 记录 - 保存域的 IPv4 地址的记录。
bash
;; ANSWER SECTION:
dn11.top. 300 IN A 104.21.27.178
dn11.top. 300 IN A 172.67.143.107
AAAA 记录 - 包含域的 IPv6 地址的记录(与 A 记录相反,A 记录列出的是 IPv4 地址)。
CNAME 记录 - 将一个域或子域转发到另一个域,不提供 IP 地址。
MX 记录 - 将邮件定向到电子邮件服务器。
TXT 记录 - 可让管理员在记录中存储文本注释。这些记录通常用于电子邮件安全。
有几种 DNS 服务器?有几种工作方式?
有两种 DNS 服务器:DNS 递归服务器和 DNS 权威服务器
有两种工作方式:递归和迭代
DNS 客户端设置使用的 DNS 服务器一般都是 DNS 递归服务器,它负责全权处理客户端的 DNS 查询请求,直到返回最终结果。而 DNS 服务器之间一般采用迭代查询方式。
如何工作的
DNS 查询 涉及 4 个 DNS 服务器:
- DNS 递归解析器
DNS 解析器是一种服务器,旨在通过 Web 浏览器等应用程序接收客户端计算机的查询。然后,解析器一般负责发出其他请求,以便满足客户端的 DNS 查询。
常见的
dns
递归解析器有谷歌
8.8.8.8
8.8.4.4
阿里
223.5.5.5
223.6.6.6
百度
180.76.76.76
腾讯 DNSPod
119.29.29.29
CloudFlare
1.1.1.1
更多 https://en.wikipedia.org/wiki/Public_recursive_name_server
- 根域名服务器
根域名服务器是将主机名转换(解析)为 IP 地址的第一步。
根域名服务器(英语:root name server,简称 “根域名服务器”)是互联网域名解析系统(DNS)中最高级别的域名服务器,负责返回顶级域的权威域名服务器地址。
任意正常 linux 发行版可以运行如下命令来看到这 13 台根域名服务器
bash
ubuntu@ubuntu_dn11:~$ dig ns . @8.8.8.8
; <<>> DiG 9.18.12-0ubuntu0.22.04.3-Ubuntu <<>> ns . @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9453
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;. IN NS
;; ANSWER SECTION:
. 71928 IN NS a.root-servers.net.
. 71928 IN NS b.root-servers.net.
. 71928 IN NS c.root-servers.net.
. 71928 IN NS d.root-servers.net.
. 71928 IN NS e.root-servers.net.
. 71928 IN NS f.root-servers.net.
. 71928 IN NS g.root-servers.net.
. 71928 IN NS h.root-servers.net.
. 71928 IN NS i.root-servers.net.
. 71928 IN NS j.root-servers.net.
. 71928 IN NS k.root-servers.net.
. 71928 IN NS l.root-servers.net.
. 71928 IN NS m.root-servers.net.
;; Query time: 0 msec
;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP)
;; WHEN: Fri Oct 06 13:22:43 UTC 2023
;; MSG SIZE rcvd: 239
全球 13 组根域名服务器以英文字母 A 到 M 依序命名,域名格式为 “字母.root-servers.net”。利用任播(anycast)技术在全球多个地点设立镜像站。
截至 2023 年 6 月,全球共有 1719 台根域名服务器在运行。
Q:为什么是 13 组?1700 组不行吗?
A:由于 DNS 和某些协议(未分片的用户数据报协议(UDP)数据包在 IPv4 内的最大有效大小为 512 字节)的共同限制,根域名服务器地址的数量被限制为 13 个。一次返回的数据放不下啦~
Q:anycast 是什么?
A:我们假设有三台服务器 α、β、γ 和一台客户机,这三台服务器都宣告了同样的一个地址比如说 172.16.255.53,客户机访问 172.16.255.53 时,会因为路由协议的原因,选择客户机距离服务器最近的一条路径。假设 α 距离客户机近,访问 172.16.255.53 获得的数据就是 α 服务器给客户机的。
Q:anycast 的好处?
A:防止服务挂掉、流量会自动寻找最佳路径、假设一台服务器挂掉了,整个服务会被另一台服务器承担。 Q:有。这个服务器吗
A:存放这 13 个根域的是一个文件,它被内置在递归服务器内,没有权威服务器会返回。这个域的解析给你。 在这里可以下载到这个文件 https://www.iana.org/domains/root/files 运营商通常需要配置一个 “Root Hints 文件” 来管理 DNS 递归解析器。该文件包含了根区域的权威名称服务器的名称和 IP 地址,以便软件可以引导 DNS 解析过程。对于许多软件来说,这个列表已经内置在软件中。https://www.internic.net/domain/named.root
- TLD 名称服务器
顶级域名(英语:Top-level Domain, TLD)是互联网域名系统的等级中,位于根域空间的最高级域名。
顶级域名服务器这个服务器是搜索特定 IP 地址的下一步,其上托管了主机名的最后一部分(例如,在 dn11.top 中,TLD 服务器为 “top”)。
https://www.iana.org/domains/root/db 这里是世界上完整的顶级域列表。
- 权威性域名服务器
权威性域名服务器是域名服务器查询中的最后一站。
权威名称服务器包含特定于其服务域名的信息(例如,dn11.top)权威性域名服务器包含特定于其所服务的域名的信息(例如 dn11.top),并且它可为递归解析器提供在 DNS A 记录中找到的服务器的 IP 地址(例如找到了上文的 ipv4 地址 104.21.27.178)
图解工作流程
基本工作流程(原初原理)
我这里画了一张图:其中红色服务器为 DNS 递归服务器,PC 上的 DNS 客户端只与 DNS 递归服务器通讯,由递归服务器完成后续查询内容。蓝色云为想要访问的网站的 ip 地址所在的服务器。
我会逐一讲解每个过程(箭头)都做了什么。
本图的前提是 dns 递归服务器中不含任何缓存。
①:PC 通过浏览器输入了 dn11.top 这个域名、dns 客户端收到了请求 dn11.top 这个域名的 ip 的任务、dns 客户端去请求 DNS 递归服务器
②:DNS 递归服务器使用内置的 Root Hint 文件(内有根服务器的 NS 解析和根服务器的 IP 地址)去请求根权威服务器、得到了 TLD 服务器的 NS 解析并得到了 TLD 服务器的 ip 地址
③:TLD 服务器的 ip 地址被返回给 DNS 递归服务器
④:DNS 递归服务器去请求 TLD 服务器、得到了域名权威服务器的 NS 解析并得到了域名权威服务器的 NS 记录和 IP 地址
⑤:域名权威服务器的 ip 地址被返回给 DNS 递归服务器
⑥:DNS 递归服务器去请求域名权威服务器、得到了请求域名最终的 ip
⑦:请求域名最终的 ip 被返回给 DNS 递归服务器
⑧:请求域名最终的 ip 被返回给 PC 上的 DNS 客户端
⑨:PC 上的浏览器用请求域名最终的 ip 访问域名所在的云服务器
⑩:云服务器返回网页数据给 PC 浏览器、实现页面的访问
这种方法会让 dns 递归服务器发出多次请求,其中①是递归查询,后继的三个查询是迭代查询。
递归查询工作流程
我这里画了一张图:其中红色服务器为 DNS 递归服务器,PC 上的 DNS 客户端只与 DNS 递归服务器通讯,由递归服务器和权威服务器的迭代查询完成后续查询内容。蓝色云为想要访问的网站的 ip 地址所在的服务器。
我会逐一讲解每个过程(箭头)都做了什么。
本图的前提是 dns 递归服务器中不含任何缓存。
①:PC 通过浏览器输入了 dn11.top 这个域名、dns 客户端收到了请求 dn11.top 这个域名的 ip 的任务、dns 客户端去请求 DNS 递归服务器
②:DNS 递归服务器使用内置的 Root Hint 文件(内有根服务器的 NS 解析和根服务器的 IP 地址)去请求根权威服务器、根权威服务器收到了请求、找到了 TLD 权威服务器的 NS 记录和 ip 地址
③:根权威服务器请求 TLD 服务器、TLD 服务器收到了请求、找到了域名权威服务器的 NS 记录和 ip 地址
④:TLD 服务器请求域名权威服务器、权威服务器找到了域名的 ip 地址
⑤:域名的 ip 地址从域名权威服务器返回给 TLD 权威服务器
⑥:域名的 ip 地址从 TLD 权威服务器返回给根权威服务器
⑦:域名的 ip 地址从根权威返回给 DNS 递归服务器
⑧:请求域名最终的 ip 被返回给 PC 上的 DNS 客户端
⑨:PC 上的浏览器用请求域名最终的 ip 访问域名所在的云服务器
⑩:云服务器返回网页数据给 PC 浏览器、实现页面的访问
这里的所有查询都是递归的
配置 pdns
接下来我们来搭建一个权威 DNS 服务器
1.openwrt 直接启动
装包
bash
opkg update
opkg install pdns pdns-backend-sqlite3 pdns-recursor sqlite3-cli
初始化数据库
创建文件
bash
mkdir -p /usr/share/doc/pdns-backend-sqlite/
touch schema.sqlite3.sql
bash
nano /usr/share/doc/pdns-backend-sqlite/schema.sqlite3.sql
如下的这个 sql 初始化文件在
https://github.com/PowerDNS/pdns/blob/master/modules/gsqlite3backend/schema.sqlite3.sql
然后在 schema.sqlite3.sql 里写入
sql
PRAGMA foreign_keys = 1;
CREATE TABLE domains (
id INTEGER PRIMARY KEY,
name VARCHAR(255) NOT NULL COLLATE NOCASE,
master VARCHAR(128) DEFAULT NULL,
last_check INTEGER DEFAULT NULL,
type VARCHAR(8) NOT NULL,
notified_serial INTEGER DEFAULT NULL,
account VARCHAR(40) DEFAULT NULL,
options VARCHAR(65535) DEFAULT NULL,
catalog VARCHAR(255) DEFAULT NULL
);
CREATE UNIQUE INDEX name_index ON domains(name);
CREATE INDEX catalog_idx ON domains(catalog);
CREATE TABLE records (
id INTEGER PRIMARY KEY,
domain_id INTEGER DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(10) DEFAULT NULL,
content VARCHAR(65535) DEFAULT NULL,
ttl INTEGER DEFAULT NULL,
prio INTEGER DEFAULT NULL,
disabled BOOLEAN DEFAULT 0,
ordername VARCHAR(255),
auth BOOL DEFAULT 1,
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX records_lookup_idx ON records(name, type);
CREATE INDEX records_lookup_id_idx ON records(domain_id, name, type);
CREATE INDEX records_order_idx ON records(domain_id, ordername);
CREATE TABLE supermasters (
ip VARCHAR(64) NOT NULL,
nameserver VARCHAR(255) NOT NULL COLLATE NOCASE,
account VARCHAR(40) NOT NULL
);
CREATE UNIQUE INDEX ip_nameserver_pk ON supermasters(ip, nameserver);
CREATE TABLE comments (
id INTEGER PRIMARY KEY,
domain_id INTEGER NOT NULL,
name VARCHAR(255) NOT NULL,
type VARCHAR(10) NOT NULL,
modified_at INT NOT NULL,
account VARCHAR(40) DEFAULT NULL,
comment VARCHAR(65535) NOT NULL,
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX comments_idx ON comments(domain_id, name, type);
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);
CREATE TABLE domainmetadata (
id INTEGER PRIMARY KEY,
domain_id INT NOT NULL,
kind VARCHAR(32) COLLATE NOCASE,
content TEXT,
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX domainmetaidindex ON domainmetadata(domain_id);
CREATE TABLE cryptokeys (
id INTEGER PRIMARY KEY,
domain_id INT NOT NULL,
flags INT NOT NULL,
active BOOL,
published BOOL DEFAULT 1,
content TEXT,
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX domainidindex ON cryptokeys(domain_id);
CREATE TABLE tsigkeys (
id INTEGER PRIMARY KEY,
name VARCHAR(255) COLLATE NOCASE,
algorithm VARCHAR(50) COLLATE NOCASE,
secret VARCHAR(255)
);
CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);
初始化 sqlite3
bash
mkdir -p /etc/powerdns/
sqlite3 /etc/powerdns/pdns.sqlite3 < /usr/share/doc/pdns-backend-sqlite/schema.sqlite3.sql
chmod +r /etc/powerdns
配置 powerdns
bash
nano /etc/powerdns/pdns.conf
写入
txt
launch=gsqlite3
gsqlite3-database=/etc/powerdns/pdns.sqlite3
local-address=<!!你的地址!!>:53
server-id=<你的id(用于标识你的pdns)>
解释:由于我们正在配置 pdns 权威服务器,地址可以选一个你自己子网你喜欢的、比如说我在 172.16.3.53
当然监听这种地址需要在网卡上创建一个新 ip
对于 op 来说 可以在 web 管理界面 选择网络 新建一个接口 区域 lan 设备 br-lan 地址为 172.16.3.53
对于监听 53 端口、你的本地 dnsmasq 可能会劫持这个端口
需要关闭 dnsmasq
打开 openwrt 的 web 管理界面 网络
- 接口
- DHCP/DNS
- 高级设置
- DNS 服务器端口
改成 0
这样 dnsmasq 就不会监听你的 53 端口了
启动 pdns
bash
service pdns restart
配置自己的子域
bash
pdnsutil create-zone ts.dn11 ns1.ts.dn11
其中 ts 换成你想用的域名
bash
pdnsutil edit-zone ts.dn11
edit-zone 会唤醒叫 editor 的编辑器,如果你没有这个叫 editor 的编辑器 可以写一下环境变量
bash
nano /etc/profile
添加一行
bash
export EDITOR=/usr/bin/nano
(op 的 nano 默认安装位置在这里、其他你想配的自由发挥)
bash
source /etc/profile
打开 edit-zone 后 写入
txt
; Warning - every name in this file is ABSOLUTE!
$ORIGIN .
ts.dn11 3600 IN SOA ns1.ts.dn11 hostmaster.ts.dn11 2023093018 60 30 604800 60
ts.dn11 3600 IN NS ns1.ts.dn11.
ns1.ts.dn11 3600 IN A 172.16.3.53
ts.dn11 60 IN A 172.16.3.1
解释:SOA 记录里第一个值是你域名权威服务器所在的 NS、第二个为邮箱、第三个为流水号(格式 YYYYMMDD+2 位顺序号)(如果你不改的话 pdns 会自动帮你顺延流水号)、第四个为刷新间隔、第五个为重试间隔、第六个为过期时间长、第七个为 TTL(生存时间值、意为缓存过期时间、设置为 60s)
最后一行就是给你的域名加一个 A 解析
验证
bash
dig a ts.dn11 @172.16.3.53 -p 53
如果返回类似如下内容则成功
bash
root@OP:~# dig a ts.dn11 @172.16.3.53 -p 53
; <<>> DiG 9.18.16 <<>> a ts.dn11 @172.16.3.53 -p 53
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58804
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;ts.dn11. IN A
;; ANSWER SECTION:
ts.dn11. 60 IN A 172.16.3.1
;; Query time: 0 msec
;; SERVER: 172.16.3.53#53(172.16.3.53) (UDP)
;; WHEN: Sun Oct 15 18:55:04 CST 2023
;; MSG SIZE rcvd: 52
配置 TLD 域、拉取同步
配置主从同步
目前所有的 dns 注册都在 Registry 里面,生成的 zone 文件在 metadata 里的 zone
我们可以写 crontab 脚本来同步这个文件里的内容
bash
nano /root/sync_dn11_zone.sh
bash
#!/bin/bash
url="https://metadata.dn11.baimeow.cn/dn11.zone" # 源文件在 https://raw.githubusercontent.com/dn-11/metadata/main/dn11.zone
output_file="dn11_output.txt" # 将文件路径替换为你的输出文件路径
dn11_zone_file="/etc/powerdns/dn11.zone" # 将文件路径替换为你的dn11.zone文件路径
pdnsutil_command="pdnsutil load-zone dn11 $dn11_zone_file"
# 使用curl获取页面内容并检查HTTP状态码
response=$(curl -s -w "%{http_code}" $url -o $output_file)
# 检查HTTP状态码是否为200(成功)
if [ "$response" -eq 200 ]; then
# 比较新获取的内容和dn11.zone的内容
if ! diff -q $output_file $dn11_zone_file > /dev/null; then
# 如果有差异,覆盖dn11.zone文件
cp $output_file $dn11_zone_file
#将文件载入
$pdnsutil_command
# 加载zone文件
else
echo "页面内容没有变化。"
fi
else
# 处理HTTP错误
echo "无法访问页面。HTTP状态码: $response"
fi
bash
chmod +x /root/sync_dn11_zone.sh
crontab -e
在 crontab 里填入(时间和频率自定、如下是每天 03:05 更新一次、crontab 写法见 crontab 计算器)
bash
5 3 * * * /root/sync_dn11_zone.sh
检查一下
bash
root@OP:~# dig ns ts.dn11 @172.16.3.53 -p 53
; <<>> DiG 9.18.16 <<>> ns ts.dn11 @172.16.3.53 -p 53
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7351
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;ts.dn11. IN NS
;; ANSWER SECTION:
ts.dn11. 60 IN NS 172.16.3.53.
;; Query time: 0 msec
;; SERVER: 172.16.3.53#53(172.16.3.53) (UDP)
;; WHEN: Sun Oct 15 19:12:09 CST 2023
;; MSG SIZE rcvd: 61
配置 pdns_recursor
bash
nano /etc/powerdns/recursor.conf
写入
txt
# 接受哪些IP的查询请求,0.0.0.0/0表示全部
allow-from=0.0.0.0/0
# 本地监听的接口IP地址
local-address=172.16.255.53:53 172.16.255.53:5300
# 关闭dnssec功能,4.5版本后默认开启
dnssec=off
# 覆写默认屏蔽的内网请求
dont-query=
# 转发到权威
forward-zones-recurse=dn11=172.16.3.53,.=223.5.5.5
# 启动文件保存目录
socket-dir=/etc/powerdns/socket
# 标识这台anycast的名字
server-id=<你的名字>
解释:
本地监听的 ip 地址这里使用 anycast、同样的你需要在你的网卡里加一个 ip 为 172.16.255.53(监听 5300 的原因是、如果路由路径上有人开了 dnsmasq、那么这个 53 请求会被劫持)
并且宣告
bird
# 宣告 172.16.3.0/24 段
protocol static {
ipv4 {
table BGP_table;
import all;
export none;
};
# 只是为了让BGP的路由表里出现这条路由,不要担心 reject
# 这个动作其实无所谓,reject 这个动作并不会被发到其他 AS
# 后续将在导出到 master4 的时候删除这条路由,本地也不会有这一条
# 请修改为你自己要宣告的段
route 172.16.3.0/24 reject;
route 172.16.255.53/32 reject;
}
bash
root@OP:~# service bird restart
dont-query = 的意思是允许内网地址进行查询(默认是禁止的、所以这里填空)
forward-zones-recurse=dn11=172.16.3.53,.=223.5.5.5
这个递归配置项的意思是:如果请求到了 dn11 这个 TLD 就去请求你自己搭的 ns、如果不是这个域就当公网处理转发给公网 dns 223.5.5.5
然后重启
bash
service pdns-recursor restart
最后测试一下、请求一下网里存在的域名
bash
root@OP:~# dig op.iraze.dn11 @172.16.255.53 -p 53
; <<>> DiG 9.18.16 <<>> op.iraze.dn11 @172.16.255.53 -p 53
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4037
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;op.iraze.dn11. IN A
;; ANSWER SECTION:
op.iraze.dn11. 60 IN A 172.16.2.2
;; Query time: 39 msec
;; SERVER: 172.16.255.53#53(172.16.255.53) (UDP)
;; WHEN: Sun Oct 15 19:23:32 CST 2023
;; MSG SIZE rcvd: 58
这是装 pdns 的第二种方法 2.docker 拉镜像 装 pdns-admin web 界面管理
yaml
version: "3"
services:
pdns:
image: zhonger/pdns:latest
restart: always
ports:
- "172.16.7.53:53:53/tcp"
- "172.16.7.53:53:53/udp"
environment:
- PDNS_launch=gsqlite3
- PDNS_gsqlite3_database=/var/lib/powerdns/pdns.sqlite3
- PDNS_webserver_address=0.0.0.0
- PDNS_webserver_allow_from=0.0.0.0/0
- PDNS_allow_axfr_ips=0.0.0.0/0,::1
- PDNS_allow_dnsupdate_from=0.0.0.0/0,::1
- PDNS_allow_notify_from=0.0.0.0/0,::0
- PDNS_also_notify=172.16.3.53
- PDNS_master=yes
- PDNS_api=yes
- PDNS_api_key=0F34664B2C9CA2E1B84C5A6B4605C968
volumes:
- /etc/localtime:/etc/localtime:ro
- ./powerdns:/var/lib/powerdns
command: /bin/bash ./up.sh
privileged: true
db:
image: mysql:latest
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD=yes
- MYSQL_DATABASE=powerdnsadmin
- MYSQL_USER=pdns
- MYSQL_PASSWORD=my_pdns
restart: always
volumes:
- /etc/localtime:/etc/localtime:ro
- ./pda-mysql:/var/lib/mysql
privileged: true
app:
image: zhonger/powerdns-admin:latest
restart: always
depends_on:
- db
- pdns
ports:
- "8083:80"
logging:
driver: json-file
options:
max-size: 50m
volumes:
- /etc/localtime:/etc/localtime:ro
environment:
- SQLALCHEMY_DATABASE_URI=mysql://pdns:my_pdns@db/powerdnsadmin
- GUNICORN_TIMEOUT=60
- GUNICORN_WORKERS=2
- GUNICORN_LOGLEVEL=DEBUG
- OFFLINE_MODE=False # True for offline, False for external resources
privileged: true
bash
[root@gs-fedora Pdns]# cat up.sh
service system-resolve stop
ip addr add 172.16.7.53 dev eno1
这个 key 是我随便写的、你可以自己生成一个
PDNS_api_key=0F34664B2C9CA2E1B84C5A6B4605C968
在 powerdns admin settings pdns 中填写这个 key 填好后 在上层的 PowerDNS server configuration & statistics 里能看到一系列 pdns 的字段
配置 dns 分流 MosDNS
装包
bash
opkg update
opkg install mosdns
注意不要装 luci-app-mosdns
我感觉不好用💩
改配置
bash
nano /etc/mosdns/config.yaml
yaml
log:
level: info
file: "/tmp/mosdns.log"
api:
http: "0.0.0.0:9091"
include: []
plugins:
- tag: main_sequence
type: sequence
args:
# dn11内网dns解析
- matches: qname dn11
exec: forward 172.16.255.53:5300
# 其他dns解析
- matches: "!qname hdu.edu.cn dn11"
exec: forward 223.5.5.5:53
# 启动端口和ip
- tag: udp_server_2
type: udp_server
args:
entry: main_sequence
listen: "172.16.3.13:53"
- tag: tcp_server_2
type: tcp_server
args:
entry: main_sequence
listen: "172.16.3.13:53"
同样的 启动需要你 br-lan 网卡里加一个 172.16.3.13
这个 ip 地址
bash
service mosdns restart
定位是谁有问题
😡
我去怎么解析不出来 谁 TM 出的问题
bash
dig id.server CH TXT @172.16.255.53
例如返回的是这样的
bash
; <<>> DiG 9.18.11 <<>> id.server CH TXT @172.16.255.53
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18873
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;id.server. CH TXT
;; ANSWER SECTION:
id.server. 85145 CH TXT "typescript"
;; Query time: 0 msec
;; SERVER: 172.16.255.53#53(172.16.255.53) (UDP)
;; WHEN: Sat Jan 06 23:54:18 CST 2024
;; MSG SIZE rcvd: 61
说明你递归连到了 typescript 的 anycast 服务,解析不出的话你可以找他修网了