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

44 Squid 快取代理伺服器

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

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

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

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

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

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

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

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

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

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

44.1.1 Squid 和安全性

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

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

44.1.2 多個快取

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

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

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

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

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

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

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

44.1.3 快取網際網路物件

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

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

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

44.2 系統要求

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

  1. RAM 大小

  2. CPU 速度/實體 CPU 核心

  3. 磁碟快取的大小

  4. 硬碟/SSD 及其架構

44.2.1 RAM

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

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

44.2.2 CPU

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

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

44.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 磁碟空間來存放一天內快取的資料瀏覽量。

44.2.4 硬碟/SSD 架構

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

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

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

在大多數情況下,使用何種檔案系統並不重要。不過,使用掛接選項 noatime 可以提升效能 - Squid 會提供自己的時戳,如此便不需要檔案系統來追蹤存取時間。

44.3 Squid 的基本用法

由於 SUSE® Linux Enterprise Server 上預設未安裝 squid,請確定您的系統上已安裝該套件。

由於 SUSE Linux Enterprise Server 中已預先設定 Squid,因此安裝該工具後便可立即將其啟動。為避免啟動過程中出現問題,請確定網路已連接至網際網路,並且至少已設定一部名稱伺服器。使用設定了動態 DNS 組態的撥號連接可能會導致出現問題。在這種情況下,至少應指定名稱伺服器,因為如果 Squid 在 /var/run/netconfig/resolv.conf 中未偵測到 DNS 伺服器,便不會啟動。

44.3.1 啟動 Squid

若要啟動 Squid,請執行以下指令:

> sudo systemctl start squid

若要在系統開機時啟動 Squid,請使用 systemctl enable squid 啟用該服務。

44.3.2 檢查 Squid 是否正在運作

透過以下幾種方法可檢查 Squid 是否在執行中:

  • 使用 systemctl

    > systemctl status squid

    輸出應指出 Squid 已載入且處於使用中 (執行中) 狀態。

  • 使用 Squid 自身:

    > sudo squid -k check | echo $?

    輸出應為 0,但也可以包含其他訊息,例如警告。

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

  • 使用指令行工具 squidclient,它可向 Web 要求輸出回應,與 wgetcurl 類似。

    wgetcurl 不同的是,squidclient 可自動連接至 Squid 的預設代理設定 localhost:3128。不過,如果您修改了 Squid 的組態,則必須相應地設定 squidclient。如需詳細資訊,請參閱 squidclient --help

    範例 44.1︰ 使用 squidclient 提交的要求
    > 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>

    範例 44.1 「使用 squidclient 提交的要求」中顯示的輸出由以下兩部分組成:

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

    2. 回應的實際內容 (空白行後面的行)。

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

    1

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

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

    2

    標題 Via 的值顯示 HTTP 版本、電腦名稱以及所使用的 Squid 版本。

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

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

如果 Squid 執行較短時間後即停止,請檢查名稱伺服器項目是否有誤,或者是否缺少 /var/run/netconfig/resolv.conf 檔案。Squid 會在 /var/log/squid/cache.log 檔案中記錄啟動失敗的原因。

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

使用以下兩種方式可重新載入 Squid:

  • 使用 systemctl

    > sudo systemctl reload squid

    > sudo systemctl restart squid
  • 使用 YaST:

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

若要停止 Squid,請使用以下其中一種方式:

  • 使用 systemctl

    > sudo systemctl stop squid
  • 使用 YaST

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

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

警告
警告:終止 Squid

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

44.3.4 移除 Squid

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

44.3.5 本地 DNS 伺服器

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

動態 DNS

通常,使用動態 DNS 時,服務提供者會在建立網際網路連接時設定 DNS 伺服器,並且本地檔案 /var/run/netconfig/resolv.conf 會自動調整。可以在檔案 /etc/sysconfig/network/config 中使用 NETCONFIG_DNS_POLICY sysconfig 變數指定此行為。使用 YaST sysconfig 編輯器將 NETCONFIG_DNS_POLICY 設定為 ""

然後在 /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 要求能夠通過防火牆。

44.4 YaST Squid 模組

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

啟動

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

