天天看點

第五天 應用代理SQUID

squid 進階的選項

http_port192.168.1.1:3128 transparent

[root@localhost ~]# iptables -t nat -APREROUTING -i eth1 -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 3128

[root@localhost ~]# iptables -t nat -APREROUTING -i eth1 -s 192.168.1.0/24 -p tcp --dport 443 -j REDIRECT --to-ports 3128

網絡選項

1.tcp_incoming_address

tcp_outgoing_address

udp_incoming_address

udp_outgoing_address

說明:

tcp_incoming_address指定監聽來自客戶或其他squid代理伺服器的綁定ip位址;

tcp_outgoing_address指定向遠端伺服器或其他squid代理伺服器發起連接配接的ip位址

udp_incoming_address為ICP套接字指定接收來自其他squid代理伺服器的包的ip位址 udp_outgoing_address為ICP套接字指定向其他squid代理伺服器發送包的ip位址;

預設為沒有綁定任何ip位址。該綁定位址可以用ip指定,也可以用完整的域名指定。

5.1.2交換空間設定選項

1.cache_swap_low (percent, 0-100)

cache_swap_high (percent, 0-100)

說明:squid使用大量的交換空間來存儲對象。那麼,過了一定的時間以後,該交換空間就會用完,是以還必須定期的按照某種名額來将低于某個水準

線的對象清除。squid使用所謂的“最近最少使用算法”(LRU)來做這一工作。當已使用的交換空間達到cache_swap_high時,squid

就根據LRU所計算的得到每個對象的值将低于某個水準線的對象清除。這種清除工作一直進行直到已用空間達到cache_swap_low。這兩個值用百分

比表示,如果你所使用的交換空間很大的話,建議你減少這兩個值得差距,因為這時一個百分點就可能是幾百兆空間,這勢必影響squid的性能。預設為:

cache_swap_low 90

cache_swap_high 95

2.maximum_object_size

說明:大于該值得對象将不被存儲。如果你想要提高通路速度,就請降低該值;如果你想最大限度地節約帶寬,降低成本,請增加該值。機關為K,預設值為:

maximum_object_size 4096 KB

5.1.3有關日志的選項

1.cache_access_log

說明:指定客戶請求記錄日志的完整路徑(包括檔案的名稱及所在的目錄),該請求可以是來自一般使用者的HTTP請求或來自鄰居的ICP請求。預設值為:

cache_access_log /var/log/squid/access.log

如果你不需要該日志,可以用以下語句取消:cache_access_log none

2.cache_store_log

說明:指定對象存儲記錄日志的完整路徑(包括檔案的名稱及所在的目錄)。該記錄表明哪些對象被寫到交換空間,哪些對象被從交換空間清除。預設路徑為:

cache_log /var/log/squid/cache.log

如果你不需要該日志,可以用以下語句取消:cache_store_log none

3.cache_log

說明:指定squid一般資訊日志的完整路徑(包括檔案的名稱及所在的目錄)。

預設路徑為:cache_log /var/log/squid/cache.log

4.cache_swap_log

說明:該選項指明每個交換空間的“swap.log”日志的完整路徑(包括檔案的名稱及所在的目錄)。該日志檔案包含了存儲在交換空間裡的對象的

中繼資料(metadata)。通常,系統将該檔案自動儲存在第一個“cache_dir”說定義的頂級目錄裡,但是你也可以指定其他的路徑。如果你定義了

多個“cache_dir”,則相應的日志檔案可能是這樣的:

cache_swap_log.00

cache_swap_log.01

cache_swap_log.02

後面的數字擴充名與指定的多個“cache_dir”一一對應。

需要注意的是,最好不要删除這類日志檔案,否則squid将不能正常工作。

5.pid_filename

說明:指定記錄squid程序号的日志的完整路徑(包括檔案的名稱及所在的目錄)。預設路徑為

pid_filename /var/run/squid.pid

如果你不需要該檔案,可以用以下語句取消:pid_filename none

6.debug_options

說明:控制作日志時記錄資訊的多寡。可以從兩個方面控制:section控制從幾個方面作記錄;level控制每個方面的記錄的詳細程度。推薦的方式(也是預設方式)是:debug_options ALL,1

即,對每個方面都作記錄,但詳細程度為1(最低)。

7.log_fqdn on|off

說明:控制在 access.log 中對使用者位址的記錄方式。打開該選項時,squid記錄客戶的完整域名,取消該選項時,squid記錄客戶

