关于DNS和Apache
本文档的涵义用一句话总结就是:不要让Apache在分析配置文件的时候使用到DNS解析。如果Apache在分析配置文件时用到了DNS解析,您的服务器就会发生可靠性的问题(也可能根本无法启动),或者遭致拒绝(偷窃)服务攻击(包括用户可以从其他用户那里偷窃点击)。
ServerName和与该服务器绑定的至少一个IP地址。上述示例没有包括IP地址,于是Apache必须要使用DNS解析来查询www.abc.dom
的地址。如果在某些不可预料的情况下,当您的服务器解析配置文件时没有得到DNS的支持,那么这个虚拟主机将不会被配置。它将不会对任何请求作出反应。(在Apache1.2之前的版本,服务器甚至无法启动)。
假设www.abc.dom
的IP地址是10.0.0.1,那么考虑以下这个配置片断:
<VirtualHost 10.0.0.1>
ServerAdmin [email protected]
DocumentRoot /www/abc
</VirtualHost>
现在Apache需要DNS对这个虚拟主机进行反向域名解析来确定其ServerName
。如果反向解析失败,那么将导致这个虚拟主机功能丧失(在Apache的1.2版本之前,服务器将不能启动)。如果虚拟主机是基于域名的,它将完全不能使用,但如果它是基于IP的,那么它将很有可能工作。然而,如果Apache不得不为一个已经包含了服务器域名的服务器产生一个完整的URL,那么它将可能产生一个无效的URL。
以下是一个可以避免上述两个问题的配置片断:
<VirtualHost 10.0.0.1>
ServerName www.abc.dom
ServerAdmin [email protected]
DocumentRoot /www/abc
</VirtualHost>
基于域名的虚拟主机支持需要Apache知道运行httpd
的主机的IP地址。可以用全局变量ServerName
(如果存在)或者调用C函数gethostname
(与在命令行模式下键入"hostname"得到的返回值一样)。接着它就会利用DNS来查找这个地址。目前还没有办法避免这样的查找。
如果您担心这样的查找会因为您的DNS服务器没有启动而遭到失败的结果,您就可以在/etc/hosts
中插入一条记录来确定主机名(此文件中应该已经存在这条记录了,否则您的机器可能无法正常启动)。然后,要确认您的机器已经配置为当DNS解析失败的情况下会使用/etc/hosts
,根据所使用的操作系统不同,您可能需要在/etc/resolv.conf
或/etc/nsswitch.conf
两个文件中选择一个进行编辑。
如果您的服务器不必因为其他理由而使用DNS,您也许不必在把HOSTRESORDER
环境变量设为"local"的情况下运行Apache。这取决于您所使用的操作系统和解析库。如果您没有使用mod_env
来控制环境变量,它还将影响到CGI。强烈建议您查看操作系统附带的man帮助或FAQ。
VirtualHost中使用IP地址
Listen
中使用IP地址ServerName
定义<VirtualHost _default_:*>
服务器附录:进一步的提示
涉及到DNS的情况都很让人很不舒服。在Apache1.2中,我们努力想让服务器在DNS解析失败的情况下至少保持能够启动,但我们没能做到。在当今重编号成了必须的Internet上面,在配置文件中显式的写明IP地址已经成为不合时宜的行为了。
上述盗窃攻击的解决办法是在一个正向DNS查询后再进行一个逆向DNS解析并将两个结果进行比较。如果不同,就禁用相应的虚拟主机。这个方法需要一个正确配置了的逆向域名解析服务器(因为FTP服务器和TCP封装进行的"双重逆向"DNS处理的普遍应用,这已为大部分管理员所熟知了)。
在某些情况下,如果没有使用IP地址而DNS解析又失败了,那么正常启动一个基于域名的虚拟主机看来是不可能的。一些诸如禁用部分配置文件这样的权宜之计会带来比根本不能启动更遭的不可预测的结果。
随着HTTP/1.1的部署以及浏览器和代理服务器开始支持Host
头,我们完全避免使用基于IP的虚拟主机也逐渐成为可能。这种状况下,web服务器也不必在配置时进行DNS的查询。但在1997年3月,这些特性的采用还没有广泛到可以在重要的web服务器应用的地步。