跳至內容跳至頁面導覽:上一頁 [access key p]/下一頁 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文件 / 管理指南 / 服務 / Squid 快取代理伺服器
適用範圍 SUSE Linux Enterprise Server 15 SP3

36 Squid 快取代理伺服器

Squid 是廣泛用於 Linux 和 UNIX 平台的快取代理伺服器。這表示它會將要求的網際網路物件 (例如網頁伺服器或 FTP 伺服器上的資料),儲存在比伺服器更接近要求工作站的機器上。您可設定多階層,以確保即使在對終端使用者而言透明的模式下,也能達到最佳的回應速度和較低的頻寬使用量。

Squid 充當快取代理伺服器。它會將物件要求從用戶端 (在此例中是從網頁瀏覽器) 重新導向至伺服器。當從伺服器而來的要求物件到達時,它會將物件傳送到用戶端,並在硬碟快取記憶體中保留物件的副本。快取的其中一個優點是,當有數個用戶端要求相同的物件時,可以從硬碟快取來提供該物件。這可讓用戶端比從網際網路更快地擷取資料。此程序還可以減少網路流量。

除實際的快取外,Squid 還提供眾多其他功能:

  • 在代理伺服器的互通階層之間分配負載

  • 為所有存取代理伺服器的用戶端定義嚴格的存取控制清單

  • 允許或拒絕使用其他應用程式存取特定網頁

  • 針對頻繁造訪的網頁產生統計資料,用於評估網頁瀏覽習慣

Squid 不是一般的代理伺服器。一般而言,它只會代理 HTTP 連接。它支援 FTP、Gopher、SSL 以及 WAIS 通訊協定,但不支援其他網際網路通訊協定,例如針對新聞或視訊會議的通訊協定。因為 Squid 只支援將 UDP 通訊協定用於在不同快取之間提供通訊功能,許多多媒體程式並不受支援。

36.1 一些關於代理伺服器的說明

做為快取代理伺服器,Squid 有數種使用方式。若與防火牆合併,它有助於提高安全性。多個代理可一起使用。它也可以判斷應該快取物件類型和持續的時間長短。

36.1.1 Squid 和安全性

Squid 可與防火牆配合使用,來防止內部網路遭受外部攻擊。防火牆將會拒絕所有的用戶端存取 Squid 以外的外部服務。所有的網路連接都必須由代理伺服器來建立。藉由這種組態方式,Squid 可完全控制網頁存取。

如果防火牆組態中包含非受保護區域 (DMZ),代理伺服器應在此區域內操作。第 36.6 節 「設定透明代理」介紹如何實作透明代理。如此可簡化用戶端的組態,因為在這種情況下,它們不需要有關代理伺服器的任何資訊。

36.1.2 多個快取

經過設定之後,可在多個 Squid 例項之間交換物件。這可減少系統的總負荷,並可增加在區域網路中取回物件的機會。您也可以設定快取階層,使快取可以將物件要求轉送至旁支快取或上層快取,如此其便可從區域網路中的另一個快取或直接從來源要求物件。

為快取記憶體階層選擇適當的拓樸是非常重要的,因為這樣它就不會增加網路的整體流量。就大型網路而言,理想的做法是:為每個子網路設定一個代理伺服器,並將它們與上層代理伺服器連接,再連接至 ISP 的快取代理伺服器。

這些通訊都是由在 UDP 通訊協定最上層執行的 ICP (網際網路快取通訊協定) 所處理。在快取之間的資料傳輸是使用以 TCP 為基礎的 HTTP (超文字傳輸通訊協定,Hypertext Transmission Protocol) 來處理。

為了找到最適合向其要求物件的伺服器,一個快取會將 ICP 要求傳送到所有旁支代理。旁支代理會透過 ICP 回應答覆這些要求。若偵測到物件,它們會使用代碼 HIT,若未偵測到,則使用 MISS

如果發現多個 HIT 回應,代理伺服器會依據哪個快取傳送回覆的速度最快或哪部伺服器較近等因素來決定要從哪部伺服器下載。如果沒有收到滿意的回應,則會將要求傳送到上層快取。

注意
注意:Squid 如何避免物件重複

為了避免網路上不同的快取記憶體中出現物件重複,系統會使用其他 ICP 通訊協定。例如 CARP (快取陣列路由通訊協定) 或 HTCP (超文字快取通訊協定)。在網路中維護的物件愈多,找到所需物件的機會就愈大。

36.1.3 快取網際網路物件

