使用Squid做代理服务器的方法
说到代理服务器,我们最先想到的可能是一些专门的代理服务器网站,某些情况下,通过它们能加快访问互联网的速度。其实,在需要访问外部的局域网中,我们自己就能设置代理,把访问次数较多的网页保存在缓存中,从而“提高”网络速度。更重要的是,我们能通过代理服务器,达到控制访问权限的目的。在 Windows中,有很多这样的软件,如:WinGate、SyGate等,不过,本文要讨论的,是能给你充分自由的Linux下的Squid。
Linux下的代理服务器软件也不是只有Squid,不过在大部分Linux版本中都带有它。
走进“代理”
首先,我们来了解一下代理服务器的工作原理。代理服务器其实就是基于TCP/IP的一种软件,它在TCP的某个端口上进行监听,例如:4444,其他客户机(就是想通过代理上网的那些Windows系统)配置好应用软件,如:IE。其中需要填上代理服务器的端口,即前例中的4444,这样代理服务器才知道你要访问的地址。如果你是合法用户的话,它就取得你想要的网页,然后再通过4444这个端口传递给你,上网时你不会感觉到代理服务器的存在。
而代理服务器的真正意义在于:一、由于它是先将网页下载到本地使用,因此访问频率越高的站点速度就会越快;二、如果你没有访问某个站点的权限而它有,你就能通过它访问到该站点;三、它可以控制你的访问。
当今,通过窄带联入Internet的恐怕仍然占大多数,代理服务器的提速作用也就十分明显了。
熟悉Linux的朋友可能知道,在Linux下有Ipchains可以做路由器,一样可以控制访问权限,但Ipchains的缺点是不支持DNS解析,如果你想通过它控制客户机的访问,就必须一一指定目的地的IP,如果有谁把Ipchains用在访问Internet上,那他一定是疯了,因为 Internet上的IP地址不但多得像天上的星星,而且和星星一样随时都在变化。Squid就不同,它可以指定哪些域后缀不能访问,如:.tw、. net等,这样就把域名对IP的映射交给ISP去做了。
配置举例
在这个例子中,我们使用的是一台普通品牌机做代理服务器,内装两块网卡,第一块eth0接的是本单位的局域网,第二块eth1接的是一台简单的Internet共享器,操作系统是RedHat Linux 6.1,Ipchains和Squid都是系统自带的。
像大多数Linux软件一样,Squid是通过配置文件工作的,它的默认配置文件是/etc/squid/squid.conf,原始文件长达数十页,给出了详细的配置说明,其中真正用得上的,可能只是很小的一部分。看看下面这个配置文件,其实很多选项都是一目了然的:
http_port 4444
#代理服务器监听的端口
cache_dir /var/cache/squid 100 16 32
#缓存目录 大小(兆) 第一级子目录个数 第二级子目录个数
cache_access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
acl all src 0.0.0.0/0.0.0.0
acl head src 192.168.0.2/255.255.255. 255 192.168.0.3/255.255.255.255
acl normal src 192.168.0.21-192.168. 0.99/255.255.255.255
acl denysite dstdomain tw net
acl denyip dst 61.136.135.04/255.255. 255.255
acl dnsport port 53
http_access allow head
http_access deny denysite
http_access deny denyip
http_access allow normal
http_access deny dnsport
实例分析
上面的内容,就是一个基本Squid所需要的全部配置,是不是很简单?!
从上面我们可以看到,代理服务器使用4444这个端口进行监听,缓存目录为100MB,IP地址为192.168.0.2和192.168.0.3的用户可访问所有站点,而IP地址为192.168.0.21~99的用户不能访问后缀为tw和net的站点,也不能访问IP地址为 61.136.135.04的站点(如果dst 61.136.135.04/255.255.255.255变成dst 61.136.135.04/255.255.255.0,指的是61.136.135.0这个网络)。
很明显,Squid使用acl 来定义用户组,并使用http_access来控制用户组的权限。acl后面可以是src(源地址)、dst(目标地址)、proto(协议)、port (端口)、 srcdomain(源域)、dstdomain(目标域)等,Squid的控制功能十分强大,你甚至可以用acl aclname time指定用户组生效的时间,不过要注意,用http_access设置不同用户组的权限时,Squid是按从上到下的顺序执行的,如果你想关闭一个组访问某些站点的权限,就必须把deny的相应句子放在这个组的前面。
另外,Squid文档中特别指出,如果没有相应的access设置,那么默认的权限与最后一行相反,在上例中,一个IP为192.168.0.5的客户未被定义却能访问外部网络,因此,在最后一行设置http_access deny all是很有必要的。
设置完成后,就可以直接运行Squid来启动它,如果配置文件有误,Squid会给出相应的提示。然后再使用Ipchains设置包的转发规则,如只允许客户机使用POP3(110)、SMTP(25)、DNS(53)这几个端口收发信件,浏览网页只能使用代理,这样网络就安全得多了。