的ip位址。注意,如果打開該選項會增加系統的負擔,因為squid還得進行客戶ip的DNS查詢。預設值為:log_fqdn off

5.1.4有關外部支援程式的選項

1.ftp_user

說明:設定登入匿名ftp伺服器時的提供的電子郵件位址,登入匿名ftp伺服器時要求用你的電子郵件位址作為登入密碼(更多的資訊請參看本書的相

關章節)。需要注意的是,有的匿名ftp伺服器對這一點要求很苛刻,有的甚至會檢查你的電子郵件的有效性。預設值為:ftp_user Squid@

2.ftp_list_width

說明:設定ftp清單的寬度,如果設得太小将不能的浏覽到長檔案名。預設值為: ftp_list_width 32

3.cache_dns_program

說明:指定DNS查詢程式的完整路徑(包括檔案的名稱及所在的目錄)。預設路徑為:

cache_dns_program /usr/lib/squid/dnsserver

4.dns_children

說明:設定DNS查詢程式的程序數。對于大型的登入伺服器系統,建議該值至少為10。最大值可以是32,預設設定為5個。注意,如果你任意的降低

該值,可能會使系統性能急劇降低,因為squid主程序要等待域名查詢的結果。沒有必要減少該值,因為DNS查詢程序并不會消耗太多的系統的資源。

5.dns_nameservers

說明:指定一個DNS伺服器清單,強制squid使用該清單中的DNS伺服器而非使用/etc/resolv.conf檔案中定義的DNS伺服器。你可以這樣指定多個DNS伺服器:dns_nameservers 172.20.80.2 172.16.0.4

預設設定為:dns_nameservers none

6.unlinkd_program

說明:指定檔案删除程序的完整路徑。

預設設定為:

unlinkd_program /usr/lib/squid/unlinkd

7.pinger_program

說明:指定ping程序的完整路徑。該程序被squid利用來測量與其他鄰居的路由距離。該選項隻在你啟用了該功能時有用。預設為:

pinger_program /usr/lib/squid/pinger

8.authenticate_program

說明:指定用來進行使用者認證的外部程式的完整路徑。squid的使用者認證功能我們将在後面的章節講述。預設設定為不認證。

5.1.5使用者通路控制選項

1.request_size (KB)

說明:設定使用者請求通訊量的最大允許值(機關為KB)。如果使用者用POST方法請求時,應該設一個較大的值。預設設定為:

request_size 100 KB

2.reference_age

說明:squid根據對象的LRU(最近最少使用算法)來清除對象,squid依據使用磁盤空間的總量動态地計算對象的LRU年齡。我們用

reference_age定義對象的最大LRU年齡。如果一個對象在指定的reference_age内沒有被通路,squid将删除該對象。預設值為

一個月。你可以使用如下所示的時間表示方法。

1 week

3.5 days

4 months

2.2 hours

3.quick_abort_min (KB)

quick_abort_max (KB)

quick_abort_pct (percent)

說明:控制squid是否繼續傳輸被使用者中斷的請求。當使用者中斷請求時,squid将檢測

quick_abort 的值。如果剩餘部分小于“quick_abort_min”指定的值,squid 将繼續完成剩餘部分的傳輸;如果剩餘

部分大于“quick_abort_max”指定的值,squid 将終止剩餘部分的傳輸;如果已完成“quick_abort_pct”指定的百分比,

squid将繼續完成剩餘部分的傳輸。預設的設定為:

quick_abort_min 16 KB

quick_abort_max 16 KB

quick_abort_pct 95

5.1.6各類逾時設定選項

1.negative_ttl time-units

說明:設定消極存儲對象的生存時間。所謂的消極存儲對象,就是諸如“連接配接失敗”及"404 Not Found"等一類錯誤資訊。預設設定為:negative_ttl 5 minutes

2.positive_dns_ttl time-units

說明:設定緩存成功的DNS查詢結果的生存時間。預設為6小時。

positive_dns_ttl 6 hours

3.negative_dns_ttl time-units

說明:設定緩存失敗的DNS查詢結果的生存時間。預設為5分鐘。

negative_dns_ttl 5 minutes

4.connect_timeout time-units

說明:設定squid等待連接配接完成的逾時值。預設值為2分鐘。

connect_timeout 120 seconds

5.read_timeout time-units

說明:如果在指定的時間内squid尚未從被請求的伺服器讀入任何資料,則squid将終止該客戶請求。預設值為15分鐘。

read_timeout 15 minutes

6.request_timeout

說明:設定在建立與客戶的連接配接後,squid将花多長時間等待客戶發出HTTP請求。預設值為30秒。

