Squid是一個應用級代理,在保證客戶端主機和服務器主機網絡連通后,需要客戶端軟件做相應的設置后才能使用,比如給 Internet Explorer設置代理服務器地址、端口等。
WEB緩存功能對于一個規模較大、訪問繁忙的網絡來說是有必要的,IBM網站上的一篇文章,詳細分析介紹了WEB緩存給上網用戶帶來的好處:
... achinga/index.shtml
下面我們就介紹一下squid的有關內容。
§§ 安裝運行squid
Redhat 7.3自帶Squid的rpm包squid-2.4.STABLE6-1.7.2.i386.rpm,這里我們直接利用rpm來安裝Squid:
[root@rh73 /mnt/cdrom/RedHat/RPMS]# rpm -ivh squid-2.4.STABLE6-1.7.2.i386.rpm
Preparing... ########################################### [100%]
1:squid ########################################### [100%]
安裝后的Squid配置文件在/etc/squid/目錄下,只需要簡單的配置一下/etc/squid/squid.conf就可以讓它工作起來了。
默認安裝的Squid配置文件是一個兩千多行的文本,實事上你用不到設置那么多。用編輯器打開該配置文件,找到http_access設置部分,把
http_access deny all
一行改成
http_access allow all
然后啟動Squid:
/etc/rc.d/init.d/squid start
現在你的Squid代理服務器已經可以使用了。到客戶端設置上網軟件的代理選項,以Internet Explorer 6.0為例,在Internet屬性設置里設置“連接”屬性,點“局域網設置”按鈕。
在彈出的對話框中選中“為LAN使用代理服務器”,在地址欄填入代理服務器地址,這里是:192.168.100.254,端口為squid默認的3128。
確認。此時你再用Internet Explorer上網便是使用squid代理。你可以察看squid的log文件來觀察到客戶端主機通過squid的訪問情況:
[root@rh73 ~]# tail -f /var/log/squid/access.log
在這里,上面的設置只對Internet Explorer起作用。如果你按照前面的章節在Linux接入服務器上實現了NAT的功能,除了IE瀏覽器里訪問http、ftp服務是在用squid 代理外,其它上訪問Internet的操作,如收發Email,telnet,還是通過NAT完成訪問。當你把瀏覽器的代理設置選項清除后,你又可以恢復到NAT方式訪問Internet。
§§ 設置squid
前面的配置是不加限制的允許內部所有用戶使用該代理上Internet,顯然這不是一個很好的訪問策略。我們說過,代理方式對用戶權限的控制有著非常豐富的支持。下面就看看squid如何實現多樣化的權限控制的。
讓我們先了解一下squid.conf的幾個配置選項和訪問控制特性:
Squid 的定制是通過設置它的配置文件 squid.conf 來實現的,squid.conf 文件通常在 /etc/squid 目錄下。這個配置文件內容很多,但它的每個選項都有詳盡的說明。下面是幾個常用的配置參數:
http_port
首先來更改一下 http_port,這個選項指定了 Squid 監聽客戶請求的端口,默認值是 3128。要使用代理功能,建議這個端口值和運行 Squid 的機器的 IP 地址一起使用,可以修改成下面這樣:
http_port 192.168.100.254:3128
上述聲明表示 Squid 綁定在 IP 地址 192.168.100.254 上,端口為 3128。端口可以設置為任意值,但要確認沒有其他程序會使用同樣的端口。/etc/services文件列出了常用端口,如果你想為squid設置其它的端口,可以參考這個文件的內容,防止重復設置。
visible_hostname 192.168.100.254
運行squid的主機的名字,可以寫上該機器的IP地址。
[email]cache_mgrpangty@usa.net[/email]
管理員的郵件地址。在訪問發生錯誤時,visible_hostname和cache_mgr這兩個選項的值顯示在錯誤提示頁面內的相關位置。
cache_mem 16 MB
定義緩存內存,一般定義為物理內存大小的1/3。默認設置為8MB。
cache_dir Type Directory-Name Fs-specific-data [options]
定義硬盤緩存空間以存儲訪問過的頁面或其它資源的拷貝。Type是指存儲類型,一般設置為ufs。Directort-Name代表緩存的位置,默認的設置是cache_dir ufs /var/spool/squid 100 16 256。其中100代表緩存空間最大為100M;16和256代表緩存目錄下的一級和二級目錄數。
訪問控制
控制用戶的訪問權限等功能是使用squid的訪問控制特性來實現的。Squid 訪問控制有兩個要素:ACL和訪問列表。訪問列表可以允許或拒絕某些用戶對特定服務的訪問。
為了使用控制功能,必須先設置 ACL。ACL 聲明的格式如下:
acl acl_element_name type_of_acl_element values_to_acl
下面列出一些重要的 ACL類型(type_of_acl_element)
l src : 源地址(即客戶機IP地址)
l dst : 目標地址(即服務器IP地址)
l srcdomain : 源名稱 (即客戶機名稱)
l dstdomain : 目標名稱 (即服務器名稱)
l time : 一天中的時刻和一周內的一天
l url_regex : URL 規則表達式匹配
l urlpath_regex: URL-path 規則表達式匹配,略去協議和主機名
l proxy_auth : 通過外部程序進行用戶驗證
l maxconn : 單一 IP 的最大連接數
注:
1. acl_element_name 可以是任一個在 ACL 中定義的名稱。
2. 任何兩個 ACL 元素不能用相同的名字。
3. 每個 ACL 由列表值組成。當進行匹配檢測的時候,多個值由邏輯或運算連接;換言之,即任一 ACL的值被匹配,則這個 ACL即被匹配。
4. 并不是所有的 ACL都能使用訪問列表中的全部類型。
5. 不同的 ACL寫在不同行中,Squid 將把它們組合在一個列表中。
我們可以使用許多不同的訪問列表。我們常用的是http_access: 允許 HTTP 訪問,這個是主要的訪問控制列表。
訪問列表的規則由一些類似 'allow' 或 'deny' 的關鍵字構成,用以允許或拒絕向特定或一組 ACL 元素提供服務。
注:
1. 這些規則按照它們的排列順序進行匹配檢測,一旦檢測到匹配的規則,匹配檢測就立即結束。
2. 一個訪問列表可以又多條規則組成。
3. 如果沒有任何規則與訪問請求匹配,默認動作將與列表中最后一條規則對應。
4. 一個訪問條目中的所有元素將用邏輯與運算連接:
http_access Action 聲明1 AND 聲明2 AND 聲明 OR.
http_access Action 聲明3
多個 http_access 聲明間用或運算連接,但每個訪問條目的元素間用與運算連接。
5. 請記住列表中的規則總是遵循由上而下的順序。
我們具體來看看如何運用acl和http_access。首先把squid.conf的配置改回原狀,即修改http_access allow all為http_access deny all。下面給出幾種常用訪問控制:
根據IP鑒權
只有地址為192.168.100.10和192.168.100.100的終端可以使用代理
在squid.conf的ACCESS CONTROL配置部分添加
acl authorizedip src 192.168.100.10
acl authorizedip src 192.168.100.100
然后到http_access部分
在http_access deny all這一行前面添加
http_access allow authorizedip
如果需要設置的IP地址非常多,又不連續,是不是要寫上一大堆的acl xxx xxx x.x.x.x?有一個簡單的方法,把這些IP地址寫在一個文件里,比如/etc/squid/authorizedip.txt,每行一個。然后在squid.conf里這樣寫
acl authorizedip src "/etc/squid/authorizedip.txt"
根據時間控制
關于時間段的設置,可以參見squid.conf中的說明,具體是S - Sunday, M - Monday, T - Tuesday, W - Wednesday, H - Thursday, F - Friday A - Saturday,如果七天都允許,也可以不寫。時間格式是H1:M1-H2:M2,要求是前面的要小于后面的。
# 定義一個訪問時間段:每周星期一到星期五的上午八點到下午五點,允許alloweduser用戶在這個時間段內上網
acl accept_time time MTWHF8:00-17:00
http_access allow alloweduser accept_time
http_access deny alloweduser
訪問特定URL地址
雖然我們不希望所有的人都使用代理自由的訪問Internet,但有幾個網站是可以讓內部終端都能訪問的。在squid.conf里添加訪問控制:
acl alloweddomain dstdomain .linuxforum.net .linuxaid.com.cn
http_access allow alloweddomain
同樣的,如果參數很多的情況,也可以把這些允許的地址名寫到一個文本里:
acl alloweddomain dstdomain "/etc/squid/alloweddomain.txt"
alloweddomain.txt里是允許訪問站點的列表,每行一個。
根據關鍵字過濾網址
有些網站(色情網站,廣告網站)很令人討厭,通過設置acl可以很容易屏蔽掉這些站點:
acl denyurl url_regex sex boylink xxx city69 asiaadult sehu
http_access deny denyurl
這個設置將過濾帶有sex boylink xxx city69 asiaadult sehu這些關鍵字的URL地址。
和前面一樣,也可以把這些關鍵字寫到一個文本里
acl denyedurl url_regex "/etc/squid/sex.txt"
http_access deny denyurl
基于用戶的認證
Squid本身并不支持用戶驗證,它是通過外部程序提供用戶驗證功能,用戶通過squid訪問前需要輸入有效的用戶名和密碼。可以用 proxy_auth ACL 和 authenticate_program 來實現這個功能,在允許訪問前強制進行用戶名和密碼的核查。下面列出一些 Squid 能用到的驗證程序:
NCSA : 使用 NCSA 風格的用戶名和密碼檔
LDAP : 使用 Linux Lightweight 目錄訪問協議(Linux Lightweight Directory Access Protocol)
SMB : 使用 SMB 協議的服務,如 SAMBA 或 Windows NT
MSNT : 使用 Windows NT 的域驗證
PAM : 使用 Linux 的可裝載驗證模塊
getpwam : 使用 Linux 密碼檔
使用驗證功能必須用authenticate_program 選項指定使什么驗證程序,并且請確認選定的驗證程序已安裝并能很好的工作。默認的,這些驗證程序放在/usr/lib/squid/目錄下。
以NCSA認證為例,修改 squid.conf 文件選定驗證程序:
authenticate_program /usr/lib/squid/ncsa_auth /etc/squid/passwd
acl alloweduser proxy_auth pangty
http_access allow alloweduser
其中/etc/squid/passwd是用戶和密碼列表,這個文件可以用apache軟件包帶的htpasswd來產生,它的內容可能是這樣的:
pangty:wCQhCeZOOF3vk
pangty是用戶名,“:”號后面的是該用戶的密碼。
注意:修改了squid.conf配置后,需要重新啟動squid或者告訴squid重新裝入配置文件才能起作用。這樣執行:
重起squid:
[root@rh73 ~]# /etc/rc.d/init.d/squid restart
不重起,只裝入新的配置文件:
[root@rh73 ~]# /etc/rc.d/init.d/squid reload
以上是squid的常用的配置選項,這對于一般的應用來說已經足夠了,如果你需要更多的特性支持,請閱讀下面的內容。
§§ 需要更多的功能
顯示中文錯誤提示信息
默認的,squid在發生錯誤時顯示的是英文提示信息,squid的提示信息已經被翻譯成很多語言,可以很方便的讓他顯示中文信息:
[root@rh73 ~]# cd /etc/squid/
[root@rh73 ~]# rm -f errors
[root@rh73 /etc/squid]# ln -s /usr/lib/squid/errors/Simplify_Chinese/ errors
/usr/lib/squid/errors下面有squid的各種語言版本的提示信息,按目錄存放在不同的子目錄下面。
支持基于MAC的控制以及訪問帶有下劃線的URL
由于計算機的IP地址是隨時可以更改的,所以即便你設置了ACL限制只有某些IP的計算機可以訪問Internet,其它人仍然可以在該計算機關機的情況下,修改成這些允許上網的IP地址后訪問Internet。另外,前面我們是使用DHCP來管理內部網絡上的計算機的IP地址,每臺計算機每次獲得的IP地址可能是不一樣的,所以,單純的通過IP地址來控制上網權限并不適合所有的場合,而MAC地址相對是穩定的,一般網卡的MAC地址不能夠更改,所以基于MAC地址的用戶控制非常適合解決這兩種情況帶來的問題。
另外,我們訪問Internet時,有時候會遇到這樣的網站地址:,在網站的URL地址里面有下劃線,這時Red Hat Linux自帶的squid軟件包可能會報告無法訪問該網站。
這些功能需要重新編譯squid源代碼增加相應的編譯選項來實現。下面我們就來看一下如何使用rpm重新編譯軟件包源代碼獲得必要的功能。
當文章寫到這里的時候,Red Hat Linux網站發布了squid的升級軟件包,我們可以從網上獲得它的最新源代碼rpm包:
ftp://updates.redhat.com/7.2/en/ ... ABLE6-6.7.3.src.rpm
在開始編譯前,有一些軟件包是需要首先安裝,這可能包括rpm-build、sgml-tools,前者在Red Hat Linux的光盤上可以找到,后者可以從這里下載:
ftp://ftp.freesoft.cei.gov.cn/.m ... s-1.0.9-12.i386.rpm
安裝squid的源代碼包
[root@rh73 ~]# rpm -ivh squid-2.4.STABLE6-6.7.3.src.rpm
安裝后的源代碼包在/usr/src/redhat/SOURCES目錄下,我們關心的是另外一個文件/usr/src/redhat/SPECS/squid.spec,這里面有squid的相關編譯選項,修改該文件%configure部分如下:
%configure /
--exec_prefix=/usr --bindir=/usr/sbin --libexecdir=/usr/lib/squid /
--localstatedir=/var --sysconfdir=/etc/squid /
--enable-poll --enable-snmp --enable-removal-policies="heap,lru" /
--enable-storeio="aufs,coss,diskd,ufs" /
--enable-delay-pools --enable-linux-netfilter /
--with-pthreads /
--enable-underscores /
--enable-arp-acl /
--enable-err-language=Simplify_Chinese /
--enable-auth-modules="LDAP,NCSA,PAM,SMB,MSNT" # --enable-icmp
--enable-underscores是增加對下劃線網址的支持,--enable-arp-acl是增加支持MAC地址方式的鑒權。
開始編譯產生新的RPM包:
[root@rh73 ~]# rpm -ba squid.spe
這條命令將根據squid.spec的配置重新編譯生成新的rpm包。編譯過程視機器性能的好壞而定,大概需要幾分鐘到幾十分鐘不等,如果沒有什么錯誤,最后產生的新的rpm包在/usr/src/redhat/RPMS/i386/目錄下:squid- 2.4.STABLE6-6.7.3.i386.rpm
安裝新的rpm包:
[root@rh73 ~]# rpm -Uvh /usr/src/redhat/RPMS/i386/squid-2.4.STABLE6-6.7.3.i386.rpm
注意,這里使用了-U參數,是因為我們前面已經安裝過squid的一個較舊的版本,-U參數指出這個操作是對原有版本軟件包的升級。現在你的squid就可以支持MAC地址鑒權和帶下劃線的URL地址了。 8)
配置squid.conf來支持MAC地址鑒權,在squid.conf里加入這樣的內容:
acl allowedmac arp00:10:DC:8F:5B:FF
http_access allow allowedmac
上面只是常用的幾種ACL設置的示例,關于ACL可以訪問squid主頁上FAQ文檔的Access Controls部分獲得更多的信息:
§§ 配置透明代理
透明代理是NAT和代理的完美結合,之所以稱為透明,是因為在這種工作方式下你感覺不到代理的存在,和單純使用NAT一樣,對上網的客戶端沒有任何特殊的設置。Squid可以通過配置支持透明代理。
很多文章講到共享上網就會講有關透明代理(iptables + squid或ipchains + squid)的內容,我個人認為對于規模不大的網絡,又沒有內容過濾等功能的要求,使用squid是沒有必要的,單純的使用NAT方式就足夠了,并且這樣對運行NAT的服務器的要求就更加低,比如使用一臺486 + 4M內存的機器,如果使用那些經過特殊定制的Linux系統,甚至連硬盤都不需要,只要一張軟盤就可以了。
如果是源代碼方式編譯安裝的squid,請在編譯選項里指明--enable-linux-netfilter選項。Red Hat Linux自帶的squid支持透明代理,我們可以直接修改/etc/squid/squid.conf文件,設置必要的參數:
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
運行/etc/rc.d/init.d/squid reload使設置生效,然后修改fw.sh腳本,在最后添加這樣一行:
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
這將把所有局域網用戶通過Linux接入服務器訪問www服務的訪問請求重定向到工作在3128端口的squid處理。運行fw.sh腳本,使設置生效。就這么簡單!
你可能還記得fw.sh里面的關于NAT的規則:
iptables -A POSTROUTING -t nat -s 192.168.100.0/24 -o eth0 -j SNAT --to-source 61.156.35.114
由于PREROUTING規則總在POSTROUTING規則之前應用,所以不用擔心squid被NAT規則屏蔽掉。
注意:使用透明代理時,無法同時使用squid基于用戶帳號的驗證功能!
想了解更多關于透明代理的資料,請訪問TLDP(The Linux Documentation Project)上關于透明代理的HOWTO文檔:
§§ 一個squid.conf的配置實例
現在給出一個支持透明代理并使用MAC地址控制用戶上網權限的squid配置文件,該配置還支持特定網站(如色情網站)的過濾功能:
#定義服務器地址和端口
http_port 192.168.100.254:3128
#定義服務器名字
visible_hostname 192.168.100.254
#定義管理員郵件地址
cache_mgr [email]pangty@usa.net[/email]
#定義緩存內存空間和緩存目錄
cache_mem 16 MB
cache_dir ufs /var/spool/squid 100 16 256
#支持透明代理
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
#定義acl
#sexurl.txt列出要過濾色情網站地址的關鍵字,每個關鍵字占一行,如xchina
#maclist.txt列出允許上網的主機的MAC地址,每個地址占一行,如00:50:56:C0:00:08
acl all src 0.0.0.0/0.0.0.0
acl sexurl url_regex "/etc/squid/sexurl.txt"
acl allowedmac arp "/etc/squid/maclist.txt"
#定義訪問策略
http_access deny sexurl
http_access allow allowedmac
http_access deny all
新聞熱點
疑難解答
圖片精選