Squid配制案例详解

作者:网络医生 发布于:2010-12-26 20:23 Sunday 分类:Linux技术

 

在此,我们要配置一个只对内部网络提供代理服务的 Proxy Server 。它将用户分为高级用户和普通用户两种,对高级用户采用网卡物理地址识别的方法,普通用户则需要输入用户名和口令才能正常使用。高级用户没有访问时间和文件类型的限制,而普通用户只在上班时可以访问以及一些其它的限制。

 安装
 可以从 Squid 站点  http://www.squid-cache.org 获取Squid软件包 ,如 Red Hat 提供的 RPM
  RPM 方式安装很简单,命令如下:
  $ rpm -ivh Squid-2.x.STALBx.i386.rpm

  不过笔者认为,即便是系统中已经默认安装了 Squid ,也应当先删掉然后安装最新的源代码包。因为开源软件会不断修正问题、提供更新的功能,使用最新版本可以保证最高的性能及安全,而且源代码方式可以完全定制系统。不过 STABLE 稳定版、 DEVEL 版通常是提供给开发人员测试程序的,假定下载了最新的稳定版 squid-2.5.STABLE2.tar.gz ,用以下命令解开压缩包:
$ tar xvfz squid-2.5.STABLE.tar.gz

bz2 方式压缩的包可能体积更小,相应的命令是:
$ tar xvfj squid-2.5.STABLE.tar.bz2

然后,进入相应目录对源代码进行配置和编译,命令如下:
$ cd squid-2.5.STABLE2

配置命令 configure 有很多选项,如果不清楚可先用 “-help” 查看。通常情况下,用到的选项有以下几个:

--prefix=/web/squid
#
指定 Squid 的安装位置,如果只指定这一选项,那么该目录下会有 bin sbin man conf 等目录,而主要的配置文件此时在 conf 子目录中。为便于管理,最好用参数 --sysconfdir=/etc 把这个文件位置配置为 /etc

--with-default-user=squid

# 允许 squid 这个系统远行,默认为 nobody 帐户
--enable-storeio=ufs,null
#
使用的文件系统通常是默认的 ufs ,不过如果想要做一个不缓存任何文件的代理服
务器,就需要加上 null 文件系统。
--enable-arp-acl
#
这样可以在规则设置中直接通过客户端的 MAC 地址进行管理,防止客户使用 IP 欺骗。
--enable-err-languages="Simplify_Chinese"     //
不加此项,默认会安装全部语言。
--enable-default-err-languages="Simplify_Chinese"
#
上面两个选项告诉 Squid 编入并使用简体中文错误信息。
--enable-linux-netfilter
#
允许使用 Linux 的透明代理功能。

--enable-underscores
#
允许解析的 URL 中出现下划线,因为默认情况下 Squid 会认为带下划线的 URL
非法的,并拒绝访问该地址。
该参数在 Squid2.5 及早期版本中有效,之后版本需要在 squid.conf 文件中设置 allow_underscore on


  整个配置编译过程如下:

./configure --prefix=/var/squid
--sysconfdir=/etc
--enable-arp-acl
--enable-linux-netfilter
--enable-pthreads
--enable-err-language="Simplify_Chinese"
--enable-storeio=ufs,null
--enable-default-err-language="Simplify_Chinese"
--enable-auth="basic"
--enable-baisc-auth-helpers="NCSA"
--enable-underscores   
//squid 2.5 及之前版本有效,之后版本在 squid.conf 中配制 allow_underscore on


  其中一些选项有特殊作用,将在下面介绍它们。

  最后执行 make make install 两条命令,将源代码编译为可执行文件,并拷贝到指定位置。

启动:   /var/squid/sbin/squid –s

关闭: /var/squid/sbin/squid –k shutdown

如果改动了 squid.conf 文件使之生效则: /var/squid/sbin/squid –k reconfigure

如果要开机运行:在 /etc/rc.local 中添加 /var/squid/sbin/squid –s

注意: /var/squid/var/cache /var/squid/var/logs 目录的权限,必须为可写才行。

