<-
Apache > HTTP Server > 文档 > 版本 2.4

关于 DNS 和 Apache HTTP Server 的问题

可用语言:  en  |  fr  |  ja  |  ko  |  tr 

这段话可以概括为:不要以依赖 DNS 解析来解析配置文件的方式配置 Apache HTTP Server。如果 httpd 需要 DNS 解析来解析配置文件,那么您的服务器可能会遇到可靠性问题(例如,它可能无法启动),或者遭受拒绝服务和窃取服务攻击(包括虚拟主机能够窃取来自其他虚拟主机的流量)。

Support Apache!

另请参阅

top

一个简单的例子

# This is a misconfiguration example, do not use on your server
<VirtualHost www.example.dom>
  ServerAdmin [email protected]
  DocumentRoot "/www/example"
</VirtualHost>

为了使服务器正常运行,它绝对需要关于每个虚拟主机的两条信息:ServerName 和服务器将绑定并响应的至少一个 IP 地址。上面的例子没有包含 IP 地址,因此 httpd 必须使用 DNS 来查找 www.example.dom 的地址。如果由于某种原因,在您的服务器解析其配置文件时 DNS 不可用,那么这个虚拟主机将不会被配置。它将无法响应对该虚拟主机的任何访问。

假设 www.example.dom 的地址是 192.0.2.1。然后考虑以下配置片段

# This is a misconfiguration example, do not use on your server
<VirtualHost 192.0.2.1>
  ServerAdmin [email protected]
  DocumentRoot "/www/example"
</VirtualHost>

这次 httpd 需要使用反向 DNS 来查找该虚拟主机的 ServerName。如果反向查找失败,它将部分禁用虚拟主机。如果虚拟主机是基于名称的,那么它将被完全禁用,但如果它是基于 IP 的,那么它将大部分正常工作。但是,如果 httpd 必须为服务器生成一个包含服务器名称的完整 URL(例如,当发出重定向时),那么它将无法生成有效的 URL。

以下是一个避免这两个问题的片段

<VirtualHost 192.0.2.1>
  ServerName www.example.dom
  ServerAdmin [email protected]
  DocumentRoot "/www/example"
</VirtualHost>
top

拒绝服务

考虑以下配置片段

<VirtualHost www.example1.dom>
  ServerAdmin [email protected]
  DocumentRoot "/www/example1"
</VirtualHost>
<VirtualHost www.example2.dom>
  ServerAdmin [email protected]
  DocumentRoot "/www/example2"
</VirtualHost>

假设您已将 192.0.2.1 分配给 www.example1.dom,并将 192.0.2.2 分配给 www.example2.dom。此外,假设 example1.dom 可以控制自己的 DNS。使用此配置,您已将 example1.dom 置于可以窃取所有发送到 example2.dom 的流量的位置。为此,他们只需将 www.example1.dom 设置为 192.0.2.2 即可。由于他们控制着自己的 DNS,因此您无法阻止他们将 www.example1.dom 记录指向任何他们想要的位置。

进入 192.0.2.2 的请求(包括所有用户输入形式为 http://www.example2.dom/whatever 的 URL 的请求)都将由 example1.dom 虚拟主机提供服务。要更好地理解为什么会发生这种情况,需要更深入地讨论 httpd 如何将传入请求与将提供服务的虚拟主机匹配。有关此方面的粗略文档在此处提供

top

“主服务器”地址

基于名称的虚拟主机支持 需要 httpd 了解运行 httpd 的主机的 IP 地址。为了获取此地址,它使用全局 ServerName(如果存在)或调用 C 函数 gethostname(它应该返回与在命令提示符下键入“hostname”相同的结果)。然后,它对该地址执行 DNS 查找。目前,无法避免此查找。

如果您担心此查找可能会失败,因为您的 DNS 服务器已关闭,那么您可以在 /etc/hosts 中插入主机名(您可能已经拥有它,以便机器能够正常启动)。然后确保您的机器配置为在 DNS 失败时使用 /etc/hosts。根据您使用的操作系统,这可以通过编辑 /etc/resolv.conf/etc/nsswitch.conf 来实现。

如果您的服务器不需要出于任何其他原因执行 DNS,那么您可能可以运行 httpd,并将 HOSTRESORDER 环境变量设置为“local”。这完全取决于您使用的操作系统和解析器库。它还会影响 CGI,除非您使用 mod_env 来控制环境。最好查阅您操作系统的联机帮助页或常见问题解答。

top

避免这些问题的技巧

可用语言:  en  |  fr  |  ja  |  ko  |  tr 

top

评论

注意
这不是一个问答部分。此处发布的评论应指向有关改进文档或服务器的建议,如果这些建议已实施或被认为无效/不相关,我们的版主可能会将其删除。有关如何管理 Apache HTTP Server 的问题应发送到我们的 IRC 频道 #httpd(在 Libera.chat 上)或发送到我们的邮件列表