天天看點

squid Introduction

        作為一種免費的網絡作業系統,Linux越來越受到廣大網絡愛好者的歡迎,目前Internet上運作的主機有相當一部分采用的就是Linux,而且中國已經把Linux作為政府上網的指定網絡作業系統。種種迹象表明,Linux正在逐漸走向成熟。

        為了解決Internet發展迅速和IP位址資源緊張的沖突,代理伺服器的使用越來越廣泛。Squid是一種在Linux系統下使用的比較優秀的代理伺服器軟體。

        代理伺服器接受到請求後,首先與通路控制清單中的通路規則相對照,如果滿足規則,則在緩存中查找是否存在需要的資訊。

  用戶端B向代理伺服器提出相同的請求。代理伺服器也首先與通路控制清單中的通路規則相對照。如果滿足規則,則将緩存中的資訊傳送給用戶端B

        代理服務是指由一台擁有标準IP位址的機器代替若幹沒有标準IP位址的機器和Internet上的其它主機打交道,提供代理服務的這台機器稱為代理伺服器。擁有内部位址的機器想連接配接到Internet上時,先把這個請求發給擁有标準IP位址的代理伺服器,由代理伺服器把這個請求通過它的标準IP位址發到請求的目的位址。然後目标位址的伺服器把傳回的結果發回給代理伺服器,代理伺服器再原封不動的把資料發給内部主機。若幹擁有内部位址的機器就組成了内部網,代理伺服器的作用就是溝通内部網和Internet,解決内部網通路Internet的問題。這種代理事不可逆的,Internet上的主機不能通路任何一台擁有内部位址的機器,這樣又可以保障内部資料的安全性。

        代理軟體的一個優點是它能夠檢驗除了資料包之外的許多東西。Squid對資料包的有效載荷進行檢驗,也就是穿越防火牆的資料包中TCP(或者UDP)部分所占地份量。根據資料包報頭(資料包中的IP部分)和資料包有效載荷(TCP部分)的資訊,代理防火牆能夠決定資料包将發往何處,資料包請求什麼,以及根據資料包所必須提供的這些資訊決定采取什麼樣的行動。

        squid不僅可用在Linux系統上,還可以用在AIX、Digital Unix、FreeBSD、HP-UX、Irix、NetBSD、Nextstep、SCO和Solaris等系統上。

  Squid與Linux下其它的代理軟體如Apache、Socks、TIS FWTK和delegate相比,下載下傳安裝簡單,配置簡單靈活,支援緩存和多種協定。用ipchains+Squid的解決方案,就可以獲得通過緩存高性能的同時能夠無縫的通路Internet。

  Squid是一個緩存internet資料的一個軟體,它接收使用者的下載下傳申請,并自動處理所下載下傳的資料。也就是說,當一個使用者想要下載下傳一個首頁時,它向Squid發出一個申請,要Squid替它下載下傳,然後Squid 連接配接所申請網站并請求該首頁,接着把該首頁傳給使用者同時保留一個備份,當别的使用者申請同樣的頁面時,Squid把儲存的備份立即傳給使用者,使使用者覺得速度相當快。

        對于Web使用者來說,Squid是一個高性能的代理緩存伺服器,可以加快内部網浏覽Internet的速度,提高客戶機的通路命中率。Squid不僅支援HTTP協定,還支援FTP、gopher、SSL和WAIS等協定。和一般的代理緩存軟體不同,Squid用一個單獨的、非子產品化的、I/O驅動的程序來處理所有的用戶端請求。

        Squid将資料元緩存在記憶體中,同時也緩存DNS查尋的結果,除此之外,它還支援非子產品化的DNS查詢,對失敗的請求進行消極緩存。Squid支援SSL,支援通路控制。由于使用了ICP,Squid能夠實作重疊的代理陣列,進而最大限度的節約帶寬。

        Squid由一個主要的服務程式Squid,一個DNS查詢程式dnsserver,幾個重寫請求和執行認證的程式,以及幾個管理工具組成。當Squid啟動以後,它可以派生出指定數目的dnsserver程序,而每一個dnsserver程序都可以執行單獨的DNS查詢,這樣一來就大大減少了伺服器等待DNS查詢的時間。

        Squid的另一個優越性在于它使用通路控制清單(ACL)和通路權限清單(ARL)。通路控制清單和通路權限清單通過阻止特定的網絡連接配接來減少潛在的Internet非法連接配接,可以使用這些清單來確定内部網的主機無法通路有威脅的或不适宜的站點。

         Squid對硬體的要求是記憶體一定要大,不應小于128M,硬碟轉速越快越好,最好使用伺服器專用SCSI硬碟,處理器要求不高,400MH以上既可。