如果启动不成功,可查看 logs 目录下面的 cache.log 日志文件,里面记录有启动不成功的原因。
 

 基本配置

  安装完成后,接下来要对 Squid 的运行进行配置(不是前面安装时的配置)。所有项目都在 squid.conf 中完成。 Squid 自带的 squid.conf 包括非常详尽的说明,相当于一篇用户手册,对配置有任何疑问都可以参照解决。

  在这个例子中,代理服务器同时也是网关,内部网络接口 eth0 IP 地址为 192.168.0.1 ,外部网络接口 eth1 IP 地址为 202.103.x.x 。下面是一个基本的代理所需要配置选项:

   http_port 192.168.0.1:3128

  默认端口是 3128 ,当然也可以是任何其它端口,只要不与其它服务发生冲突即可。为了安全起见,在前面加上 IP 地址, Squid 就不会监听外部的网络接口。

  下面的配置选项是服务器管理者的电子邮件,当错误发生时,该地址会显示在错误页面上,便于用户联系:

cache_mgr start@soocol.com

  以下这些参数告诉 Squid 缓存的文件系统、位置和缓存策略:

cache_dir ufs /var/squid
cache_mem 32MB
cache_swap_low 90
cache_swap_high 95

  在这里, Squid 会将 /var/squid 目录作为保存缓存数据的目录,每次处理的缓存大小是 32 兆字节,当缓存空间使用达到 95% 时,新的内容将取代旧的而不直接添加到目录中,直到空间又下降到 90% 才停止这一活动。如果不想 Squid 缓存任何文件,如某些存储空间有限的专有系统,可以使用 null 文件系统(这样不需要那些缓存策略):

cache_dir null /tmp


  下面的几个关于缓存的策略配置中,较主要的是第一行,即用户的访问记录,可以通过分析它来了解所有用户访问的详尽地址:

cache_access_log /var/squid/access.log
cache_log /var/squid/cache.log
cache_store_log /var/squid/store.log

下面这行配置是在较新版本中出现的参数,告诉 Squid 在错误页面中显示的服务器名称:

visible_hostname No1.proxy

以下配置告诉 Squid 如何处理用户,对每个请求的 IP 地址作为单独地址处理:

client_mask 255.255.255.255

  如果是普通代理服务器,以上的配置已经足够。但是很多 Squid 都被用来做透明代理。所谓透明代理,就是客户端不知道有代理服务器的存在,当然也不需要进行任何与代理有关的设置,从而大大方便了系统管理员。相关的选项有以下几个:

Httpd_accel_host  test.com.cn  // 后台服务器的主机域名
httpd_accel_port 80       //
做反向代理时 squid 后台 Web 服务器的端口号
httpd_accel_with_proxy on   //
此处设置开反向代理的同时,是否开普通代理服务,否则用 off

  在 Linux 上,可以用 iptables/ipchains 直接将对 Web 端口 80 的请求直接转发到 Squid 端口 3128 ,由 Squid 接手,而用户浏览器仍然认为它访问的是对方的 80 端口。例如以下这条命令:

iptables -t nat -A PREROUTING -s 192.168.0.200/32 -p tcp --dport 80 -j REDIRECT 3128

  就是将 192.168.0.200 的所有针对 80 端口的访问重定向到 3128 端口。

  所有设置完成后,关键且重要的任务是访问控制。 Squid 支持的管理方式很多,使用起来也非常简单(这也是有人宁愿使用不做任何缓存的 Squid ,也不愿意单独使用 iptables 的原因)。 Squid 可以通过 IP 地址、主机名、 MAC 地址、用户 / 密码认证等识别用户,也可以通过域名、域后缀、文件类型、 IP 地址、端口、 URL 匹配等控制用户的访问,还可以使用时间区间对用户进行管理,所以访问控制是 Squid 配置中的重点。 Squid ACL Access Control List ,访问控制列表)对访问类型进行划分,用 http_access deny allow 进行控制。根据需求首先定义两组用户 advance normal ,还有代表所有未指明的用户组 all 及不允许上网的 baduser ,配置代码如下:

acl advance 192.168.0.2-192.168.0.10/32
acl normal src 192.168.0.11-192.168.0.200/32
acl baduser src 192.168.0.100/32
acl baddst dst www.soocol.com
acl all src 0.0.0 .0/0

