squid服务的应用 转
生活随笔
收集整理的這篇文章主要介紹了
squid服务的应用 转
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原貼:http://blog.ixpub.net/8400463/viewspace-3985
空間管理 您的位置: IXPUB技術博客 ? 太陽微繫統'sBlog ? 博客 網絡依然還是計算機,Sun還是Sun!squid服務的應用[轉]
上一篇 / 下一篇 ?2007-09-15 04:27:50 / 個人分類:Linux學習
查看( 1 ) / 評論( 0 ) / 評分( 0 / 0 ) 初始化cache)P PZv] i `0# /s/squid/sbin/squid -zIXPUB技術博客0j gSo4LO5q
啟動squid
`;Z(jY `0# /s/squid/etc/rc.d/squid.sh start
H)T`0w&| z;q0@ 設置ipfilter
7Em#q-^ e!v9U5k0為了實現透明的功能,需要將所有對80端口的請求轉到squid的3128端口上,以實現對客戶端透明的功能。在/etc/ipnat.rules中加入:
t[c0}R Y0rdr fxp1 0.0.0.0/0 port 80 -> 127.0.0.1 3128
;c?2r!E!}Ob0刷新ipnat配置:
@V4l3o(V@ a2_0# ipnat -Cf /etc/ipnat.rules
/IS` p iq-z/z0一切完成,客戶端無需任何設置,根本感覺不到代理的存在,而且訪問速度明顯變快透明代理IXPUB技術博客(e,xRv/V,fG4^ ~1S
httpd_accel_host virtual
*Dt;]p&|3h%E fA0httpd_accel_port 80
(F&]f F}j/ndL ]LY0httpd_accel_with_proxy on
7`lb)C-khdl0httpd_accel_user_host_header onIXPUB技術博客 w U)f w#wL M
在Linux上,可以用iptables/ipchains直接將對Web端口80的請求直接轉發到Squid端口3128,由Squid接手,而用戶瀏覽器仍然認為它訪問的是對方的80端口。例如以下這條命令:iptables -t nat -A PREROUTING -s 192.168.0.200/32 -p tcp --dport 80 -j REDIRECT 3128
GdHe/'{'S,I0就是將192.168.0.200的所有針對80端口的訪問重定向到3128端口。IXPUB技術博客pPcCQ ~VM&mR
普通代理服務器
nZ)O&qTPv dY4]K0在這個例子中,代理服務器同時也是網關,內部網絡接口eth0的IP地址為192.168.0.1,外部網絡接口eth1的IP地址為202.103.x.x。下面是一個基本的代理所需要配置選項:
u0p6EjQa7l,B0http_port 192.168.0.1:3128IXPUB技術博客uNX0GzfIH8aj
? 默認端口是3128,當然也可以是任何其它端口,只要不與其它服務發生沖突即可。為了安全起見,在前面加上IP地址,Squid就不會監聽外部的網絡接口。IXPUB技術博客G+U&f&|B k0/!Cl
? 下面的配置選項是服務器管理者的電子郵件,當錯誤發生時,該地址會顯示在錯誤頁面上,便于用戶聯系:
b&T3L({R.PoI_V0/ V0cache_mgrstart@soocol.com以下這些參數告訴Squid緩存的文件系統、位置和緩存策略:
1u+rU+hvQ0cache_dir ufs /var/squidIXPUB技術博客Q.bt V'l+R I
cache_mem 32MB
_/G6d6Y)v8I3c%f,s0cache_swap_low 90IXPUB技術博客!g b x,] I/y
cache_swap_high 95在這里,Squid會將/var/squid目錄作為保存緩存數據的目錄,每次處理的緩存大小是32兆字節,當緩存空間使用達到95%時,新的內容將取代舊的而不直接添加到目錄中,直到空間又下降到90%才停止這一活動。如果不想Squid緩存任何文件,如某些存儲空間有限的專有系統,可以使用null文件系統(這樣不需要那些緩存策略):
t3XX9C8}1A*O+^]|2/J0cache_dir null /tmp下面的幾個關于緩存的策略配置中,較主要的是第一行,即用戶的訪問記錄,通過分析它來了解所有用戶訪問的詳盡地址
Z.[Iesd(a&Q0cache_access_log /var/squid/access.logIXPUB技術博客4k(u*i p3CYI:uOI
cache_log /var/squid/cache.logIXPUB技術博客9C| p _z0O'u-Mh
cache_store_log /var/squid/store.log下面這行配置是在較新版本中出現的參數,告訴Squid在錯誤頁面中顯示的服務器名稱:
8y^ R9Ss k Y;f0visible_hostname No1.proxy以下配置告訴Squid如何處理用戶,對每個請求的IP地址作為單獨地址處理:
YgPLoiG"m0client_mask 255.255.255.255################################################################################
K:w/PaW"X,PM;E0第4章 快速配置向導4.1 squid.conf 語法Squid 的配置文件相對規范。它與其他許多unix 程序相似。每行以配置指令開始,后面跟著數字值或關鍵字。在讀取配置文件時,squid 忽略空行和注釋掉的行(以#開始)。如下是一些配置行示例:IXPUB技術博客@Hp/[D@pTb
cache_log /squid/var/cache.log
1gpZ4N;~0# define the localhost ACLIXPUB技術博客ubW4Lz O
acl Localhost src 127.0.0.1/32IXPUB技術博客OxV h*?7m Vq
connect_timeout 2 minutesIXPUB技術博客*? v7uXtS$O6~
log_fqdn on某些指令取唯一值。在這些情形下,重復賦予該指令不同的值,將覆蓋前面的值。例如,IXPUB技術博客G:P5G-?/` ~
下面是一個連接超時值。第一行無效,因為第二行覆蓋了它:IXPUB技術博客8Xzah4p-z };@
connect_timeout 2 minutes
1o9WP5HE$v"Cy0connect_timeout 1 hour另外,某些指令取列表值。在這些情形下,每一個新增的值都有效。"擴展方式"指令以這種方法工作:
&^|)z*p7f)lH0extension_methods UNGETIXPUB技術博客.qw`@K z./
extension_methods UNPUT
6[R6J$^6V+V-gcL0extension_methods UNPOST對這些基于列表的指令,你通常能在同一行中賦予多個值:
R/]H0OiOH3Y+v0extension_methods UNGET UNPUT UNPOST許多指令有通用類型。例如,連接超時值是一個時間規范,在數字后面跟著時間單元。例如:
&n"xtQ-/&X0connect_timeout 3 hoursIXPUB技術博客rc c+{:i]P[#w+ee!M3y
client_lifetime 4 daysIXPUB技術博客:u*f1sl1i'm
negative_ttl 27 minutes類似的,大量的指令指向文件大小或者內存額度。例如,你可以這樣編寫大小規范:十進制數字后面跟bytes,KB,MB 或GB.例如:
[tS7X+s!@T0minimum_object_size 12 bytes
pBv#l [0request_header_max_size 10 KBIXPUB技術博客)c n:{0} f$tyZ
maximum_object_size 187 MB另一種值得提起的類型是觸發器,它的值是on 或者off。許多指令使用該類型。例如:
(xo4BGoF!]0server_persistent_connections on
&Anv4c!_lIaI4C0strip_query_terms off
Fs?I&P:y*c0prefer_direct on通常,配置文件指令能以任何順序出現。然而,如果某個指令指向的值被其他指令所定義,那么順序就很重要。訪問控制列表是個好的例子。acl 被用在http_access 規則之前必須被定義:
m9w)l`*C6]/H5fA0acl Foo src 1.2.3.4IXPUB技術博客| s tk6bc
http_access deny Foosquid.conf 文件里的許多東西是大小寫敏感的,例如指令名。你不能將http_port 寫成HTTP_port。默認的squid.conf 文件包含了對每個指令的大量注釋,以及指令的默認值。例如:IXPUB技術博客/UgdYNIAD3~
# TAG: persistent_request_timeout
P2FN+pGF&R&[5g"D:Y0# How long to wait for the next HTTP request on a persistent
#C0P8A3tHm0# connection after the previous request completes.
8k+M-RR;_;p0#IXPUB技術博客 qd;S%EO1]8?
#Default:IXPUB技術博客K DV] o l(Iu/s7y
# persistent_request_timeout 1 minute每次安裝squid 后,當前默認配置文件存放在$prefix/etc 目錄下的squid.conf.default。既然指令每次都有所改變,你能參考該文檔,以獲取最近的更新。該章剩下的部分是關于在開始運行squid 之前,你必須知道的少數指令。IXPUB技術博客[xun&m+K4j /5?
4.2 User IDs你可能知道,unix 進程和文件擁有文件和組屬主的屬性。你必須選擇某個用戶和組給squid。該用戶和組的組合,必須對大部分squid 相關的文件和目錄有讀和寫的權限。我高度推薦創建名為"squid"的用戶和組。這避免了某人利用squid 來讀取系統中的其他文件。假如不止一個人擁有對squid 的管理權限,你可以將他們加到squid 組里。unix 進程繼承了它們父進程的屬主屬性。那就是說,假如你以joe 用戶來啟動squid,squid 也以joe 來運行。假如你不想以joe 來運行squid,你需要預先改變你的用戶ID。這是su 命令的典型功能。例如:IXPUB技術博客%XwaN$i'W9WO
joe% su - squid
A8}`e.f/k3i:| Z%ub0squid% /usr/local/squid/sbin/squid不幸的是,運行squid 并非總是如此簡單。在某些情況下,你必須以root 來啟動squid,這依賴于你的配置。例如,僅僅root 能綁定TCP 套接字到特權端口上,如80。假如你必須以root 來啟動squid,你必須設置cache_effective_user 指令。它告訴squid,在執行完需要特別權限的任務后,變成哪個用戶。例如:
9r&FqIN-K0cache_effective_user squid你提供的該名字必須是有效用戶(在/etc/passwd 文件里)。請注意僅僅當你以root 來啟動squid 時,你才需要用到該指令。僅僅root 有能力來隨意改變用戶身份。假如你以joe 來啟動squid,它不能改變到squid 用戶。你可能嘗試不設置cache_effective_user,直接以root 來運行squid。假如你試過,你會發現squid 拒絕運行。這違背了安全規則。假如外部攻擊者有能力危及或利用squid,他能獲取對系統的全部訪問權。盡管我們努力使squid 安全和少bug,但還是穩重點好。假如你沒有設置cache_effective_user,以root 來啟動squid,squid 使用nobody 作為默認值。不管你選擇什么用戶ID , 請確認它有對下面目錄的讀訪問權:$prefix/etc,$prefix/libexec,$prefix/share。該用戶ID 也必須有對日志文件和緩存目錄的寫訪問IXPUB技術博客)dei0bE
權。squid 也有一個cache_effective_group 指令,但你也許不必設置它。默認的,squid 使用cache_effective_user 的默認組(從/etc/passwd 文件讀取)。
+Odl;Fyg+d#A04.3 端口號http_port 指令告訴squid 在哪個端口偵聽HTTP 請求。默認端口是3128:
*G2JFl:C,j0http_port 3128假如你將squid 作為加速器運行(見15 章),你也許該將它設為80。你能使用附加的http_port 行,來指示squid 偵聽在多個端口上。假如你必須支持客戶組(它們被配置得不一致),這點就經常有用。例如,來自某個部門的瀏覽器發送請求到3128,
*O%X+a$w&bV/s0然而另一個部門使用80 端口。簡單的將兩個端口號列舉出來:
Ac3E$B7]+o l8N&xA9^xe0http_port 3128
,D2f m0DV%y7/$AUT0http_port 8080你也能使用http_port 指令來使squid 偵聽在指定的接口地址上。當squid 作為防火墻運行時,它有兩個網絡接口:一個內部的和一個外部的。你可能不想接受來自外部的http 請求。為了使squid 僅僅偵聽在內部接口上,簡單的將IP 地址放在端口號前面:IXPUB技術博客Q/z#wTD3Q z9/ w
http_port 192.168.1.1:3128
;B)Y&A"Yl(?7]!h04.4 日志文件路徑我將在第13 章討論所有squid 的日志細節。你現在你關注的唯一事情是,squid 將它的日志放在何處。默認的日志目錄是squid 安裝位置下的logs 目錄。例如,假如你在./configureIXPUB技術博客?xj1WL
時沒有使用--prefix=選項,那么默認的日志文件路徑是/usr/local/squid/var/logs。你必須確認日志文件所存放的磁盤位置空間足夠。在squid 寫日志時如果接受到錯誤,它會退出和重啟。該行為的主要理由應引起你的注意。squid 想確認你不會丟失任何重要的日志信息,特別是你的系統被濫用或者被攻擊時。squid 有三個主要的日志文件:cache.log,access.log,store.log.第一個文件即cache.log,包含狀態性的和調試性的消息。當你剛開始運行squid 時,你應密切的關注該文件。假如squid拒絕運行,理由也許會出現在cache.log 文件的結尾處。在正常條件下,該文件不會變得很大。也請注意,假如你以-s 選項來運行squid,重要的cache.log 消息也可被送到你的syslog進程。通過使用cache_log 指令,你可以改變該日志文件的路徑:IXPUB技術博客|P3x j5Uv
cache_log /squid/logs/cache.logaccess.log 文件包含了對squid 發起的每個客戶請求的單一行。每行平均約150 個字節。也就是說,在接受一百萬條客戶請求后,它的體積約是150M。請使用cache_access_log 指令來改變該日志文件的路徑:IXPUB技術博客.D3OT.q U
cache_access_log /squid/logs/access.log假如因為某些理由,你不想squid 記錄客戶端請求日志,你能指定日志文件的路徑為/dev/null.store.log 文件對大多數cache 管理員來說并非很有用。它包含了進入和離開緩存的每個目標的記錄。平均記錄大小典型的是175-200 字節。然而,squid 不在store.log 里對cache點擊創建接口,所以它比access.log 包含少得多的記錄。請使用cache_store_log 指令來改變它的位置:IXPUB技術博客)C~)Z}:_ P w
cache_store_log /squid/logs/store.log通過指定路徑為none,你能輕易的完全禁止store.log 日志:IXPUB技術博客4G7S B!g_4c
cache_store_log none假如你不小心,squid 的日志文件增加沒有限制。某些操作系統對單個文件強制執行2G的大小限制,即使你有充足的磁盤空間。超過該限制會導致寫錯誤,這樣squid 就會退出。為了保證日志文件大小合理,你應創建任務來有規律的重命名和打包日志。squid 有內建功能來使這個容易做到。請見13.7 章關于日志輪循的解釋。
&}-Y_B5y{7nn&~04.5 訪問控制在第6 章里有更多的關于訪問控制的描述。現在,我只講述少量的訪問控制方法,以使熱心的讀者能快速開始使用squid。squid 默認的配置文件拒絕每一個客戶請求。在任何人能使用代理之前,你必須在squid.conf 文件里加入附加的訪問控制規則。最簡單的方法就是定義一個針對客戶IP 地址的ACL 和一個訪問規則,告訴squid 允許來自這些地址的HTTP 請求。squid 有許多不同的ACL類型。src 類型匹配客戶IP 地址,squid 會針對客戶HTTP 請求檢查http_access 規則。這樣,你需要增加兩行:
v,k$@m2{ A0acl MyNetwork src 192.168.0.0/16
1Bq!E?V!i0http_access allow MyNetwork請將這些行放在正確的位置。http_access 的順序非常重要,但是acl 行的順序你不必介意。你也該注意默認的配置文件包含了一些重要的訪問控制,你不應該改變或刪除它們,除非你完全理解它們的意義。在你第一次編輯squid.conf 文件時,請看如下注釋:IXPUB技術博客3C&r)[#/t W3B2FH
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS在該注釋之后,以及"http_access deny all"之前插入你自己的新規則。為了徹底說明,如下是一個合理的初始訪問控制配置,包括推薦的默認控制和早先的例子:
d?Ex:J&/6EdK0acl All src 0/0IXPUB技術博客 ^XYI)bo
acl Manager proto cache_objectIXPUB技術博客2xN6wng3hm!q
acl Localhost src 127.0.0.1/32IXPUB技術博客Z2_ b7wQ(w `)Q@
acl Safe_ports port 80 21 443 563 70 210 280 488 591 777 1025-65535IXPUB技術博客9dHUUR?T4RhA,r:S
acl SSL_ports 443 563IXPUB技術博客w y%AaE%N
acl CONNECT method CONNECTIXPUB技術博客3m q&[J8`u/W
acl MyNetwork src 192.168.0.0/16IXPUB技術博客E H4h;qQ
http_access allow Manager LocalhostIXPUB技術博客8v~Q[&Q"Th X
http_access deny ManagerIXPUB技術博客 p:T*Tnk
http_access deny !Safe_portsIXPUB技術博客9i-?T&Y+t;q1C
http_access deny CONNECT !SSL_ports
w2/fzi:LI6Z0http_access allow MyNetwork
z8_~*j%hi0http_access deny AllIXPUB技術博客9}X/q2i"DaP
4.6 可見主機名希望你不必擔心visible_hostname 指令。然而,假如squid 不能發現它所運行的機器的主機名,你就必須設置它。如果發生這樣的事,squid 抱怨和拒絕運行:IXPUB技術博客!L.XEMN/Q4v6Byh r
% squid -Nd1
G'n1o;Fa:oO0FATAL: Could not determine fully qualified hostname. Please set 'visible_hostname'有大量的理由使squid 需要知道主機名:IXPUB技術博客1R Z-PF(~l/^/Ag
+ 主機名出現在squid 的錯誤消息里,這幫助用戶驗證潛在問題的源頭。
5jn5r /9uJ:M!I0+ 主機名出現在squid 轉發的cache 單元的HTTP Via 頭里。當請求到達原始主機時,Via頭包含了在傳輸過程中涉及的代理列表。squid 也使用Via 頭來檢測轉發環路。我將在第10章里討論轉發環路。squid 對特定事務使用內部URL,例如FTP 目錄列表的圖標。當squid 對FTP 目錄產生HTML 頁面時,它插入小圖標用以指明該目錄中的文件類型。圖標URL 包含了cache 的主機名,以便web 瀏覽器能直接從squid 請求它們。每個從squid 響應的HTTP 回復包含了X-Cache 頭。這并非官方HTTP 頭。它是一個擴展頭,用以指明該響應是cache 點擊還是cache 丟失。既然請求和響應可能經過多個cache,每個X-Cache 頭包含了cache 報告點擊或丟失的名字。如下是一個通過2 個cache 的響應示例:IXPUB技術博客;}"Lx[:F])rx
HTTP/1.0 200 OK
gBMVh*V2FNt0Date: Mon, 29 Sep 2003 22:57:23 GMTIXPUB技術博客(IE%|4Kf
Content-type: text/html
!Q?/$~ Um0W:sN,h$d0Content-length: 733IXPUB技術博客"y1j9d"VE:^5_`B
X-Cache: HIT from bo2.us.ircache.net
}C3_J0{d ers&Zsm0X-Cache: MISS from bo1.us.ircache.netsquid 在啟動時試圖自動獲取主機名。首先它調用gethostname()函數,這通常能返回正確的主機名。接著,squid 調用gethostbyname()函數嘗試對主機名進行DNS 查詢。該函數典型的返回IP 地址和系統的規范名。假如gethostbyname()成功,squid 在錯誤消息里,Via 頭里等地方使用這個規范名。因為大量的理由,squid 可能不能檢測到它的規范主機名,包括:IXPUB技術博客w c,Wi*Pi
+ 主機名可能未設置。
wK`S0{4o^Ao0+ 主機名可能從DNS 區域或/etc/hosts 文件里丟失。squid 系統的DNS 客戶端配置可能不正確或丟失。在unix 系統上,你該檢查/etc/resolv.conf 和/etc/host.conf 文件。假如你看到上述的致命錯誤,你必須修正主機名和DNS 信息,或者顯式的給squid 指明主機名。在大多數情況下,請確認"hostname"命令返回一個完全規范的主機名,并且在/etc/hosts 文件里增加這個接口。假如這樣不成功,請在squid.conf 里設置可見主機名:
lP Vm x/i0visible_hostname squid.packet-pushers.netIXPUB技術博客0X `~ XE(f
4.7 管理聯系信息你應該設置cache_mgr 指令作為對用戶的幫助。它是一個email 地址,假如問題發生,用戶能寫信給它。cache_mgr 地址默認出現在squid 的錯誤消息里。例如:
@j5{"]0S0cache_mgrsquid@web-cache.net
qi`-])E ?'qc04.8 下一步在創建了初步的配置文件后,你多少準備首次運行squid 了。請遵循下面章節的建議。當你掌握了啟動和停止squid 后,你該花費一些時間來改善配置文件。你可能想增加更高級的訪問控制,這在第6 章里有描述。既然我在這里沒有討論磁盤cache,你該花些時間閱讀第7 和第8 章。第5章 運行Squid5.1 squid 命令行選項在開始其他事情之前,讓我們先看一下squid 的命令行選項。這里的許多選項你從不會使用,另外有些僅僅在調試問題時有用。-a portIXPUB技術博客+lg4FMe?%Rn
指定新的http_port 值。該選項覆蓋了來自squid.conf 的值。然而請注意,你能在squid.conf里指定多個值。-a 選項僅僅覆蓋配置文件里的第一個值。(該選項使用字母a 是因為在Harvest cache 里,HTTP 端口被叫做ASCII 端口)-d level
(Y~$X*Md0讓squid 將它的調試信息寫到標準錯誤(假如配置了,就是cache.log 和syslog)。level參數指定了顯示在標準錯誤里的消息的最大等級。在多數情況下,d1 工作良好。請見16.2章關于調試等級的描述。-f fileIXPUB技術博客8TE4i(q#~D%^
指定另一個配置文件。-hIXPUB技術博客|Qx6N g~8LI
顯示用法。-k function
M af[3L*qd|0指示squid 執行不同的管理功能。功能參數是下列之一:reconfigure,rotate,shutdown,interrupt,kill,debug,check,or parse。IXPUB技術博客Wv/C kYh
+ reconfigure 導致運行中的squid 重新讀取配置文件。
#p;MB0I&H+t%d0+ rotate導致squid 滾動它的日志,這包括了關閉日志,重命名,和再次打開它們。
-K,G`f}v0+ shutdown 發送關閉squid 進程的信號。
3d sO#FW/]e0+ interrupt 立刻關閉squid,不必等待活動會話完成。
!uBA+L5N#m f8e0+ kill 發送KILL 信號給squid,這是關閉squid 的最后保證。
9e g&m/@4q.Q0P0+ debug 將squid 設置成完全的調試模式,假如你的cache 很忙,它能迅速的用完你的磁盤空間。IXPUB技術博客o2h v0O!mj(]
+ check 簡單的檢查運行中的squid 進程,返回的值顯示squid 是否在運行。IXPUB技術博客 Ji$B:f${lK4Y |
+ 最后,parse 簡單的解析squid.conf 文件,如果配置文件包含錯誤,進程返回非零值。-s
H+b!S)Ls-M3n0激活將日志記錄到syslog 進程。squid 使用LOCAL4 syslog 設備。0 級別調試信息以優先級LOG_WARNING 被記錄,1 級別消息以LOG_NOTICE 被記錄。更高級的調試信息不會被發送到syslogd.你可以在/etc/syslogd.conf 文件里使用如下接口:
u ?ak3b'[0local4.warning /var/log/squid.log-u port
"[#z Qy$a2i(Y[:X0指定另一個ICP 端口號,覆蓋掉squid.conf 文件里的icp_port。-v
(_k'THE,J JjH lW0打印版本信息。-z
?RS,h!_#l0初始化cache,或者交換,目錄。在首次運行squid,或者增加新的cache 目錄時,你必須使用該選項。-C
1T|7v/A3i,Fy#s0阻止安裝某些信號句柄,它們捕獲特定的致命信號例如SIGBUS 和SIGSEGV。正常的,這些信號被squid 捕獲,以便它能干凈的關閉。然而,捕獲這些信號可能讓以后調試問題困難。使用該選項,致命的信號導致它們的默認動作,通常是coredump。-DIXPUB技術博客VUO ] M&_:U3L
禁止初始化DNS 測試。正常情況下,squid 直到驗證它的DNS 可用才能啟動。該選項阻止了這樣的檢測。你也能在squid.conf 文件里改變或刪除dns_testnames 選項。-F
/8P/S'f X_0讓squid 拒絕所有的請求,直到它重新建立起存儲元數據。假如你的系統很忙,該選項可以減短重建存儲元數據的時間。然而,如果你的cache 很大,重建過程可能會花費很長的時間。-N
2]~ nU(z0W:R0阻止squid 變成后臺服務進程。-R
iu+^suu0VTp0阻止squid 在綁定HTTP 端口之前使用SO_REUSEADDR 選項。-VIXPUB技術博客2Q4HhQ,LV8e
激活虛擬主機加速模式。類似于squid.conf 文件里的httpd_accel_host virtual 指令。-X
8Aq t1nV _[4PV0強迫完整調試模式,如你在squid.conf 文件里指定debug_options ALL,9 一樣。-Y
F4W:}M#?}0在重建存儲元數據時,返回ICP_MISS_NOFETCH 代替ICP_MISS.忙碌的父cache 在重建時,該選項可以導致最少的負載。請見10.6.1.2 章。
;b m3|LK05.2 對配置文件查錯在開啟squid 之前,你應該謹慎的驗證配置文件。這點容易做到,運行如下命令即可:IXPUB技術博客y9O/`%C]pd;u}G
%squid -k parse假如你看不到輸出,配置文件有效,你能繼續后面的步驟。然而,如果配置文件包含錯誤,squid 會告訴你:IXPUB技術博客zc}a1VRI
squid.conf line 62: http_access allow okay2
3|,GYQ!m~0aclParseAccessLine: ACL name 'okay2' not found.這里你可以看到,62 行的http_access 指令指向的ACL 不存在。有時候錯誤信息很少:IXPUB技術博客 n5IZR `nU8n v'{
FATAL: Bungled squid.conf line 76: memory_pools在這個情形里,我們忘記了在76 行的memory_pools 指令后放置on 或off。建議你養成習慣:在每次修改配置文件后,使用squid -k parse。假如你不愿麻煩,并且你的配置文件有錯誤,squid 會告訴你關于它們而且拒絕啟動。假如你管理著大量的cache,也許你會編輯腳本來自動啟動,停止和重配置squid。你能在腳本里使用該功能,來確認配置文件是有效的。IXPUB技術博客J?/$mzEJ
5.3 初始化cache 目錄在初次運行squid 之前,或者無論何時你增加了新的cache_dir,你必須初始化cache 目錄。命令很簡單:
2KR.}#Zw*W {WP0%squid –z對UFS 相關的存儲機制(ufs,aufs,and diskd;見第8 章),該命令在每個cache_dir 下面創建了所需的子目錄。你不必擔心squid 會破壞你的當前cache 目錄(如果有的話)。在該階段屬主和許可權是通常遇到的問題。squid 在特定的用戶ID 下運行,這在squid.conf 文件里的cache_effective_user 里指定。用戶ID 必須對每個cache_dir 目錄有讀和寫權限。否則,你將看到如下信息:IXPUB技術博客 /}(X:c y%X
Creating Swap Directories
]9wq#Nl6l#s c1o0FATAL: Failed to make swap directory /usr/local/squid/var/cache/00:
#]DU6IFII_*_"U0(13) Permission denied在這樣的情形下,你該確認/usr/local/squid/var/cache 目錄的所有組成都可被squid.conf給定的用戶ID 訪問。最終的組件--cache 目錄--必須對該用戶ID 可寫。cache 目錄初始化可能花費一些時間,依賴于cache 目錄的大小和數量,以及磁盤驅動器的速度。假如你想觀察這個過程,請使用-X 選項:IXPUB技術博客.[g2RJ;k
%squid –zXIXPUB技術博客2ZO(R!B z
5.4 在終端窗口里測試squid一旦你已經初始化cache 目錄,就可以在終端窗口里運行squid,將日志記錄到標準錯誤。這樣,你能輕易的定位任何錯誤或問題,并且確認squid 是否成功啟動。使用-N 選項來保持squid 在前臺運行,-d1 選項在標準錯誤里顯示1 級別的調試信息。
K)kR? l-]V8s0%squid -N -d1你將看到類似于以下的輸出:
"z"w)v,a(WY Y*@z02003/09/29 12:57:52| Starting Squid Cache
/_7lJ-]P}#[4E)~0version 2.5.STABLE4 for i386-unknown-freebsd4.8...IXPUB技術博客0C z6Bw*|%C+X
2003/09/29 12:57:52| Process ID 294IXPUB技術博客p(hbIM,W
2003/09/29 12:57:52| With 1064 file descriptors availableIXPUB技術博客y;O d&aYqc~8ZZ
2003/09/29 12:57:52| DNS Socket created on FD 4IXPUB技術博客wF*yh#H
2003/09/29 12:57:52| Adding nameserver 206.107.176.2 from /etc/resolv.confIXPUB技術博客m2B:N0s i#U
2003/09/29 12:57:52| Adding nameserver 205.162.184.2 from /etc/resolv.confIXPUB技術博客.`2H)L;/fu;|P8Y
2003/09/29 12:57:52| Unlinkd pipe opened on FD 9IXPUB技術博客@[h;S"KdUpf
2003/09/29 12:57:52| Swap maxSize 102400 KB, estimated 7876 objectsIXPUB技術博客8G Y{,r"Od5B0Q v
2003/09/29 12:57:52| Target number of buckets: 393IXPUB技術博客;n:F;R:X3j)|d
2003/09/29 12:57:52| Using 8192 Store bucketsIXPUB技術博客0CFN1R#p"f9`
2003/09/29 12:57:52| Max Mem size: 8192 KB
)^AI5}D4e"O,r+|02003/09/29 12:57:52| Max Swap size: 102400 KBIXPUB技術博客 c c2Pm/K8P5oy
2003/09/29 12:57:52| Rebuilding storage in /usr/local/squid/var/cache (DIRTY)
,j)R_Kut3C4e02003/09/29 12:57:52| Using Least Load store dir selection
!fB#C2rIK]'I02003/09/29 12:57:52| Set Current Directory to /usr/local/squid/var/cacheIXPUB技術博客X/xY y#DJ)k
2003/09/29 12:57:52| Loaded Icons.
o lA9T"O@02003/09/29 12:57:52| Accepting HTTP connections at 0.0.0.0, port 3128, FD 11.IXPUB技術博客N+k9Z H[D
2003/09/29 12:57:52| Accepting ICP messages at 0.0.0.0, port 3130, FD 12.
J$u[Q XVN J02003/09/29 12:57:52| WCCP Disabled.
7xV.f;b9[5Z02003/09/29 12:57:52| Ready to serve reques假如你看到錯誤消息,你該首先修正它。請檢查輸出信息的開始幾行以發現警告信息。最普通的錯誤是文件/目錄許可問題,和配置文件語法錯誤。假如你看到一條不引起注意的錯誤消息,請見16 章中關于squid 故障處理的建議和信息。如果還不行,請檢查squid FAQ,或查找郵件列表來獲得解釋。一旦你見到"Ready to serve requests"消息,就可用一些HTTP 請求來測試squid。配置你的瀏覽器使用squid 作為代理,然后打開某個web 頁面。假如squid 工作正常,頁面被迅速載入,就象沒使用squid 一樣。另外,你可以使用squidclient 程序,它隨squid 發布:
A0@ Ec*ts0% squidclienthttp://www.squid-cache.org/假如它正常工作,squid 的主頁html 文件會在你的終端窗口里滾動。一旦確認squid 工作正常,你能中斷squid 進程(例如使用ctrl-c)并且在后臺運行squid。
'l+S&ne:b3N05.5 將squid 作為服務進程運行正常情況下你想將squid 以后臺進程運行(不出現在終端窗口里)。最容易的方法是簡單執行如下命令:IXPUB技術博客!PCF8t"Bs4Qk
%squid –s-s 選項導致squid 將重要的狀態和警告信息寫到syslogd。squid 使用LOCAL4 設備,和LOG_WARNING 和LOG_NOTICE 優先權。syslog 進程實際可能會或不會記錄squid 的消息,這依賴于它被如何配置。同樣的消息被寫進cache.log 文件,所以假如你愿意,忽略-s 選項也是安全的。當你不使用-N 選項來啟動squid,squid 自動在后臺運行并且創建父/子進程對。子進程做所有的實際工作。父進程確認子進程總在運行。這樣,假如子進程意外終止,父進程啟動另外一個子進程以使squid 正常工作。通過觀察syslog 消息,你能看到父/子進程交互作用。IXPUB技術博客2N'A5p.w+Z3yZ
Jul 31 14:58:35 zapp squid[294]: Squid Parent: child process 296 started這里顯示的父進程ID 是294,子進程是296。當你查看ps 的輸出,你可以看到子進程以(squid)形式出現:
5C h*}kM"`Q0%ps ax | grep squidIXPUB技術博客f1sWJ(T]s
294 ?? Is 0:00.01 squid -sD
@"`U H r0296 ?? S 0:00.27 (squid) -sD (squid)假如squid 進程意外終止,父進程啟動另一個。例如:
2V;eXv,@ JA0Jul 31 15:02:53 zapp squid[294]: Squid Parent: child process 296 exited due to signal 6IXPUB技術博客&|_|)|&x*p y
Jul 31 15:02:56 zapp squid[294]: Squid Parent: child process 359 started在某些情形下,squid 子進程可能立即終止。為了防止頻繁的啟動子進程,假如子進程連續5 次沒有運行至少10 秒鐘,父進程會放棄。
'?9L[ F&f{V!z0Jul 31 15:13:48 zapp squid[455]: Squid Parent: child process 474 exited with status 1IXPUB技術博客#lY1G'E0pz
Jul 31 15:13:48 zapp squid[455]: Exiting due to repeated, frequent failures如果發生這樣的事,請檢查syslog 和squid 的cache.log 以發現錯誤。
];G6e MT-O2V n B4a05.5.1 squid_start 腳本當squid 以后臺進程運行時,它查找squid 執行程序目錄下的名為squid_start 的文件。假如發現,該程序在父進程創建子進程之前被執行。你能使用該腳本完成特定的管理任務,例如通知某人squid 在運行,管理日志文件等。除非squid_start 程序存在,squid 不會創建子進程。squid_start 腳本在你使用絕對或相對路徑啟動squid 時才開始工作。換句話說,squid 不使用PATH 環境變量來定位squid_start.這樣,你應該養成習慣這樣啟動squid:IXPUB技術博客'unoL(y
% /usr/local/squid/sbin/squid –sD而不要這樣:
zj~TUdx3G0%squid –sD
d Lv/]Z5k]"TO05.6 啟動腳本通常你希望squid 在每次計算機重啟后自動啟動。對不同的操作系統,它們的啟動腳本如何工作也很不同。我在這里描述一些通用的環境,但對你自己的特殊操作系統,也許該有特殊的處理方法。
{_+m9w)dK"A05.6.1 /etc/rc.local最容易的機制之一是/etc/rc.local 腳本。這是個簡單的shell 腳本,在每次系統啟動時以root 運行。使用該腳本來啟動squid 非常容易,增加一行如下:
p~uP3[Z X0/usr/local/squid/sbin/squid –s當然你的安裝位置可能不同,還有你可能要使用其他命令行選項。不要在這里使用-N選項。假如因為某些理由,你沒有使用cache_effective_user 指令,你可以嘗試使用su 來讓squid以非root 用戶運行:IXPUB技術博客6M p:c_ `U s)sW l+Z8H
/usr/bin/su nobody -c '/usr/local/squid/sbin/squid -s'
;FCFo3x5/:@05.6.2 init.d 和rc.dinit.d 和rc.d 機制使用獨立的shell 腳本來啟動不同的服務。這些腳本通常在下列目錄之中:/sbin/init.d, /etc/init.d, /usr/local/etc/rc.d.腳本通常獲取單一命令行參數,是start 或stop。某些系統僅僅使用start 參數。如下是啟動squid 的基本腳本:IXPUB技術博客Pr*XA vdi
#!/bin/shIXPUB技術博客C5J#cc.JX
# this script. starts and stops Squid
e8v#F|1dBZ)x0case "$1" in
8jx$nz!DE0start)
Cvo.YxoZ0/usr/local/squid/sbin/squid -s
O2z0po9FXU5f ` c UF-o0echo -n ' Squid'
+~x@ZQ0;;IXPUB技術博客$m&zC$J#KAd
stop)
!S ^(Q2_4l0/usr/local/squid/sbin/squid -k shutdownIXPUB技術博客;TzH-y _4_2j
;;IXPUB技術博客1l `3]"P H R H
esacLinux 用戶可能在啟動squid 之前需要設置文件描述符限制。例如:IXPUB技術博客O@/s{T
echo 8192 >; /proc/sys/fs/file-maxIXPUB技術博客U:}C:_y
limit -HSn 8192為了使用該腳本,先找到腳本存放的目錄。給它一個有意義的名字,類似于其他的系統啟動腳本。可以是S98squid 或squid.sh。通過重啟計算機來測試該腳本,而不要假想它會正常工作。
Px TFs7N05.6.3 /etc/inittab某些操作系統支持另一種機制,是/etc/inittab 文件。在這些系統中,init 進程啟動和停止基于運行等級的服務。典型的inittab 接口類似如此:IXPUB技術博客$k3lW yo[ ]
sq:2345nce:/usr/local/squid/sbin/squid –s使用該接口,init 進程啟動squid 一次并且隨后忘記它。squid 確認它駐留在運行狀態,象前面描述的一樣。或者,你能這樣做:IXPUB技術博客y0cJDX!Ik_
sq:2345:respawn:/usr/local/squid/sbin/squid –Ns這里我們使用了respawn 選項,假如進程不存在init 會重啟squid。假如使用respawn,請確認使用-N 選項。在編輯完inittab 文件后,使用下面的命令來使init 重新讀取它的配置文件和啟動squid:
~*fM;~'/N0# init q
#C1x$Tf'Q,e05.7 chroot 環境某些人喜歡在chroot 環境運行squid。這是unix 的功能,給予進程新的root 文件系統目錄。在squid 受安全威脅時,它提供額外等級的安全保護。假如攻擊者在某種程度上通過squid獲取了對操作系統的訪問權,她僅僅能訪問在chroot 文件系統中的文件。在chroot 樹之外的系統文件,她不可訪問。最容易在chroot 環境里運行squid 的方法是,在squid.conf 文件里指定新的root 目錄,如下:
l/nL6I4^I1~0chroot /new/root/directorychroot()系統調用需要超級用戶權限,所以你必須以root 來啟動squid。chroot 環境不是為unix 新手準備的。它有點麻煩,因為你必須在新的root 目錄里重復放置大量的文件。例如,假如默認的配置文件正常在/usr/local/squid/etc/squid.conf,并且你使用chroot 指令,那么文件必須位于/new/root/directory/usr/local/squid/etc/squid.conf.你必須將位于$prefix/etc,$prefix/share,$prefix/libexec 下的所有文件拷貝到chroot 目錄。請確認$prefix/var 和cache 目錄在chroot 目錄中存在和可寫。同樣的,你的操作系統需要將大量的文件放在chroot 目錄里,例如/etc/resolv.conf 和/dev/null.假如你使用外部輔助程序,例如重定向器(見11 章)或者驗證器(見12 章),你也需要來自/usr/lib 的某些共享庫。你可以使用ldd 工具來查找給定的程序需要哪些共享庫:IXPUB技術博客+D0{Xq|Z/^
% ldd /usr/local/squid/libexec/ncsa_authIXPUB技術博客b?/F-o7N
/usr/local/squid/libexec/ncsa_auth:
+z@*CK2o`0libcrypt.so.2 =>; /usr/lib/libcrypt.so.2 (0x28067000)
S _ |.E'cDn0libm.so.2 =>; /usr/lib/libm.so.2 (0x28080000)
5e c)}3n D0libc.so.4 =>; /usr/lib/libc.so.4 (0x28098000)你可以使用chroot 命令來測試輔助程序:
b"s7O*U5S*|Ao7j*{#dG0# chroot /new/root/directory /usr/local/squid/libexec/ncsa_authIXPUB技術博客 w2i1Jw{8sux
/usr/libexec/ld-elf.so.1: Shared object "libcrypt.so.2" not found更多的關于chroot 的信息,請見你系統中chroot()的manpage。
+Y}t w*Z%}05.8 停止squid最安全的停止squid 的方法是使用squid -k shutdown 命令:IXPUB技術博客-h.e9Y~P`7z'i
%squid -k shutdown該命令發送TERM 信號到運行中的squid 進程。在接受到TERM 信號后,squid 關閉進來的套接字以拒收新請求。然后它等待一段時間,用以完成外出請求。默認時間是30 秒,你可以在shutdown_lifetime 指令里更改它。
&Ckr E;a"^:^0假如因為某些理由,squid.pid 文件丟失或不可讀,squid -k 命令會失敗。在此情形下,你可以用ps 找到squid 的進程ID,然后手工殺死squid。例如:
%/,Y!|*NyJh^ z0%ps ax |grep squid假如你看到不止一個squid 進程,請殺死以(squid)顯示的那個。例如:IXPUB技術博客)T$X[.Fi4Y7I
% ps ax | grep squid
&h1U V'X pl+m` [k0294 ?? Is 0:00.01 squid -sD
R1V4dagN0296 ?? S 0:00.27 (squid) -sD (squid)IXPUB技術博客U0N;Dsjp6Z`iw
% kill -TERM 296在發送TERM 信號后,你也許想查看日志,以確認squid 已關閉:
fC-t;B'ku#o0% tail -f logs/cache.logIXPUB技術博客-W,p|+]SC3f$v
2003/09/29 21:49:30| Preparing for shutdown after 9316 requests
a1e&f ByG02003/09/29 21:49:30| Waiting 10 seconds for active connections to finish
Rc7l"}oVI:C02003/09/29 21:49:30| FD 11 Closing HTTP connection
Eg Ky2xQV_7J(wC;RZ7q02003/09/29 21:49:31| Shutting down...IXPUB技術博客S&Z6L&cKPn
2003/09/29 21:49:31| FD 12 Closing ICP connection
m;Yu]*J'^!t-u~02003/09/29 21:49:31| Closing unlinkd pipe on FD 9
|B _ml @R02003/09/29 21:49:31| storeDirWriteCleanLogs: Starting...
tU-I,j^,Cg02003/09/29 21:49:32| Finished. Wrote 253 entries.
la;Mm`_+~9]K02003/09/29 21:49:32| Took 0.1 seconds (1957.6 entries/sec).IXPUB技術博客C8x2M(]0g#^
2003/09/29 21:49:32| Squid Cache (Version 2.5.STABLE4): Exiting normally.假如你使用squid -k interrupt 命令,squid 立即關閉,不用等待完成活動請求。這與在kill 里發送INT 信號相同。IXPUB技術博客!j1y IMefj&N(iH
5.9 重配置運行中的squid 進程在你了解了更多關于squid 的知識后,你會發現對squid.conf 文件做了許多改動。為了讓新設置生效,你可以關閉和重啟squid,或者在squid 運行時,重配置它。重配置運行中的squid 最好的方法是使用squid -k reconfigure 命令:
SN'UKbUBK*v0%squid -k reconfigure當你運行該命令時,HUP 信號被發送到運行中的squid 進程。然后squid 讀取和解析squid.conf 文件。假如操作成功,你可以在cache.log 里看到這些:
b"Jk3lLHsiS P02003/09/29 22:02:25| Restarting Squid Cache (version 2.5.STABLE4)...
2?Ud6aw5Ik)T/'m02003/09/29 22:02:25| FD 12 Closing HTTP connection
$Mz[2e5D;?.]E02003/09/29 22:02:25| FD 13 Closing ICP connectionIXPUB技術博客mg$kU?6/J]
2003/09/29 22:02:25| Cache dir '/usr/local/squid/var/cache' size remains unchangedIXPUB技術博客.VKz"R;D$i)L/P
at 102400 KB
3^k5vQ+aID02003/09/29 22:02:25| DNS Socket created on FD 5IXPUB技術博客:pa!BH1g*V.{.Z`
2003/09/29 22:02:25| Adding nameserver 10.0.0.1 from /etc/resolv.confIXPUB技術博客xa8c.a)G'uV3F
2003/09/29 22:02:25| Accepting HTTP connections at 0.0.0.0, port 3128, FD 9.IXPUB技術博客?C{-|r8{/yc7Mr_
2003/09/29 22:02:25| Accepting ICP messages at 0.0.0.0, port 3130, FD 11.
9o'/"zIB$s02003/09/29 22:02:25| WCCP Disabled.
p[i0gmH8e O Ppk5f02003/09/29 22:02:25| Loaded Icons.
6[?,q~ m02003/09/29 22:02:25| Ready to serve requests.在使用reconfigure 選項時你須謹慎,因為所做的改變可能會導致致命錯誤。例如,請注意squid 關閉和重新打開進來的HTTP 和ICP 套接字;假如你將http_port 改變為squid 不能打開的端口,它會發生致命錯誤并退出。在squid 運行時,某些指令和和選項不能改變,包括:IXPUB技術博客p(I d7F8A$`Y/S*g-^a
+ 刪除cache 目錄(cache_dir 指令)
YS,r le0+ 改變store_log 指令
~f.o^eT xhTre0+ 改變coss cache_dir 的塊大小數值。事實上,無論何時你改變了該值,你必須重新初始化coss cache_dir。IXPUB技術博客aj3r3F/o|
+ coredump_dir 指令在重配置過程中不被檢查。所以,在squid 已經啟動了后,你不能讓squid 改變它的當前目錄。solaris 用戶在重配置squid 過程中可能遇到其他問題。solaris 的stdio 執行組件里的fopen()調用要求使用小于256 的未用文件描述符。FILE 結構以8 位值存儲該文件描述符。正常情況下這不構成問題,因為squid 使用底層I/O(例如open())來打開cache 文件。然而,在重配置過程中的某些任務使用fopen(),這就有可能失敗,因為前面的256 個文件描述符已被分配出去。IXPUB技術博客w"C/gIL#j/r|
5.10 滾動日志文件除非你在squid.conf 里禁止,squid 會寫大量的日志文件。你必須周期性的滾動日志文件,以阻止它們變得太大。squid 將大量的重要信息寫入日志,假如寫不進去了,squid 會發生錯誤并退出。為了合理控制磁盤空間消耗,在cron 里使用如下命令:
@u*V r6w`.N H2|r0%squid -k rotate例如,如下任務接口在每天的早上4 點滾動日志:
:_4RW6l(Z1R+^B00 4 * * * /usr/local/squid/sbin/squid -k rotate該命令做兩件事。首先,它關閉當前打開的日志文件。然后,通過在文件名后加數字擴展名,它重命名cache.log,store.log,和access.log。例如,cache.log 變成cache.log.0,cache.log.0變成cache.log.1,如此繼續,滾動到logfile_rotate 選項指定的值。squid 僅僅保存每個日志文件的最后logfile_rotate 版本。更老的版本在重命名過程中被刪除。假如你想保存更多的拷貝,你需要增加logfile_rotate 限制,或者編寫腳本用于將日志文件移動到其他位置。請見13.7 章關于滾動日志的其他信息。6.訪問控制6.1 訪問控制元素ACL 元素是Squid 的訪問控制的基礎。這里告訴你如何指定包括IP 地址,端口號,主機名,和URL 匹配等變量。每個ACL 元素有個名字,在編寫訪問控制規則時需要引用它們。基本的ACL 元素語法如下:
/[F%l+j*jQ0acl name type value1 value2 ...例如:IXPUB技術博客XV*T5u1ZP
acl Workstations src 10.0.0.0/16在多數情況下,你能對一個ACL 元素列舉多個值。你也可以有多個ACL 行使用同一個名字。例如,下列兩行配置是等價的:IXPUB技術博客 lx.O+_f$[(Pc'_
acl http_ports port 80 8000 8080
e:z.M&W1|s@0acl Http_ports port 80IXPUB技術博客1d,Zgn/B
acl Http_ports port 8000IXPUB技術博客q a5B Y$x+aqQ:oZ
acl Http_ports port 80806.1.1 一些基本的ACL 類型Squid 大約有25 個不同的ACL 類型,其中的一些有通用基本類型。例如,src 和dst ACL使用IP 地址作為它們的基本類型。為避免冗長,我首先描述基本類型,然后在接下來章節里描述每種ACL 類型。6.1.1.1 IP 地址使用對象:src,dst,myipIXPUB技術博客&f:hTZ E)S1l/[:t+^
squid 在ACL 里指定IP 地址時,擁有強有力的語法。你能以子網,地址范圍,域名等形式編寫地址。squid 支持標準IP 地址寫法(由”.”連接的4 個小于256 的數字)和無類域間路由規范。另外,假如你忽略掩碼,squid 會自動計算相應的掩碼。例如,下例中的每組是相等的:
B] Jbea G^0acl Foo src 172.16.44.21/255.255.255.255
&VZ E'H(h1P%x0acl Foo src 172.16.44.21/32
oG+V6A*U| oo0acl Foo src 172.16.44.21
(B6~;P1H0h0Y u/B0acl Xyz src 172.16.55.32/255.255.255.248
%ZRm/b+iU v0acl Xyz src 172.16.55.32/28
w9V3mu*J9G0acl Bar src 172.16.66.0/255.255.255.0IXPUB技術博客Gz?)T h9}0n
acl Bar src 172.16.66.0/24IXPUB技術博客7N.HE3B9vX t
acl Bar src 172.16.66.0當你指定掩碼時,squid 會檢查你的工作。如果你的掩碼在IP 地址的非零位之外,squid會告警。例如,下列行導致告警:
N6tq3TI r0acl Foo src 127.0.0.1/8IXPUB技術博客2G&X$~McFX)s
aclParseIpData: WARNING: Netmask masks away part of the specified IP in 'Foo'這里的問題是/8 掩碼(255.0.0.0)在最后三個字節里都是零值,但是IP 地址127.0.0.1不是這樣的。squid 警告你這個問題,以便你消除歧義。正確的寫法是:IXPUB技術博客 [D g2i{#H
acl Foo src 127.0.0.1/32IXPUB技術博客u:?(g1wvn
or:IXPUB技術博客l'WThY1?
acl Foo src 127.0.0.0/8有時候你可能想列舉多個相鄰子網,在這樣的情況下,通過指定地址范圍很容易做到。例如:
8QI2RMm|+C0acl Bar src 172.16.10.0-172.16.19.0/24這等價但高效于下面的行:
)uL0/ T*B'Z6s&xs0acl Foo src 172.16.10.0/24
;V:S&NK"ZJ U3LA$QC0acl Foo src 172.16.11.0/24
ky vxvBL6{0acl Foo src 172.16.12.0/24
9e hn5Rt4UVS0acl Foo src 172.16.13.0/24IXPUB技術博客8K ^#p[?/X8{!v
acl Foo src 172.16.14.0/24IXPUB技術博客!] is Ev)v
acl Foo src 172.16.15.0/24IXPUB技術博客Z Pj{.saP2Wq
acl Foo src 172.16.16.0/24IXPUB技術博客H Q7Ii Z{(UV
acl Foo src 172.16.18.0/24IXPUB技術博客/D tU X9X
acl Foo src 172.16.19.0/24注意使用IP 地址范圍,掩碼只能取一個。你不能為范圍里的地址設置多個不同掩碼。你也能在IP ACL 里指定主機名,例如:IXPUB技術博客7l,p,y-f C*b:QnQ'S
acl Squid dstwww.squid-cache.orgsquid 在啟動時,將主機名轉換成IP 地址。一旦啟動,squid 不會對主機名的地址發起第二次DNS 查詢。這樣,假如在squid 運行中地址已改變,squid 不會注意到。假如主機名被解析成多個IP 地址,squid 將每一個增加到ACL 里。注意你也可以對主機名使用網絡掩碼。在基于地址的ACL 里使用主機名通常是壞做法。squid 在初始化其他組件之前,先解析配置文件,所以這些DNS 查詢不使用squid 的非阻塞IP 緩存接口。代替的,它們使用阻塞機制的gethostbyname()函數。這樣,將ACL 主機名轉換到IP 地址的過程會延緩squid 的啟動。除非絕對必要,請在src,dst,和myip ACL 里避免使用主機名。squid 以一種叫做splay tree 的數據結構在內存里存儲IP 地址ACL ( 請見http://www.link.cs.cmu.edu/splay/)。splay tree 有一些有趣的自我調整的特性,其中之一是在查詢發生時,列表會自動糾正它自己的位置。當某個匹配元素在列表里發現時,該元素變成新的樹根。在該方法中,最近參考的條目會移動到樹的頂部,這減少了將來查詢的時間。屬于同一ACL 元素的所有的子網和范圍不能重迭。如果有錯誤,squid 會警告你。例如,如下不被允許:IXPUB技術博客/aL,q0@$X?K
acl Foo src 1.2.3.0/24
7` @MX jg/~mL0acl Foo src 1.2.3.4/32它導致squid 在cache.log 里打印警告:IXPUB技術博客&[D?'_!r
WARNING: '1.2.3.4' is a subnetwork of '1.2.3.0/255.255.255.0'
1U%KCzC fT2G0WARNING: because of this '1.2.3.4' is ignored to keep splay tree searching predictable
E"H'H(A;kiU a+T4?o0WARNING: You should probably remove '1.2.3.4' from the ACL named 'Foo'在該情形下,你需要修正這個問題,可以刪除其中一個ACL 值,或者將它們放置在不同的ACL 列表中。IXPUB技術博客 PD2[ }8s
6.1.1.2 域名使用對象:srcdomain,dstdomain,和cache_host_domain 指令域名簡單的就是DNS 名字或區域。例如,下面是有效的域名:
k(f2N+T!q1O5y TI$^0www.squid-cache.orgIXPUB技術博客],^.b8f] ?6[
squid-cache.org
(y'Q!FJ/? RU0org域名ACL 有點深奧,因為相對于匹配域名和子域有點微妙的差別。當ACL 域名以"."開頭,squid 將它作為通配符,它匹配在該域的任何主機名,甚至域名自身。相反的,如果ACL 域名不以"."開頭,squid 使用精確的字符串比較,主機名同樣必須被嚴格檢查。表6-1 顯示了squid 的匹配域和主機名的規則。第一列顯示了取自URL 請求的主機名(或者srcdomain ACL 的客戶主機名)。第二列指明是否主機名匹配lrrr.org。第三列顯示是否主機名匹配.lrrr.org ACL。你能看到,唯一的不同在第二個實例里。IXPUB技術博客9ZZ*~(]'f
Table 6-1. Domain name matchingIXPUB技術博客2~-[Y^E E-VI#Z
___________________________________________________________________
1/A6B3w ~{-|/rE9c0__URL hostname_____Matches ACL lrrr.org? ____Matches ACL .lrrr.org?
S{v`5q0S0__lrrr.org_________Yes_______________________Yes
$R.?4BRw/Ev0__i.am.lrrr.org____No________________________Yes
u6kU&l(`:|0__iamlrrr.org______No________________________No
N2r{o T%de/rI0___________________________________________________________________
a ~7J)jd [ DV mw0**說明:為了表現表格形狀,“__”僅代表空格分隔符,沒有任何實際意義(段譽 注釋)。域名匹配可能讓人迷惑,所以請看第二個例子以便你能真正理解它。如下是兩個稍微不同的ACL:
!LH1S,xy6b$~N.p0acl A dstdomain foo.com
G&j;~9MVqoA0acl B dstdomain .foo.com用戶對http://www.foo.com/的請求匹配ACL B,但不匹配A。ACL A 要求嚴格的字符串IXPUB技術博客)V3I1W kA;/l
匹配,然而ACL B 里領頭的點就像通配符。另外,用戶對http://foo.com/的請求同時匹配A 和B。盡管在URL 主機名里的foo.com前面沒有字符,但ACL B 里領頭的點仍然導致一個匹配。squid 使用splay tree 的數據結構來存儲域名ACL,就像它處理IP 地址一樣。然而,squid的域名匹配機制給splay tree 提供了一個有趣的問題。splay tree 技術要求唯一鍵去匹配任意特定搜索條目。例如,讓我們假設搜索條目是i.am.lrrr.org。該主機名同時匹配.lrrr.org和.am.lrrr.org。事實上就是兩個ACL 值匹配同一個主機名擾亂了splay 機制。換句話說,在配置文件里放置如下語句是錯誤的:IXPUB技術博客cB|emJ.@&s
acl Foo dstdomain .lrrr.org?? .am.lrrr.org假如你這樣做,squid 會產生如下警告信息:
2{#e(wn`-S b/f0WARNING: '.am.lrrr.org' is a subdomain of '.lrrr.org'IXPUB技術博客l5G2@r$VN8R
WARNING: because of this '.am.lrrr.org' is ignored to keep splay tree searching predictable
zm"V kO-EN K*^6x0WARNING: You should probably remove '.am.lrrr.org' from the ACL named 'Foo'在該情況下你應遵循squid 的建議。刪除其中一條相關的域名,以便squid 明確知道你的意圖。注意你能在不同的ACL 里任意使用這樣的域名:IXPUB技術博客%pu"~M%C#inw
acl Foo dstdomain .lrrr.orgIXPUB技術博客`;Xw.{0{$G?
acl Bar dstdomain .am.lrrr.org這是允許的,因為每個命名ACL 使用它自己的splay tree.
F!_ Yr*UU p06.1.1.3 用戶名使用對象:ident,proxy_auth該類型的ACL 被設計成匹配用戶名。squid 可能通過RFC 1413 ident 協議或者通過HTTP驗證頭來獲取用戶名。用戶名必須被嚴格匹配。例如,bob 不匹配bobby。squid 也有相關的ACL 對用戶名使用正則表達式匹配(ident_regex 和proxy_auth_regex)。你可以使用單詞"REQUIRED"作為特殊值去匹配任意用戶名。假如squid 不能查明用戶名,ACL 不匹配。當使用基于用戶名的訪問控制時,squid 通常這樣配置。IXPUB技術博客qs9St/D S&R@
6.1.1.4 正則表達式使用對象:srcdom_regex,dstdom_regex,url_regex,urlpath_regex,browser,referer_regex,ident_regex,proxy_auth_regex,req_mime_type,rep_mime_type大量的ACL 使用正則表達式來匹配字符串(完整的正則表達式參考,請見O'Reilly 的Mastering Regular Expressions 一書)。對squid 來說,最常使用的正則表達式功能用以匹配字符串的開頭或結尾。例如,^字符是特殊元字符,它匹配行或字符串的開頭:IXPUB技術博客2WgRL Fa._
^http://該正則表達式匹配任意以http://開頭的URL。$也是特殊的元字符,因為它匹配行或字IXPUB技術博客$V$Y]3k@KU6}2o?
符串的結尾:IXPUB技術博客U5f8jd)g&i
.jpg$實際上,該示例也有些錯誤,因為.字符也是特殊元字符。它是匹配任意單個字符的通配符。我們實際想要的應該是:
Wpx g.nx0/.jpg$反斜杠對這個"."進行轉義。該正則表達式匹配以.jpg 結尾的任意字符串。假如你不使用^或$字符,正則表達式的行為就象標準子串搜索。它們匹配在字符串里任何位置出現的單詞或詞組。對所有的squid 正則表達式類,你可以使用大小寫敏感的選項。匹配是默認大小寫敏感的。為了大小寫不敏感,在ACL 類型后面使用-i 選項。例如:
#C6LghN7Y(Pqik0acl Foo url_regex -i ^http://wwwIXPUB技術博客Qmb'F^,j:b
6.1.1.5 TCP 端口號使用對象:port,myport該類型是相對的。值是個別的端口號或端口范圍。回想一下TCP 端口號是16 位值,這樣它的值必須大于0 和小于65536。如下是一些示例:
_!uUZgB'c D vg,x d0acl Foo port 123
Dk*d ng V!y0acl Bar port 1-1024
k$|I6Op06.1.1.6 自主系統號
C{-c ^j-j-y#ep,OV0使用對象:src_as,dst_asIXPUB技術博客S$iH4ty]PK
Internet 路由器使用自主系統(AS)號來創建路由表。基本上,某個AS 號指向被同一組織管理的IP 網絡范圍。例如,我的ISP 分配了如下網絡塊:134.116.0.0/16, 137.41.0.0/16, 206.168.0.0/16,和其他更多。在Internet 路由表里,這些網絡被公布為屬于AS 3404。當路由器轉發包時,它們典型的選擇經過最少AS 的路徑。假如這些對你不重要,請不必關注它們。AS 基礎的ACL 僅僅被網絡gurus 使用。如下是基于AS 的類型如何工作的:當squid 首先啟動時,它發送一條特殊的查詢到某個whois 服務器。查詢語句基本是:“告訴我哪個IP 網絡屬于該AS 號”。這樣的信息被RADB收集和管理。一旦Squid 接受到IP 網絡列表,它相似的將它們作為IP 基礎的ACL 對待。基于AS 的類型僅僅在ISP 將他們的RADB 信息保持與日更新時才工作良好。某些ISP更新RADB 比其他人做得更好;而許多根本不更新它。請注意squid 僅僅在啟動或者reconfigure 時才將AS 號轉換為網絡地址。假如ISP 更新了它的RADB 接口,除非你重啟或者重配置squid,squid 不會知道這個改變。另外的情況是,在你的squid 啟動時,RADB可能不可到達。假如Squid 不能聯系上RADB服務器,它從訪問控制配置里刪除AS 接口。默認的whois 服務器是whois.ra.net,對許多用戶來說太遙遠了而不可信賴。
/f/m JPe*Sg0H06.1.2 ACL 類型現在我們能把焦點放在ACL 類型自身上。我在這里按照重要性的降序來列舉它們。
M4c-E^7xw m/F06.1.2.1 srcIP 地址在訪問控制元素里是最普遍使用的。大部分站點使用IP 地址來控制客戶允許或不允許訪問Squid。src 類型指客戶源IP 地址。也就是說,當src ACL 出現在訪問控制列表里時,squid 將它與發布請求的客戶IP 地址進行比較。正常情況下你允許來自內網中主機的請求,并阻塞其他的。例如,假如你的單位使用192.168.0.0 子網,你可以這樣指定ACL:
#_4d(dG%~.g-@[0acl MyNetwork src 192.168.0.0假如你有許多子網,你能在同一個acl 行里面列舉它們:IXPUB技術博客4Tsn.ox X
acl MyNetwork src 192.168.0.0 10.0.1.0/24 10.0.5.0/24 172.16.0.0/12squid 有許多其他ACL 類型用以檢查客戶地址。srcdomain 類型比較客戶的完整可驗證域名。它要求反向DNS 查詢,這可能會延緩處理該請求。srcdom_regex ACL 是類似的,但它允許你使用正則表達式來匹配域名。最后,src_as 類型比較客戶的AS 號。
.U%jH3_Q-Y5T06.1.2.2 dstdst 類型指向原始服務器(目標)IP 地址。在某些情況下,你能使用該類型來阻止你的用戶訪問特定web 站點。然而,在使用dst ACL 時你須謹慎。大部分squid 接受到的請求有原始服務器主機名。例如:
U5C |E;AZ z0GEThttp://www.web-cache.com/HTTP/1.0這里,www.web-cache.com是主機名。當訪問列表規則包含了dst 元素時,squid 必須找到該主機名的IP 地址。假如squid 的IP 緩存包含了該主機名的有效接口,這條ACL 被立即檢測。否則,在DNS 查詢忙碌時,squid 會延緩處理該請求。這對某些請求來說會造成延時。為了避免延時,你該盡可能的使用dstdomain ACL 類型來代替dst。如下是簡單的dst ACL 示例:
@ SD xO'f3d/r)R0acl AdServers dst 1.2.3.0/24請注意,dst ACL 存在的問題是,你試圖允許或拒絕訪問的原始服務器可能會改變它的IP 地址。假如你不關心這樣的改變,那就不必麻煩去升級squid.conf。你可以在acl 行里放上主機名,但那樣會延緩啟動速度。假如你的ACL 需要許多主機名,你也許該預處理配置文件,將主機名轉換成IP 地址。
'M)uJ^SR0s06.1.2.3 myipmyip 類型指Squid 的IP 地址,它被客戶連接。當你在squid 機上運行netstat -n 時,你見到它們位于本地地址列。大部分squid 安裝不使用該類型。通常所有的客戶連接到同一個IP 地址,所以該ACL元素僅僅當系統有多個IP 地址時才有用。為了理解myip為何有用,考慮某個有兩個子網的公司網絡。在子網1的用戶是程序員和工程師。子網2包括會計,市場和其他管理部門。這樣情況下的squid 有三個網絡接口:一個連接子網1,一個連接子網2,第三個連接到外部因特網。當正確的配置時,所有在子網1 的用戶連接到squid 位于該子網的IP 地址,類似的,子網2 的用戶連接到squid 的第二個IP 地址。這樣你就可以給予子網1 的技術部員工完全的訪問權,然而限制管理部門的員工僅僅能訪問工作相關的站點。ACL 可能如下:
3e q6m5we7Nq0acl Eng myip 172.16.1.5IXPUB技術博客g:Lw9e*T8c
acl Admin myip 172.16.2.5然而請注意,使用該機制你必須特別小心,阻止來自某個子網的用戶連接squid 位于另一子網的IP 地址。否則,在會計和市場子網的聰明的用戶,能夠通過技術部子網進行連接,從而繞過你的限制。
hH a1H'Q]8x6tzT'W06.1.2.4 dstdomain在某些情況下,你發現基于名字的訪問控制非常有用。你可以使用它們去阻塞對某些站點的訪問,去控制squid 如何轉發請求,以及讓某些響應不可緩存。dstdomain 之所以非常有用,是因為它檢查請求url 里的主機名。然而首先我想申明如下兩行的不同:IXPUB技術博客R$G7t9vYY
acl A dstwww.squid-cache.orgIXPUB技術博客&{?m}5y%Ak R'/
acl B dstdomainwww.squid-cache.orgA 實際上是IP 地址ACL。當Squid 解析配置文件時,它查詢www.squid-cache.org的IP地址,并將它們存在內存里。它不保存名字。假如在squid 運行時IP 地址改變了,squid 會繼續使用舊的地址。然而dstdomain ACL 以域名形式存儲,并非IP 地址。當squid 檢查ACL B 時,它對URL的主機名部分使用字符串比較功能。在該情形下,它并不真正關心是否www.squid-cache.orgIXPUB技術博客as%LV;[9hh:P
的IP 地址改變了。使用dstdomain ACL 的主要問題是某些URL 使用IP 地址代替主機名。假如你的目標是使用dstdomain ACL 來阻塞對某些站點的訪問,聰明的用戶能手工查詢站點的IP 地址,然后將它們放在URL 里。例如,下面的2 行URL 帶來同樣的頁面:
/c4H6[E'x&UR J0http://www.squid-cache.org/docs/FAQ/IXPUB技術博客r-h+u(Cc/aX n
http://206.168.0.9/docs/FAQ/第一行能被dstdomain ACL 輕易匹配,但第二行不能。這樣,假如你依靠dstdomain ACL,你也該同樣阻塞所有使用IP 地址代替主機名的請求。請見6.3.8 章節。IXPUB技術博客y$v Dx9} G:O Gk
6.1.2.5 srcdomainsrcdomain ACL 也有點麻煩。它要求對每個客戶IP 地址進行所謂的反向DNS 查詢。技術上,squid 請求對該地址的DNS PTR 記錄。DNS 的響應--完整可驗證域名(FQDN)--是squid匹配ACL 值的東西。(請參考O'Reilly's DNS and BIND 找到更多關于DNS PTR 記錄的信息)使用dst ACL,FQDN 查詢會導致延時。請求會被延緩處理直到FQDN 響應返回。FQDN響應被緩存下來,所以srcdomain 查詢通常僅在客戶首次請求時延時。不幸的是,srcdomain 查詢有時不能工作。許多組織并沒有保持他們的反向查詢數據庫與日更新。假如某地址沒有PTR 記錄,ACL 檢查失敗。在該情形下,請求可能會延時非常長時間(例如2 分鐘)直到DNS 查詢超時。假如你使用srcdomain ACL,請確認你自己的DNS in-addr.arpa 區域配置正確并且在工作中。假如這樣,你可以使用如下的ACL:IXPUB技術博客#X3A)/WEC
acl LocalHosts srcdomain .users.example.comIXPUB技術博客*m8BU,y_"M'X*fi
6.1.2.6 port你很可能想使用port ACL 來限制對某些原始服務器端口號的訪問。就像我即將講到的,squid 其實不連接到某些服務,例如email 和IRC 服務。port ACL 允許你定義單獨的端口或端口范圍。例如:
E.` R6Gz |0l ]0acl HTTPports port 80 8000-8010 8080HTTP 在設計上與其他協議類似,例如SMTP。這意味著聰明的用戶通過轉發email 消息到SMTP 服務器能欺騙squid。Email 轉發是垃圾郵件的主要原因之一,我們必須處理它們。歷史上,垃圾郵件有真正的郵件服務器。然而近來,越來越多的垃圾郵件制造者使用開放HTTP 代理來隱藏他們的蹤跡。你肯定不想Squid 被當成垃圾郵件轉發器。假如是這樣,你的IP 地址很可能被許多郵件轉發黑名單凍結(MAPS,ORDB,spamhaus 等)。除email 之外,還有其他許多TCP/IP 服務是squid 不與其通信的。這些包括IRC,Telnet,POP,和NNTP。你的針對端口的策略必須被配置成拒絕已知危險端口,并允許剩下的;或者允許已知安全端口,并拒絕剩下的。我的態度比較保守,僅僅允許安全的端口。默認的squid.conf 包含了下面的安全端口ACL:IXPUB技術博客v@8o4EB
acl Safe_ports port 80 # http
0A%[a1}+n'PO0acl Safe_ports port 21 # ftpIXPUB技術博客qO rvz1_FRc
acl Safe_ports port 443 563 # https, snews
4z*Sl.K!H[0acl Safe_ports port 70 # gopherIXPUB技術博客lk!X0]3O-s} S!Iq
acl Safe_ports port 210 # waisIXPUB技術博客1K(cQI9s$@#L#RQ
acl Safe_ports port 1025-65535 # unregistered portsIXPUB技術博客!]#r[ /-l8{J
acl Safe_ports port 280 # http-mgmt
q Ep@@1T0acl Safe_ports port 488 # gss-httpIXPUB技術博客,@?|{*W2A H1Q3N
acl Safe_ports port 591 # filemakerIXPUB技術博客 `4XzE2d
acl Safe_ports port 777 # multiling httpIXPUB技術博客&J-_1qC9N,[+Wy
http_access deny !Safe_ports這是個較明智的配置。它允許用戶連接到任何非特權端口(1025-65535),但僅僅指定的特權端口可以被連接。假如你的用戶試圖訪問某個URL如下:http://www.lrrr.org:123/,squid會返回訪問拒絕錯誤消息。在某些情形下,為了讓你的用戶滿意,你可能需要增加另外的端口號。寬松的做法是,拒絕對特別危險的端口的訪問。Squid FAQ 包括了如下示例:
7k-CB2a]!L:]7^7g0acl Dangerous_ports 7 9 19 22 23 25 53 109 110 119
y}+KA9l0http_access deny Dangerous_ports使用Dangerous_ports 的弊端是squid 對幾乎每個請求都要搜索整個列表。這對CPU 造成了額外的負擔。大多數情況下,99%到達squid的請求是對80端口的,它不出現在危險端口列表里。所有請求對該表的搜索不會導致匹配。當然,整數比較是快速的操作,不會顯然影響性能。(譯者注:這里的意思是,兩者都要對列表進行搜索和匹配。在第一種情況下,它搜索安全端口列表并匹配80,顯然第一個元素就匹配成功了。而第二種情況中,會搜索危險端口列表并試圖匹配80,當然危險端口不會包括80,所以每次對80 的請求都要搜索完整個列表,這樣就會影響性能。)
~:}Y_;[ y i{06.1.2.7 myportsquid 也有myport ACL。port ACL 指向原始服務器的端口號,myport 指向squid 自己的端口號,用以接受客戶請求。假如你在http_port 指令里指定不止一個端口號,那么squid 就可以在不同的端口上偵聽。假如你將squid 作為站點HTTP 加速器和用戶代理服務器,那么myport ACL 特別有用。你可以在80 上接受加速請求,在3128 上接受代理請求。你可能想讓所有人訪問加速器,但僅僅你自己的用戶能以代理形式訪問squid。你的ACL 可能如下:
y{;KN a%/'t0acl AccelPort myport 80IXPUB技術博客7l0{eZ3X$y'r%{
acl ProxyPort myport 3128IXPUB技術博客8C Y+Q+K3k q9xwHe
acl MyNet src 172.16.0.0/22IXPUB技術博客@ v2t@"YmW
http_access allow AccelPort # anyoneIXPUB技術博客 Or$g7pd4fx
http_access allow ProxyPort MyNet # only my users
_ z2J|b ro;c?_'h8P0http_access deny ProxyPort # deny othersIXPUB技術博客V4i nc2P mx%o
6.1.2.8 methodmethod ACL 指HTTP 請求方法。GET 是典型的最常用方法,接下來是POST,PUT,和其他。下例說明如何使用method ACL:IXPUB技術博客:x iH2W1FdZ{;U
acl Uploads method PUT POSTSquid 知道下列標準HTTP 方法:GET, POST, PUT, HEAD, CONNECT, TRACE,OPTIONS 和DELETE。另外,squid 了解下列來自WEBDAV 規范,RFC 2518 的方法:PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK。某些Microsoft 產品使用非標準的WEBDAV 方法,所以squid 也了解它們:BMOVE, BDELETE, BPROPFIND。最后,你可以在extension_methods 指令里配置squid 去理解其他的請求方法。請見附錄A。注意CONNECT 方法非常特殊。它是用于通過HTTP 代理來封裝某種請求的方法(請見RFC 2817:Upgrading to TLS Within HTTP/1.1)。在處理CONNECT 方法和遠程服務器的端口號時應特別謹慎。就像前面章節講過的一樣,你不希望squid 連接到某些遠程服務。你該限制CONNECT 方法僅僅能連接到HTTPS/SSL 或NNTPS 端口(443 和563)。默認的squid.conf 這樣做:IXPUB技術博客;whPJ2GGm
acl CONNECT method CONNECTIXPUB技術博客@T?YT O
acl SSL_ports 443 563IXPUB技術博客w(p*l^*] u
http_access allow CONNECT SSL_ports
3K5}b4Oq'f UdD:Q7Z0http_access deny CONNECT在該配置里,squid 僅僅允許加密請求到端口443(HTTPS/SSL)和563(NNTPS)。CONNECT 方法對其他端口的請求都被拒絕。PURGE 是另一個特殊的請求方法。它是Squid 的專有方法,沒有在任何RFC 里定義。它讓管理員能強制刪除緩存對象。既然該方法有些危險,squid 默認拒絕PURGE 請求,除非你定義了ACL 引用了該方法。否則,任何能訪問cache 者也許能夠刪除任意緩存對象。我推薦僅僅允許來自localhost 的PURGE:
bA P9@"[[c[0acl Purge method PURGE
wC%eOMV4k0acl Localhost src 127.0.0.1IXPUB技術博客;?4J3mE O"_cGU
http_access allow Purge LocalhostIXPUB技術博客*{*Hz%WJ-`J O*f!ld
http_access deny Purge關于從squid 的緩存里刪除對象,請見7.6 章。IXPUB技術博客QJ(h/@C n sg{
6.1.2.9 proto該類型指URI 訪問(或傳輸)協議。如下是有效值:http, https (same as HTTP/TLS), ftp,gopher, urn, whois, 和cache_object。也就是說,這些是被squid 支持的URL 機制名字。例如,假如你想拒絕所有的FTP 請求,你可以使用下列指令:IXPUB技術博客r X2wLw S `0a"R
acl FTP proto FTPIXPUB技術博客H1pWJ u,U
http_access deny FTPcache_object機制是squid的特性。它用于訪問squid的緩存管理接口,我將在14.2 章討論它。不幸的是,它并非好名字,可能會被改變。默認的squid.conf 文件有許多行限制緩存管理訪問:
o-n|!i)H0acl Manager proto cache_objectIXPUB技術博客_X+v'})H/v7Kw"c
acl Localhost src 127.0.0.1
xqSNZ0CX1o0http_access allow Manager LocalhostIXPUB技術博客6^)lTLd3x2~QC$|4@h
http_access deny Manager這些配置行僅允許來自本機地址的緩存管理請求,所有其他的緩存管理請求被拒絕。這意味著在squid 機器上有帳號的人,能訪問到潛在的敏感緩存管理信息。你也許想修改緩存管理訪問控制,或對某些頁面使用密碼保護。我將在14.2.2 章里談論到。IXPUB技術博客7v6Uw M8~E(KxK eW
6.1.2.10 timetime ACL 允許你控制基于時間的訪問,時間為每天中的具體時間,和每周中的每天。日期以單字母來表示,見如下表。時間以24 小時制來表示。開始時間必須小于結束時間,這樣在編寫跨越0 點的time ACL 時可能有點麻煩。IXPUB技術博客/`~4M+_E N*X*Ry
Code____Day
u2P n'G#n~ `j0-----------------IXPUB技術博客{!A$d |)vySY5u*N
S_______SundayIXPUB技術博客i dhS-Sc
M_______MondayIXPUB技術博客"h]FM){y4SU
T_______Tuesday
OS4Y [5Ca0/L0W_______Wednesday
B4L[ HA4i5^0H_______Thursday
/9A?%Th`0F_______Friday
F~A'U)^X`%Puq0A_______Saturday
Lp&Odj4e1x7Y0D_______All weekdays (M-F)
xr&n*Ma9YD%h0^(V0-----------------日期和時間由localtime()函數來產生。請確認你的計算機位于正確的時區,你也該讓你的時鐘與標準時間同步。為了編寫time ACL 來匹配你的工作時間,你可以這樣寫:
F!ZCW|~*yr%R0acl Working_hours MTWHF 08:00-17:00
-{iw!| R?O(q"E0or:IXPUB技術博客lfGk D!O
acl Working_hours D 08:00-17:00讓我們看一個麻煩的例子。也許你是某個ISP,在下午8 點到早上4 點這段不忙的時間內放松訪問。既然該時間跨越子夜,你不能編寫“20:00-04:00”。代替的,你需要把它們分成兩個ACL 來寫,或者使用否定機制來定義非忙時。例如:IXPUB技術博客.G7j6s*?;Wy![s
acl Offpeak1 20:00-23:59IXPUB技術博客BLS$~J;j|c)i)r
acl Offpeak2 00:00-04:00
A we-/.V0http_access allow Offpeak1 ...
3k)v&]H4QJ6x0http_access allow Offpeak2 ...另外,你可以這樣寫:IXPUB技術博客9r:VE5hEy*LJa
acl Peak 04:00-20:00
u:V{U2lj*p(bCe0http_access allow !Peak ...盡管squid 允許,你也不應該在同一個time ACL 里放置多個日期和時間范圍列表。對這些ACL 的解析不一定是你想象的那樣。例如,假如你輸入:IXPUB技術博客d0Ku|wa*B
acl Blah time M 08:00-10:00 W 09:00-11:00實際能做到的是:IXPUB技術博客ze0g s |
acl Blah time MW 09:00-11:00解析僅僅使用最后一個時間范圍。正確的寫法是,將它們寫進兩行:IXPUB技術博客 q:FP.j:d;Y6j
acl Blah time M 08:00-10:00
8iX:~1U IoF/s7g1h*/0acl Blah time W 09:00-11:00IXPUB技術博客cL^6E R5_v(O
6.1.2.11 identident ACL 匹配被ident 協議返回的用戶名。這是個簡單的協議,文檔是RFC 1413。它工作過程如下:1.用戶代理(客戶端)對squid 建立TCP 連接。2.squid 連接到客戶系統的ident 端口(113)。3.squid 發送一個包括兩個TCP 端口號的行。squid 端的端口號可能是3128(或者你在squid.conf 里配置的端口號),客戶端的端口號是隨機的。4.客戶端的ident 服務器返回打開第一個連接的進程的用戶名。5.squid 記錄下用戶名用于訪問控制目的,并且記錄到access.log。當squid 遇到對特殊請求的ident ACL 時,該請求被延時,直到ident 查詢完成。這樣,ident ACL 可以對你的用戶請求造成延時。我們推薦僅僅在本地局域網中,并且大部分客戶工作站運行ident 服務時,才使用ident ACL。假如squid 和客戶工作站連在一個局域網里,ident ACL 工作良好。跨廣域網使用ident難以成功。ident 協議并非很安全。惡意的用戶能替換他們的正常ident 服務為假冒服務,并返回任意的他們選擇的用戶名。例如,假如我知道從administrator 用戶的連接總是被允許,那么我可以寫個簡單的程序,在回答每個ident 請求時都返回這個用戶名。你可以使用ident ACL 攔截cache(請見第9 章)。當squid 被配置成攔截cache 時,操作系統假設它自己是原始服務器。這意味著用于攔截TCP 連接的本地socket 地址有原始服務器的IP 地址。假如你在squid 上運行netstat -n 時,你可以看到大量的外部IP 地址出現在本地地址欄里。當squid 發起一個ident 查詢時,它創建一個新的TCP 套接字,并綁定本地終點到同一個IP 地址上,作為客戶TCP 連接的本地終點。既然本地地址并非真正是本地的(它可能與原始服務器IP 地址相距遙遠),bind()系統調用失敗。squid 將這個作為失敗的ident查詢來處理。注意squid也有個特性,對客戶端執行懶惰ident 查詢。在該情形下,在等待ident 查詢時,請求不會延時。在HTTP 請求完成時,squid 記錄ident 信息,假如它可用。你能使用ident_lookup_access 指令來激活該特性,我將在本章后面討論。
5y/G-V-c"|FdU(B7E06.1.2.12 proxy_authsquid 有一套有力的,在某種程度上有點混亂的特性,用以支持HTTP 代理驗證功能。使用代理驗證,客戶的包括頭部的http 請求包含了驗證信用選項。通常,這簡單的是用戶名和密碼。squid 解密信用選項,并調用外部驗證程序以發現該信用選項是否有效。squid 當前支持三種技術以接受用戶驗證:HTTP 基本協議,數字認證協議,和NTLM。基本認證已經發展了相當長時間。按今天的標準,它是非常不安全的技術。用戶名和密碼以明文同時發送。數字認證更安全,但也更復雜。基本和數字認證在RFC 2617 文檔里被描述。NTLM 也比基本認證更安全。然而,它是Microsoft 發展的專有協議。少數squid 開發者已經基本完成了對它的反向工程。為了使用代理驗證,你必須配置squid 使用大量的外部輔助程序。squid 源代碼里包含了一些程序,用于對許多標準數據庫包括LDAP,NTLM,NCSA 類型的密碼文件,和標準Unix密碼數據庫進行認證。auth_param 指令控制對所有輔助程序的配置。我將在12 章里討論這些細節。auth_param 指令和proxy_auth ACL 是少數在配置文件里順序重要的實例。你必須在proxy_auth ACL 之前定義至少一個驗證輔助程序(使用auth_param)。假如你沒有這樣做,squid 打印出錯誤消息,并且忽略proxy_auth ACL。這并非致命錯誤,所以squid 可以啟動,但所有你的用戶的請求可能被拒絕。proxy_auth ACL 取用戶名作為值。然而,大部分安裝里簡單的使用特殊值REQUIRED:auth_param ...
^7o_E_^Y0acl Auth1 proxy_auth REQUIRED在該情況中,任何具有有效信用選項的請求會匹配該ACL。假如你需要細化控制,你可以指定獨立的用戶名:IXPUB技術博客9qWg-`8Z:X
auth_param ...
N:F C!Fv{0acl Auth1 proxy_auth allan bob charlie
j.dE!/l:]+Rp]!s0acl Auth2 proxy_auth dave eric frank代理驗證不支持HTTP 攔截,因為用戶代理不知道它在與代理服務器,而非原始服務器通信。用戶代理不知道在請求里發送Proxy-Authorization 頭部。見9.2 章更多細節。IXPUB技術博客4g[? p'G
6.1.2.13 src_as該類型檢查客戶源IP 地址所屬的具體AS 號(見6.1.1.6 關于squid 如何將AS 號映射到IP 地址的信息)。作為示例, 我們虛構某ISP 使用AS 64222 并且通告使用10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 網絡。你可以編寫這樣的ACL,它允許來自該ISP 地址空間的任何主機請求:IXPUB技術博客0`9nq0_z/ m/?1s"l/
acl TheISP src 10.0.0.0/8IXPUB技術博客&Ui"T#n UcB
acl TheISP src 172.16.0.0/12IXPUB技術博客+^(]l"x^2}
acl TheISP src 192.168.0.0/16
8VN%nVkp'L0http_access allow TheISP當然,你還可以這樣寫:IXPUB技術博客/HZqzx Rv+bh
acl TheISP src_as 64222IXPUB技術博客6P$O `S[u9X
http_access allow TheISP第二種寫法不但更短,而且假如ISP 增加了新的網絡,你不必更新ACL 配置。
gV Z.y8P-q?"k1V06.1.2.14 dst_asdst_as ACL 經常與cache_peer_access 指令一起使用。在該方法中,squid 使用與IP 路由一致的方式轉發cache 丟失。考慮某ISP,它比其他ISP 更頻繁的更換路由。每個ISP 處理他們自己的cache 代理,這些代理能轉發請求到其他代理。理論上,ISP A 將ISP B 網絡里主機的cache 丟失轉發到ISP B 的cache 代理。使用AS ACL 和cache_peer_access 指令容易做到這點:IXPUB技術博客 t9KVt"B-Q
acl ISP-B-AS dst_as 64222IXPUB技術博客iY(f)JuW.^
acl ISP-C-AS dst_as 64333
w"Ab#aHl[0cache_peer proxy.isp-b.net parent 3128 3130
W%L'AM$QJt0cache_peer proxy.isp-c.net parent 3128 3130IXPUB技術博客#X#|8XDu,?{ j9b
cache_peer_access proxy.isb-b.net allow ISP-B-ASIXPUB技術博客3bdkU8zI6Rc r
cache_peer_access proxy.isb-c.net allow ISP-C-AS我將在第10 章里討論更多關于cache 協作。IXPUB技術博客"T[g%wb)f?
6.1.2.15 snmp_communitysnmp_community ACL 對SNMP 查詢才有意義,后者被snmp_access 指令控制。例如,你可以這樣寫:
'R A0EZ"P]'^H0acl OurCommunityName snmp_community hIgHsEcUrItYIXPUB技術博客 A'U{M@*L,^e6E$T
acl All src 0/0
4P{'I/|'l0snmp_access allow OurCommunityName
(W R/q Wc/^7G2X0snmp_access deny All在該情況中,假如community 名字設置為hIgHsEcUrItY,SNMP 查詢才被允許。
3r8S_q fb"X+J06.1.2.16 maxconnmaxconn ACL 指來自客戶IP 地址的大量同時連接。某些squid 管理員發現這是個有用的方法,用以阻止用戶濫用代理或者消耗過多資源。maxconn ACL 在請求超過指定的數量時,會匹配這個請求。因為這個理由,你應該僅僅在deny 規則里使用maxconn。考慮如下例子:IXPUB技術博客v%{?l9i1P)p
acl OverConnLimit maxconn 4
l kJp9?J OTt-w0http_access deny OverConnLimit在該情況中,squid 允許來自每個IP 地址的同時連接數最大為4 個。當某個客戶發起第五個連接時,OverConnLimit ACL 被匹配,http_access 規則拒絕該請求。IXPUB技術博客V6K_q(F/v3K J
6.1.2.17 arparp ACL 用于檢測cache 客戶端的MAC 地址(以太網卡的物理地址)。地址解析協議(ARP)是主機查找對應于IP 地址的MAC 地址的方法。某些大學學生發現,在Microsoft Windows 下,他們可以改變系統的IP 地址到任意值,然后欺騙squid 的基于地址的控制。這時arp 功能就派上用場了,聰明的系統管理員會配置squid 檢查客戶的以太網地址。不幸的是,該特性使用非移植性代碼。假如你運行Solaris 或Linux,你能使用arp ACL。其他系統不行。當你運行./configure 時增加--enable-arp-acl 選項,就可以激活該功能。arp ACL 有另一個重要限制。ARP 是數據鏈路層協議,假如客戶主機和squid 在同一子網,它才能工作。你不容易發現不同子網主機的MAC 地址。假如在squid 和你的用戶之間有路由器存在,你可能不能使用arp ACL。現在你知道何時去使用它們,讓我們看看arp ACL 實際上是怎樣的。它的值是以太網地址,當使用ifconfig 和arp 時你能看到以太網地址。例如:
T4@e-y%YLh0acl WinBoxes arp 00:00:21:55:ed:22IXPUB技術博客e7r(lZ&u~.R
acl WinBoxes arp 00:00:21:ff:55:38IXPUB技術博客'_ ft"Q T7Ec^^r-V
6.1.2.18 srcdom_regexsrcdom_regex ACL 允許你使用正則表達式匹配客戶域名。這與srcdomain ACL 相似,它使用改進的的子串匹配。相同的限制是:某些客戶地址不能反向解析到域名。作為示例,下面的ACL 匹配以dhcp 開頭的主機名:IXPUB技術博客 m%z1k^_y@*J5a
acl DHCPUser srcdom_regex -i ^dhcp因為領頭的^ 符號, 該ACL 匹配主機名dhcp12.example.com , 但不匹配host12.dhcp.example.com。IXPUB技術博客&T!tKL&~7ro
6.1.2.19 dstdom_regexdstdom_regex ACL 也與dstdomain 相似。下面的例子匹配以www 開頭的主機名:
x7}#rc`?L0acl WebSite dstdom_regex -i ^www/.如下是另一個有用的正則表達式,用以匹配在URL 主機名里出現的IP 地址:
#i*c@ MIpvO[@v0acl IPaddr dstdom_regex [0-9]$這樣可以工作,因為squid 要求URL 主機名完全可驗證。既然全局頂級域名中沒有以數字結尾的,該ACL 僅僅匹配IP 地址,它以數字結尾。IXPUB技術博客&qyzp/wT
6.1.2.20 url_regexurl_regex ACL 用于匹配請求URL 的任何部分,包括傳輸協議和原始服務器主機名。例如,如下ACL 匹配從FTP 服務器的MP3 文件請求:IXPUB技術博客ROi4@)UI
acl FTPMP3 url_regex -i ^ftp://.*/.mp3$IXPUB技術博客K4^_?+qR"J/I,|
6.1.2.21 urlpath_regexurlpath_regex 與url_regex 非常相似,不過傳輸協議和主機名不包含在匹配條件里。這讓某些類型的檢測非常容易。例如,假設你必須拒絕URL 里的"sex",但仍允許在主機名里含有"sex"的請求,那么這樣做:
.g"B"ARp*Gn t0acl Sex urlpath_regex sex另一個例子,假如你想特殊處理cgi-bin 請求,你能這樣捕獲它們:IXPUB技術博客S6cO1H"@R P
acl CGI1 urlpath_regex ^/cgi-bin當然,CGI 程序并非總在/cgi-bin/目錄下,這樣你應該編寫其他的ACL 來捕獲它們。IXPUB技術博客l.X"m-p.Mf!J
6.1.2.22 browser大部分HTTP 請求包含了User-Agent 頭部。該頭部的值典型如下:
,l2F,[.M;/:B [0Mozilla/4.51 [en] (X11; I; Linux 2.2.5-15 i686)browser ACL 對user-agent 頭執行正則表達式匹配。例如,拒絕不是來自Mozilla 瀏覽器的請求,可以這樣寫:
Mt*j-TAZ P;f9j0acl Mozilla browser Mozilla
c_B#eYh0http_access deny !Mozilla在使用browser ACL 之前,請確認你完全理解cache 接受到的User-Agent 字符串。某些user-agent 與它們的來源相關。甚至squid 可以重寫它轉發的請求的User-Agent 頭部。某些瀏覽器例如Opera 和KDE 的Konqueror,用戶可以對不同的原始服務器發送不同的user-agent字串,或者干脆忽略它們。
L2|Ge8^c WZ06.1.2.23 req_mime_typereq_mime_type ACL 指客戶HTTP 請求里的Content-Type 頭部。該類型頭部通常僅僅出現在請求消息主體里。POST 和PUT 請求可能包含該頭部,但GET 從不。你能使用該類型ACL 來檢測某些文件上傳,和某些類型的HTTP 隧道請求。req_mime_type ACL 值是正則表達式。你可以這樣編寫ACL 去捕獲音頻文件類型:IXPUB技術博客$qDsU~ K5G9AB
acl AuidoFileUploads req_mime_type -i ^audio/
cJ'C sG/R}06.1.2.24 rep_mime_type該類型ACL 指原始服務器的HTTP 響應里的Content-Type 頭部。它僅在使用http_reply_access 規則時才有用。所有的其他訪問控制形式是基于客戶端請求的。該ACL 基于服務器響應。假如你想使用squid 阻塞Java 代碼,你可以這樣寫:
7HL|l5R gp;B0acl JavaDownload rep_mime_type application/x-javaIXPUB技術博客O3OA&o!F-nZ
http_reply_access deny JavaDownloadIXPUB技術博客n$m z_l.?C_
6.1.2.25 ident_regex在本節早些時講過ident ACL。ident_regex 允許你使用正則表達式,代替嚴格的字符串匹配,這些匹配是對ident 協議返回的用戶名進行。例如,如下ACL 匹配包含數字的用戶名:IXPUB技術博客7G'c#go V.R'fn2v,Ni
acl NumberInName ident_regex [0-9]
S.{%PL/K;K1G06.1.2.26 proxy_auth_regex該ACL 允許對代理認證用戶名使用正則表達式。例如, 如下ACL 匹配
Z}#_Q0A^0admin,administrator 和administrators:IXPUB技術博客*Od7C bu:M
acl Admins proxy_auth_regex -i ^admin
2Y~z2f'x~P0U/zG06.1.3 外部ACLSquid 2.5 版本介紹了一個新特性:外部ACL。你可以指示squid 發送某些信息片斷到外部進程,然后外部的輔助程序告訴squid,數據匹配或不匹配。squid 附帶著大量的外部ACL 輔助程序;大部分用于確定命名用戶是不是某個特殊組的成員。請見12.5 章關于這些程序的描述,以及關于如何編寫你自己的程序的信息。現在,我解釋如何定義和使用外部ACL 類型。external_acl_type 指令定義新的外部ACL 類型。如下是通用語法:
5lj5m!}.l&v0external_acl_type type-name [options] format helper-commandtype-name 是用戶定義的字串。你也可以在acl 行里引用它。Squid 當前支持如下選項(options):ttl=nIXPUB技術博客x8?(~.NBq
時間數量,單位是秒,用以緩存匹配值的時間長短。默認是3600 秒,或1 小時。negative_ttl=nIXPUB技術博客 L`!V hm C?
時間數量,單位是秒,用以緩存不匹配值的時間長短。默認是3600 秒,或1 小時。concurrency=n
:`,vb A"Gm P0衍生的輔助程序的數量,默認是5。cache=nIXPUB技術博客:V [}2l{x8D
緩存結果的最大數量。默認是0,即不限制cache 大小。格式是以%字符開始的一個或多個關鍵字。squid 當前支持如下格式:%LOGINIXPUB技術博客dA}^(xPr5m J1i!t
從代理驗證信用選項里獲取的用戶名。%IDENTIXPUB技術博客*{{#g2A?}^
從RFC 1413 ident 獲取的用戶名。%SRC
/D.p4Jt LeE*Go.F,e)/0客戶端IP 地址。%DST
Zo7`R,qx3Gc0原始服務器IP 地址。%PROTO
.V/.Mp7M2F zF0傳輸協議(例如HTTP,FTP 等)%PORTIXPUB技術博客-@Al9P5H-E0Cr]U H
原始服務器的TCP 端口。%METHOD
9O,q"q)m5x:Su6goz0HTTP 請求方法。%{Header}IXPUB技術博客 O| }g/qRP
HTTP 請求頭部的值;例如,%{User-Agent}導致squid 發送這樣的字串到驗證器:"Mozilla/4.0 (compatible; MSIE 6.0; Win32)"%{Hdr:member}
yzE0U;w:w tF v0選擇某些數量的基于列表的HTTP 頭部,例如Caceh-Control;例如,給出如下HTTP頭部:IXPUB技術博客-j;OT/Ds qL8`V
X-Some-Header: foo=xyzzy, bar=plugh, foo=zoinks對%{X-Some-Header:foo}的取值,squid 發送這樣的字串到外部ACL 進程:
1q"l5A;_-ET0foo=xyzzy, foo=zoinks%{Hdr:;member}IXPUB技術博客@"y piu h(i
與%{Hdr:member}相同,除了";"是列表分隔符外。你能使用任何非字母數字的字符作為分隔符。輔助命令是squid 為輔助程序衍生的命令。你也可以在這里包含命令參數。例如,整條命令可能類似如此:
O-H:r0Qz/~0/usr/local/squid/libexec/my-acl-prog.pl -X -5 /usr/local/squid/etc/datafile將這些放在一個長行里。squid 不支持如下通過反斜杠分隔長行的技術,所以請記住所有這些必須放在單行里:IXPUB技術博客.~vB dZ,`+w,d,RS
external_acl_type MyAclType cache=100 %LOGIN %{User-Agent} /IXPUB技術博客:I.~/S^FIXAO
/usr/local/squid/libexec/my-acl-prog.pl -X -5 /
)A#Zm#LI0/usr/local/squid/share/usernames /
j$eQLV|uA:DcO0/usr/local/squid/share/useragents現在你知道如何定義外部ACL,下一步是編寫引用它的acl 行。這相對容易,語法如下:IXPUB技術博客7W eFa Dr'F/z4R
acl acl-name external type-name [args ...]如下是個簡單示例:
Y$kO}*H0acl MyAcl external MyAclTypesquid 接受在type-name 后面的任意數量的參數。這些在每個請求里被發送到輔助程序。
PsZ t X]0請見12.5.3 章,我描述了unix_group 輔助程序,作為該功能的示例。
EE g5F|WBs2f0f8P06.1.4 處理長ACL 列表ACL 列表某些時候非常長。?br />
導入論壇 引用鏈接 收藏 分享給好友 推薦到圈子 管理 舉報
TAG:
查看全部評論我來說兩句???顯示全部
??? ????
???內容
???昵稱
???驗證
???提交評論
??? width="0" height="0" id="xspace-phpframe">?
???????????再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow
總結
以上是生活随笔為你收集整理的squid服务的应用 转的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机汉字字模信息怎么算,汉字字模库字模
- 下一篇: 汉字点阵原理字模读取与显示