網路中提供的很多物件都不是靜態的,例如動態產生的頁面和 TLS/SSL 加密內容。此類物件是不會被快取的,因為每次存取這些物件時,它們都會改變。

為確定物件在快取中應保留的時間,系統會為物件指定其中一種狀態。網頁以及代理伺服器會藉由新增標頭至這些物件來找出物件的狀態,例如上一次修改到期以及對應的日期。也可使用指定不得快取的物件的其他標題。

快取中的物件通常會因缺少可用磁碟空間而透過 LRU (最久未用) 之類的演算法進行替換。這表示代理會刪除那些最久沒有被要求的物件。

36.2 系統要求

系統要求主要取決於該系統必須承擔的最大網路負載。因此請檢查負載尖峰值,因為在這些時段,負載可能會達到日平均值的四倍以上。若不能確定,請稍稍高估系統要求。若 Squid 的工作負荷臨近其處理能力上限,可能會嚴重影響服務品質。接下來的幾節將依重要程度依次指出系統因素:

  1. RAM 大小

  2. CPU 速度/實體 CPU 核心

  3. 磁碟快取的大小

  4. 硬碟/SSD 及其架構

36.2.1 RAM

Squid 所需的記憶體 (RAM) 容量與快取中的物件數量有直接的關係。隨機存取記憶體的速度比硬碟/SSD 快很多。因此,請務必讓 Squid 程序擁有充足的記憶體,因為若使用交換磁碟,系統效能會大幅降低。

Squid 也會將快取記憶體物件的參照以及常要求的物件儲存在主記憶體中以加速此資料的擷取速度。除此之外,Squid 需要在記憶體中保留其他的資料,例如所有已處理 IP 位址的表格、精確的網域名稱快取、最常要求的物件、存取控制清單、緩衝區等等。

36.2.2 CPU

Squid 已經過優化,在處理器核心數量較少 (4 - 8 個實體核心) 的情況下工作狀態最好,這樣每個核心都能提供出色的效能。像超執行緒這類提供虛擬核心的技術會影響效能。

要充分利用多個 CPU 核心,必須設定多個寫入不同快取裝置的工作執行緒。預設情況下,多核心支援通常都處於停用狀態。

36.2.3 磁碟快取的大小

在小的快取中,HIT (發現要求的物件已在該處) 的機率比較小,因為快取很容易就會填滿,所以較少要求的物件會替換為新的物件。例如,如果快取的可用空間為 1 GB,而使用者一天僅瀏覽 10 MB,則需要 100 多天才會將快取填滿。

確定所需快取大小的最簡易方法是考量連接的最大傳輸速率。1 Mbit/s 連接的最大傳輸速率為 128 KB/s。如果所有流量都流向快取,一個小時內這些量會達到 460 MB。假設所有流量都是在 8 小時工作時間產生,則一天內會達到 3.6 GB。由於連接一般都不會用到其容量上限,因此可以假設快取記憶體所處理的總資料容量大約為 2 GB。因此在本例中,Squid 需要 2 GB 磁碟空間來存放一天內快取的資料瀏覽量。

36.2.4 硬碟/SSD 架構

速度在快取處理過程中扮演很重要的角色,因此應該特別注意這個因素。對於硬碟/SSD,此參數稱為隨機搜尋時間隨機讀取效能,按毫秒計算。因為 Squid 從硬碟/SSD 讀取或寫入其中的資料區塊通常都很小,所以硬碟/SSD 的搜尋時間/讀取效能比其資料輸送量更重要。

如果要充當代理伺服器,高轉速硬碟或 SSD 會是最好的選擇。使用硬碟時,採用多個較小硬碟的效果可能更佳,因為每個硬碟都有單獨的快取目錄,可避免讀取次數過多。

如果采用 RAID 系統,可以犧牲速度來提升可靠性。但是基於效能考量,請避免使用 (軟體) RAID5 及類似設定。

檔案系統的選擇通常無關緊要。但是,使用掛接選項 noatime 可提升效能 - Squid 提供自己的時戳,因此無需檔案系統追蹤存取時間。

36.3 Squid 的基本用法

如果尚未安裝套件 squid 。預設情況下,SUSE® Linux Enterprise Server 上不會安裝 squid 套件。

Squid 在 SUSE® Linux Enterprise Server 中已經過預先設定,可在安裝後直接啟動。為了確保啟動更平順,應該將網路設定為至少使用一部名稱伺服器,而且可連接網際網路。如果撥號連接是使用動態 DNS 組態,就有可能產生問題。在此情況下,至少應指定名稱伺服器,因為如果 Squid 在 /var/run/netconfig/resolv.conf 中未偵測到 DNS 伺服器,就不會啟動。

