一、缓存代理概述
应用层的代理服务软件,Squid主要提供缓存加速、应用层过滤控制的功能
1、代理的工作机制
第一种情况:Squid服务器中有缓存
当客户机通过代理来请求Web页面时,指定的代理服务器会先检查自己的缓存,如果缓存中已经有客户机需要的页面,则直接将缓存中的页面内容反馈给客户机;
第二种情况:Squid服务器中没有缓存
如果缓存中没有客户机要访问的页面,则由代理服务器向Internet发送访问请求,当获得返回的Web页面以后,将网页数据保存到缓存中并发送给客户机
HTTP代理的缓存加速对象主要是文字、图像等静态Web元素。使用缓存机制后,当客户机在不同的时候访问同一Web元素,或者不同的客户机访问相同的Web元素时,可以直接从代理服务器的缓存中获得结果。这样就大大减少了向Internet提交重复的Web请求的过程,提高了客户机的Web访问响应速度
由于客户机的Web访问请求实际上是由代理服务器来代替完成的,从而可以隐藏用户的真实IP地址,起到一定的保护作用。另一方面,代理服务器担任着类似“经纪人”的角色,所以有机会针对要访问的目标、客户机的地址、访问的时间段等进行过滤控制
2、代理的基本类型
根据实现方式不同,代理服务可分为传统代理和透明代理两种常见的代理服务:
a.传统代理:也就是普通的代理服务,首先必须在客户机的浏览器、QQ聊天工具、下载软件等程序中手动设置代理服务器的地址和端口,然后才能使用代理来访问网络。对于网页浏览器,访问网站时的域名解析请求也会发给指定的代理服务器
b.透明代理:提供与传统代理相同的功能和服务,其区别在于客户机不需要指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将Web访问重定向,实际仍然交给代理服务器来处理。重定向的过程对客户机来说是“透明”的,用户甚至都不知道自己在使用代理服务,所以称为“透明代理”。使用透明代理时,网页浏览器访问网站时的域名解析请求将优先转发给DNS服务器
实际应用中,传统代理多见于Internet环境,如为QQ程序使用代理可以隐藏本机真实IP地址,为下载工具使用多个代理可以规避服务器的并发连接限制。而透明代理多见于局域网环境,如在Linux网关中启用透明代理后,局域网主机无需进行额外设置就可以享受更好的上网速度
二、安装及运行控制
1、编译安装Squid
配置Squid的编译选项时,将安装目录设为/usr/local/squid,其他具体选项根据实际需求来定,配置前可参考“./configure --help”给出的说明
[[email protected] ~]# tar -zxf squid-3.5.7.tar.gz
[[email protected] ~]# cd squid-3.5.7/
[[email protected] squid-3.5.7]# ./configure --prefix=/usr/local/squid --sysconfdir=/etc/ --enable-linux-netfilter --enable-arp-acl --enable-linux-tproxy --enable-async-io=100 --enable-err-language="Simplify_Chinese" --enable-underscore --enable-poll --enable-gnuregex
[[email protected] squid-3.5.7]# make && make install
上述选项含义如下:
--prefix=/usr/local/squid \\安装目录
--sysconfdir=/etc/ \\单独将配置文件修改到其他目录
--enable-arp-acl \\可以在规则中设置直接通过客户端MAC进行管理,防止客户端使用IP欺骗
--enable-linux-netfilter \\使用内核过滤
--enable-linux-tproxy \\支持透明模式
--enable-async-io=值 \\异步I/O,提升存储性能
--enable-err-language="Simplify_Chinese" \\错误信息的显示语言
--enable-underscore \\允许URL中有下划线
--enable-poll \\使用Poll()模式,提升性能
--enable-gnuregex \\使用GNU正则表达式
安装完成后,创建链接文件、创建用户和组
[[email protected] ~]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/
[[email protected] ~]# useradd -M -s /sbin/nologin squid
[[email protected] ~]# chown -R squid:squid /usr/local/squid/var/
2、Squid的配置文件
Squid服务的配置文件位于/etc/squid.conf,充分了解配置行的作用将有助于管理员根据实际情况灵活配置代理服务,更详细的配置项请参考/etc/squid.conf.documented文件
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localnet
http_access allow localhost
http_access deny all
http_port 3128 \\用来指定代理服务监听的地址和端口(默认的端口号为3128)
cache_effective_user squid \\指定squid的程序用户,用来设置初始化、运行时缓存的账号
cache_effective_group squid \\默认为cache_effective_user指定账号的基本组
coredump_dir /usr/local/squid/var/cache/squid
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
3、Squid的运行控制
1)检查配置语法是否正确
[[email protected] ~]# squid -k parse
2)启动、停止Squid
第一次启动Squid服务时,会自动初始化缓存目录。在没有可用的Squid服务脚本的情况下,也可以直接调用Squid程序来启动服务,这时需要先进行初始化
[[email protected] ~]# squid -z \\-z选项用来初始化缓存目录
[[email protected]calhost ~]# squid \\启动Squid服务
确认Squid服务处于正常监听状态
[[email protected] ~]# netstat -utpln | grep "squid"
tcp6 0 0 :::3128 :::* LISTEN 19958/(squid-1)
3)使用Squid服务脚本
为了使Squid服务的启动、停止、重载等操作更加方便,可以编写Shell服务脚本,并使用chkconfig和service工具来进行管理
#!/bin/bash # chkconfig: 2345 90 25 # config: /etc/squid.conf # pidfile: /usr/local/squid/var/run/squid.pid # Description: Squid - Internet Object Cache PID="/usr/local/squid/var/run/squid.pid" CONF="/etc/squid.conf" CMD="/usr/local/squid/sbin/squid" case "$1" in start) netstat -utpln | grep squid &>/dev/null if [ $? -eq 0 ] then echo "Squid is running" else $CMD fi ;; stop) $CMD -k kill &>/dev/null rm -rf $PID &>/dev/null ;; status) [ -f $PID ] &>/dev/null if [ $? -eq 0 ] then netstat -utpln | grep squid else echo "Squid is not running" fi ;; restart) $0 stop &>/dev/null echo "正在关闭Squid..." $0 start &>/dev/null echo "正在启动Squid..." ;; reload) $CMD -k reconfigure ;; check) $CMD -k parse ;; *) echo "用法:{ start | stop | restart | reload | check | status}" ;; esac
[[email protected] ~]# chmod +x /etc/init.d/squid
[[email protected] ~]# chkconfig --add squid \\添加为系统服务
[[email protected] ~]# chkconfig squid on
这样一来,就可以通过Squid脚本来启动、停止、重启、重载Squid服务器了,方法是在执行时添加相应的start、stop、restart、reload参数