編譯安裝Squid

        squid軟體包有兩種:一種是RedHat所使用的rpm包,另一種是源代碼包。

rpm包的安裝:

        1.進入/mnt/cdrom/RedHat/RPMS。

        2.執行rpm -ivh squid-2.2.STABLE4-8.I386.rpm。

源代碼包的安裝:

        1.從http://www.squid-cache.org下載下傳squid-2.2.STABLE4-src.tar.gz。 

        2.将該檔案拷貝到/usr/local目錄。 

        3.解開該檔案tar xvzf squid-2.2.STABLE4-src.tar.gz,在/usr/local目錄下生成一個新的目錄squid-2.2.STABLE4,為了友善使用mv squid-2.2.STABLE4 squid将目錄更名為squid。 

        4.進入squid目錄。 

        5.執行./configure,可以用./configure -prefix=/directory/you/want指定安裝目錄。系統預設安裝目錄為/usr/local/squid。 

        6.執行make all。 

        7.執行make install。 

        8.安裝結束後,Squid的可執行檔案在安裝目錄的bin子目錄下,配置檔案在etc子目錄下。

配置squid

配置檔案squid.conf

Squid有一個主要的配置檔案squid.conf,位于/etc/squid目錄下,使用者僅僅需要修改該配置檔案即可。

squid.conf配置檔案分為13個部分,分别是:

1.NETWORK OPTIONS(有關的網絡選項)

2.OPTIONS WHICH AFFECT THE NEIGHBOR SELECTION ALGORITHM(作用于鄰居選擇算法的有關選項)

3.OPTIONS WHICH AFFECT THE CACHE SIZE(定義cache大小選項)

4.LOGFILE PATHNAMES AND CACHE DIRECTORIES(定義日志檔案的路徑及cache的目錄)

5.OPTIONS FOR EXTERNAL SUPPORT PROGRAMS(外部支援程式選項)

6.OPTIONS FOE TUNING THE CACHE(調整cache選項)

7.TIMEOUTS(逾時)

8.ACCESS CONTROLS(通路控制)

9.ADMINISTRATIVE PARAMETERS(管理參數)

10.OPTIONS FOR THE CACHE REGISTRATION SERVICE(cache注冊服務選項)

11.HTTPD-ACCELERATOE OPTIONS(HTTPD加速選項)

12.MISCELLANEOUS(雜項)

13.DELAY POOL PARAMETERS(延時池選項)

雖然squid的配置檔案很龐大,但是使用者可以根據自己的實際情況修改相應的選項,并不需要配置所有的選項。下面介紹幾個常用的選項。

1.http_port

定義squid監聽HTTP客戶連接配接請求的端口。預設是3128,如果使用HTTPD加速模式則為80。可以指定多個端口,但是所有指定的端口都必須在一條指令行上。

2.cache_mem

指定squid可以使用的記憶體理想值,建議設為記憶體的1/3.

3.cache_dir Directory-Name Mbytes Level1 Level2

指定squid用來存儲對象的交換空間的大小及其目錄結構。可以用下面的公式來估算系統所需要的子目錄數目。

已知量:

DS = 可用交換空間總量(機關KB)/ 交換空間數目

OS = 平均每個對象的大小= 20k

NO = 平均每個二級子目錄所存儲的對象數目 = 256

未知量:

L1 = 一級子目錄的數量

L2 = 二級子目錄的數量

計算公式:

L1 x L2 = DS / OS / NO

注意這是個不定方程,可以有多個解。

4.maximum_object_size

大于該值得對象将不被存儲。如果要提高通路速度,就降低該值;如果想最大限度的節約帶寬,降低成本,就增加該值。

5.dns_nameservers

定義Squid進行域名解析時使用的域名伺服器。

6.acl

定義通路控制清單。定義文法為:

acl aclname acltype string ...

acl aclname acltype "file" ...

7.http_access

根據某個通路控制清單允許或禁止某一類使用者通路。

squid常用指令

1、初始化你在 squid.conf 裡配置的 cache 目錄

#squid/sbin/squid -z //第一次啟動squid服務時必須輸入此指令

如果有錯誤提示,請檢查你的 cache目錄的權限。

2、對你的squid.conf 排錯,即驗證 squid.conf 的 文法和配置。

#squid/sbin/squid -k parse

如果squid.conf 有文法或配置錯誤,這裡會傳回提示你,如果沒有傳回,恭喜,可以嘗試啟動squid。

3、在前台啟動squid,并輸出啟動過程。

#squid/sbin/squid -N -d1

如果有到 ready to server reques,恭喜,啟動成功。

然後 ctrl + c,停止squid,并以背景運作的方式啟動它。

4、啟動squid在背景運作。

#squid/sbin/squid -s

這時候可以 ps -A 來檢視系統程序,可以看到倆個 squid 程序。

5、停止 squid

#squid/sbin/squid -k shutdown

這個不用解釋吧。

6、重引導修改過的 squid.conf

#squid/sbin/squid -k reconfigure

這個估計用的時候比較多,當你發現你的配置有不盡你意的時候,可以随時修改squid.conf,然後别忘記對你的 squid.conf排錯,然後再執行此指令,即可讓運作中squid重新按照你的squid.conf 來運作。

7、把squid添加到系統啟動項

編輯 /etc/rc.d/rc.local

添加如下行: /usr/local/squid/sbin/squid -s

當然,并不是每個人都喜歡這種啟動方式,你可以用你最習慣的方式;或者把它安裝為服務。

再來點其他的。

1、修改cache 緩存目錄的權限。

#chown -R squid:squid /home/cache

我的cache緩存目錄是 /home/cache,squid執行使用者和使用者組是 squid,squid。

2、修改squid 日志目錄的權限

#chown -R squid:squid /usr/local/squid/var/logs

這一步并不是适合每一個使用squid的使用者.意為讓squid有權限在該目錄進行寫操作 。

例如生成 access.log cache.log store.log

3、檢視你的日志文檔。

#more /usr/local/squid/var/logs/access.log | grep TCP_MEM_HIT

該指令可以看到在squid運作過程中,有那些檔案被squid緩存到記憶體中,并傳回給通路使用者。

#more /usr/local/squid/var/logs/access.log | grep TCP_HIT

該指令可以看到在squid運作過程中,有那些檔案被squid緩存到cache目錄中,并傳回給通路使用者。

#more /usr/local/squid/var/logs/access.log | grep TCP_MISS

該指令可以看到在squid運作過程中,有那些檔案沒有被squid緩存,而是現重原始伺服器擷取并傳回給通路使用者。

關于 TCP_XXXX 等參數及代表的資訊,請參看彭勇華《squid中文權威指南》13.2.1 章節。

當然,本例中的藍色文字是可以修改為其他的參數,例如你的域名,同樣可以看到access.log裡關于該域名的行。

4、squid -k rotate 輪換squid的日志檔案/var/log/squid,Squid代理伺服器日志檔案

的增長速度是驚人的,很容易點球滿磁盤空間導緻系統不能正常工作,甚至是當機.為了解決日志檔案增長太快的問題,squid采用了"輪換"的方法.在squid.conf中可以通過logfile_rotate來設定檔案輪換的個數,如:

logfile_rotate 10 ,輪換的工作一般用crontab定時器完在周期性的日志輪換,例如每周六淩晨2:00進行日志輪換,則執行如下指令: crontab -e

0 2 * * 6 squid -k rotate

小貼士:Squid預設的錯誤提示資訊為英文,對于英文不好的使用者來說,實在不友善.在/etc/squid/squid.conf裡添加如下:

error_directory /usr/share/squid/errors/Simplify_Chinese 即可顯示中文的錯誤提示。

用戶端的配置

将某台終端設定成内部位址,并将該終端的DNS伺服器設定為代理伺服器的DNS服務,在内部位址和标準位址之間作一個路由。在浏覽器裡設定代理伺服器位址為Squid代理伺服器的位址,就可以通過代理伺服器上網了。

