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 可完全控制 Web 存取。
如果防火牆組態中包含非受保護區域 (DMZ),代理伺服器應在此區域內操作。第 44.6 節 「設定透明代理」介紹如何實作透明代理。如此可簡化用戶端的組態,因為在這種情況下,它們不需要有關代理伺服器的任何資訊。
44.1.2 多個快取 #
經過設定之後,可在多個 Squid 例項之間交換物件。這可減少系統的總負荷,並可增加在區域網路中取回物件的機會。您也可以設定快取階層,使快取可以將物件要求轉送至旁支快取或上層快取,如此其便可從區域網路中的另一個快取或直接從來源要求物件。
為了不給網路增加整體流量,為快取階層選擇適當的拓撲非常重要。就大型網路而言,理想的做法是:為每個子網路設定一個代理伺服器,並將它們與上層代理伺服器連接,再連接至 ISP 的快取代理伺服器。
這些通訊都是由在 UDP 通訊協定最上層執行的 ICP (網際網路快取通訊協定) 所處理。在快取之間的資料傳輸是使用以 TCP 為基礎的 HTTP (超文字傳輸通訊協定,Hypertext Transmission Protocol) 來處理。
為了找到最適合向其要求物件的伺服器,一個快取會將 ICP 要求傳送到所有旁支代理。旁支代理會透過 ICP 回應答覆這些要求。若偵測到物件,它們會使用代碼 HIT
,若未偵測到,則使用 MISS
。
如果發現多個 HIT
回應,代理伺服器會依據哪個快取傳送回覆的速度最快或哪部伺服器較近等因素來決定要從哪部伺服器下載。如果沒有收到符合的回應,則會將要求傳送到上層快取。
為了避免網路上不同的快取記憶體中出現物件重複,系統會使用其他 ICP 通訊協定。例如 CARP (快取陣列路由通訊協定) 或 HTCP (超文字快取通訊協定)。在網路中維護的物件愈多,找到所需物件的機會就愈大。
44.1.3 快取網際網路物件 #
網路中提供的很多物件都不是靜態的,例如動態產生的頁面和 TLS/SSL 加密內容。此類物件是不會被快取的,因為每次存取這些物件時,它們都會改變。
為確定物件在快取中應保留的時間,系統會為物件指定其中一種狀態。網頁以及代理伺服器會藉由新增標頭至這些物件來找出物件的狀態,例如「上一次修改」或「到期」以及對應的日期。也可使用指定不得快取的物件的其他標題。
快取中的物件通常會因缺少可用磁碟空間而透過 LRU (最久未用) 之類的演算法進行替換。這表示代理會刪除那些最久沒有被要求的物件。
44.2 系統要求 #
系統要求主要取決於該系統必須承擔的最大網路負載。因此請檢查負載尖峰值,因為在這些時段,負載可能會達到日平均值的四倍以上。若不能確定,請稍稍高估系統要求。若 Squid 的工作負荷臨近其處理能力上限,可能會嚴重影響服務品質。接下來的幾節將依重要程度依次指出系統因素:
RAM 大小
CPU 速度/實體 CPU 核心
磁碟快取的大小
硬碟/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 已
loaded
且處於active (running)
狀態。使用 Squid 自身:
>
sudo
squid -k check | echo $?
輸出應為
0
,但也可以包含其他訊息,例如警告。
若要在本地系統上測試 Squid 的功能,請選擇以下其中一種方式:
使用指令列工具
squidclient
,它可向 Web 要求輸出回應,與wget
或curl
類似。與
wget
和curl
不同的是,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
提交的申請」中顯示的輸出由以下兩部分組成:回應的通訊協定標題 (空白行前面的行)。
回應的實際內容 (空白行後面的行)。
若要驗證是否使用了 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,請使用以下其中一種方式:
使用
systemctl
:>
sudo
systemctl
stop squid使用 YaST
在 Squid 模組中,按一下
。按鈕.
關閉 Squid 可能需要一些時間,因為 Squid 會等待最長半分鐘時間,來中斷與用戶端的連接,並將其資料寫入磁碟 (請參閱 /etc/squid/squid.conf
中的 shutdown_lifetime
選項)。
使用 kill
或 killall
來終止 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 要求能夠通過防火牆。
44.4 YaST Squid 模組 #
YaST Squid 模組包含以下索引標籤:
指定 Squid 的啟動方式,以及在哪些介面上開啟哪個防火牆連接埠。
定義 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 PORT
這是 Squid 監聽用戶端要求所用的連接埠。預設的連接埠是
3128
,但是8080
也是常用的連接埠。cache_peer HOST_NAME TYPE PROXY_PORT ICP_PORT
此選項允許建立協同工作的快取網路。快取對等是一台同樣代管網路快取且與您自己的電腦有某種關係的電腦。TYPE 指定關係的類型。類型可能是
parent
或sibling
。對於 HOST_NAME,請指定要使用的代理伺服器的名稱或 IP 位址。對於 PROXY_PORT,請指定瀏覽器中要使用的連接埠號碼 (通常為
8080
)。請將 ICP_PORT 設定為7
,如果父層的 ICP 連接埠未知並且其用途與提供者無關,則設定為0
。若要使 Squid 如同網頁瀏覽器而非代理伺服器一般運作,請透過附加
default
和no-query
選項來停用 ICP 通訊協定。cache_mem SIZE
此選項定義 Squid 可為頻率最高的回覆使用的記憶體大小。預設值為
8 MB
。這不指定 Squid 的記憶體使用量,而且可以超過。cache_dir STORAGE_TYPE CACHE_DIRECTORY CACHE_SIZE LEVEL_1_DIRECTORIES LEVEL_2_DIRECTORIES
選項
cache_dir
定義磁碟快取的目錄。在 SUSE Linux Enterprise Server 上的預設組態中,Squid 不會建立磁碟快取。預留位置 STORAGE_TYPE 可以是以下其中一個:
目錄式儲存類型:
ufs
、aufs
(預設值)、diskd
。這三類都是ufs
儲存形式的變體。不過,雖然ufs
是做為核心 Squid 執行緒的一部分執行,但aufs
是在單獨的執行緒中執行,而diskd
則使用單獨的程序。這表示後兩種類型可避免因磁碟 I/O 而封鎖 Squid。資料庫式儲存系統:
rock
。此儲存形式依賴於單一資料庫檔案,在此檔案中,每個物件佔用固定大小的一或多個記憶體單位 (「插槽」)。
下文將只介紹基於
ufs
的儲存類型的參數。rock
的參數有所不同。CACHE_DIRECTORY 是磁碟快取的目錄,預設為
/var/cache/squid
。CACHE_SIZE 是該目錄的最大大小 (以 MB 計),預設設定為 100 MB。請將其設定為介於可用磁碟空間的 50% 和最大 80% 之間的值。LEVEL_1_DIRECTORIES 和 LEVEL_2_DIRECTORIES 值指定應在 CACHE_DIRECTORY 中建立的子目錄數量。依預設,在 CACHE_DIRECTORY 下的第一層會建立 16 個子目錄,在其中的每個子目錄下會建立 256 個子目錄。提高這些值時請務必謹慎,因為建立太多目錄會導致效能問題。
如果您有數個共用一個快取的磁碟,請指定數行
cache_dir
。cache_access_log LOG_FILE
,cache_log LOG_FILE
,cache_store_log LOG_FILE
這三個選項指定 Squid 記錄其所有動作的路徑。一般情況下,無需變更此處的任何設定。如果 Squid 負荷過重,則可能需要將快取和記錄檔案分散到數個磁碟上。
client_netmask NETMASK
此選項允許透過套用子網路遮罩在記錄檔案中遮罩用戶端的 IP 位址。例如,若要將 IP 位址的最後一位設定為
0
,請指定255.255.255.0
。ftp_user E-MAIL
此選項允許設定 Squid 應該用於匿名 FTP 登入的密碼。請在此處指定有效的電子郵件地址,因為有些 FTP 伺服器會檢查這些資訊以驗證有效性。
cache_mgr E-MAIL
Squid 當機時會向指定的電子郵件地址傳送訊息。預設值為網站管理員。
logfile_rotate VALUE
與
squid
、-k rotate
一併使用時,squid
會輪用記錄檔案。它會將檔案編號,並且會在達到指定的值後覆寫最舊的檔案。預設值為10
,表示輪替編號為 0 到 9 的記錄檔案。不過,在 SUSE Linux Enterprise Server 上,記錄檔案的輪替是透過使用
logrotate
和組態檔案/etc/logrotate.d/squid
自動執行的。append_domain DOMAIN
使用 append_domain 可指定當未指定網域時自動附加的網域。通常在此處指定您自己的網域,因此將瀏覽器指向 www 將導覽至您自己的 Web 伺服器。
forwarded_for STATE
如果此選項設定為
on
,則會將如下所示的一行新增至標題:X-Forwarded-For: 192.168.0.1
如果您將選項設定為
off
,則 Squid 會從 HTTP 要求中移除用戶端的 IP 位址及系統名稱。negative_ttl TIME
,negative_dns_ttl TIME
如果設定了這些選項,Squid 會快取某些類型的失敗,例如
404
回應。之後,它會拒絕發出新要求,即使資源變為可用狀態也不例外。依預設,
negative_ttl
設定為0
,negative_dns_ttl
設定為1 minutes
。這表示預設情況下不會快取對 Web 要求的負面回應,但會將 DNS 要求的負面回應快取 1 分鐘。never_direct allow ACL_NAME
若要防止 Squid 接受直接來自網際網路的要求,可使用選項
never_direct
以強制連接至另一個代理伺服器。事先必須已在cache_peer
中指定該代理。如果將all
指定為 ACL_NAME,則所有申請都將直接轉遞給parent
。有時這可能是必要的,例如,您所使用的提供者規定了其代理的使用方式或拒絕其防火牆直接存取網際網路時。
44.5.2 存取控制選項 #
Squid 可透過存取控制清單 (ACL) 控制對代理伺服器的存取。存取控制清單包含循序處理的規則。在使用 ACL 前必須先進行定義。Squid 包含預設 ACL,例如 all
和 localhost
。但若要使 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 文件。
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
- http_access allow ACL_NAME
http_access
定義誰可以使用代理伺服器,以及誰能夠存取網際網路上的哪些內容。您需要為此定義 ACL。上文中已經定義了localhost
和all
ACL,您可以透過deny
或allow
拒絕或允許存取它們。可以建立包含任意多個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 PATH
使用此選項可指定 URL 重寫器。
auth_param basic program PATH
如果必須在代理伺服器上對使用者進行驗證,請設定對應的程式,例如
/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_NAME
使用此選項可啟用 ident 要求動作,以便為類型為
src
的 ACL 所定義的所有用戶端確定每個使用者的身分。若要對所有用戶端啟用此選項,請使用預先定義的 ACLall
做為 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 的透明代理模式很有效:
出於安全考量,所有用戶端都需要使用代理伺服器來存取網際網路。
所有用戶端都必須使用代理伺服器,無論用戶端是否清楚這一點。
網路中的代理伺服器已轉移,但是現有用戶端需要保留其原有組態。
在
/etc/squid/squid.conf
中,將transparent
參數新增至http_port
一行。此時應該有 2 行:http_port 3128⎄ http_port 3128 transparent
重新啟動 Squid:
>
sudo
systemctl restart squid
設定防火牆,以將 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。
若要確認是否一切正常,請檢查
/var/log/squid/access.log
中的 Squid 記錄檔案。
44.7 使用 Squid 快取管理員 CGI 介面 (cachemgr.cgi
) #
Squid 快取管理員 CGI 介面 (cachemgr.cgi
) 是一種 CGI 公用程式,用來顯示執行中 Squid 程序的記憶體使用量統計資料。它還提供了在不登入伺服器的情況下,管理快取和檢視統計資料的便捷方式。
cachemgr.cgi
#確定 Apache Web 伺服器正在系統上執行。依第 42 章 「Apache HTTP 伺服器」 中所述方式設定 Apache。請著重參閱第 42.5 節 「啟用 CGI 程序檔」。若要檢查 Apache 是否已在執行中,請使用:
>
sudo
systemctl status apache2
如果狀態為
inactive
,請使用 SUSE Linux Enterprise Server 預設設定啟動 Apache:>
sudo
systemctl start apache2
現在,在 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
(選擇性) 或者,您也可以為
cachemgr.cgi
設定一或多個密碼。這樣您還可以執行更多動作,例如從遠端關閉快取,或檢視關於快取的詳細資訊。若要允許存取,請為選項cache_mgr
和cachemgr_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
定義使用哪個密碼允許哪些動作。none
和disable
是特殊關鍵字:none
表示無需使用密碼,disable
會徹底停用功能。登入
cachemgr.cgi
之後,便可全面查看完整的動作清單。若要瞭解組態檔案中需如何參考操作,請查看動作頁面 URL 中&operation=
後面的字串。all
是特殊關鍵字,表示所有動作。重新載入 Squid 和 Apache 以啟用變更:
>
sudo
systemctl reload squid
若要檢視統計資料,請移至先前設定的
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
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 的郵件清單。