<-
Apache > HTTP Server > 文件 > 第 2.4 版

DNS 和 Apache HTTP Server 相關問題

可用的語言:  en  |  fr  |  ja  |  ko  |  tr 

這頁的重點是,不要將 Apache HTTP Server 設定為解析組態檔案時仰賴 DNS 解析。如果 httpd 需要進行 DNS 解析來解析組態檔案,您的伺服器可能會發生可靠性問題(例如無法啟動),或是發生拒絕服務攻擊和竊取服務攻擊(包括能夠從其他虛擬主機竊取點選次數的虛擬主機)。

Support Apache!

另請參閱

top

一個簡單的範例

# This is a misconfiguration example, do not use on your server
<VirtualHost www.example.dom>
  ServerAdmin webgirl@example.dom
  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 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>
top

拒絕服務攻擊

考量以下這段組態片段

<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 如何將傳入的要求與將提供服務的虛擬主機進行比對。有份粗略的文件 可供取得,說明這項設定。

top

「主伺服器」位址

基於名稱的虛擬主機支援 要求 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 來控制環境。最好查閱您的作業系統說明書或常見問題。建議您諮詢您的作業系統說明手冊或常見問題。

top

避免這些問題的秘訣

可用的語言:  en  |  fr  |  ja  |  ko  |  tr 

top

意見

注意
此處並非 Q&A 區段。在此處放置的意見應著重於提出改進文件或伺服器的建議,如果已實作或被認為無效/與主題無關,則可能會被我們的版主移除。有關如何管理 Apache HTTP 伺服器的問題應導向 Libera.chat 上的 IRC 頻道 #httpd,或寄送至我們的 郵件清單