HTTP 連接埠

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

重新整理模式

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

快取記憶體設定

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

快取目錄

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

存取控制

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

記錄和逾時

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

雜項

指定管理員的語言和郵件地址。

44.5 Squid 組態檔案

Squid 代理伺服器設定儲存在 /etc/squid/squid.conf 檔案中。雖然首次啟動 Squid 不需要對檔案進行任何變更,但是外部用戶端最初會被拒絕存取。代理可供 localhost 使用。預設的連接埠是 3128。預先安裝的 /etc/squid/squid.conf 組態檔可提供關於選項及許多範例的詳細資訊。

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

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

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

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

44.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 如同網頁瀏覽器而非代理伺服器一般運作,請透過附加 defaultno-query 選項來停用 ICP 通訊協定。

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% 之間的值。

LEVEL_1_DIRECTORIESLEVEL_2_DIRECTORIES 值指定 CACHE_DIRECTORY 中建立的子目錄數量。預設情況下,在快取目錄下的第一層級會建立 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 rotate 一起使用時,squid 會輪用記錄檔案。它會將檔案編號,並且會在達到指定的值後覆寫最舊的檔案。預設值為 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。有時這可能是必要的,例如,您所使用的提供者規定了其代理的使用方式或拒絕其防火牆直接存取網際網路時。

44.5.2 存取控制選項

Squid 可透過存取控制清單 (ACL) 控制對代理伺服器的存取。存取控制清單包含循序處理的規則。在使用 ACL 前必須先進行定義。Squid 包含預設 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 文件。

範例 44.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 ACL,您可以透過 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 all 做為 ACL_NAME

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 查閱。

44.6 設定透明代理

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

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

  • 出於安全考量,所有用戶端都需要使用代理伺服器來存取網際網路。

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

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

程序 44.1︰ Squid 充當透明代理伺服器 (指令行)
  1. /etc/squid/squid.conf 中,將 transparent 參數新增至 http_port 一行。此時應該有 2 行:

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

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

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

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

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

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

Squid 快取管理員 CGI 介面 (cachemgr.cgi) 是一種 CGI 公用程式,用來顯示執行中 Squid 程序的記憶體使用量統計資料。它還提供了在不登入伺服器的情況下,管理快取和檢視統計資料的便捷方式。

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

    > sudo systemctl status apache2

    如果狀態為 inactive,請使用 SUSE Linux Enterprise Server 預設設定啟動 Apache:

    > 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 組態檔案。但需驗證該檔案是否包含以下幾行:

      http_access allow manager localhost
      http_access deny manager

      其作用是讓您僅可從您的電腦 (localhost) 存取管理員介面。

    • 如果 Squid 與 Apache Web 伺服器在不同的電腦上執行,您需要新增額外的規則,以允許從 CGI 程序檔存取 Squid。定義伺服器的 ACL (以 Web 伺服器的 IP 位址取代 WEB_SERVER_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 以啟用變更:

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

    選擇正確的伺服器。如果設定了使用者名稱和密碼,請指定。按一下繼續並瀏覽可用的統計資料。

44.8 使用 Calamaris 產生快取報告

Calamaris 是一個 Perl 程序檔,用來產生快取活動的 ASCII 或 HTML 格式報告。它使用原生的 Squid 存取記錄檔。此工具不屬於 SUSE Linux Enterprise Server 預設安裝範圍,若想使用它,可以安裝 calamaris 套件。如需 Calamaris 的更多資訊,請造訪 http://cord.de/calamaris-english

root 身分登入,然後輸入:

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

使用多個記錄檔案時,請確定這些檔案依時間順序排列,越早的檔案越靠前。這可以透過以下兩種方式來實現:如上例一般逐一列出檔案,或使用 access{1..3}.log

calamaris 接受下列選項:

-a

輸出所有可用的報告

-w

以 HTML 報告輸出

-l

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

關於各個選項的更多資訊,請參閱該程式的 man 頁面 (man calamaris)。

以下是典型的範例:

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

這會將報告儲存到 Web 伺服器的相應目錄。需要有 Apache 才能檢視報告。

44.9 詳細資訊

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

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