当前位置: > CentOS > CentOS入门 >

CentOS -- squid 代理

时间:2015-04-06 23:52来源:linux.it.net.cn 作者:IT
Proxy 所需的 squid 软件及其软件结构

达成代理服务器功能的软件很多,目前代理服务器在 Unix 的环境下,大多就是使用 squid ,如果尚未安装,请用『 yum install squid 』来安装!安装好 squid 之后,它主要的提供的配置文件有:

  • /etc/squid/squid.conf
    这个是主要的配置文件,所有 squid 所需要的设定都是放置在这个文件当中


  • /etc/squid/mime.conf
    这个文件则是在设定 squid 所支持的文件格式,就是 mime 格式. 一般来说,这个档案的默认内容已经能够符合我们的需求了,所以不需要更动。

其他重要的目录与文件有:

  • /usr/sbin/squid:squid 的主程序!
  • /var/spool/squid:默认的 squid 缓存放置的目录。
  • /usr/lib64/squid/:提供 squid 额外的控制模块,尤其是影响认证密码方面的程序,都是放在这个目录下的;
CentOS 默认的 squid 设定

在默认情况下,CentOS 的 squid 具有底下几个特色:

  • 仅有本机 (localhost, 127.0.0.1) 来源可以使用这个 squid 功能
  • squid 所监听的 Proxy 服务端口在 port 3128
  • 缓存文件所在的位置在 /var/spool/squid/ ,且仅有 100MB 的磁盘高速缓存
  • 除了 squid 程序所需要的基本内存之外,还提供 8MB 的内存来给热门文件缓存在内存中 (因为内存速度比硬盘快)
  • 默认启动 squid 程序的用户为 squid 这个账号 (与磁盘高速缓存目录权限有关)

CentOS 默认的 squid 设定,是仅针对本机 (localhost) 开放的情况,而一大堆设定的默认值,都是仅针对小型网络环境所指定的数值,同时,很多比较特殊的参数都没有启动。所以,我们就得要来了解一下各设定值的意义,这样才能够进行修改!这些参数都是在 squid.conf 里指定的:

[root@www ~]# vim /etc/squid/squid.conf  
# 1. 信任用户与目标控制,通过 acl 定义出 localhost 等相关用户  
acl manager proto cache_object <==定义 manager 为管理功能  
acl localhost src 127.0.0.1/32 <==定义 localhost 为本机来源  
acl localhost src ::1/128  
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 <==定义 to_localhost 可联机到本机  
acl to_localhost dst ::1/128  
# 2. 信任用户与目标控制,定义可能使用这部 proxy 的外部用户(内网)  
acl localnet src 10.0.0.0/8 <==可发现底下都是 private IP 的设定  
acl localnet src 172.16.0.0/12  
acl localnet src 192.168.0.0/16  
acl localnet src fc00::/7  
acl localnet src fe80::/10  
# 上述数据设定两个用户 (localhost, localnet) 与一个可访问目标 (to_localhost) 
 # 3. 定义可取得的数据端口所在!  
