17.2 Proxy 服务器的基础设定

虽然在我们小型的网络环境中,架设 Proxy 真的没有什么用,不过,考虑到大家未来可能会高升嘛!所以企业常用的 Proxy 也需要了解一下比较好。 在这个小节中,我们主要介绍一个比较简单的 Proxy 环境,就是单纯可以跑而已的代理服务器。比较高阶的设定请参考后续小节的介绍啰。


17.2.1 Proxy 所需的 squid 软件及其软件结构

达成代理服务器功能的软件很多,例如效能不是很好的 Apache 以及我们这个章节要介绍的八爪章鱼 squid 这一套。 目前代理服务器在 Unix Like 的环境下,大多就是使用 squid ,因此我们这里以 squid 为准来介绍啦。同样的, 请使用 rpm 来检查,如果尚未安装,请用『 yum install squid 』来安装吧!安装好 squid 之后,它主要的提供的配置文件有:

  • /etc/squid/squid.conf 这个是主要的配置文件,所有 squid 所需要的设定都是放置在这个档案当中的! 鸟哥底下提到的种种设定方法几乎都是这个档案里面的说明喔!

  • /etc/squid/mime.conf 这个档案则是在设定 squid 所支持的 Internet 上面的文件格式,就是所谓的 mime 格式啰! 一般来说,这个档案的预设内容已经能够符合我们的需求了,所以不需要更动他,除非你很清楚的知道你所需要额外支持的 mime 文件格式。

其他重要的目录与档案有:

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

17.2.2 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 里头指定的,所以,就让我们来看看这个档案的内容与较重要的参数吧:

Tips: CentOS 6.x 已经将 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.conf 里面的其他设定值,看到头好昏... 无论如何,上述这些设定已经是很基础的设定了,你最好了解一下!除了 cache_dir 那一行取消批注,其他的保持不动! 让我们以默认值来直接启动 squid 看看有什么特别的地方再说。

  • 使用默认值来启动 squid 并观察相关信息

要启动 squid 真是简单,让我们来启动 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 预设将这个设定值批注不使用啰!

例题:由于我的 Proxy 仅是部简单的单一代理服务器,并没有架设成为公开的邻近代理服务器 (peer proxy 或 neighbor proxy), 因此想要关闭 port 3130 ,该如何处理?答:旧版的 CentOS 5.x 以前的版本才需要进行,很简单,直接修改 icp_port 即可!方法为:

[root@www ~]# vim /etc/squid/squid.conf
#Default: VBird 2011/04/06 modified,将下列数据从 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 是如何将快取存进磁盘的呢? 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 类型才成呦!

例题:看起来预设的 proxy 的磁盘高速缓存应该是不够用,而之前的磁盘规划又没有做好,因此 /var/ 最多还有 500MB 可以让我们做为磁盘高速缓存。 那么如果想要将预设的磁盘高速缓存改为 500MB 而且再加上 /srv/squid/ 目录给予 2GB 的容量做为磁盘高速缓存,该如何进行设定?答:这里都与 cache_dir 有关!这个设定值可以重复出现多次!因此,我们可以这样进行的,特别注意底下的目录权限与 SELinux 类型呦!

[root@www ~]# vim /etc/squid/squid.conf
#Default: VBird 2011/04/06 modified,底下的设定除了拿掉 # 之外还得修改!
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 这个人物嘛!所以当然要变更!至于 SELinux 的类型方面,参考预设的 /var/spool/squid 就能够知道了。不过要注意,某些特定的目录 (例如 /home) 是不允许建立快取目录的, 因此我们使用服务资料可以放置的 /srv 作为测试范例啰!

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

  • cache_swap_low 90
  • cache_swap_high 95

代表当磁盘使用量达 95% 时,比较旧的快取数据将会被删除,当删除到剩下磁盘使用量达 90% 时,就停止持续删除的动作。 以本案例中,总共 2.5GB 的容量,当用到 2.50.95=2.375G 时,旧的数据会开始被删除,删到剩下 2.50.9=2.25GB 时,就停止删除的意思。所以会被删除掉 125MB 的旧数据就是了。通常这个设定值已经足够了,不需要变动他, 除了你的快取太大或太小时,才会调整这个设定值。

  • squid 使用的内存计算方式

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

很多人 (包括鸟哥) 都会误会 cache_mem 的用途!其实 cache_mem 是额外的指定一些内存来进行比较『热门』的数据存取! cache_mem 并不是指我要使用多少内存给 squid 使用,而是指 "我还要额外提供多少内存给 squid 使用" 的意思』!由于预设 1GB 的磁盘高速缓存会占用约 10M 的内存,而 squid 本身也会占用约 15MB 的内存, 因此,上个例题中 squid 使用掉的内存就有:

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

squid 官方网站建议你的物理内存最好是上面数值的两倍,也就是说,上述的内存使用量已经是 48MB, 则我的物理内存最好至少要有 100 MB 以上,才会有比较好的效能!当然,这个单指 Proxy 部分而已,如果你的该部主机还有负责其他的工作,呵呵!那么内存就得在累加上去啦!一般来说,如果你的 Proxy 很多人使用时,这个值越大越好,但是最好也要符合上面的需求喔!

例题:由于我的内存够大,而 proxy 确实是我重要的服务,因此想要增加额外的 32MB 作为热门数据快取,该如何修改?答:直接做了啦!就是修改 cache_mem 而已!

[root@www ~]# vim /etc/squid/squid.conf
#Default: VBird 2011/04/06 modified,将原本的 8 改为 32 啰!
cache_mem 32 MB

