有关 DNS 和 Apache HTTP Server 的问题

该页面可以用以下语句来概括:不要以依赖 DNS 解析来解析配置文件的方式配置 Apache HTTP Server。如果 httpd 需要 DNS 解析来解析配置文件,则您的服务器可能会遇到可靠性问题(即,它可能无法启动),或者遭到拒绝和盗窃服务攻击(包括能够从其他虚拟主机中窃取数据的虚拟主机)。

一个简单的例子

# 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>

拒绝服务

考虑以下配置片段:

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

假设您已将 1.9.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形式 Importing URL 的请求)都将由example1.dom虚拟主机处理。为了更好地理解为什么会发生这种情况,需要更深入地讨论 httpd 如何将传入请求与将为其服务的虚拟主机进行匹配。描述此is available的粗略文档。

“主服务器”地址

基于名称的虚拟主机支持要求 httpd 知道httpd在其上运行的主机的 IP 地址。要获取此地址,它可以使用全局ServerName(如果存在)或调用 C 函数gethostname(返回的功能应与在命令提示符下键入“主机名”相同)。然后,它在该地址上执行 DNS 查找。目前没有办法避免这种查找。

如果您担心此查询可能会由于 DNS 服务器已关闭而失败,则可以在/etc/hosts中插入主机名(您可能已经在其中找到了主机名,以便计算机可以正常启动)。然后,确保您的计算机配置为在 DNS 失败的情况下使用/etc/hosts。根据您使用的 os,这可以通过编辑/etc/resolv.conf/etc/nsswitch.conf完成。

如果您的服务器由于任何其他原因不必执行 DNS,则您可以通过将HOSTRESORDER环境变量设置为“本地”的 httpd 运行。这完全取决于您使用的 os 和解析器库。除非您使用mod_env来控制环境,否则它还会影响 CGI。最好查阅 os 的手册页或常见问题解答。

避免这些问题的技巧

  • 使用VirtualHost中的 IP 地址

  • 使用Listen中的 IP 地址

  • 确保所有虚拟主机都有明确的ServerName

  • 创建一个没有页面可服务的<VirtualHost _default_:*>服务器