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_addressICP套接字指定接收来自其他squid代理服务器的包的ip地址 udp_outgoing_addressICP套接字指定向其他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还得进行客户ipDNS查询。缺省值为: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

说明:有时候由于用户的不正常操作,可能会使与squidTCP连接处于半关闭状态,

这时候,该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启动squidsquid将变成这两条语句指定的用户和用户组。缺省变为squid用户和squid用户组。注意这里指定

的用户和用户组必须真是存在于/etc/passwd中。如果用非root帐号启动squid,则squid将保持改用户及用户组运行,这时候,你不能指

定小于1024http_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认证:可以实现基于NTsamba的用户认证。更多的信息请访问以下资源。

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实现的基于NTsamba的用户认证。下面我们就来讲这两种认证方法的具体实现。

5.2.1 ncsa用户认证的实现

ncsasquid源代码包自带的认证程序之一,下面我们以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_authsamba实现基于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中的SAMBAPREFIXINSTALLBIN参数。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.定义相关的用户类

acl auth_user proxy_auth REQUIRED

注意,REQUIRED关键字指明了接收所有合法用户的访问。

10.设置http_access

http_access allow auth_user

注意,如果你在改行中指定了多个允许访问的用户类的话,应该把要认证的用户类放在第一个。如下所示:

错误的配置:http_access allow auth_user all manager

正确的配置:http_access allow auth_user manager all

如果一切正确的话,然后重新启动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

在本例中,我们假设squidHTTP监听端口为3128,squid缺省设置值。然后,把所有来自于客户端web请求的包(即目标端口为80)重定向到3128端口。

2.httpd_accel_host virtual

httpd_accel_port 80

这两个选项本来是用来定义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地址作为索引。这一点在你想建立代理服务器阵列时显得尤为重要。