request_timeout 30 seconds

7.client_lifetime time-units

說明:設定客戶在與squid建立連接配接後,可以将該連接配接保持多長時間。

注意,因為客戶建立的每個連接配接都會消耗一定的系統資源,是以如果你是為一個大型網絡提供代理服務的話,一定要正确地修改該值。因為如果同一時間的

連接配接數量太大的話,可能會消耗大量的系統資源,進而導緻伺服器當機。預設值為1天,該值太大了,建議根據你自己的情況适當減小該值。

client_lifetime 1 day

8.half_closed_clients on/off

說明:有時候由于使用者的不正常操作,可能會使與squid的TCP連接配接處于半關閉狀态,

這時候,該TCP連接配接的發送端已經關閉,而接收端正常工作。預設地,squid将一直保持這種處于半關閉狀态的TCP連接配接,直到傳回套接字的讀寫

錯誤才将其關閉。如果将該值設為off,則一旦從用戶端傳回“no more data to read”的資訊,squid就立即關閉該連接配接。

half_closed_clients on

9.pconn_timeout

說明:設定squid在與其他伺服器和代理建立連接配接後,該連接配接閑置多長時間後被關閉。預設值為120秒。

pconn_timeout 120 seconds

10.ident_timeout

說明:設定squid等待使用者認證請求的時間。預設值為10秒。

ident_timeout 10 seconds

11.shutdown_lifetime time-units

說明:當收到SIGTERM 或者 SIGHUP 信号後, squid将進入一種shutdown pending的模式,等待所有活動的套接字關閉。在過了shutdown_lifetime所定義的時間後,所有活動的使用者都将收到一個逾時資訊。預設值為30秒。

shutdown_lifetime 30 seconds

5.1.7管理參數選項

1.cache_mgr

說明:設定管理者郵件位址。預設為:

cache_mgr root

2. cache_effective_user

cache_effective_group

說明:如果用root啟動squid,squid将變成這兩條語句指定的使用者和使用者組。預設變為squid使用者和squid使用者組。注意這裡指定

的使用者和使用者組必須真是存在于/etc/passwd中。如果用非root帳号啟動squid,則squid将保持改使用者及使用者組運作,這時候,你不能指

定小于1024地http_port。

cache_effective_user squid

cache_effective_group squid

3.visible_hostname

說明:定義在傳回給使用者的出錯資訊中的主機名。

如: visible_hostname cache.linux-oracle.com

4.unique_hostname

說明:如果你有一個代理伺服器陣列,并且你為每個代理伺服器指定了同樣的“visible_hostname”,同時你必須為它們指定不同的“unique_hostname”來避免“forwarding loops ”(傳輸循環)發生。

5.1.8其它雜項

1. dns_testnames

說明:設定進行DNS查詢測試,如果第一個站點解析成功則立即結束DNS查詢測試。如果你不願意進行DNS查詢測試,就不要去掉預設的設定。

#dns_testnames netscape.com internic.net nlanr.net microsoft.com

2.logfile_rotate

說明:通常,squid會定期的将日志檔案更名并打包。比如正在使用的日志檔案為access.log,squid會将其更名并打包為access.log.1.gz;過了一定時間後,squid又會将

access.log.1.gz更名為access.log.2.gz并将目前的日志檔案更名并打包為access.log.1.gz,以此循

環。logfile_rotate所指定的數字即為打包并備份的檔案的數量,當達到這一數目時,squid将删除最老的備份檔案。預設值為10。如果你想

手動來進行這些操作,你可以用logfile_rotate 0來取消自動操作。

3.err_html_text

說明:用該語句定義一個字元串變量,可以用%L在傳回給使用者的錯誤資訊檔案中引用。錯誤資訊檔案通常在/etc/squid/errors目錄中,這是一些用HTML寫成的腳本檔案,你可以自己修改它。

4.deny_info

說明:你可以定制自定義的拒絕通路資訊檔案,并且可以和不同的使用者清單相關聯。當使用者被http_access相關規則拒絕時,squid可以向使用者顯示你自定義的相應的拒絕通路資訊檔案。文法為:

Usage: deny_info err_page_name acl

比如:

deny_info ERR_CUSTOM_ACCESS_DENIED bad_guys

5.memory_pools on|off

說明:如果你将該項設為on,則squid将保留所有已經配置設定(但是未使用)的記憶體池以便在将來使用。預設為on.

memory_pools on

6.log_icp_queries on|off

