ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 17.2 Proxy 服务器的基础设定 ## 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 里面不相干的设定值通通拿掉了,所以这个档案就变的非常的精简!这样其实有好有坏啦! 好处是,你不用去看一些你用不到的参数值,坏处是,如果你想要其他的设定,就得额外参考外部文件了!伤脑筋~ ![](https://box.kancloud.cn/2016-05-13_5735736501917.gif) ``` [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.5*0.95=2.375G 时,旧的数据会开始被删除,删到剩下 2.5*0.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:](http://url%EF%BC%9A) 使用正规表示法来处理网址列的一种方式!这种方式的网址列必须要完整的输入正规表示法的开始到结尾才行。 举例来说,昆山科大的中文网页写法为 (并非部分比对,所以最结尾的 . *记得要加上去!): 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 <==这三行的『顺序』很重要! 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 <==重点就是这一行!可以拒绝,不要让后面的 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 <regex> <最小时间> <百分比> <最大时间> 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分钟) 时,这个数据也会被判定为旧资料。 例题:在网址列出现 .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/|\?) 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 为 dmtsai@www.centos.vbird ,此时我们可以这样修改: ``` [root@www ~]# vim /etc/squid/squid.conf cache_mgr dmtsai@www.centos.vbird <==管理员的 email 呦! visible_hostname www.centos.vbird <==直接设定主机名喔! [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](#http_access) 小节里面谈到,可以透过『 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 写了一支控制该档案的网页接口,可以让老师在上课时直接透过网页输入要被控制的目标网站, 这样学生就无法在上课时联机到外面的某些网站去玩游戏啰~ - - - - - -