语境
我打算使用 Technitium 设置本地 DNS 服务器,并想验证本地 DNS 服务器在查询域时是否返回正确的响应。使用时它不起作用nslookup mydomain.com
。我猜是因为无法从公共/互联网位置访问本地 DNS 服务器。
为了排除这是由于我的本地 DNS 服务器无法正常工作(本地)造成的,我想验证至少本地 DNS 服务器在查询我的域时是否返回正确的 IP 地址。
尝试
本地 DNS 服务器127.0.0.1
在端口上的本地 IP 地址上运行5379
,因此我尝试了以下命令,然后按照它们各自的输出进行操作:
nslookup 127.0.0.1 somedomain.com
;; connection timed out; no servers could be reached
nslookup 127.0.0.1:5379 somedomain.com
nslookup: couldn't get address for 'somedomain.com': failure
nslookup http://127.0.0.1:5379 somedomain.com
;; connection timed out; no servers could be reached
nslookup https://127.0.0.1:5379 somedomain.com
;; connection timed out; no servers could be reached
因此,测试命令要么nslookup 127.0.0.1:5379 somedomain.com
是测试本地 DNS 服务器在查询某个域时是否返回正确 IP 地址的可能方法,而我没有正确设置本地 DNS 服务器,要么我使用了错误的测试命令。
问题
如何测试本地 DNS 服务器在查询域时(从托管 DNS 服务器的设备)的响应是否返回正确的 IP 地址?
答案1
你的 nslookup 语法是错误的:服务器后域名。
nslookup example.com 127.0.0.1
您无法使用 Windows 的 nslookup 指定自定义端口。(虽然它有一个隐藏-port=
选项,但不幸的是它被忽略了。)
URL 在这里不起作用:DNS 不是基于 HTTP 的。(有一个在 HTTP 内部承载 DNS 消息的规范,但它需要特殊的客户端和服务器。)
如果你有 Linux 或某些 BSD 可用(Windows Subsystem for Linux 也可以使用),则有更多种类的工具,例如dig
、drill
或delv
。例如:
host -p 5379 example.com 127.0.0.1
dig @127.0.0.1 -p 5379 example.com
答案2
正如一些人指出的那样,这个答案ping 解析不能证明你的 DNS 服务器已经响应。它只能证明某个 DNS 服务器已经响应。假设你不能从 nslookup 切换到支持指定端口的其他命令(如这个答案),然后我看到两个可能对您有帮助的选项:
关闭 DNS 服务器,这样它肯定不会响应。尝试 ping,如果它没有返回任何结果,但在您打开服务器时确实提供了结果,那么它就可以正常工作。缺点:如果互联网可以解析地址,它将无法工作。
拔掉网线。确认无法连接任何设备(这样您就知道没有 WiFi 连接或类似的东西)。尝试在服务器关闭的情况下执行 ping 操作(以确保服务器没有缓存)。然后打开 DNS 服务器并再次尝试 ping 操作。
请注意,无论哪种情况,一切都必须正确配置。因此,您的计算机需要配置为使用本地 DNS 服务器,并且本地 DNS 服务器必须配置为响应请求。如果不起作用,则可能出现上述任一问题。这就是为什么切换到支持端口选择的其他 DNS 客户端可能会更好。然后,您可以针对已知良好的服务器测试客户端,并针对您的服务器测试现已验证的客户端。
另一个选项是端口转发。nslookup 命令将使用端口 53。如果您配置了某些东西,以便将对 53 的请求转发到正确的端口,那么请求也会通过。不过,这又增加了一些可能无法正常工作的东西。DNS 服务器坏了吗?还是端口转发配置错误了?这两种情况都可能产生相同的结果。
答案3
我将尝试在这里提供一个完整的示例,包括从本地 DNS 服务器公开一个区域。
我们将在 Ubuntu 21 机器上使用 bind9 作为名称服务器。
首先在文件中定义你的区域,我使用了 etc/bind/example.com.zone,修改这个例子
文档:https://bind9.readthedocs.io/en/latest/reference.html#zone-file
$ORIGIN example.com.
$TTL 30
@ SOA localhost. admin.example.com. (
2001062501 ; serial
21600 ; refresh after 6 hours
3600 ; retry after 1 hour
604800 ; expire after 1 week
86400 ) ; minimum TTL of 1 day
;
;
NS localhost. ;
NS dns1.example.com.
NS dns2.example.com.
dns1 A 10.0.1.1
AAAA aaaa:bbbb::1
dns2 A 10.0.1.2
AAAA aaaa:bbbb::2
bar CNAME www.example.com
现在你应该从绑定配置文件 /etc/bind/named.conf 加载该区域,如下所示
zone "example.com." IN {
type master;
file "/etc/bind/example.com.zone";
allow-update {none; };
};
我还为命名服务 /etc/bind/named.conf.options 添加了一些额外的选项
options {
;---OTHER STUFF
listen-on port 53 { any; };
allow-query { any; };
recursion yes;
};
然后你可以重新启动服务
sudo systemctl restart named bind9
最后测试您的区域,您可以使用 dig、host、resolvectl 或 nslookup 中的任意一个。
$ host -t A dns1.example.com localhost
Using domain server:
Name: localhost
Address: 127.0.0.1#53
Aliases:
dns1.example.com has address 10.0.1.1
$ host -t AAAA dns1.example.com localhost
Using domain server:
Name: localhost
Address: 127.0.0.1#53
Aliases:
dns1.example.com has IPv6 address aaaa:bbbb::1
$ host -t CNAME bar.example.com localhost
Using domain server:
Name: localhost
Address: 127.0.0.1#53
Aliases:
bar.example.com is an alias for www.example.com.example.com.
答案4
视窗
您可以使用 nslookup,因为 Grawity 提到您的语法是错误的。
您还可以使用Bind9在 Windows 上,您不再需要 Windows Subsystem for Linux 来使用它们。它不需要安装。只需将其解压到方便命令行使用的地方即可。(附带 dig、delv、host、nslookup 等)bind9-nslookup 似乎能够使用 Grawity 在他的回答中提到的隐藏端口参数。
挖
Debian 和 Ubuntu 安装:
sudo apt-get install dnsutils
CentOS 7 安装:
yum install bind-utils
dig 的典型用法如下:
dig @server name type
在哪里:
服务器
is the name or IP address of the name server to query. This can be an IPv4 address in dotted-decimal notation or an IPv6 address in colon-delimited notation. When the supplied server argument is a hostname, dig resolves that name before querying that name server.
If no server argument is provided, dig consults /etc/resolv.conf; if an address is found there, it queries the name server at that address. If either of the -4 or -6 options are in use, then only addresses for the corresponding transport will be tried. If no usable addresses are found, dig will send the query to the local host. The reply from the name server that responds is displayed.
姓名
is the name of the resource record that is to be looked up.
类型
indicates what type of query is required — ANY, A, MX, SIG, etc. type can be any valid query type. If no type argument is supplied, dig will perform a lookup for an A record.
德夫
delv 的典型用法如下:
delv @server name type
http://manpages.ubuntu.com/manpages/xenial/man1/delv.1.html
或者您也可以使用快速而简单的 ping 来实现这一点。
全面披露:如果您需要知道您的本地 LAN 私人服务器是否使用此方法响应,那么您只需要在运行服务器应用程序的计算机上将 127.0.0.1 作为网络适配器配置中的第一个也是唯一的 DNS 服务器。
Ping mydomain.com并检查它是否显示正确的 IP 号码。
127.0.0.1 是计算机的环回地址,只有您的本地操作系统可以与该 IP 号码通信。
如果您希望 LAN 上的其他计算机能够使用本地 DNS 服务,请确保该服务连接到本地 IP 地址。
不要忘记在局域网上其他计算机的适配器设置中添加DNS服务的本地IP。