說明:設定是否對ICP請求作日志。如果你的系統負載很大,你可以用off來取消該功能。預設為:

log_icp_queries on

7.always_direct

說明:該選項允許你指定某些使用者類,squid将這些使用者類的請求直接轉發給被請求的伺服器。文法為:

always_direct allow|deny [!]aclname ...

如:直接轉發FTP請求可以這樣設定:

acl FTP proto FTP

always_direct allow FTP

8.never_direct

說明:與always_direct相反。文法為:

Usage: never_direct allow|deny [!]aclname ...

比如,為了強制除了本地域的其他使用者使用代理伺服器,你可以這樣設定:

acl local-servers dstdomain linux-oracle.com

acl all src 0.0.0.0/0.0.0.0

never_direct deny local-servers

never_direct allow all

9.icon_directory

說明:指明向使用者傳送錯誤資訊時所用到的圖示檔案的目錄。預設路徑為: icon_directory /usr/lib/squid/icons

10.error_directory

說明:指明向使用者傳送錯誤資訊所用到的錯誤描述檔案的目錄。預設路徑為:

error_directory /etc/squid/errors

5.2 使用者認證設定

預設的,squid本身不帶任何認證程式,但是我們可以通過外部認證程式來實作使用者認證。一般說來有以下的認證程式:

1.LDAP認證:你可以通路以下資源來擷取更多的有用資訊。

http://www.geocities.com/ResearchTriangle/Thinktank/5292/projects/ldap/

http://home.iae.nl/users/devet/squid/proxy_auth/contrib/ldap_auth.tar.gz

2.SMB認證:可以實作基于NT和samba的使用者認證。更多的資訊請通路以下資源。

http://www.hacom.nl/~richard/software/smb_auth.html

3.基于mysql的使用者認證。

http://home.iae.nl/users/devet/squid/proxy_auth/contrib/mysql_auth.c

4.基于sock5密碼使用者認證。

http://nucleo.freeservers.com/

5.基于Radius 的使用者認證。

http://home.iae.nl/users/devet/squid/proxy_auth/contrib/auth.pl

但是我們一般常用的是用ncsa實作的認證和用smb_auth實作的基于NT和samba的使用者認證。下面我們就來講這兩種認證方法的具體實作。

5.2.1 ncsa使用者認證的實作

ncsa是squid源代碼包自帶的認證程式之一,下面我們以squid-2.3.STABLE2版本為例講述ncsa的安裝和配置。

1.從www.squid-cache.org下載下傳squid源代碼包squid-2.3.STABLE2-src.tar.gz并放到/tmp目錄下。

2.用tar解開:

tar xvzf squid-2.3.STABLE2-src.tar.gz

%make

%make install

3.然後,進入/tmp/squid-2.3.STABLE2/auth_modules/NCSA目錄。

% make

% make install

編譯成功後,會生成ncsa_auth的可執行檔案。

4.拷貝生成的執行檔案ncsa_auth到/usr/bin目錄

cp ncsa_auth /usr/bin/bin

5.修改squid.conf中的相關選項如下所示:

authenticate_program /usr/local/squid/bin/ncsa_auth /usr/bin/passwd

6.定義相關的使用者類

acl auth_user proxy_auth REQUIRED

注意,REQUIRED關鍵字指明了接收所有合法使用者的通路。

7.設定http_access

http_access allow auth_user

注意,如果你在改行中指定了多個允許通路的使用者類的話,應該把要認證的使用者類放在第一個。如下所示:

錯誤的配置:http_access allow auth_user all manager

正确的配置:http_access allow auth_user manager all

8.利用apache攜帶的工具軟體htpasswd在/usr/local/squid/etc下生成密碼檔案并添加相應的使用者資訊。一般說來,該密碼檔案每行包含一個使用者的使用者資訊,即使用者名和密碼。

用htpasswd生成密碼檔案passwd并添加使用者bye。

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

然後重新啟動squid,密碼認證已經生效。

5.2.2 smb使用者認證的實作

國内介紹并使用ncsa實作使用者認證的文章不多,而使用smb_auth和samba實作基于NT的使用者認證我還沒有看到過,下面我們就來看一看在squid中實作基于NT的使用者認證。

目前smb_auth的最高版本是smb_auth-0.05,你可以在以下位址下載下傳。當然,squid的源代碼包中也包含smb_auth,但是是0.02版的。

http://www.hacom.nl/~richard/software/smb_auth-0.05.tar.gz

smb_auth的首頁位址是http://www.hacom.nl/~richard/software/smb_auth.html。

1.系統需求:

