Apache HTTP Server 第 2.4 版
這頁的重點是,不要將 Apache HTTP Server 設定為解析組態檔案時仰賴 DNS 解析。如果 httpd 需要進行 DNS 解析來解析組態檔案,您的伺服器可能會發生可靠性問題(例如無法啟動),或是發生拒絕服務攻擊和竊取服務攻擊(包括能夠從其他虛擬主機竊取點選次數的虛擬主機)。
# This is a misconfiguration example, do not use on your server <VirtualHost www.example.dom> ServerAdmin webgirl@example.dom DocumentRoot "/www/example" </VirtualHost>
為了讓伺服器正常運作,伺服器絕對需要針對各個虛擬主機具備兩項資訊:
和伺服器將繫結並回應的至少一個 IP 位址。以上的範例未包含 IP 位址,因此 httpd 必須使用 DNS 來找出 ServerName
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 webgirl@example.dom DocumentRoot "/www/example" </VirtualHost>
這次,httpd 需要使用反向 DNS 來為這項虛擬主機找出 ServerName
。如果反向查找失敗,虛擬主機將會部分停用。如果這個虛擬主機是基於名稱,這個主機基本上將會完全停用,但如果是基於 IP,這個主機將會大部分正常運作。但是,如果 httpd 一定要為伺服器產生包含伺服器名稱的完整 URL(例如在發佈重新導向時),此舉將無法產生有效的 URL。
底下這段片段可以避免這些問題
<VirtualHost 192.0.2.1> ServerName www.example.dom ServerAdmin webgirl@example.dom DocumentRoot "/www/example" </VirtualHost>
考量以下這段組態片段
<VirtualHost www.example1.dom> ServerAdmin webgirl@example1.dom DocumentRoot "/www/example1" </VirtualHost> <VirtualHost www.example2.dom> ServerAdmin webguy@example2.dom 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 如何將傳入的要求與將提供服務的虛擬主機進行比對。有份粗略的文件 可供取得,說明這項設定。
基於名稱的虛擬主機支援 要求 httpd 瞭解執行 httpd
的主機 IP 位址。若要取得這個位址,它會使用全域 ServerName
(如果存在),或呼叫 C 函式 gethostname
(應傳回與在命令提示字元輸入「hostname」相同的結果)。然後執行此位址的 DNS 查詢。目前無法避免執行這項查詢。
如果您擔心這項查詢可能會失敗,因為您的 DNS 伺服器已關閉,則可以在 /etc/hosts
中插入主機名稱(您可能已將其放在該處,以便機器可以順利開機)。再確認您的機器已設定為在 DNS 失敗時使用 /etc/hosts
。依據您使用的作業系統,這項設定可能會透過編輯 /etc/resolv.conf
或 /etc/nsswitch.conf
來完成。
如果您的伺服器沒有任何其他原因需要執行 DNS,那麼您或許可以透過執行已將 HOSTRESORDER
環境變數設為「local」的 httpd 來解決問題。這一切會依據您的作業系統和求解程式函式庫而定。它也會影響 CGI,除非您使用 mod_env
來控制環境。最好查閱您的作業系統說明書或常見問題。建議您諮詢您的作業系統說明手冊或常見問題。
VirtualHost
中使用 IP 位址Listen
中使用 IP 位址ServerName
<VirtualHost _default_:*>
伺服器