这是一个非常奇特的问题。我家有一个SOHO,大概是这样的:
internet->-|ISPmodem|->-|Firewall/DHCP/DNS/HTTP server|->-intranet
在哪里
- ISP调制解调器根本不用作路由器,并配置为DMZ,具有开放的防火墙
- 我的服务器正在执行防火墙/路由工作,同时充当所有 Intranet 的 DHCP 和 DNS(绑定)解析器。当然,它也充当所有内部网的互联网网关。
- Intranet 包括台式机/笔记本电脑/打印机/接入点/等,其中包括一些 HTTP 服务器、MPD(音乐播放器守护进程)、VNC 服务器、树莓派等服务。
当调制解调器连接到互联网时,解析任何 Intranet 和 Internet 地址并对它们进行 ping 操作都可以正常工作。任何其他服务,例如使用 FQDN 查看我的 Intranet 中 HTTP 服务器的网页,或者使用某些 MPC(音乐播放器控件)中的 MPD 的 FQDN 来更改歌曲也都可以正常工作。对一切都一样。我说这一切基本上是为了说我思考我已正确设置 DHCP/DNS 部分。
现在,如果我没有互联网,我希望在中断期间所有 Intranet 服务都将继续可解析,但情况似乎并非如此。如果我使用 IP 地址而不是 FQDN,我仍然可以使用 Intranet 中的所有内容。我还可以运行nslookup <hostname|FQDN>
来解析某个服务器的 IP 地址,我将看到tcpdump
我的请求确实到达了 DNS 服务器,并且响应已正常发回。但尝试正常访问“服务”却失败了。因此,如果我尝试使用“Firefox”查看 HTTP 服务器的网页,则会失败并出现“找不到页面”错误。对于 MPD,或者当我尝试ssh
其他 GNU/Linux IoT 或嵌入式计算机时也是如此。问题始终是无法找到服务器。
这对我来说非常奇怪,因为我希望所有 Intranet 服务都应该正常工作 - DNS 服务器是 DNS“主机”,并且对 Intranet 域具有权威性。
tcpdump
这变得更加奇怪,因为我一直在跟踪用和解决问题的活动当看到那些“找不到服务器”错误消息时,已经意识到没有 DNS 请求被转发到 DNS 服务器!就好像客户(所有内联网电脑!)已经决定“由于我们无法解决绝大多数互联网请求,因此根本没有必要尝试请求任何东西”。
我知道这听起来很愚蠢,但我真的不知道为什么没有解决!我什至无法将问题范围缩小到 DNS 服务器或其他组件或接入点。
能否请你帮忙?我已将其named.conf
作为起点附在此处。也许确实缺少一些重要的选项。如果您认为其他信息有助于得出一些结论,请随时询问!
$ cat /etc/named.conf
include "/etc/rndc.key";
acl skails_dns {
192.168.12.122/32;
};
acl outbound_subnet { 192.168.321.0/24; }; //this is the modem subnet side
acl skails_subnet { 192.168.12.0/24; }; //this is the intranet side
acl local_host { 127.0.0.1/32; };
acl local_nets {
local_host;
skails_subnet;
};
acl other_subnets { outbound_subnet; };
acl trusted_subnets {
local_nets;
skails_dns;
};
acl all_my_nets {
trusted_subnets;
other_subnets;
};
options {
directory "/var/named";
/*
* If there is a firewall between you and name servers you want
* to talk to, you might need to un-comment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
forwarders {
192.168.321.72; //modem
..... //some other servers (openDNS, google, others)
};
// forward first;
allow-recursion { trusted_subnets; }; //for whom will bind go the extra mile to find the final address
listen-on { trusted_subnets; }; //ifs on which bind listens for queries
allow-transfer { trusted_subnets; };
allow-query { trusted_subnets; };
};
controls {
inet 127.0.0.1 port 953 allow { local_host; } keys { rndc-key; };
};
//
// a caching only nameserver config
//
zone "." IN {
type hint;
file "caching-example/named.root";
};
zone "localhost" IN {
type master;
file "caching-example/localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "caching-example/named.local";
allow-update { none; };
};
zone "skails.home" {
type master;
file "/var/named/skails.home.hosts";
notify yes;
allow-update { key rndc-key; };
};
zone "12.168.192.in-addr.arpa" {
type master;
file "/var/named/192.168.12.rev";
notify yes;
allow-update { key rndc-key; };
};
编辑:正如建议的那样,我也尝试过host <intranet pc name|FQDN> <ip address of server>
,这也按预期工作。所以在随机的内联网电脑上我:
- 可以从 cli 正确 ping、nslookup、host、ssh、wget(cli 有效)
- 无法访问Apache服务器(简单的HTTP网页)
从手机我:
- 可以 nslookup
- 无法 ping、访问 HTTP、访问 MPD 或任何其他 Intranet 服务。
在所有这些情况下,奇怪的是没有发生 DNS 查找。
EDIT2:named.root不为空:
$ cat /var/named/caching-example/named.root | egrep -v "(;)"
. 3600000 NS A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4
A.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:ba3e::2:30
. 3600000 NS B.ROOT-SERVERS.NET.
B.ROOT-SERVERS.NET. 3600000 A 199.9.14.201
B.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:200::b
. 3600000 NS C.ROOT-SERVERS.NET.
C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12
C.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2::c
. 3600000 NS D.ROOT-SERVERS.NET.
D.ROOT-SERVERS.NET. 3600000 A 199.7.91.13
D.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2d::d
. 3600000 NS E.ROOT-SERVERS.NET.
E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10
E.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:a8::e
. 3600000 NS F.ROOT-SERVERS.NET.
F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241
F.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2f::f
. 3600000 NS G.ROOT-SERVERS.NET.
G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4
G.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:12::d0d
. 3600000 NS H.ROOT-SERVERS.NET.
H.ROOT-SERVERS.NET. 3600000 A 198.97.190.53
H.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:1::53
. 3600000 NS I.ROOT-SERVERS.NET.
I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17
I.ROOT-SERVERS.NET. 3600000 AAAA 2001:7fe::53
. 3600000 NS J.ROOT-SERVERS.NET.
J.ROOT-SERVERS.NET. 3600000 A 192.58.128.30
J.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:c27::2:30
. 3600000 NS K.ROOT-SERVERS.NET.
K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129
K.ROOT-SERVERS.NET. 3600000 AAAA 2001:7fd::1
. 3600000 NS L.ROOT-SERVERS.NET.
L.ROOT-SERVERS.NET. 3600000 A 199.7.83.42
L.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:9f::42
. 3600000 NS M.ROOT-SERVERS.NET.
M.ROOT-SERVERS.NET. 3600000 A 202.12.27.33
M.ROOT-SERVERS.NET. 3600000 AAAA 2001:dc3::35
答案1
整个描述所需配置(数字海洋是一个相当有信誉的网站)很长并且有很多细节。基本前提是您必须dig
(因为您正在使用bind
)能够从本地 DNSbind
服务器解析本地名称。基本查询:
$ dig @192.168.12.122 skails.home. # assuming your server
# is at 192.168.12.122
bind
无论是否有互联网,您的服务器都应该正确解析。
请理解 DNS 服务器可能会缓存收到的答案。特别消极的答案。如果 DNS 服务器正在尝试解析。(点)地址或家。地址并收到否定答案,则不会解决任何其他问题(除非服务器本身知道如何绕过此类问题)。这就是为什么服务器需要配置为独立的服务器。上面给出的配置链接。
请理解,只有一点(。)可能会被定向到 mini-dns(或 avahi 或其他)。简而言之:您的本地 dns 地址不应该是家(不是本地的,也不是示例)。给出了合理的描述这张纸(这是草案而不是政策,但给出了对该问题的正确总体看法)。