acl SSL_ports port 443 <==联机加密的端口设定  
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp  
acl Safe_ports port 443 # https  
# 定义出 SSL_ports 及标准的常用埠口 Safe_ports 两个名称  
# 4. 定义这些名称是否可放行的标准依据(有顺序)  
http_access allow manager localhost <==放行管理本机的功能  
http_access deny manager <==其他管理来源都予以拒绝  
http_access deny !Safe_ports <==拒绝非正规的端口联机要求  
http_access deny CONNECT !SSL_ports <==拒绝非正规的加密端口联机要求  
# 这个位置为可以写入自己的规则!有顺序之分!  
http_access allow localnet <==放行内部网络的用户来源  
http_access allow localhost <==放行本机的使用  
http_access deny all <==全部都予以拒绝  
# 5. 网络相关参数,最重要的是那个定义 Proxy 协议端口的 http_port  
http_port 3128 <==Proxy 预设的监听客户端要求的端口,是可以改的  
# 其实,如果想让 proxy server/client 之间的联机加密,可以改用 https_port (923)  
# 6. 缓存与内存相关参数的设定值,尤其注意内存的计算方式  
hierarchy_stoplist cgi-bin ? <==hierarchy_stoplist 后面的关键词 (此例为 cgi-bin)  
# 若发现在客户端所需要的网址列,则不缓存 (避免经常变动的数据库或程序)  
cache_mem 8 MB <==给proxy额外的内存,用来处理最热门的数据 
# 7. 磁盘高速缓存,亦即放置缓存数据的目录所在与相关设定  
cache_dir ufs /var/spool/squid 100 16 256 <==默认使用 100MB 的容量coredump_dir /var/spool/squid  
# 底下的四个参数得要自己加上来喔!旧版才有这样的默认值!  
minimum_object_size 0 KB <==小于多少 KB 的数据不要放入缓存,0 为不限制 maximum_object_size 4096 KB <==大于 4 MB 的数据就不缓存到磁盘  
cache_swap_low 90 <==磁盘使用率过高时,删除缓存数据,减低到剩下 90%  
cache_swap_high 95 <==当磁盘使用量超过 95% 就开始删除磁盘中的旧缓存  
# 8. 其他可能会用到的默认值!参考参考即可,并不会出现在配置文件中。  
access_log /var/log/squid/access.log squid <==曾经使用过 squid 的用户记录 ftp_user Squid@ <==当以 Proxy 进行 FTP 代理匿名登录时,使用的账号名称  
ftp_passive on <==若有代理 FTP 服务,使用被动式联机  
refresh_pattern ^ftp: 1440 20% 10080  
refresh_pattern ^gopher: 1440 0% 1440  
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0  
refresh_pattern . 0 20% 4320  
# 上面这四行与快取的存在时间有关,底下内文会予以说明  
cache_mgr root <==预设的 proxy 管理员的 email  
cache_effective_user squid <==启动 squid PID 的拥有者  
cache_effective_group squid <==启动 squid PID 的群组  
# visible_hostname <==有时由于 DNS 的问题,找不到主机名会出错,就得加上此设定  
ipcache_size 1024 <==以下三个为指定 IP 进行快取的设定值  
ipcache_low 90  
ipcache_high 95
  • 使用默认值来启动 squid 并观察相关信息

 

[root@www ~]# /etc/init.d/squid start  
init_cache_dir /var/spool/squid... 正在激活 squid: . [ 确定 ]  
# 第一次启动会初始化缓存目录,因此会出现上述左边的数据,以后来这个讯息不会再出现 [root@www ~]# netstat -tulnp | grep squid  
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name  
tcp 0 0 :::3128 :::* LISTEN 2370/(squid)  
udp 0 0 :::45470 :::* 2370/(squid)  
[root@www ~]# chkconfig squid on 

如果你有设定 icp_port ,squid 默认会启动 3128 及 3130 两个端口,其中要注意的是, 实际帮用户进行监听与传送数据的是 port 3128 (TCP),3130 (UDP) 仅是负责与邻近 Proxy 互相沟通彼此的快取数据库的功能,与实际的用户要求无关。因此,如果你的 proxy 是单纯的单一主机,或者是单纯的作为防火墙功能,那么这个 port 3130 是可以关闭的。就因如此,所以 CentOS 6.x 默认将这个设定值批注不使用!

想要关闭 port 3130,直接修改 icp_port 即可!方法为:

[root@www ~]# vim /etc/squid/squid.conf  
#将下列数据从 3130 改为 0 即可  
icp_port 0  
[root@www ~]#/etc/init.d/squid restart 
 

事实上,如果你的客户端与 proxy 之间的沟通想要使用加密机制的 SSL 功能,以保障客户端的信息避免被窃取时, 那么还有个 https_port 可以取代 http_port !不过,一般我们的 proxy 并非公开也仅是架设在内部区网,因此还不需要使用到这个 https_port !
 

  • 观察与修改缓存目录 (cache_dir):权限与 SELinux

磁盘高速缓存是影响 proxy 效能的一个相当重要的参数。 squid 是将数据分成一小块一小块,然后分别放置到个别的目录中。由于较多的目录可以节省在同一个目录内找好多档案的时间 (分门别类的放置书籍在不同的书柜内,总比将所有书籍杂乱无章的放置到一个大书柜要好的多!), 因此,在默认的 /var/spool/squid/ 目录下, squid 又会将它分成两层子目录来存放相关的缓存数据,所以观察该目录就会是:

[root@www ~]# ls /var/spool/squid  
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F swap.state  
# 你会发现共有 16 个子目录!看看第一个子目录的内容:  
 [root@www ~]# ls /var/spool/squid/00  
00 08 10 18 20 28 ... 98 A0 A8 B0 B8 C0 C8 D0 D8 E0 E8 F0 F8 01 09 11 19 21 29 ... 99 A1 A9 B1 B9 C1 C9 D1 D9 E1 E9 F1 F9 ....(中间省略).... 06 0E 16 1E 26 2E ... 9E A6 AE B6 BE C6 CE D6 DE E6 EE F6 FE 07 0F 17 1F 27 2F ... 9F A7 AF B7 BF C7 CF D7 DF E7 EF F7 FF # 总共有 256 个子目录出现! 