squid2.0以上版本。

安裝samba2.0.4以上版本。你并不需要運作samba服務,因為smb_auth隻用到了 samba的用戶端軟體。

2.下載下傳smb_auth-0.05.tar.gz并複制到/tmp.

3.tar xvzf smb_auth-0.05.tar.gz

4.根據你的要求修改Makefile中的SAMBAPREFIX和INSTALLBIN參數。SAMBAPREFIX指定了你的samba安裝路徑,INSTALLBIN指明了smb_auth的安裝路徑。我們指定:

SAMBAPREFIX=/usr,INSTALLBIN=/usr/bin.

5.make

6.make install,成功後會在INSTALLBIN指定路徑中生成可執行檔案smb_auth.

7.按下列步驟設定你要用于認證的主域控制器:

首先在NETLOG共享目錄中建立一個“proxy”檔案,該檔案隻包含一個“allow”的字元串,一般說來,該NETLOG目錄位于

winntsystem32Replimportscripts目錄中;然後,設定所有你想讓其通路squid的使用者和使用者組擁有對該檔案的讀的權力。

8.修改squid.conf中的相關選項如下所示:

authenticate_program /usr/local/squid/bin/smb_auth your_domain_name

9.定義相關的使用者類

10.設定http_access

如果一切正确的話,然後重新啟動squid,密碼認證已經生效。

說明:smb_auth的調用方法:

1.smb_auth -W your_domain_name

用your_domain_name指定你的域名。smb_auth将進行廣播尋找該主域控制器。

2.smb_auth -W your_domain_name -B

如果你有多個網絡接口,可以用-B 指定用于廣播的網絡接口的ip位址。

3.smb_auth -W your_domain_name -U

也可以用-U直接指定該主域控制器的ip位址。

4.smb_auth -W your_domain_name -S share

可以用-S指定一個不同于NETLOG的共享目錄。

5.2.3 squid.conf中關于認證的其他設定

1.authenticate_children

說明:設定認證子程序的數目。預設為5個。如果你處于一個繁忙的網絡環境中,你可以适當增大該值。

2.authenticate_ttl

說明:設定一次認證的有效期,預設是3600秒。

3.proxy_auth_realm

說明:設定使用者登入認證時向使用者顯示的域名。

5.3透明代理的設定

關于透明代理的概念我們已經在第一節将過了,下面我們看一下怎麼樣在squid中實作透明代理。

透明代理的實作需要在Linux 2.0.29以上,但是Linux 2.0.30并不支援該功能,好在我們現在使用的通常是2.2.X以上的版

本,是以不必擔心這個問題。下面我們就用ipchains+squid來實作透明代理。在開始之前需要說明的是,目前我們隻能實作支援HTTP的透明代

理,但是也不必太擔心,因為我們之是以使用代理,目的是利用squid的緩存來提高Web的通路速度,至于提供内部非法ip位址的通路及提高網絡安全性,

我們可以用ipchains來解決。

實作環境:RedHat6.x+squid2.2.x+ipchains

5.3.1 linux的相關配置

确定你的核心已經配置了以下特性:

·Network firewalls

[ ] Socket Filtering

·Unix domain sockets

·TCP/IP networking

[ ] IP: multicasting

[ ] IP: advanced router

[ ] IP: kernel level autoconfiguration

·IP: firewalling

[ ] IP: firewall packet netlink device

·IP: always defragment (required for masquerading)

·IP: transparent proxy support

如果沒有,請你重新編譯核心。一般在RedHat6.x以上,系統已經預設配置了這些特性。

5.3.2squid的相關配置選項

設定squid.conf中的相關選項,如下所示:

http_port 3218

httpd_accel_host virtual

httpd_accel_port 80

httpd_accel_with_proxy on

httpd_accel_uses_host_header on

1.http_port 3128

在本例中,我們假設squid的HTTP監聽端口為3128,即squid預設設定值。然後,把所有來自于用戶端web請求的包(即目标端口為80)重定向到3128端口。

2.httpd_accel_host virtual

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

3.httpd_accel_with_proxy on

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

4.httpd_accel_uses_host_header on

在透明代理模式下,如果你想讓你代理伺服器的緩存功能正确工作的話,你必須将該選項設為on。設為on時,squid會把存儲的對象加上主機名而不是ip位址作為索引。這一點在你想建立代理伺服器陣列時顯得尤為重要。

本文轉自 jxwpx 51CTO部落格,原文連結:http://blog.51cto.com/jxwpx/1263699,如需轉載請自行聯系原作者