[root@www ~]# /etc/init.d/squid restart

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

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

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

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

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

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

  • src ip-address/netmask: 主要控制『来源的 IP 地址』。举例来说,鸟哥的内网有两个,分别是 192.168.1.0/24 以及 192.168.100.0/24 , 那么假设我想要制订一个 vbirdlan 的 acl 名称,那就可以在配置文件内写成: acl vbirdlan 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.tw 的来源用户就开放使用权,那就是: acl vbirdksu srcdomain .ksu.edu.tw

  • 管理是否让 proxy 帮忙代理到该目标去获取数据:

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

  • 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.ksu.edu.tw/cht/.

  • 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 的困扰! 好了!了解了 acl 之后,接下来得要谈谈 http_access 这个实际放行或拒绝的参数了!

  • 以 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  &lt;==这三行的『顺序』很重要!
http_access deny dropsex
http_access allow vbirdlan

[root@www ~]# /etc/init.d/squid restart

你得要注意,如果先放行了 vbirdlan 才抵挡 dropdomain 时,你的设定可能会失败!因为内网已经先放行, 因此后面的规则不会比对,那么 facebook.com 就无法被抵挡了!这点得要很注意才行! 通常的作法是,先将要拒绝的写上去,然后才写要放行的数据就好了。


17.2.4 其他额外的功能项目

  • 不要进行某些网页的快取动作

从前面的说明我们知道 Proxy 的快取通常在记录比较少变动的数据,如果是讨论区或者是程控类的数据库型态网页, 那么恐怕就没有快取的需要,因为数据一直变动嘛!你总不希望你发了一帖留言,结果等一下再去浏览时,看到的还是旧留言吧! 所以啰,在预设的情况下,squid 已经拒绝某些数据的快取了,那就是底下的几个设定值:

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

我们知道通常 .php 结尾的网页大部分就是讨论区之类的变动性数据,那么能不能出现 .php 结尾的网页就不要快取呢? 当然可以啊!那该如何进行?我们以上面的数据来照样造句一下吧!

例题:只要网址列出现 .php 结尾的,就不予以快取!答:透过 acl 配合 cache 这两个参数来处理即可!

[root@www ~]# vim /etc/squid/squid.conf
acl denyphp urlpath_regex \.php$
cache deny denyphp
# 在此档案的最后新增这两行即可!

[root@www ~]# /etc/init.d/squid restart
  • 磁盘中快取的存在时间

还记得底下的设定值吗?这个设定值的参数是这样设定的:

# refresh_pattern &lt;regex&gt;   &lt;最小时间&gt; &lt;百分比&gt; &lt;最大时间&gt;
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/&#124;\?) 0     0%      0
refresh_pattern .               0       20%     4320
  • regex:使用的是正规表示法来分析网址列的资料,如上面第一行设定为网址列开头是 ftp 的意思。

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

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

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

例题:在网址列出现 .vbird. 字样时,该数据为暂时使用的,因此 2 小时后就算旧数据。而最长保留在快取给她一天的时间, 且经过 50% 的时间后,就被判定为旧数据吧!答:

[root@www ~]# vim /etc/squid/squid.conf
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/&#124;\?) 0     0%      0
refresh_pattern \.vbird\.       120     50%     1440
refresh_pattern .               0       20%     4320

[root@www ~]# /etc/init.d/squid restart
  • 主机名与管理员的 email 指定

如果你的服务器主机名尚未决定,因此使用的主机名在因特网上面是找不到对应的 IP 的 (因为 DNS 未设定), 那么在预设的 squid 设定中,恐怕会无法顺利的启动。此时你可以手动的加入一个主机名,就是透过 visible_hostname 来指定。 同时,如果客户端使用 squid 出现任何错误时,屏幕上都会出现管理员的 email 让用户可以回报。现在假设主机名为 www.centos.vbird 且管理员的 email 为 [email protected] ,此时我们可以这样修改:

[root@www ~]# vim /etc/squid/squid.conf
cache_mgr [email protected]  &lt;==管理员的 email 呦!
visible_hostname www.centos.vbird  &lt;==直接设定主机名喔!

[root@www ~]# /etc/init.d/squid restart

17.2.5 安全性设定:防火墙, 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
  • SELinux 的注意事项

针对 proxy 来说,CentOS 6.x 倒是没有给予太多的规则限制,因此似乎不太需要修订规则。不过,SELinux 的安全本文在类型部分得注意。这包括配置文件 (/etc/squid/ 内的数据) 类型是 squid_conf_t 的样式, 而快取目录的类型则是 squid_cache_t 的类型,且上层类型 (/var/spool/) 应该是要成为 var_t 之类的才行。 修改的方法就是透过 chcon 来处理即可。

  • 建立黑名单配置文件

我们在 17.2.3 小节里面谈到,可以透过『 dstdomain .domain.name 』来抵挡不想联机的网站。 不过每次都得使用 root 身份来设定 squid.conf 才行。那有没有办法额外处理出一个档案,让想要拒绝联机的数据写入, 这样比较容易管理,不需要一直去修改 squid.conf 嘛!有没有办法可以达成呢?有的,就透过特定档案来处置即可。 看看底下这个例题来修订一下吧:

例题:建立一个名为 /etc/squid/dropdomain.txt 的档案,内容为拒绝联机的目标网站。答:我们之前设定过相关的网站,处理的方法是直接将主机名写入 squid.conf 中,现在我们可以这样修订:

[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

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