现在我们知道了较多的目录是为了将数据分门别类放置,但是第一层 16 个与第二层 256 个是怎么来的? 让我们来瞧一瞧 cache_dir 这个重要参数的设定是怎样:

  • cache_dir ufs /var/spool/squid 100 16 256

在 /var/spool/squid/ 后面的参数意义是:

  • 第一个 100 代表的是磁盘使用量仅用掉该文件系统的 100MB
  • 第二个 16 代表第一层次目录共有 16 个
  • 第三个 256 代表每层次目录内部再分为 256 个次目录

根据 squid 的说法与其他文献的说明,这两层快取目录较佳的配置就是 16 256 以及 64 64 这两种配置,所以我们也不需要修改相关的数据啦!重点时还得要注意这个目录的文件拥有者与 SELinux 类型才成!

那么如果想要将默认的磁盘高速缓存改为 500MB 而且再加上 /srv/squid/ 目录给予 2GB 的容量做为磁盘高速缓存,该如何进行设定?

这里都与 cache_dir 有关!这个设定值可以重复出现多次!因此,我们可以这样进行:
[root@www ~]# vim /etc/squid/squid.conf  
#底下的设定除了拿掉 # 之外还得修改!  
cache_dir ufs /var/spool/squid 500 16 256  
cache_dir ufs /srv/squid 2000 16 256  
[root@www ~]# mkdir /srv/squid  
[root@www ~]# chmod 750 /srv/squid  
[root@www ~]# chown squid:squid /srv/squid  
[root@www ~]# chcon --reference /var/spool/squid /srv/squid  
[root@www ~]# ll -Zd /srv/squid  
drwxr-x---. squid squid system_u:object_r:squid_cache_t:s0 /srv/squid/ [root@www ~]#/etc/init.d/squid restart 
之所以要改成 squid 拥有,是因为上头的 squid.conf 中,预设的启动 PID 的账号就是 squid 这个用户!所以当然要变更!

想一想,既然快取是放在磁盘上面的,那么快取的数据会不会塞满整个快取磁盘呢?当然会!而且当塞满磁盘之后, proxy 恐怕就无法继续运作了!所以,我们得好好的注意磁盘使用量是否已经饱和了。在上述的示例, 若 /var/spool/squid 塞满 500MB 而 /srv/squid 塞满 2GB 那么你的 proxy 就挂了。为了避免这个问题,因此 squid 有底下两个重要设定:

  • cache_swap_low 90
  • cache_swap_high 95

代表当磁盘使用量达 95% 时,比较旧的快取数据将会被删除,当删除到剩下磁盘使用量达 90% 时,就停止持续删除的动作。以本案例中,总共 2.5GB 的容量,当用到 2.5*0.95=2.375G 时,旧的数据会开始被删除,删到剩下 2.5*0.9=2.25GB 时,就停止删除的意思。

所以会被删除掉 125MB 的旧数据。通常这个设定值已经足够了,不需要变动他,除了你的缓存太大或太小时,才会调整这个设定值。

  • squid 使用的内存计算方式

除了磁盘容量之外,内存可能是另一个相当重要的影响 proxy 效能的因子!因为 proxy 会将数据存一份在磁盘高速缓存中,但是同时也会将数据暂存在内存当中啊,以加快未来使用者存取同一份数据的速度!但是这个内存快取是需要花费额外的服务器物理内存的量,所以就得要以额外的设定值来指定。那就是 cache_mem 这个设定值的功能了。

 cache_mem 是额外的指定一些内存来进行比较『热门』的数据存取! cache_mem 并不是指我要使用多少内存给 squid 使用,而是指 "我还要额外提供多少内存给 squid 使用" 的意思』!由于默认1GB 的磁盘高速缓存会占用约 10M 的内存,而 squid 本身也会占用约 15MB 的内存,因此,上个示题中 squid 使用掉的内存就有:

  • 2.5 * 10 + 15 + "cache_mem 设定值 (8)"

squid 官方网站建议你的物理内存最好是上面数值的两倍,也就是说,上述的内存使用量已经是 48MB,则我的物理内存最好至少要有 100 MB 以上,才会有比较好的效能!

管理信任来源 (如区网) 与目标 (如恶意网站): acl 与 http_access 的使用

在上面的基础设定中,其实仅有 proxy 服务器本身可以向自己的 proxy 要求网页代理~那有个屁用啊?我们的重点是想要开放给区网来使用这个 proxy !所以当然得要修改信任用户的管控参数。 此时,那个重要到不行的 acl 就得要来瞧一瞧啦!这个 acl 的基本语法为:

acl <自定义的 acl 名称> <要控制的 acl 类型> <设定的内容>

由于 squid 并不会直接使用 IP 或网域来管控信任目标,而是透过 acl 名称来管理,这个就必须要设定管理的是来源还是目标 (acl 类型) ,以及实际的 IP 或网域 (设定的内容) 啦!这个 acl 名称可以想成是一个昵称就是了。那么有哪些重要的 acl 类型呢?基本上有这些:

  • 管理是否能使用 proxy 的信任客户端方式:

由于因特网主要有使用 IP 或主机名来作为联机方式的,因此信任用户的来源至少就有底下几种:

  • src ip-address/netmask
    主要控制『来源的 IP 地址』。举例来说,内网有两个,分别是 192.168.1.0/24 以及 192.168.100.0/24 ,那么假设我想要制订一个 test 的 acl 名称,那就可以在配置文件内写成:
    acl test src 192.168.1.0/24 192.168.100.0/24


  • src addr1-addr2/netmask
    主要控制『一段范围来源的 IP 地址』。假设我只想要让 192.168.1.100-192.168.1.200 使用这部 proxy ,那么就用:
    acl vbirdlan2 src 192.168.1.100-192.168.1.200/24


  • srcdomain .domain.name
    如果来源用户的 IP 一直变,所以使用的是 DDNS 的方式来更新主机名与 IP 的对应,此时我们可以使用主机名来开放! 例如来源是 .ksu.edu.cn 的来源用户就开放使用权,那就是:
    acl test srcdomain .ksu.edu.cn
  • 管理是否让 proxy 帮忙代理到该目标去获取数据:

除了管理来源用户之外,我们还能够管理是否让 proxy 服务器到某些目标去获取数据!在默认的设定中, 我们的 proxy 仅管理可以向外取得 port 21, 80, 440... 等端口的目标网站,不是这些端口就无法通过代理取得。基本的管理有这些方式:

  • dst ip-addr/netmask
    控制不能去的目标网站的 IP ,举例来说,我们不许 proxy 去抓取 120.114.150.21 这部主机的 IP 时,可以写成是:
    acl dropip dst 120.114.150.21/32


  • dstdomain .domain.name
    控制不能去的目标网站的主机名。要把 .facebook.com 给关闭!那就需要写成:
    acl dropfb dstdomain .facebook.com


  • url_regex [-i] ^http://url
    使用正规表示法来处理网址列的一种方式!这种方式的网址列必须要完整的输入正规表示法的开始到结尾才行:
    acl ksuurl url_regex ^http://www.iyanhuang.com/a/.*


  • urlpath_regex [-i] \.gif$
    与上一个 acl 非常类似,只是上一个需要填写完整的网址数据,这里则是根据网址列的部分比对来处置。如: 只要网址列结尾是 gif (图片文件) 就符合这个规则了。万一我要找出有问题的色情网站,有出现 /sexy 名称并以 jpg 结尾的,就予以阻止,那就是使用:
    acl sexurl urlpath_regex /sexy.*\.jpg$

除了上述的功能之外,我们还能够使用外部的文件来提供相对应的 acl 内容设定值!如,假设我们想要阻止的外部主机名常常会变动,那么我们可以使用 /etc/squid/dropdomain.txt 来设定主机名,然后通过底下的方式来处理

acl dropdomain dstdomain "/etc/squid/dropdomain.txt"

然后在 dropdomain.txt 当中,一行一个待管理的主机名,这样也能够减少持续修改 squid.conf 的困扰!好了!

  • 以 http_access 调整管理信任来源与管控目标的『顺序』:

设定好 acl 之后,接下来就是要看看到底要不要放行~放行与否跟 http_access 这个项目有关。基本上, http_access 就是拒绝 (deny) 与允许 (allow) 两个控件,然后再加上 acl 名称就能够达到这样的功能了!只是你得要特别注意的是:http_access 后面接的数据,是有顺序的!

假设我要放行内部网络 192.168.1.0/24, 192.168.100.0/24 这两段网域,然后拒绝对外的色情相关图片,以及 facebook.com 网站,那么就应该要这样做:

[root@www ~]# vim /etc/squid/squid.conf  
# http_access 是有顺序的,因此建议你找到底下这个关键词行后,将你的资料加在后面  
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS  
acl vbirdlan src 192.168.1.0/24 192.168.100.0/24  
acl dropdomain dstdomain .facebook.com  
acl dropsex urlpath_regex /sexy.*jpg$  
http_access deny dropdomain <==这三行的『顺序』很重要!  
http_access deny dropsex  
http_access allow testn  
 [root@www ~]# /etc/init.d/squid restart 