一個執行個體

假設有這樣的應用環境,網絡中有一台撥号伺服器為使用者提供撥号接入服務,且運作有Squid實作的代理伺服器,其IP位址為192.168.2.32。撥号使用者得到一個内部IP,位址範圍為192.168.2.1-192.168.2.30。

1.配置squid.conf

http_port 80

cache_mem 32 MB

cache_swap_low 90

cache_swap_high 95

maximum_object_size 4096 KB

cache_dir /var/spool/squid 100 16 256

cache_access_log /var/log/squid/access.log

cache_log /var/log/squid/cache.log

cache_store_log /var/log/squid/store.log

cache_dns_program /usr/lib/squid/dnsserver

dns_nameservers 192.168.2.32

unlinkd_program /usr/lib/squid/unlinkd

acl all src 0.0.0.0/0.0.0.0

acl allow_ip src 192.168.2.1/255.255.255.0

acl manager proto cache_object

acl localhost src 192.168.2.32/255.255.255.255

acl SSL_ports port 443 563

acl Safe_ports port 80 21 443 563 70 210 1025-65535

acl CONNECT method CONNECT

http_access allow manager localhost

http_access deny manager

http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow localhost

http_access allow allow_ip

cache_effective_user squid

cache_effective_group squid

下面兩個選項是用來定義squid加速模式的。用virtual來指定為虛拟主機模式。80端口為要加速的請求端口。采用這種模式時,Squid就取消了緩存及ICP功能,假如需要這些功能,必須設定httpd_accel_with_proxy選項。

httpd_accel_host virtual

httpd_accel_port 80

下面兩個選項在透明代理模式下是必須設定成on的。在該模式下,Squid既是web請求的加速器,又是緩存代理伺服器。

httpd_accel_with_proxy on

httpd_accel_uses_host_header on

設定透明代理時,必須打開包轉發功能,還要結合ipchains:

echo 1 > /proc/sys/net/ipv4/ip_forward

/sbin/ipchains -A input -j ACCEPT -i lo

/sbin/ipchains -A forward -s 192.168.2.1/24 -d 0/0 -j MASQ

2.使用者認證設定

預設時,Squid本身不帶任何認證程式,但是可以通過外部認證程式來實作使用者認證。一般有以下的認證程式:LDAP認證、SMB認證、基于mysql的認證、基于sock5的密碼認證和基于Radius的認證。下面介紹常用的ncsa實作的認證,ncsa是Squid源代碼包自帶的認證程式之一,實作步驟如下:

* 進入/usr/local/squid/auth_modules/NCSA目錄,執行:

make

make install

* 編譯成功後,會生成ncsa_auth的可執行檔案,拷貝生成的可執行檔案到/usr/bin目錄下。

* 修改squid.conf檔案的相關選項。

acl auth_user proxy_auth REQUIRED

http_access allow auth_user

authenticate_program /usr/local/squid/bin/ncsa_auth

/usr/local/squid/etc/passwd

* 利用Apache攜帶的工具軟體htpasswd在/usr/locad/squid/etc下生成密碼檔案,并添加相應的使用者資訊。該密碼檔案每行包含一個使用者的資訊,即使用者名和密碼。例如,用htpasswd生成密碼檔案passwd并添加使用者me:

htpasswd -c /usr/local/squid/etc/passwd me

* 重新啟動Squid,密碼認證生效。

3.用戶端的設定

在用戶端浏覽器的選項中将代理伺服器的IP位址設為192.168.2.32,http端口為80。若要設定透明代理,則用戶端不需要在浏覽器中指定代理伺服器,而将網關設為192.168.2.32,并且用戶端要配置好DNS。

現在,内部網的主機就可以通過代理通路Internet了。

結束語

Squid與Linux下其它的代理軟體如Apache、Socks、TIS FWTK和delegate相比,下載下傳安裝簡單,配置簡單靈活,支援緩存和多種協定。用ipchains+Squid的解決方案,就可以獲得通過緩存高性能的同時能夠無縫的通路Internet。最後說明一點,squid不僅可用在Linux系統上,還可以用在AIX、Digital Unix、FreeBSD、HP-UX、Irix、NetBSD、Nextstep、SCO和Solaris等系統上。

繼續閱讀