|
楼主 |
发表于 2003-7-25 21:43:19
|
显示全部楼层
另外,关于验证方面的问题
我在看了一篇关于squid方面的文章。可是在社区里看到关于验证方面的文章很少。好像是squid不用验证也工作得很好,为什么要验证呢,请教大家讨论一下呀?
转贴自:http://oldsite.linuxaid.com.cn/support/showfom.jsp?i=2695
用LINUX架设代理服务器(下)
LinuxAid.com.cn 01-10-16 15:34 2783p bye2000
--------------------------------------------------------------------------------
6.2 用户认证设置
缺省的,squid本身不带任何认证程序,但是我们可以通过外部认证程序来实现用户认证。一般说来有以下的认证程序:
1) LDAP认证:你可以访问以下资源来获取更多的有用信息。
http://www.geocities.com/Researc ... 5292/projects/ldap/
http://home.iae.nl/users/devet/s ... ib/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/s ... ontrib/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的用户认证。下面我们就来讲这两种认证方法的具体实现。
1. ncsa用户认证的实现
ncsa是squid源代码包自带的认证程序之一,下面我们以squid-2.3.STABLE2版本为例讲述ncsa的安装和配置。
1) 从www.squid-cache.org下载squid ... 到/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,密码认证已经生效。
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.0tar.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.0tar.gz并复制到/tmp.
3) tar xvzf smb_auth-0.0tar.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) 定义相关的用户类
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的调用方法:
¨ smb_auth -W your_domain_name
用your_domain_name指定你的域名。smb_auth将进行广播寻找该主域控制器。
¨ smb_auth -W your_domain_name -B
如果你有多个网络接口,可以用-B 指定用于广播的网络接口的ip地址。
¨ smb_auth -W your_domain_name -U
也可以用-U直接指定该主域控制器的ip地址。
¨ smb_auth -W your_domain_name -S share
可以用-S指定一个不同于NETLOG的共享目录。
3. squid.conf中关于认证的其他设置
1) authenticate_children
说明:设置认证子进程的数目。缺省为5个。如果你处于一个繁忙的网络环境中,你可以适当增大该值。
2) authenticate_ttl
说明:设置一次认证的有效期,缺省是3600秒。
3) proxy_auth_realm
说明:设置用户登录认证时向用户显示的域名。
6.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
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以上,系统已经缺省配置了这些特性。
2.squid的相关配置选项
设置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
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地址作为索引。这一点在你想建立代理服务器阵列时显得尤为重要。
3. ipchains的相关配置
ipchains在这里所起的作用是端口重定向。我们可以使用下列语句实现将目标端口为80端口的TCP包重定向到3128端口。
#接收所有的回送包
/sbin/ipchains -A input -j ACCEPT -i lo
#将目标端口为80端口的TCP包重定向到3128端口
/sbin/ipchains -A input -p tcp -d 0.0.0.0/0 80 -j REDIRECT 80
当然在这以前,我们必须用下面的语句打开包转发功能。
echo 1 > /proc/sys/net/ipv4/ip_forward
提示:如果您的用户使用的是伪地址,那么,如果在设置了透明代理的同时设置了ipchais的ip欺骗功能,则可以让用户获得对Internet的透明访问,同时也没有支持协议的限制。有关ipchains可以参考本书的相关章节。
6.4代理服务器阵列的实现
一、代理服务器阵列的概念
所谓代理服务器阵列就是将一组在逻辑上是父子或子关系的代理服务器(也
即所谓的peer)组合在一起,通过特定的缓存协议通信,从而在逻辑上构成一个具有更大缓存,更强处理能力的代理服务器。
如图5-4所示,当客户端向子代理服务器请求某数据时,该子代理服务器会检查自己的缓存中是否有客户端请求的数据。如果客户端请求的数据就在自己的缓存中,则直接将该数据传给客户端;如果缓存中没有客户端请求的数据,该代理服务器会通过ICP (Inter-Cache Protocol)等缓存协议和其他子代理服务器或父代理服务器通信,以请求该数据。
如果自己的缓存中有该代理服务器请求的数据,则不管是子代理服务器还是父代理服务器都立即将请求的数据返回给请求的代理服务器;如果自己的缓存中没有该代理服务器请求的数据时,子代理服务器会返回给发出请求的子代理服务器一个信号,让其自己去请求该数据,而父代理服务器会向远程Web服务器发起请求,并将返回的数据缓存后传给子代理服务器。所以说,所有的子代理服务器的地位都是平等的。
二、squid中配置代理服务器阵列
我们通过squid.conf配置文件中的cache_peer选项来配置代理服务器阵
列,通过其他的选项来控制选择代理伙伴的方法。Cache_peer的使用格式如下:
cache_peer hostname type http_port icp_port
共有5个选项可以配置:
1. hostname:指被请求的同级子代理服务器或父代理服务器。可以用主机名或ip地址表示;
2. type:指明hostname的类型,是同级子代理服务器还是父代理服务器,也即parent(父) 还是 sibling(子);
3. http_port:hostname的监听端口;
4. icp_port:hostname上的ICP监听端口,对于不支持ICP协议的可指定7;
5. options:可以包含一个或多个关键字。
Options可能的关键字有:
1. proxy-only:指明从peer得到的数据在本地不进行缓存,缺省地,squid是要缓存这部分数据的;
2. weight=n:用于你有多个peer的情况,这时如果多于一个以上的peer拥有你请求的数据时,squid通过计算每个peer的ICP响应时间来决定其weight的值,然后squid向其中拥有最大weight的peer发出ICP请求。也即weight值越大,其优先级越高。当然你也可以手工指定其weight值;
3. no-query:不向该peer发送ICP请求。如果该peer不可用时,可以使用该选项;
4. Default:有点象路由表中的缺省路由,该peer将被用作最后的尝试手段。当你只有一个父代理服务器并且其不支持ICP协议时,可以使用default和
no-query选项让所有请求都发送到该父代理服务器;
5.login=user:password:当你的父代理服务器要求用户认证时可以使用该选项来进行认证。
三、Peer的选择
我们可以使用特定的规则来选择不同的父代理服务器,从而达到均衡代理服务器负载的目的,常用的选择规则有:
1. 通过目的域进行选择:
比如,对于所有对教科网(域名以.edu.cn结尾)的请求,我们使用名为
cernet.proxy.com的父代理服务器,而对于其他的请求我们使用other.proxy.com的代理服务器,这时我们可以使用cache_peer_domain选项进行指定:
cache_peer_domain cernet.proxy.com .edu.cn
cache_peer_domain other.proxy.com !.edu.cn
2. 通过访问控制列表进行选择:
比如,对于来自192.168.1.0的请求我们使用local.proxy.com父代理服务
器,而对于其他请求由本地子代理服务器直接进行处理,这时我们可以使用cache_peer_access选项来实现:
acl LocalNet src 192.168.1.0/2525250
acl all src 0.0.0.0/0.0.0.0
cache_peer local.proxy.com parent 3128 3130
cache_peer_access local.proxy.com allow LocalNet
cache_peer_access local.proxy.com deny all
3. 通过URL进行选择:
比如,对于某些特定URL的请求,我们使用local.proxy.com父代理服务器,
而对于其他URL的请求,我们使用other.proxy.com父代理服务器,这时我们可以通过以下的选项来实现。假设这些特定的URL已在/etc/squid/url-list文件中做了定义。
acl url url_regex "/etc/squid/url-list"
acl all src 0.0.0.0/0.0.0.0
cache_peer local.proxy.com parent 3128 3130
cache_peer other.proxy.com parent 3128 3130
cache_peer_access local.proxy.com allow url
cache_peer_access other.proxy.com allow !url
除了以上的几种过滤方法外,还有其他的peer选择方法,具体可以参考squid.conf中的相关说明。
4. 配置实例
假设ISP为你提供了代理服务器(proxy.domain.com),假设该代理服务器的监听端口为8080,再假设该代理服务器不支持ICP协议。你通过ISP提供的帐号访问该代理服务器。现在由于你的公司的扩大,你不得不使用私有ip(假设为192.168.1.0)来配置客户端。为了使使用私有ip的客户机也可以上网,你决定使用squid代理服务器。你和ISP之间是通过DDN专线进行互联。则squid.conf中的相关配置如下所示:
acl local src 192.168.1.0/2525250
acl all src 0.0.0.0/0.0.0.0
http_access allow local
http_access deny all
cache_peer proxy.domain.com parent 8080 7 [default] [no-query]
6.5 squid的加速器模式
6.1 squid加速器模式的概念
所谓squid的加速器模式,就是用squid代替你的Web服务器接受Web客户端的请求,然后再由squid请求Web服务器并将得到的数据返回给Web客户端。
整个过程如图5-5所示。Squid监听在80端口,当其接收到Internet用户Web请求时,squid先查看自己的缓存中是否有请求的数据,如果有就直接返回给客户端;如果没有squid就发出一个请求到内部网的Web服务器请求该数据,内部网的Web服务器响应请求后,squid先将数据拷贝到缓存中,然后在返回给客户端。
那么,在以下的几种情况下,我们可能需要使用squid的加速器模式。
1. 如果你的Web服务器的连接很慢;
比如,你和Internet的连接速度是2M,但是由于某些原因,你和Web服
务器的连接只有64K。这时,你就可以在2M的接口出配置squid工作在加速器模式,通过对Web服务器的内容进行缓存来加速Internet用户的访问速度。
2. 如果你的Web服务器的地址是私有ip;
在这种情况下,为了让Internet上的用户可以访问到你的Web服务器,你必须采用一定的手段。通常的解决办法有:端口转发技术和反向代理技术。我们可以通过squid的加速器模式来实现反向代理。
3. 为了增强Web服务器的网络安全性;
如果你想增强Web服务器的安全性,你也可以采用squid的加速器模式,
这种情况下,我们将Web服务器放置于squid的后面,Internet上的用户只能通过squid来访问Web服务器,不能直接访问到Web服务器,从而大大增强了Web服务器的安全性。
6.2 squid中的加速器模式配置选项
下面我们一起来看一看squid中的有关加速器配置的选项。
1. httpd_accel_host hostname
httpd_accel_port port
定义被加速的Web服务器的hostname和port,hostname可以是主机名或服务器的ip地址。并且,只能定义一个port,因为加速请求只能转发到一个端口。
2. httpd_accel_with_proxy on/off
当定义了httpd_accel_host时,缺省地,squid的缓存功能就被取消了,
这时如果你还想使用squid的缓存功能,你可以设置该值为on。
3. httpd_accel_uses_host_header on/off
一般说来,一个HTTP请求包含三个部分:传送的方法(POST,GET等等),
请求文件的路径,HTTP的版本号;所以在加速一个以上的Web服务器时,squid无法知道请求的是哪一个Web服务器。值得庆幸的是,从HTTP1.1开始,HTTP标准开始支持一个特定的主机头(host header),从而可以方便地定位文件的正确位置。如果你要加速一个以上的Web服务器,你可以设置该值为on。
6.3 squid加速模式的配置实例
1. Web服务器和squid在同一台服务器上;
假设Web服务器和squid在同一台服务器上,Web服务器的监听端口为
3721。需要注意的是,在这种情况出下,squid在80端口监听客户请求,因为两个进程不可能监听在同一台服务器的同一个端口上,所以需要该Web服务器的监听端口为非80端口。相关的配置选项如下:
http_port 80
httpd_accel_host 127.0.0.1
acl accel_host dst 127.0.0.1/252525255
httpd_accel_port 3721
acl accel_ort port 3721
httpd_accel_with_proxy on
acl all src 0.0.0.0/0.0.0.0
#因为是在同一台服务器上,没有必要进行缓存,所以用no_cache取消之
no_cache deny acceleratedHost
http_access allow accel_host accel_port
http_access allow all
2. Web服务器和squid位于不同的服务器上;
如果Web服务器和squid位于不同的服务器上时,Web服务器和squid就
可以采用同样的监听端口了。具体的配置选项如下:
http_port 80
httpd_accel_host 192.168.1.80
acl accel_host dst 192.168.1.80/252525255
httpd_accel_port 80
acl accel_port port 8000
httpd_accel_with_proxy on
acl all src 0.0.0.0/0.0.0.0
http_access allow accel_host accel_port
http_access allow all
7关于squid日志的说明
7.1 squid日志系统的构成
squid拥有完善的日志系统,但是对用户来说,以下的几个日志文件具有比较重要的意义:
1. access.log
该文件主要包含了客户访问的相关信息,如客户机的ip地址,访问的站点,
访问的流量大小等等。一般的squid日志分析程序主要是基于该文件的。
2. cache.log
该文件包含着squid服务进程的相关信息,如启动的状态,错误信息等等。
3. store.log
该文件包含缓存中存储对象的相关信息,如对象存储的时间,对象的大小,
对象超期的时间等等。
7.2 access.log日志文件的格式说明
由于access.log文件是最重要的一个日志文件,好多squid的日志分析程序都是围绕该文件编写的(如计费,流量分析,热门站点等),所以在这里我们就着重讲述一下该日志文件的格式。
access.log可以有两种基本的格式,一种native日志文件格式,另外一种是common日志文件格式。common日志文件格式包含的信息要比native日志文件格式来得少,并且native日志文件包含着许多管理员感兴趣的信息。缺省地,squid采用native日志文件格式。如果要切换到common日志文件格式,可以更改emulate_httpd_log选项为on。
native日志文件格式如下所示:
time elapsed remotehost code/status bytes method URL rfc931 peerstatus/peerhost type
1. time: UNIX时间邮票,以毫秒计;
2. elapsed: 用户请求所花费的时间;
3. remotehost: 客户机的ip地址;
4. code/status: code为客户请求的类型,status为HTTP的返回代码;
5. bytes: 客户请求数据的大小;
6. method: 客户请求的方法,如GET/POST;
7. URL: 客户请求的URL;
8. rfc931: 包含用户的认证信息,如果没有则用“-”表示;
9. peerstatus/peerhost: 包含peer的相关信息;
10.type: 包含对象的内容类型,如image/jpeg。
8评价squid
总得说来,squid是一个功能非常强大的代理服务器软件,比如灵活的用户认证方法,极大的降低了客户端维护成本的透明代理模式等等;但是squid还是有一些不足之处,如支持的协议有限(不支持pop3、smtp、realaudio等流行协议),采用透明代理配置时不能提供对非80端口的代理。但是我们还是可以通过一些手段来补充squid的不足之处,比如可以采用其他的代理服务器来提供对pop3、smtp的协议的代理,可以通过ip欺骗来避免采用透明代理模式时只能代理80端口HTTP请求的缺陷。
5.9 squid FAQ
下面是几个精选的squid 一般信息的FAQ,希望能对以上的叙述起到一个
补充的作用。
1. squid支持的协议有哪些?
Squid支持以下协议:
客户端协议:HTTP、FTP、Gopher、WAIS、SSL
缓存及管理协议:ICP、Cache Digests、SNMP、HTCP
2. squid支持RealAudio吗?
Squid不支持RealAudio、telnet等流行协议,但是我们可以通过squid+ipchains的方法来提供对任何协议的支持。具体方法请看配置透明代理服务器一节。
3. 可以在NT上运行squid吗?
目前的squid版本已经可以在windows NT上运行了,但是GNU-Win32包的支持。您可以从ftp://ftp.logisense.com/pub/cach ... 版本的squid。
4.squid支持的类UNIX操作系统有哪些?
Squid支持以下的类UNIX操作系统:
Linux
FreeBSD
NetBSD
BSDI
OSF and Digital Unix
IRIX
SunOS/Solaris
NeXTStep
SCO Unix
AIX
HP-UX
4. squid是Y2K兼容的吗?
Squid是Y2K兼容的。 |
|