要注意,如果先放行了 test 才阻止 dropdomain 时,设定可能会失败!因为内网已经先放行,因此后面的规则不会生效,那么 facebook.com 就无法被阻止!通常的作法是,先将要拒绝的写上去,然后才写要放行的数据

其他额外的功能项目

  • 不要进行某些网页的缓存动作

Proxy 的缓存通常在记录比较少变动的数据,如果是动态网页,那么恐怕就没有缓存的需要,因为数据一直变动!总不能你发了一帖留言,等一下再去浏览时,看到的还是旧留言吧!所以,在默认情况下,squid 已经拒绝某些数据的快取了,那就是底下的几个设定值:

acl QUERY urlpath_regex cgi-bin \? cache deny QUERY <==重点就是这一行!可以拒绝,不要让后面的 URL 被快取! 

通常 .php 结尾的网页大部分就是动态数据,设定 .php 结尾的网页就不缓存:

[root@www ~]# vim /etc/squid/squid.conf  
acl denyphp urlpath_regex \.php$  
cache deny denyphp  
# 在此档案的最后新增这两行即可!  
[root@www ~]#/etc/init.d/squid restart 
  • 磁盘中快取的存在时间
# refresh_pattern <最小时间> <百分比> <最大时间>  
refresh_pattern ^ftp: 1440 20% 10080  
refresh_pattern ^gopher: 1440 0% 1440  
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0  
refresh_pattern . 0 20% 4320
  • regex:使用的是正则来分析网址列的资料,如上面第一行设定为网址开头是 ftp。


  • 最小时间:单位是分钟,当取得这个数据的时间超过这个设定值,则该数据会被判定为旧资料。如上面第一行, 表示当取得的资料超过 1440 分钟时,该资料会被判定为旧数据,若有人尝试读取同样的网址列,那么 squid 会重新抓取该数据,不会使用缓存内的旧数据。至于第三行,则表示除了上述的两个开头数据外,其他的数据都是被定义为新的, 因此 squid 只会从快取内抓数据给客户端。


  • 百分比:这个项目与『最大时间』有关,当该文件被抓取到缓存后,经过最大时间的多少百分比时,该数据就会被重抓。


  • 最大时间:与上一个设定有关,就是这个数据存在快取内的最长时间。如上面第一行,最大时间为 10080 分钟,但是当超过此时间的 20% (2016分钟) 时,这个数据也会被判定为旧资料。
安全性设定:防火墙, SELinux 与黑名单

  • 防火墙得要放行 tcp 的 port 3128

现在我们已经设定了让 192.168.100.0/24 及 192.168.1.0/24 这两段来源使用我们的 proxy server , 那么想当然尔,防火墙的设定就得要开放这两段使用 port 3128 才行!不过你得要特别注意,并不是开放防火墙就能使用 proxy server 的资源,还得要使用 acl 配合 http_access 才行!假设你已经使用了 iptables.rule , 那么修改的方法就是这样:

[root@www ~]# vim /usr/local/virus/iptables/iptables.allow  
iptables -A INPUT -i $EXTIF -p tcp -s 192.168.1.0/24 --dport 3128 -j ACCEPT  
# 因为内网 192.168.100.0/24 本来就是全部都接受放行的!  
[root@www ~]# /usr/local/virus/iptables/iptables.rule 
  • 建立黑名单配置文件

前面谈到,可以通过『 dstdomain .domain.name 』来抵挡不想联机的网站。 不过每次都得使用 root 身份来设定 squid.conf 才行。还可以额外处理出一个档案,让想要拒绝联机的数据写入, 这样比较容易管理,不需要一直去修改 squid.conf :

这个方法的好处是,你可以使用额外的控制方式去修改 /etc/squid/dropdomain.txt 这个档案的内容,并且修改完毕后再使用 reload 去加载配置文件,不必要重新启动 (restart),因为 reload 的速度比较快速。举例来说,鸟哥的专题生就用 PHP 写了一支控制该档案的网页接口,可以让老师在上课时直接透过网页输入要被控制的目标网站,这样学生就无法在上课时联机到外面的某些网站去玩游戏啰
 

[root@www ~]# vim /etc/squid/squid.conf  
# 找到底下的数据,就是 dropdomain 那行,约在 629 行左右,并且修改一下  
acl dropdomain dstdomain "/etc/squid/dropdomain.txt"  
# 注意一下,如果是档名,请写绝对路径,且使用双引号或单引号圈起来!  
[root@www ~]# vim /etc/squid/dropdomain.txt .facebook.com .yahoo.com  
# 一行一个 domain 名称即可  
[root@www ~]# /etc/init.d/squid reload 


(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容