36.3.1 啟動 Squid

若要啟動 Squid,請使用:

tux > sudo systemctl start squid

若要讓 Squid 隨系統開機一起啟動,請使用 systemctl enable squid 啟用該服務。

36.3.2 檢查 Squid 是否正在運作

若要檢查 Squid 是否正在執行,請選擇下列其中一種方式:

  • 使用 systemctl

    tux > systemctl status squid

    此指令的輸出應指出 Squid 已載入在使用中 (執行中)

  • 使用 Squid 自身:

    tux > sudo squid -k check | echo $?

    此指令的輸出應當為 0,但也可能包含其他警告或訊息。

若要測試 Squid 在本地系統上的功能,請選擇下列其中一種方式:

  • 若要進行測試,您可以使用指令行工具 squidclient,它可向 Web 要求輸出回應,類似於 wgetcurl

    與這些工具不同的是,squidclient 會自動連接至 Squid 的預設代理設定 localhost:3128。不過,如果您變更過 Squid 的組態,則需要透過指令行選項將 squidclient 設定為使用其他設定。如需詳細資訊,請參閱 squidclient --help

    範例 36.1︰ 使用 squidclient 提交的要求
    tux > squidclient http://www.example.org
    HTTP/1.1 200 OK
    Cache-Control: max-age=604800
    Content-Type: text/html
    Date: Fri, 22 Jun 2016 12:00:00 GMT
    Expires: Fri, 29 Jun 2016 12:00:00 GMT
    Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
    Server: ECS (iad/182A)
    Vary: Accept-Encoding
    X-Cache: HIT
    x-ec-custom-error: 1
    Content-Length: 1270
    X-Cache: MISS from moon1
    X-Cache-Lookup: MISS from moon:3128
    Via: 1.1 moon (squid/3.5.16)2
    Connection: close
    
    <!doctype html>
    <html>
    <head>
        <title>Example domain</title>
    [...]
    </body>
    </html>

    範例 36.1 「使用 squidclient 提交的要求」中顯示的輸出可以分成兩個部分:

    1. 回應的通訊協定標題:空白行前面的幾行。

    2. 回應的實際內容:空白行後面的幾行。

    若要驗證是否使用了 Squid,請參閱所選的標題行:

    1

    標題 X-Cache 的值指明所要求的文件不在電腦 moon 的 Squid 快取中 (MISS)。

    上面的範例包含兩行 X-Cache。您可以忽略第一個 X-Cache 標題,因為它是由來源 Web 伺服器的內部快取軟體產生。

    2

    標題 Via 的值指明 HTTP 版本、電腦名稱和正在使用的 Squid 的版本。

  • 使用瀏覽器:將代理設定為 localhost,連接埠設定為 3128。然後,您可以載入一個頁面,並在瀏覽器的審查器開發人員工具網路面板中檢查回應標題。該標題應該會以範例 36.1 「使用 squidclient 提交的要求」中所述的類似方式再次產生。

若要允許本地系統和其他系統的使用者存取 Squid 和網際網路,請將 /etc/squid/squid.conf 組態檔中的 http_access deny all 項目變更為 http_access allow all。然而,當您這麼做時,請考量到此動作將使 Squid 可供任何人完全存取。因此,需定義用於控制對代理伺服器的存取權限的 ACL (存取控制清單)。修改組態檔案後,必須重新載入或重新啟動 Squid。如需 ACL 的詳細資訊,請參閱第 36.5.2 節 「存取控制選項」

如果 Squid 在成功啟動後不久就結束,請檢查名稱伺服器項目是否有誤,或者是否缺少 /var/run/netconfig/resolv.conf 檔案。Squid 會在 /var/log/squid/cache.log 檔案中記錄啟動失敗的原因。

36.3.3 停止、重新載入和重新啟動 Squid

若要重新載入 Squid,請選擇以下其中一種方法:

  • 使用 systemctl

    tux > sudo systemctl reload squid

    tux > sudo systemctl restart squid
  • 使用 YaST:

    在 Squid 模組中,按一下儲存設定並立即重新啟動 Squid 按鈕。

若要停止 Squid,請選擇以下其中一種方法:

  • 使用 systemctl

    tux > sudo systemctl stop squid
  • 使用 YaST

    在 Squid 模組中,按一下立即停止 Squid。按鈕.

