我们正在使用标准 dnslib 库在 Python 中构建一个实验性的名称服务器。
它似乎起作用了,我们已经将一个测试子域 midsummer.beltaine.co.uk 委托给它,它为其配置文件中的记录提供了预期的答案。
使用久负盛名的 squish.net DNS 检查器显示没有错误,解析完美。其他主要 DNS 测试工具也报告子域名一切正常。
当被要求时,Cloudflare 的公共解析器 1.1.1.1 很乐意为我们提供记录。
但是,Google 的公共 DNS 8.8.8.8 / 8.8.4.4 对子域的所有查询都返回空白记录。
使用提供的测试工具https://dns.google,如果我尝试查找 NS 记录,它显示的是这样的 - 它似乎认为没有返回任何答案。
{
"Status": 0 /* NOERROR */,
"TC": false,
"RD": true,
"RA": true,
"AD": false,
"CD": false,
"Question": [
{
"name": "midsummer.beltaine.co.uk.",
"type": 2 /* NS */
}
],
"Comment": "Response from 195.82.107.179."
}
然而,当我对该 IP(即主机 two.beltaine.co.uk,子域的两个权威服务器之一)进行挖掘时,返回了预期的数据:
:~> dig @195.82.107.179 midsummer.beltaine.co.uk ns
; <<>> DiG 9.9.4-rpz2.13269.14-P2 <<>> @195.82.107.179 midsummer.beltaine.co.uk ns
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15616
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;midsummer.beltaine.co.uk. IN NS
;; ANSWER SECTION:
midsummer.beltaine.co.uk. 3600 IN NS one.beltaine.co.uk.
midsummer.beltaine.co.uk. 3600 IN NS two.beltaine.co.uk.
;; Query time: 17 msec
;; SERVER: 195.82.107.179#53(195.82.107.179)
;; WHEN: Sat Jul 08 15:40:27 BST 2023
;; MSG SIZE rcvd: 78
委托正在进行,并附有胶水记录,这是正常的:
:~> dig @d.ns.as8401.net midsummer.beltaine.co.uk a
;; QUESTION SECTION:
;midsummer.beltaine.co.uk. IN NS
;; AUTHORITY SECTION:
midsummer.beltaine.co.uk. 3600 IN NS one.beltaine.co.uk.
midsummer.beltaine.co.uk. 3600 IN NS two.beltaine.co.uk.
;; ADDITIONAL SECTION:
one.beltaine.co.uk. 1812 IN A 212.85.249.179
two.beltaine.co.uk. 1812 IN A 195.82.107.179
我猜测服务器无法设置或提供某些功能,但不确定是什么?
答案1
发现问题并找到解决方案。
事实证明,Google 的 DNS 在权威服务器上查找答案时会随机将 DNS 查询中的字母大写。这意味着当通过挖掘或使用我们接口的测试要求输入“midsummer.beltaine.co.uk”时,他们实际上要求我们的服务器输入的是(例如)“mIdsUMmer.beLtAINe.Co.uK”。我知道 DNS 不区分大小写,但我们忘记将传入的查询改为小写,因此当脚本将其收到的数据与其配置中的数据(小写)进行比较时,没有匹配。
将代码添加到小写接收的查询解决了问题,并且测试子域现在可以正确提供服务。
这是缺失的代码:
qname = str(request.q.qname).lower() # Convert to lowercase
这表明在假设某些深奥的事情发生之前,总是要检查基本情况。问题是通过对传入接口和端口执行 tcpdump 发现的,它显示了随机大写的查询。