為什麼需要在一台服務器上安置多個 SSL 站點?確實有企業需要在一台服務器上托管多個 SSL 站點嗎?我們將通過一個真實的場景來解釋這些問題。有創新精神的用戶肯定會為這種思想找到更新穎的用途。
案例研究:兩個應用程序,一台服務器
在我們公司早期的一個項目中,人力資源(HR)部門希望為一個基於 Web 的福利應用程序提供外部互聯網訪問。用戶大多是從公司網絡內部訪問這個 Web 應用程序的,但是偶爾也會通過外部互聯網訪問它。為了滿足安全需求,我們決定將這個應用程序放在公司網絡內部的一台服務器上,使用 Apache 的 HTTP 服務器構建一個反向代理服務器。反向代理服務器會終止 SSL 連接,再重新打開另外一個到托管 HR 應用程序的 Web 應用服務器的 SSL 連接。通過在 Apache Web 服務器中添加 mod_security 模塊,即可將反向代理服務器改為應用網關,並為 Web 應用程序提供更高的安全性。HR 部門精心挑選了一個完全限定域名(FQDN),這個域名是用戶友好的,易於記憶。隨後,我們繼續向前推進,獲得了 SSL 證書,我們認為一切就這樣圓滿結束了。
一年的時間很快就過去了。另一個企業 Web 應用程序出現了,它的需求與 HR 應用程序極為相似。它也需要為外部用戶提供訪問能力。外部用戶的數量非常少。大多數訪問都是在公司網絡中進行的。我們立刻想到使用反向代理服務器為這個新的 Web 應用程序提供外部訪問。
但是,這個新的應用程序有點兒麻煩。首先,我們很關心數據中心的物理空間,竭力在一切應用程序的部署中尋求整合服務器的機會。其次,我們必須證明購買額外的反向代理服務器是值得的。這兩個因素結合在一起,促使我們仔細研究如何使用現有的反向代理服務器滿足新 Web 應用程序的需求。惟一的問題是,這個應用程序需要一個與現有 HR 應用程序不同的 FQDN。
我們研究了幾種為新的 Web 應用程序使用現有反向代理服務器的方法。第一種想法是,將新舊兩個應用程序的域名都改為某個通用域名,比如 rp.company.com,並用上下文路徑區分這兩個應用程序。但是,原來的反向代理服務器用戶強烈反對改變域名。如果改變域名,他們必須將域名變更情況通知公司中的所有人,還要修改所有印刷資料,以反映新的 URL。改變域名的成本非常高,而且可能會影響客戶支持部門,他們不可避免地會收到大量用戶投訴。另外,兩個應用程序組都希望保留自己的 FQDN,他們認為自己精心選擇的 FQDN 比這種一般化的 URL 更醒目,而且也是宣傳推廣這些 Web 應用程序的有效手段。
另一個想法是:為什麼不注冊一個 DNS 入口,讓它將新的域名指向現有的服務器?這個想法很快就被否決了。在 SSL 應用程序中,SSL 證書必須與用戶請求的 URL 匹配,否則會彈出一個警告消息,指出所請求的 URL 與 SSL 證書的域名不匹配。由於彈出式廣告和惡意軟件日益猖獗,公司中每個訓練有素的人都會取消產生彈出警告框的 Web 交互。根據公司架構標准的要求,生產性 Web 應用程序嚴禁生成彈出警告消息。
另一個建議是:使第二個 SSL 站點駐留在運行第一個站點的服務器的不同端口上。但是,我們覺得這會給用戶帶來過多的困擾,用戶很難同時記住站點 URL 和端口號。如果用戶只輸入 URL 而沒有輸入端口號,他們就會被重定向到 HR 應用程序。這會導致很多問題。
解決方案:IP 別名
最終敲定的解決方案是 IP 別名(IP aliasing)。在尋找這個解決方案時,最需要技巧的部分就是確定正確的術語。最初引入這個概念時,我們聽到了虛擬接口(virtual interface) 和虛擬 IP(virtual IP) 等術語。我們艱難地尋找著關於這些概念的信息;但我們最終意識到,我們正在尋找的東西是通常被稱為 IP 別名功能的概念,這幫助我們找到了關於該主題的更多文獻。IP 別名有時候也稱為網絡接口別名(network interface aliasing) 或邏輯接口(logical interface)。
Linux 系統上的 IP 別名
混雜模式:一個警告
配置了多個 IP 地址時,某些以太網卡會進入所謂的混雜模式(promiscuous mode)。在混雜模式下,網卡將捕捉本地網絡上的所有通信流量。這可能導致服務器易受網絡上其他主機轉發的攻擊。大多數嗅探器和網絡監視軟件會使以太網卡進入混雜模式,以便捕捉所有網絡通信包。
IP 別名背後的概念很簡單:可以在一個網絡接口上配置多個 IP 地址。這樣就能夠在使用單一接口的同一個服務器上運行多個 Web 服務器。設置 IP 別名也非常容易。只需配置系統上的網絡接口,讓它監聽額外的 IP 地址。在 Linux™ 系統上,可以使用標准的網絡配置工具(比如 ifconfig 和 route 命令)添加 IP 別名,也可以利用圖形化網絡管理工具。
在一般情況下,會為每塊以太網卡配置一個物理單元號。要想在已經配置的以太網卡上添加額外的 IP 別名,應該為一個接口配置同樣的物理單元號,但是要用一個邏輯單元號來限定它。例如,如果在物理單元號為 eth0 的以太網卡上已經配置了一個現有的 IP 地址,那麼可以通過添加一個邏輯單元號 :1 來創建 IP 別名,如清單 1 所示。可以通過遞增邏輯單元號來添加更多的 IP 地址。(注意,需要作為 root 用戶登錄。)
清單 1. 在現有的網絡接口上添加額外的 IP 地址
ifconfig eth0:1 192.168.0.2 netmask 255.255.255.0
在您正在配置的系統上,Linux 內核必須支持 IP 別名,這樣才能使用這種技術。如果內核沒有提供這種支持,可能需要重新構建內核。要想了解您的內核是否支持 IP 別名,可檢查 /proc/net/alias* 文件是否存在。
配置了新的 IP 地址之後,要為新的接口設置路由,如清單 2 所示。
清單 2. 為新的 IP 地址添加路由
route add -host 192.168.0.2 dev eth0:1
在創建新的 IP 地址之後,還需要在 /etc/hosts 文件中給這個新地址命名,如清單 3 所示。
清單 3. 為新的 IP 地址命名
192.168.0.1 primaryserver
192.168.0.2 secondaryserver
Solaris 系統上的IP別名
要想在 Solaris™ 上設置 IP 別名,使用的命令稍有不同。網絡接口的配置如清單 4 所示。需要作為 root 用戶登錄。
清單 4. 在 Solaris 上添加虛擬 IP
ifconfig eth0:1 plumb
ifconfig eth0:1 192.168.0.2 netmask 255.255.255.0
ifconfig eth0:1 up
為了讓虛擬 IP 在重啟之後仍然有效,可以將 /etc/hosts 中的 IP 地址或主機名添加到 /etc/hostname.eth0:1 文件中。
在 Linux 和 Solaris 系統上,可以在一塊物理以太網卡上創建多個虛擬接口,讓它們連接到不同子網上的 IP 地址。但是,通常應該避免這麼做,因為這會成為兩個子網之間的瓶頸,而且這兩個子網上的所有網絡設備的性能都會因此受損。
IP 別名的其他用途
還可以在客戶端使用 IP 別名執行負載和壓力測試。更多信息請參考文章 “Testing and tuning load balancers and networks”(參見 參考資料 中的鏈接)。
按照 IP 地址配置多個 SSL 站點
配置了第二個 IP 地址之後,可以按照 IP 地址將額外的 SSL 站點添加到 Apache Web 服務器的配置文件中,如清單 5 所示。
這樣就行了!我們已經在同一台服務器、同一塊物理網卡上構建了多個 SSL Web 站點。
清單 5. 兩個 SSL Web 站點的配置
Listen 443 DocumentRoot "/Web site1/docs" ServerName Web site1.company.com:443 SSLEngine on SSLCertificateFile ssl/site1.crt SSLCertificateKeyFile ssl/site1.key
DocumentRoot "/Web site2/docs" ServerName Web site2.company.com:443 SSLEngine on SSLCertificateFile ssl/site2.crt SSLCertificateKeyFile ssl/site2.key
多個 SSL 站點的其他用途
由於我們的 Apache Web 服務器上的通信流量很低,因此可以利用這個反向代理服務器為後端具有類似低流量需求的更多服務器服務。
更大、更強的服務器和網卡不斷湧現,帶寬容量也比以往更高,因此也可以用這種方法來托管多個虛擬 SSL 站點。如果客戶具有提供小額零售業務的低流量站點,而且需要 SSL 安全性,那麼您可以為其設置一個提供有限帶寬 SSL 站點的 ISP。可以利用 IP 別名在一個 IP 地址上駐留一個 SSL Web 站點,在另一個地址上提供其他服務,比如 Web 服務。其他可能性還包括設置一個主生產系統和一個故障轉移系統,從而形成備用的 QA 系統和/或 DR 系統。現在,您已經理解了 IP 別名背後的基本概念,那麼在設計應用程序時,也就有了更廣闊的可能性。