關閉 Squid 可能需要一些時間,因為 Squid 會等待最長半分鐘時間,來中斷與用戶端的連接並將其資料寫入磁碟 (請參閱 /etc/squid/squid.conf 中的 shutdown_lifetime 選項)。

警告
警告:終止 Squid

使用 killkillall 來終止 Squid 有可能會損毀快取。若要能夠重新啟動 Squid,必須刪除損毀的快取。

36.3.4 移除 Squid

從系統中移除 Squid 並不會移除快取階層與記錄檔案。若要移除這些階層,請手動刪除 /var/cache/squid 目錄。

36.3.5 本地 DNS 伺服器

即使本地 DNS 伺服器不管理自己的網域,也可以設定本地 DNS 伺服器。它可以做為僅供快取的名稱伺服器,也可以透過根 名稱伺服器來解析 DNS 要求,而不需任何特殊的組態 (請參閱第 31.4 節 「啟動 BIND 名稱伺服器」)。如何達成此目的,端視您在設定網際網路連線的組態時,是否選擇動態的 DNS 而定。

動態 DNS

一般而言,使用動態 DNS 時,會由提供者在建立網際網路連線期間設定 DNS 伺服器,且 /var/run/netconfig/resolv.conf 本地檔案會自動進行調整。可以使用以下 sysconfig 變數在檔案 /etc/sysconfig/network/config 中控制此行為: NETCONFIG_DNS_POLICY 。設定 NETCONFIG_DNS_POLICY 針對 "" (使用 YaST sysconfig 編輯器)。

然後在 /var/run/netconfig/resolv.conf 檔案中新增本地 DNS 伺服器,並將 localhost 的 IP 位址設定為 127.0.0.1。這樣,Squid 每次啟動時就能找到本地名稱伺服器。

為了使提供者的名稱伺服器可供存取,請在 /etc/named.conf 組態檔案中的 forwarders 下指定該名稱伺服器及其 IP 位址。若使用動態 DNS,則可在建立連接時自動完成上述操作,方法是將 sysconfig 變數 NETCONFIG_DNS_POLICY 針對 auto

靜態 DNS

若使用靜態 DNS,建立連接時將不會執行任何自動的 DNS 調整,所以不必變更任何 sysconfig 變數。但是您必須依照動態 DNS中所述在 /var/run/netconfig/resolv.conf 檔案中指定本地 DNS 伺服器。除此之外,還必須在 /etc/named.conf 檔案中的 forwarders 下手動指定提供者的靜態名稱伺服器及其 IP 位址。

提示
提示:DNS 與防火牆

如果您有執行防火牆,請確定 DNS 要求可以通過防火牆。

36.4 YaST Squid 模組

YaST Squid 模組包含以下索引標籤:

啟動

指定啟動 Squid 的方式,以及在哪些介面上開啟哪個防火牆連接埠。

HTTP 連接埠

定義 Squid 將用來監聽用戶端 HTTP 要求的連接埠。

重新整理模式

定義 Squid 如何處理快取中的物件。

快取記憶體設定

定義有關快取記憶體、最大和最小物件大小等的設定。

快取目錄

定義 Squid 用來儲存所有快取交換檔案的頂層目錄。

存取控制

透過 ACL 群組控制對 Squid 伺服器的存取。

記錄和逾時

定義用於存取、快取和快取儲存記錄檔案的路徑,以及連接逾時和用戶端存留期。

雜項

設定管理員的語言和電子郵件地址。

36.5 Squid 組態檔案

所有的 Squid 代理伺服器的設定值都是在 /etc/squid/squid.conf 檔案中設定。在第一次啟動 Squid 時,此檔案不需做任何變更,但是外部用戶端一開始為拒絕存取。代理可供 localhost 使用。預設的連接埠是 3128。預先安裝的 /etc/squid/squid.conf 組態檔可提供關於選項及許多範例的詳細資訊。

許多項目標有備註,因此以備註字元 # 開頭。相關規格請見行尾。給定值一般與預設值相關聯,因此僅移除備註符號而不變更任何參數通常毫無效果。若有可能,請保留原始的備註行,在該行的下方插入選項以及修改過的值。如此一來,就可以輕易復原預設值,並與變更做比較。

提示
提示:更新後調整組態檔案

如果您是從較早的 Squid 版本更新,建議您編輯新的 /etc/squid/squid.conf,並且只套用在舊檔案中所做的變更。

有時候,該檔案中會新增、移除或修改 Squid 選項。因此,如果您嘗試使用舊的 squid.conf,Squid 可能會無法正常運作。

