环境
我的 LAN 设置非常基本:
- 连接到 ISP 调制解调器和互联网的路由器
- 我的开发电脑直接连接到路由器
路由器提供 DHCP,但不运行自己的 DNS 服务器。事实上,我的 LAN 上的任何位置都没有托管 DNS 服务器(典型的家庭网络设置)。路由器配置为发送 ISP 的 DNS 服务器作为 DHCP 租用信息的一部分。
我在我的开发 PC 上设置了一台 VirtualBox 机器并在其上安装了 Debian Squeeze (6.0.4)。 VirtualBox网络模式是Bridged Adapter
在我的局域网上模拟一个独立的服务器。成为 VirtualBox 服务器而不是物理服务器并不重要,但我为了完整性而提及它。
问题
每次网络操作在执行之前都会对 LAN ip 进行 DNS 反向查找,服务器会有很长的延迟。网络操作缓慢的一些示例:
- 从我的开发 PC 到服务器的 SSH 连接
- 连接到 Glassfish 服务器的管理端口
netstat -l
(netstat -nl
非常快)Starting MTA: exim4
启动需要很长时间才能完成
其中一些有解决方法,例如添加我的开发电脑的 Ip/etc/hosts
或添加特定于命令的选项以避免进行 DNS 反向查找。显然,使用/etc/hosts
只能到此为止,因为它与 DHCP 不一致。
然而,我不禁认为我错过了一些东西。我是吗真的需要在 LAN 上的某个地方设置 DNS 服务器吗?对于我的需求来说,这似乎是一个巨大而无用的努力,我不敢相信在像我这样的 DHCP 环境中没有其他选择。
我在网上搜索了很多这个问题,也许我没有正确的搜索词,但我找不到解决方案......
根据 BillThor 的回答更新 1
使用主机(dig 给出相同的结果):
# ip of stackoverflow.com
$ time host -v 64.34.119.12
Trying "12.119.34.64.in-addr.arpa"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15537
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;12.119.34.64.in-addr.arpa. IN PTR
;; ANSWER SECTION:
12.119.34.64.in-addr.arpa. 143 IN PTR stackoverflow.com.
Received 74 bytes from 192.168.1.1#53 in 15 ms
real 0m0.020s
user 0m0.008s
sys 0m0.000s
# ip of dev pc
$ time host -v 192.168.1.50
Trying "50.1.168.192.in-addr.arpa"
;; connection timed out; no servers could be reached
real 0m10.004s
user 0m0.004s
sys 0m0.000s
我的/etc/resolv.conf(在安装过程中自动创建)
nameserver 192.168.1.1
对于公共 ip,host 和 dig 的返回速度都非常快,但对于 LAN ip 则需要 10 秒才能超时。我想 10s 是我当前的超时值。
更新2
在dev-pc
/etc/hosts 文件中:
$ time getent hosts 192.168.1.50
192.168.1.50 dev-pc
real 0m0.001s
user 0m0.000s
sys 0m0.000s
dev-pc
/etc/hosts 文件中没有:
$ time getent hosts 192.168.1.50
real 0m10.012s
user 0m0.004s
sys 0m0.000s
看起来我越来越需要为每个尝试执行反向 DNS 查找的程序找到分段程序选项或参数!没有任何机器(无论是否虚拟)可以充当我的 LAN 上的 DNS 服务器,因为它们并非始终处于运行状态。不幸的是,路由器的固件不包含 DNS 服务器。
答案1
192.168.1.1是你路由器的IP地址吗?
nameserver 192.168.1.1
表明您的路由器正在将自己宣传为 DNS 服务器,而不是“发送 ISP 的 DNS 服务器”。
您有什么品牌和型号的路由器? Web 界面是否显示日志消息?
我想知道您的路由器是否将请求转发到 ISP 的名称服务器,但您的 ISP 的名称服务器正在丢弃该请求,因为他们不想让您知道他们的 IP 机器的名称192.168.1.50
。
建议:
答案2
如果您不想为家庭网络设置本地 DNS(可能还有 DHCP)服务器,您可以告诉服务尽可能不要执行反向 DNS 查找。
例如,要禁用 SSHD 的反向 DNS 查找,请将以下内容添加到文件sshd_config
(或根据发行版类似添加):
UseDNS no
您可以从 Exim 配置中删除此行,尽管我不清楚这是否会影响启动速度,但它将阻止连接客户端上的反向 dns 查找:
host_lookup = *
看起来您可以为启动 Glassfish 进程的用户导出此环境变量:
export AS_NO_REVERSE_DNS=true
答案3
失败的 DNS 查找应该会很快失败。但是,我通常运行 dnsmasq ,它将读取主机文件并为这些条目提供正向和反向查找。它还充当 DNS 缓存服务器,以减少上游 DNS 服务器的负载。
您可能需要使用host
ordig
命令来查看哪些查找速度较慢。如果您被重定向到未运行的 DNS 服务器,则 DNS 将需要相当长的时间才会失败。您可以调整超时和重试/etc/resolv.conf
以加快失败速度。
编辑:要测试解析器响应,请尝试使用time getent hosts 192.168.1.50
.这应该返回来自您的/etc/hosts
文件和 DNS 的查找。和host
命令dig
仅检查 DNS。如果此操作返回但需要几秒钟,您可能需要更改hosts
将/etc/nsswitch.conf
文件移动到列表前面的条目的顺序。
如果您有任何程序仅依赖 DNS 进行名称查找,则将其设置dnsmasq
并用作主要 DNS 名称服务器应该可以解决该问题。 /etc/resolve.conf
Exim 应该使用解析器进行基本查找。您将需要一个/etc/hosts
文件,除非您可以禁用路由器上的 DHCP 服务器,否则您可以用于dnsmasq
DHCP。 dnsmasq
如果在它处理的 DHCP 请求中提供了名称,则会自动注册名称。
EDIT2:如果您的计算机中没有一台始终处于运行状态,您可能需要考虑安装 samba 并wins
在 nsswitch 配置中使用。它应该很快,所以如果你把它放在dns
主机条目前面,它可能会起作用。
您还可以考虑安装avahi
能够在本地链路网络上启用自动发现的实用程序。我让它在 IPv6 端工作,但它没有发布 IPv4 地址。主机的默认域是“.local”。这可能不适合您的情况,但可以被覆盖。查找速度似乎也比wins
在nsswitch 配置中mdns
提前进行dns
可能不合适。
答案4
从动态 IP 更改为静态 IP 后遇到同样的问题。我的网络现在配置为:静态 - 无 IPv6 并且不打算使用邮件服务器。
我通过执行以下操作解决了问题:
1:运行 dpkg-reconfigure exim4-config
2:当您遇到 DNS 查找问题时 -> 将 DNS 查找设置为最小(拨号)
它给了我一个错误,即这种查找不起作用,并建议编辑 /etc/hosts - 但我对 /etc/hosts 所做的唯一一件事就是注释掉 ip6-allnodes 和 ip6-allrouters 行。
现在重新启动应该很快(至少对我来说是这样)。