http_access deny baduser
http_access allow advance
http_access allow normal

可以看出, ACL 的基本格式如下:

acl 列表名称 控制方式 控制目标

  比如 acl all src 0.0.0.0/0 ,其名称是 all ,控制方式是 src IP 地址,控制目标是 0.0.0.0/0 IP 地址,即所有未定义的用户。出于安全考虑,总是在最后禁止这个列表。

  下面这个列表代表高级用户,包括 IP 地址从 192.168.0.2 192.168.0.10 的所有计算机:
acl advance 192.168.0.2-192.168.0.20/32
  下面这个 baduser 列表只包含一台计算机,其 IP 地址是 192.168.0.100
acl baduser 192.168.0.100/32

   ACL 写完后,接下来要对它们分别进行管理,代码如下:
http_access deny baduser
http_access allow advance
http_access allow normal

  上面几行代码告诉 Squid 不允许 baduser 组访问 Internet ,但 advance normal 组允许(此时还没有指定详细的权限)。由于 Squid 是按照顺序读取规则,会首先禁止 baduser ,然后允许 normal 。如果将两条规则顺序颠倒,由于 baduser normal 范围中, Squid 先允许了所有的 normal ,那么再禁止 baduser 就不会起作用。

  特别要注意的是, Squid 将使用 allow-deny-allow-deny…… 这样的顺序套用规则。例如,当一个用户访问代理服务器时, Squid 会顺序测试 Squid 中定义的所有规则列表,当所有规则都不匹配时, Squid 会使用与最后一条相反的规则。就像上面这个例子,假设有一个用户的 IP 地址是 192.168.0.201 ,他试图通过这台代理服务器访问 Internet ,会发生什么情况呢?我们会发现,他能够正常访问,因为 Squid 找遍所有访问列表也没有和 192.168.0.201 有关的定义,便开始应用规则,而最后一条是 deny ,那么 Squid 默认的下一条处理规则是 allow ,所以 192.168.0.201 反而能够访问 Internet 了,这显然不是我们希望的。所以在所有 squid.conf 中,最后一条规则永远是 http_access deny all ,而 all 就是前面定义的 “src 0.0.0.0”

 高级控制

  前面说过, Squid 的控制功能非常强大,只要理解 Squid 的行为方式,基本上就能够满足所有的控制要求。下面就一步一步来了解 Squid 是如何进行控制管理的。

  通过 IP 地址来识别用户很不可靠,比 IP 地址更好的是网卡的 MAC 物理地址。要在 Squid 中使用 MAC 地址识别,必须在编译时加上 “--enable-arp-acl” 选项,然后可以通过以下的语句来识别用户:

acl advance arp 00:01:02:1f :2c :3e 00:01:02:3c :1a :8b ...

  它直接使用用户的 MAC 地址,而 MAC 地址一般是不易修改的,即使有普通用户将自己的 IP 地址改为高级用户也无法通过,所以这种方式比 IP 地址可靠得多。

  假如不想让用户访问某个网站应该怎么做呢?可以分为两种情况:一种是不允许访问某个站点的某个主机,比如 ok 的主机是 ok.sina.com.cn ,而其它的新浪资源却是允许访问的,那么 ACL 可以这样写:

acl sinapage dstdomain ok.sina.com.cn
... ...
http_access deny ok
... ...

  由此可以看到,除了 ok ,其它如 http://www.sina.com.cn news.sina.c...?? 常访问。

  另一种情况是整个网站都不许访问,那么只需要写出这个网站共有的域名即可,配置如下:

acl qq dstdomain .tcccent.com.cn

  注意 tcccent 前面的 “.” ,正是它指出以此域名结尾的所有主机都不可访问,否则就只有 tcccent.com.cn 这一台主机不能访问。

如果想禁止对某个 IP 地址的访问,如 202.118.2.182 ,可以用 dst 来控制,代码如下:

acl badaddr dst 202.118.2.182

  当然,这个 dst 也可以是域名,由 Squid 查询 DNS 服务器将其转换为 IP

  还有一种比较广泛的控制是文件类型。如果不希望普通用户通过代理服务器下载 MP3 AVI 等文件,完全可以对他们进行限制,代码如下:

acl mmxfile urlpath_regex \.mp3$ \.avi$ \.exe$
http_access deny mmxfile


  看到 regex ,很多读者应该心领神会,因为这条语句使用了标准的规则表达式(又叫正则表达式)。它将匹配所有以 .mp3 .avi 等结尾的 URL 请求,还可以用 -i 参数忽略大小写,例如以下代码:

acl mmxfile urlpath_regex -i \.mp3$

  这样,无论是 .mp3 还是 .MP3 都会被拒绝。当然, -i 参数适用于任何可能需要区分大小写的地方,如前面的域名控制。

  如果想让普通用户只在上班时间可以上网,而且是每周的工作日,用 Squid 应当如何处理呢?看看下面的 ACL 定义:

acl worktime time MTWHF 8:30-12:00 14:00-18:00
http_access deny !worktime

  首先定义允许上网的时间是每周工作日(星期一至星期五)的上午和下午的固定时段,然后用 http_access 定义所有不在这个时间段内的请求都是不允许的。

  或者为了保证高级用户的带宽,希望每个用户的并发连接不能太多,以免影响他人,也可以通过 Squid 控制,代码如下:

acl conncount maxconn 3
http_access deny conncount normal
http_access allow normal

  这样,普通用户在某个固定时刻只能同时发起三个连接,从第四个开始,连接将被拒绝。

  总之, Squid ACL 配置非常灵活、强大,更多的控制方式可以参考 squid.conf.default

  认证

  用户 / 密码认证为 Squid 管理提供了更多便利,最常用的认证方式是 NCSA 。从 Squid 2.5 版本开始, NCSA 认证包含在了 basic 中,而非以前单独的认证模块。下面来看看实现认证的具体操作。

  首先在编译时配置选项应包括以下配置:
--enable-auth="basic" --enable-basic-auth-helpers="NCSA"

   “make install” 以后,需要将 “helpers/basic_auth/NCSA/ncsa_auth” 拷贝到用户可执行目录中,如 /usr/bin (如果在该目录中找不到这个执行文件,在编译时请使用 make all 而不是 make ,或者直接在该目录中执行 make ),然后需要借助 Apache 的密码管理程序 htpasswd 来生成用户名 / 密码对应的文件,就像下面这行代码:


htpasswd -c /var/squid/etc/password guest

  在输入两遍 guest 用户的密码后,一个 guest 用户就生成了。如果以后需要添加用户,把上面的命令去掉 -c 参数再运行即可。

   Squid 2.5 在认证处理上有了较大的改变,这里就只讨论 2.5 版本的处理方法, 2.4 及以下版本请参考 squid.conf.default 。在 2.5 版的 squid.conf 中,包括以下几个相关选项:

#
该选项指出了认证方式( basic) 、需要的程序( ncsa_auth )和
对应的密码文件( password
auth_param basic program /usr/bin/ncsa_auth /var/squid/etc/password
#
指定认证程序的进程数
auth_param basic children 5
#
浏览器显示输入用户 / 密码对话框时的领域内容
auth_param basic realm My Proxy Caching Domain
#
基本的认证有效时间
auth_param basic credentialsttl 2 hours
#
普通用户需要通过认证才能访问 Internet
acl normal proxy_auth REQUIRED
http_access allow normal


  通过以上的配置即可完成认证工作。有的读者可能要问:认证只针对普通用户,而高级用户是直接上网的,该怎么处理呢?其实,这两种用户是可以共存的。如前所述, Squid 是顺序处理 http_access 的,所以在 http_access 处理过程中,如果先处理 normal 用户,那么当前用户无论是否属于高级用户,都会被要求进行认证;相反如果先处理高级用户,剩下的就只有需要认证的普通用户了。例如以下配置代码:

...
http_access allow normal (
需要认证 )
http_access allow advance
(不需要认证)

...

  不管是否为 noauth 用户,都要求进行用户名 / 密码验证。正确的方法是将二者位置交换,代码如下:
...
http_access allow advance
http_access allow normal
...

  这时,高级用户不会受到任何影响。

总结

下面把整个 squid.conf 总结一下:

#
服务器配置
http_port 192.168.0.1:3128
cache_mgr start@soocol.com
cache_dir null /tmp
cache_access_log /var/squid/access.log
cache_log /var/squid/cache.log
cache_store_log /var/squid/store.log
visible_hostname No1.proxy
client_mask 255.255.255.255
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_user_host_header on

#
用户分类
acl advance arp 00:01:02:1f :2c :3e 00:01:02:3c :1a :8b ...
acl normal proxy_auth REQUIED
acl all src 0.0.0.0

#
行为分类
acl mmxfile urlpath_regex \.mp3$ \.avi$ \.exe$
acl conncount maxconn 3
acl worktime time MTWHF 8:30-12:00 14:00-18:00
acl sinapage dstdomain ok.sina.com.cn
acl qq dstdomain .tcccent.com.cn

#
处理
http_access allow advance
http_access deny conncount normal
http_access deny !worktime
http_access deny mmxfile
http_access deny sinapage
http_access deny qq
http_access allow normal


  配置后的状况是, advance 组可以不受任何限制地访问 Internet ,而 normal 组则只能在工作时间上网,而且不能下载多媒体文件,不能访问某些特定的站点,而且发送请求不能超过 3 个。

  通过本文的介绍,它可以了解 Squid 的基本能力。当然,它的能力远不止此,可以建立强大的代理服务器阵列,可以帮助本地的 Web 服务器提高性能,可以提高本地网络的安全性等。要想发挥它的功效,还需要进一步控制。

 

 -----------------------------------------------------------------------------------------------------------------

其它常用命令:

解压,编译, make make install 就不说了。
make install 后开始。
当你的 squid.conf 配置文档按照你的想法修改完以后,启动 squid 之旅就开始了。
1
,初始化你在 squid.conf 里配置的 cache 目录
#squid/sbin/squid -z
如果有错误提示,请检查你的 cache 目录的权限。
2
,对你的 squid.conf 排错,即验证 squid.conf 语法和配置。
#squid/sbin/squid -k parse
如果 squid.conf 有语法或配置错误,这里会返回提示你,如果没有返回,恭喜,可以尝试启动 squid
3
,在前台启动 squid ,并输出启动过程。
#squid/sbin/squid -N -d1
如果有到 ready to server reques ,恭喜,启动成功。
然后 ctrl + c ,停止 squid ,并以后台运行的方式启动它。
4
,启动 squid 在后台运行。
#squid/sbin/squid -s
这时候可以 ps -A 来查看系统进程,可以看到俩个 squid 进程。
5
,停止 squid
#squid/sbin/squid -k shutdown
这个不用解释吧。
6
,重引导修改过的 squid.conf
#squid/sbin/squid -k reconfigure
这个估计用的时候比较多,当你发现你的配置有不尽你意的时候,可以随时修改 squid.conf ,然后别忘记对你的 squid.conf 排错,然后再执行此指令,即可让 squid 重新按照你的 squid.conf 来运行。
7
,把 squid 添加到系统启动项
编辑 /etc/rc.d/rc.local
添加如下行:   /usr/local/squid/sbin/squid -s
当然,并不是每个人都喜欢这种启动方式,你可以用你最习惯的方式;或者把它安装为服务。

再来点其他的。
1
,修改 cache 缓存目录的权限。
#chown -R squid:squid /home/cache
我的 cache 缓存目录是 /home/cache,squid 执行用户和用户组是 squid squid
2
,修改 squid 日志目录的权限
#chown -R squid:squid /usr/local/squid/var/logs
这一步并不是适合每一个使用 squid 的用户 . 意为让 squid 有权限在该目录进行写操作
例如生成   access.log    cache.log   store.log
3
,查看你的日志文档。
#more /usr/local/squid/var/logs/access.log | grep TCP_MEM_HIT
该指令可以看到在 squid 运行过程中,有那些文件被 squid 缓存到内存中,并返回给访问用户。
#more /usr/local/squid/var/logs/access.log | grep TCP_HIT
该指令可以看到在 squid 运行过程中,有那些文件被 squid 缓存到 cache 目录中,并返回给访问用户。
#more /usr/local/squid/var/logs/access.log | grep TCP_MISS
该指令可以看到在 squid 运行过程中,有那些文件没有被 squid 缓存,而是现重原始服务器获取并返回给访问用户。
关于 TCP_XXXX 等参数及代表的信息,请参看《 squid 中文权威指南》 13.2.1 章节。
当然,本例中的蓝色文字是可以修改为其他的参数,例如你的域名   www.xxxx.com ,同样可以看到 access.log 里关于该域名的行。

 

-----------------------------------------------------------------------------------

 

配制案例:   squid+Iptables 配制 web 反向代理

1、  软件 : squid-2.5.tar.gz

2、  解压缩、编译

./configure  --prefix=/home/squid

               --sysconfdir=/etc

           --enable-large-cache-files

            --with-large-files    // 支持大文件,日志文件等

                    --with-pthreads

                    --enable-underscores

                    --enable-linux-netfilter

                    --enable-storeio=ufs,null

                     --enable-err-language="Simplify_Chinese"

                    --enable-default-err-language="Simplify_Chinese"
                    --enable-auth="basic"
                    --enable-baisc-auth-helpers="NCSA"

  编译安装: make;make install

3 、本实验 iptables squid 在同一服务器上, iptables 把访问反向代理服务器的 80 端口的数据包转发给 squid 8080 端口来处理。

4 、修改 /etc/hosts 文件,让域名解析出内部真实服务器的 IP 地址

5 squid.conf 配制文件

 

#proxy name

visible_hostname HighSpeedProxy

 

#chache_memory

cache_mem 700 MB

cache_swap_low 90

cache_swap_high 95

 

#cache_dir

cache_dir ufs /home/squidcache 10000 16 256

 

#cache_logs

cache_access_log /home/squidlogs/access.log

cache_log /home/squidlogs/cache.log

cache_store_log /home/squidlogs/store.log

#cache_manager

cache_mgr zhangyan@brenda.edu.cn

 

#cache runner

cache_effective_user squid

 

#squid proxy port 8080

http_port 8080

 

#use reverse proxy not normal

httpd_accel_with_proxy off

 

#squid background webserver port 80

httpd_accel_port 80

httpd_accel_uses_host_header on

 

#webserver domainname

httpd_accel_host virtual

httpd_accel_host www.brenda.edu.cn

httpd_accel_host brenda.edu.cn

httpd_accel_host ao.brenda.edu.cn

 

#squid ACL rules 允许所有客户端访问网站

acl all src 0.0.0.0/0.0.0.0

acl clearcache method PURGE

http_access allow clearcache    // 允许使用 squidclient 刷新缓存

http_access allow all

 

6 iptables 配制

iptables -t nat -A PREROUTING -p tcp d 反向代理服务器的 IP 地址 --dport 80 -j REDIRECT --to-port   squid 代理服务器端口号

 

7 、如果真实服务器上有图片修改,那么就需要刷新反向代理上的缓存。脚本如下:

建立一个文件如 clear_squid_cache.sh , 粘贴进去即可。

#!/bin/sh
squidcache_path="/data1/squid/var/cache"
squidclient_path="/usr/local/squid/bin/squidclient"
grep -a -r $1 $squidcache_path/* | strings | grep "http:" | awk -F'http:' '{print "http:"$2;}' > cache_list.txt
for url in `cat cache_list.txt`; do
$squidclient_path -m PURGE -p 8080 $url
done

 

注意: 请赋予 clear_squid_cache.sh 可执行权限(命令 chmod +x clear_squid_cache.sh )。 请确 保脚本所在目录可写。

设置:
   squidcache_path= 表示 squid 缓存目录的路径
   squidclient_path= 表示 squidclient 程序所在的路径,默认为 squid 安装目录下的 bin/squidclient

 

 

 

用法:
   1 、清除所有 Flash 缓存(扩展名 .swf ):
   ./clear_squid_cache.sh swf

   2 、清除 URL 中包含 sina.com.cn 的所有缓存:
   ./clear_squid_cache.sh sina.com.cn

   3 、清除文件名为 zhangyan.jpg 的所有缓存:
   ./clear_squid_cache.sh zhangyan.jpg

 

 

 

 

标签: squid iptables 代理

发表评论:

  • 6
  • 5
  • 7
  • 9
  • 0

Powered by emlog