36.5.1 一般組態選項

下面列出了 Squid 的一些組態選項,但並不詳盡。/etc/squid/squid.conf.documented 中列出了 Squid 套件的完整選項清單,其中僅做了簡單記錄。

http_port 連接埠

這是 Squid 監聽用戶端要求所用的連接埠。預設的連接埠是 3128,但是 8080 也是常用的連接埠。

cache_peer 主機名稱 類型 代理連接埠 ICP 連接埠

此選項允許建立協同工作的快取網路。快取對等是一台同樣代管網路快取且與您自己的電腦有某種關係的電腦。類型指定關係的類型。類型可以是 parentsibling

對於 HOST_NAME,請指定要使用的代理伺服器的名稱或 IP 位址。對於代理連接埠,請指定瀏覽器中要使用的連接埠號碼 (通常為 8080)。將 ICP 連接埠設定為 7,如果上層的 ICP 連接埠未知且其用途與提供者無關,則設定為 0

若要讓 Squid 以網頁瀏覽器而非代理伺服器的方式工作,請禁止使用 ICP 通訊協定。您可以附加選項 defaultno-query 來實現此目的。

cache_mem 大小

此選項定義 Squid 可用於常用回覆的記憶體容量。預設值為 8 MB。這不指定 Squid 的記憶體使用量,而且可以超過。

cache_dir 儲存類型 快取目錄 快取大小 層級 1 目錄 層級 2 目錄

選項 cache_dir 定義磁碟快取的目錄。在 SUSE Linux Enterprise Server 上的預設組態中,Squid 不會建立磁碟快取。

預留位置儲存類型可以是下列其中一種:

  • 目錄式儲存類型:ufsaufs (預設類型)、diskd。這三類都是 ufs 儲存形式的變體。不過,雖然 ufs 是做為核心 Squid 執行緒的一部分執行,但 aufs 是在單獨的執行緒中執行,而 diskd 則使用單獨的程序。這表示後兩種類型可避免因磁碟 I/O 而封鎖 Squid。

  • 資料庫式儲存系統:rock。此儲存形式依賴於單一資料庫檔案,在此檔案中,每個物件佔用固定大小的一或多個記憶體單位 (插槽)。

下文將只介紹基於 ufs 的儲存類型的參數。rock 的參數有些不同。

快取目錄是磁碟快取的目錄,預設為 /var/cache/squid快取大小是該目錄的最大大小 (以 MB 為單位),預設設定為 100 MB。請將其設定為介於可用磁碟空間的 50% 和最大 80% 之間的值。

最後兩個值層級 1 目錄層級 2 目錄指定快取目錄中建立的子目錄數。預設情況下,在快取目錄下的第一層級會建立 16 個子目錄,其中每個子目錄下又有 256 個子目錄。提高這些值時請務必謹慎,因為建立太多目錄會導致效能問題。

如果您有數個共用一個快取的磁碟,請指定數行 cache_dir

cache_access_log 記錄檔案, cache_log 記錄檔案, cache_store_log 記錄檔案

這三個選項指定 Squid 記錄其所有動作的路徑。一般情況下,無需變更此處的任何設定。如果 Squid 負荷過重,則可能需要將快取與記錄檔案分散到數個磁碟上。

client_netmask 網路遮罩

此選項允許透過套用子網路遮罩在記錄檔案中遮罩用戶端的 IP 位址。例如,若要將 IP 位址的最後一位設定為 0,請指定 255.255.255.0

ftp_user 電子郵件

此選項允許設定 Squid 應該用於匿名 FTP 登入的密碼。請在此處指定有效的電子郵件地址,因為一些 FTP 伺服器會檢查這些資料的有效性。

cache_mgr 電子郵件

如果 Squid 意外當機,將會向此電子郵件地址傳送一封郵件。預設值為網站管理員

logfile_rotate

如果您執行 squid -k rotatesquid 可以輪替記錄檔案。在此程序中會計算檔案的數量,而且在到達指定的值後,就會覆寫最舊的檔案。預設值為 10,表示輪替編號為 0 到 9 的記錄檔案。

但是,在 SUSE Linux Enterprise Server 上,記錄檔案的輪替是透過使用 logrotate 和組態檔案 /etc/logrotate.d/squid 自動執行的。

append_domain 網域

使用 append_domain 可指定當未指定網域時自動附加的網域。通常可在此處指定您自己的網域,因此在瀏覽器中指定 www 將存取您自己的 Web 伺服器。

