作为一种免费的网络操作系统,Linux越来越受到广大网络爱好者的欢迎,目前Internet上运行的主机有相当一部分采用的就是Linux,而且中国已经把Linux作为政府上网的指定网络操作系统。种种迹象表明,Linux正在逐渐走向成熟。为了解决Internet发展迅速和IP地址资源紧张的矛盾,代理服务器的使用越来越广泛。Squid是一种在Linux系统下使用的比较优秀的代理服务器软件。
编者注:本站点有Squid下载

 
代理服务
代理服务是指由一台拥有标准IP地址的机器代替若干没有标准IP地址的机器和Internet上的其它主 机打交道,提供代理服务的这台机器称为代理服务器。拥有内部地址的机器想连接到Internet上时,先把这个请求发给拥有标准IP地址的代理服务器,由代理服务器把这个请求通过它的标准IP地址发到请求的目的地址.然后目标地址的服务器把返回的结果发回给代理服务器,代理服务器再原封不动的把资料发给内部主机.若干拥有内部地址的机器就组成了内部网,代理服务器的作用就是沟通内部网和Internet,解决内部网访问Internet的问题。这种代理事不可逆的,Internet上的主机不能访问任何一台拥有内部地址的机器,这样又可以保障内部资料的安全性。代理软件的一个优点是它能够检验除了数据包之外的许多东西。Squid对数据包的有效载荷进行检验,也就是穿越防火墙的数据包中TCP(或者UDP)部分所占地份量。根据数据包报头(数据包中的IP部分)和数据包有效载荷(TCP部分)的信息,代理防火墙能够决定数据包将发往何处,数据包请求什么,以及根据数据包所必须提供的这些信息决定采取什么样的行动。对于Web用户来说,Squid是一个高性能的代理缓存服务器,可以加快内部网浏览Internet的速度,提高客户机的访问命中率。Squid不仅支持HTTP协议,还支持FTPgopherSSLWAIS等协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。Squid将数据元缓存在内存中,同时也缓存DNS查寻的结果,除此之外,它还支持非模块化的DNS查询,对失败的请求进行消极缓存。Squid支持SSL,支持访问控制。由于使用了ICPSquid能够实现重叠的代理阵列,从而最大限度的节约带宽。
Squid
由一个主要的服务程序Squid,一个DNS查询程序dnsserver,几个重写请求和执行认证的程序,以及几个管理工具组成。当Squid启动以后,它可以派生出指定数目的dnsserver进程,而每一个dnsserver进程都可以执行单独的DNS查询,这样一来就大大减少了服务器等待DNS查询的时间。
Squid
的另一个优越性在于它使用访问控制清单(ACL)和访问权限清单(ARL)。访问控制清单和访问权限清单通过阻止特定的网络连接来减少潜在的Internet非法连接,可以使用这些清单来确保内部网的主机无法访问有威胁的或不适宜的站点。

 
编译安装Squid
squid软件包有两种:一种是RedHat所使用的rpm包,另一种是源代码包
rpm包的安装
  1
.进入/mnt/cdrom/RedHat/RPMS
  2
.执行rpm -ivh squid-2.2.STABLE4-8.I386.rpm

源代码包的安装
 
1.从[url]http://www.squid-cache.org[/url]下载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个部分,分别是
 
1NETWORK 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 SERVICEcache注册服务选项)
  11
HTTPD-ACCELERATOE OPTIONSHTTPD加速选项)
  12
MISCELLANEOUS(杂项)
  13
DELAY POOL PARAMETERS(延时池选项)

虽然squid的配置文件很庞大,但是用户可以根据自己的实际情况修改相应的选项,并不需要配置所有的选项。
下面介绍几个常用的选项。
 
1http_port
   
定义squid监听HTTP客户连接请求的端口。缺省是3128,如果使用HTTPD加速模式则为80。可以指定 多个端口,但是所有指定的端口都必须在一条命令行上。
 
2cache_mem
    
指定squid可以使用的内存理想值,建议设为内存的1/3.
 
3cache_dir Directory-Name Mbytes Level1 Level2
 
指定squid用来存储对象的交换空间的大小及其目录结构。可以用下面的公式来估算系统所需要的    子目录数目。
已知量:
  DS =
可用交换空间总量(单位KB/ 交换空间数目
  OS =
平均每个对象的大小= 20k
  NO =
平均每个二级子目录所存储的对象数目 = 256
未知量:
  L1 =
一级子目录的数量
  L2 =
二级子目录的数量
计算公式:
  L1 x L2 = DS / OS / NO
注意这是个不定方程,可以有多个解。
 
4maximum_object_size
   
大于该值得对象将不被存储。如果要提高访问速度,就降低该值;如果想最大限度的节约带宽,降低成本,就增加该值。
 
5dns_nameservers
   
定义Squid进行域名解析时使用的域名服务器。
 
6acl
   
定义访问控制列表。定义语法为:
    acl aclname acltype string ...
    acl aclname acltype "file" ...
 
7http_access
  
根据某个访问控制列表允许或禁止某一类用户访问。
  
运行Squid
配置并保存好squid.conf后,就可以启动、停止和重新启动Squid
   /etc/rc.d/init.d/squid start
   /etc/rc.d/init.d/squid stop
   /etc/rc.d/init.d/squid restart
可以通过ps命令查看Squid服务是否已经正常启动:

 
ps -A |grep squid
如果出现以下信息:
  6573
000000 squid
  6574
000000 squid
 
则表明Squid服务已经正常启动。

 
客户端的配置
  
将某台终端设置成内部地址,并将该终端的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实现的认证,ncsaSquid源代码包自带的认证程序之一,实现步骤如下:
 
进入/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.32http端口为80。若要设置透明代理,则客户端不需要在浏览器中指定代理服务器,而将网关设为192.168.2.32,并且客户端要配置好DNS
现在,内部网的主机就可以通过代理访问Internet了。

 
结束语
  
SquidLinux下其它的代理软件如ApacheSocksTIS FWTKdelegate相比,下载安装简单,配置简单灵活,支持缓存和多种协议。用ipchains+Squid的解决方案,就可以获得通过缓存高性能的同时能够无缝的访问Internet。最后说明一点,squid不仅可用在Linux系统上,还可以用在AIXDigital UnixFreeBSDHP-UXIrixNetBSDNextstepSCOSolaris等系统上。