forwarded_for 狀態

如果此選項設定為 on,則會將如下所示的一行新增至標題:

X-Forwarded-For: 192.168.0.1

如果您將選項設定為 off,則 Squid 會從 HTTP 要求中移除用戶端的 IP 位址及系統名稱。

negative_ttl 時間, negative_dns_ttl 時間

如果設定了這些選項,Squid 將快取某些類型的失敗,例如 404 回應。之後,它將拒絕發出新要求,即使當時資源可供使用。

預設情況下,negative_ttl 設定為 0negative_dns_ttl 設定為 1 minute。這表示預設情況下不會快取對 Web 要求的負面回應,但會將 DNS 要求的負面回應快取 1 分鐘。

never_direct allow ACL 名稱

為了防止 Squid 接受直接來自網際網路的要求,請使用選項 never_direct 以強制連接連到另一個代理伺服器。事先必須已在 cache_peer 中指定該代理。如果將 ACL 名稱指定為 all,則所有要求將直接轉送至 parent。有時這可能是必要的,例如,您所使用的提供者規定了其代理的使用方式或拒絕其防火牆直接存取網際網路時。

36.5.2 存取控制選項

Squid 會提供一個精細化系統來控制對代理伺服器的存取。這些存取控制清單 (ACL) 都是包含依順序處理的規則的清單。在使用 ACL 前必須先進行定義。某些預設的 ACL,例如 alllocalhost 已經存在。然而,僅定義 ACL 並不代表實際上會套用。僅當存在對應的 http_access 規則時才會套用。

選項 acl 的語法如下所示:

acl ACL_NAME TYPE DATA

此語法中的預留位置含義如下所示:

  • 名稱 ACL_NAME 可以隨意選擇。

  • 對於 TYPE/etc/squid/squid.conf 檔案的 ACCESS CONTROLS 區段中提供了多個不同的選項,您可以從中選取。

  • DATA 的規格取決於單個 ACL 類型 (例如主機名稱、IP 位址或 URL),也可以從檔案中讀取。

若要在 YaST Squid 模組中新增規則,請開啟該模組,然後按一下存取控制索引標籤。在「ACL 群組」清單下按一下新增,然後輸入規則的名稱、類型及其參數。

如需 ACL 規則類型的詳細資訊,請參閱 http://www.squid-cache.org/Versions/v3/3.5/cfgman/acl.html 上的 Squid 文件。

範例 36.2︰ 定義 ACL 規則
acl mysurfers srcdomain .example.com 1
acl teachers src 192.168.1.0/255.255.255.0 2
acl students src 192.168.7.0-192.168.9.0/255.255.255.0 3
acl lunch time MTWHF 12:00-15:00 4

1

此 ACL 將 mysurfers 定義為來自 .example.com 中的所有使用者 (由 IP 的反向查詢確定)。

2

此 ACL 將 teachers 定義為其電腦 IP 位址以 192.168.1. 開頭的使用者。

3

此 ACL 將 students 定義為其電腦 IP 位址以 192.168.7.192.168.8.192.168.9. 開頭的使用者。

4

此 ACL 將 lunch 定義為星期一至星期五的中午到下午 3 點之間的某個時間。

http_access allow ACL 名稱

http_access 定義誰可以使用代理伺服器,以及誰能夠存取網際網路上的哪些內容。為此必須定義 ACL。上文中已經定義了 localhostall,您可以透過 denyallow 拒絕或允許對它們的存取。可以建立包含任意多個 http_access 項目的清單,並依自上而下的順序處理這些項目。依據哪個項目先發生,系統會允許或拒絕存取相應的 URL。最後一個項目應該永遠為 http_access deny all。在下面的範例中,localhost 可隨意存取任何內容,而所有其他的主機則完全被拒絕存取:

http_access allow localhost
http_access deny all

在另一個使用這些規則的範例中,teachers 群組永遠具有網際網路的存取權。群組 students 僅在星期一至星期五的午餐時間才有存取權:

http_access deny localhost
http_access allow teachers
http_access allow students lunch time
http_access deny all

基於可讀性考量,請在組態檔案 /etc/squid/squid.conf 中將所有 http_access 選項指定在一個區塊中。

url_rewrite_program 路徑

此選項可用於指定 URL 重寫器。

auth_param basic program 路徑

如果必須在代理伺服器上對使用者進行驗證,請設定對應的程式,如 /usr/sbin/pam_auth。當第一次存取 pam_auth 時,使用者會看到需要其指定使用者名稱與密碼的登入視窗。此外,您還需要一個 ACL,以便僅讓具備有效登入的用戶端使用網際網路:

acl password proxy_auth REQUIRED

http_access allow password
http_access deny all

acl proxy_auth 選項中,使用 REQUIRED 表示接受所有有效的使用者名稱。REQUIRED 還可以替換為允許的使用者名稱清單。

ident_lookup_access allow ACL 名稱

藉由此選項,可以執行 ident 要求,以便為類型為 src 的 ACL 定義的所有用戶端確定每個使用者的身分。或者,可以針對所有用戶端使用此選項,對於 ACL 名稱,則套用預先定義的 ACL all

ident_lookup_access 涵蓋的所有用戶端都必須執行 ident 精靈。在 Linux 上,您可以將 pidentd ( pidentd 套件) 用做 ident 精靈。對於其他作業系統,通常有免費的軟體可供使用。若要確保只有 ident 查閱成功的用戶端才有權存取,請定義對應的 ACL:

acl identhosts ident REQUIRED

http_access allow identhosts
http_access deny all

acl identhosts ident 選項中,使用 REQUIRED 表示接受所有有效的使用者名稱。REQUIRED 還可以替換為允許的使用者名稱清單。

使用 ident 會延緩存取時間,因為對每個要求都要重複 ident 查閱。

36.6 設定透明代理

透明代理會攔截並回應網頁瀏覽器的要求,因此網頁瀏覽器可收到所要求的頁面,但並不知道它們來自何處。顧名思義,整個過程對於使用者而言是透明的。

使用代理伺服器的一般方式如下:網頁瀏覽器向代理伺服器的某個連接埠傳送要求,代理永遠都會提供要求的這些物件,而不論它們是否在其快取中。不過,在某些情況下,Squid 的透明代理模式很有效:

  • 若出於安全原因,建議所有用戶端都使用代理伺服器來瀏覽網際網路。

  • 若所有用戶端都必須使用代理伺服器,不論它們是否清楚這一點。

  • 若網路上的代理伺服器已轉移,但現有用戶端需要保留其原有的組態。

程序 36.1︰ Squid 充當透明代理伺服器 (指令行)
  1. /etc/squid/squid.conf 的選項 http_port 所在行中新增參數 transparent。此時應該有 2 行:

    http_port 3128
    http_port 3128 transparent
  2. 重新啟動 Squid:

    tux > sudo systemctl restart squid
  3. 設定防火牆,以便將 HTTP 流量重新導向至 http_proxy 中指定的連接埠。在上例中為連接埠 3128。然後重新載入防火牆組態。此操作假設已將區域 internal 指定給您的 LAN 介面。

    tux > sudo firewall-cmd --permanent --zone=internal \
        --add-forward-port=port=80:proto=tcp:toport=3128:toaddr=LAN_IP
    tux > sudo firewall-cmd --permanent --zone=internal --add-port=3128/tcp
    tux > sudo firewall-cmd --reload

    以您 LAN 介面或 Squid 所監聽介面的 IP 位址取代 LAN_IP

  4. 若要確認一切正常,請查看 /var/log/squid/access.log 中的 Squid 記錄檔案。

36.7 使用 Squid 快取管理員 CGI 介面 (cachemgr.cgi)

Squid 快取管理員 CGI 介面 (cachemgr.cgi) 是一種 CGI 公用程式,用來顯示執行中 Squid 程序的記憶體使用量統計資料。您也可以用它來方便地管理快取和檢視統計資料,因為不需要登入伺服器。

程序 36.2︰ 設定 cachemgr.cgi
  1. 確定 Apache Web 伺服器正在系統上執行。依第 34 章 「Apache HTTP 伺服器 中所述方式設定 Apache。請著重參閱第 34.5 節 「啟用 CGI 程序檔」。若要檢查 Apache 是否已在執行中,請使用:

    tux > sudo systemctl status apache2

    若顯示 inactive,您可以使用 SUSE Linux Enterprise Server 預設設定啟動 Apache:

    tux > sudo systemctl start apache2
  2. 現在,在 Apache 中啟用 cachemgr.cgi。為此,請為 ScriptAlias 建立一份組態檔案。

    在目錄 /etc/apache2/conf.d 中建立該檔案,並將其命名為 cachemgr.conf。在該檔案中新增下列內容:

    ScriptAlias /squid/cgi-bin/ /usr/lib64/squid/
    
    <Directory "/usr/lib64/squid/">
    Options +ExecCGI
    AddHandler cgi-script .cgi
    Require host HOST_NAME
    </Directory>

    HOST_NAME 替換為您要用於存取 cachemgr.cgi 的電腦的主機名稱。這樣可限制只有您的電腦方可存取 cachemgr.cgi。若要允許從任何位置存取該檔案,請改用 Require all granted

    • 如果 Squid 與您的 Apache Web 伺服器在同一台電腦上執行,則無需對 /etc/squid/squid.conf 進行任何變更,但需驗證 /etc/squid/squid.conf 是否包含以下幾行:

      http_access allow manager localhost
      http_access deny manager

      這幾行允許您從自己的電腦 (localhost) 存取管理員介面,但不允許從其他位置存取。

    • 如果 Squid 與您的 Apache Web 伺服器不在同一台電腦上執行,您需要新增其他規則,以便允許從 Squid 的 CGI 程序檔存取。為您的伺服器定義 ACL (將 WEB_SERVER_IP 替換為您的 Web 伺服器的 IP 位址):

      acl webserver src WEB_SERVER_IP/255.255.255.255

      確定下列規則都包含在組態檔案中。與預設組態相比,只有中間的規則是新增的。不過,這些規則的前後順序非常重要。

      http_access allow manager localhost
      http_access allow manager webserver
      http_access deny manager
  3. (選擇性) 或者,您也可以為 cachemgr.cgi 設定一或多個密碼。這樣還可允許執行更多動作,例如在遠端關閉快取,或者檢視有關快取的詳細資訊。為此,請使用管理員的一或多個密碼以及允許的動作清單設定選項 cache_mgrcachemgr_passwd

    例如,若要明確允許在未經驗證的情況下檢視索引頁面、功能表、60 分鐘計數器的平均值,允許使用密碼 secretpassword 切換離線模式,以及完全停用任何其他功能,請使用以下組態:

    cache_mgr user
    cachemgr_passwd none index menu 60min
    cachemgr_passwd secretpassword offline_toggle
    cachemgr_passwd disable all

    cache_mgr 定義使用者名稱。cache_mgr 定義使用哪個密碼允許哪些動作。

    nonedisable 是特殊關鍵字:none 表示無需使用密碼,disable 會徹底停用功能。

    登入 cachemgr.cgi 之後,便可全面查看完整的動作清單。若要瞭解在組態檔案中需如何參考操作,請查看動作頁面 URL 中 &operation= 後面的字串。all 是特殊關鍵字,表示所有動作。

  4. 在組態檔案變更後重新載入 Squid 和 Apache:

    tux > sudo systemctl reload squid
  5. 若要檢視統計資料,請移至先前設定的 cachemgr.cgi 頁面。例如 http://webserver.example.org/squid/cgi-bin/cachemgr.cgi

    選擇適當的伺服器,若已設定,請指定使用者名稱和密碼。然後按一下繼續並瀏覽不同的統計資料。

36.8 使用 Calamaris 產生快取報告

Calamaris 是一種 Perl 程序檔,用來產生 ASCII 或 HTML 格式的快取記憶體活動報告。它使用原生的 Squid 存取記錄檔。Calamaris 的首頁網址為 http://cord.de/calamaris-english。此工具不屬於 SUSE Linux Enterprise Server 預設安裝範圍,若想使用它,可以安裝 calamaris 套件。

root 身分登入,然後輸入:

root # cat access1.log [access2.log access3.log] | calamaris OPTIONS > reportfile

如果使用的記錄檔案不止一個,請確定它們依時間順序排列,時間越早的檔案越靠前。為此,您可以如上例一般逐個列出檔案,也可以使用 access{1..3}.log

calamaris 可使用下列選項:

-a

輸出所有可用的報告

-w

以 HTML 報告輸出

-l

在報告標題中包含訊息或標誌

在程式的手冊頁中,使用 man calamaris 可以找到各種選項的詳細資訊。

以下是典型的範例:

root # cat access.log.{10..1} access.log | calamaris -a -w \
> /usr/local/httpd/htdocs/Squid/squidreport.html

這會將報告放在網頁伺服器的目錄中。需要有 Apache 才能檢視報告。

36.9 更多資訊

請瀏覽 Squid 的首頁,網址為 http://www.squid-cache.org/。此處可以找到Squid 使用者指南(Squid User Guide) 以及有關 Squid 常見問題集 (FAQ) 的豐富資訊。

除此之外,還可以在 http://www.squid-cache.org/Support/mailing-lists.html 中找到 Squid 的郵件清單。