Squid代理服务器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Squid代理服务器相关的知识,希望对你有一定的参考价值。

一、代理服务器(缓存)


1.分类

正向代理:部署在企业内部,实现企业内部客户端访问公网加速(ACL、缓存)

>传统代理:需在客户端指向正向代理服务器的IP及端口,方可正常使用

>透明代理:将正向代理服务器作为网关,客户端只需指明网关地址即可

反向代理:部署在企业内部,实现公网客户端访问内部服务器加速

2.缓存方式

  • 硬盘:速度慢、缓存时间长

  • 内存:速度快、重启后缓存丢失

二、Squid


  • Squid是应用层的代理服务软件,Squid主要提供缓存加速、应用层过滤控制的功能
  • Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher、HTTPS和HTTP协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。
  • Squid是一种用来缓冲Internet数据的软件。它接受来自人们需要下载的目标(object)的请求并适当地处理这些请求。也就是说,如果一个人想下载一web页面,他请求Squid为他取得这个页面。Squid随之连接到远程服务器并向这个页面发出请求。然后,Squid显式地聚集数据到客户端机器,而且同时复制一份。当下一次有人需要同一页面时,Squid可以简单地从磁盘中读到它,那样数据迅即就会传输到客户机上。当前的Squid可以处理HTTP,FTP,GOPHER,SSL和WAIS等协议。但它不能处理如POP,NNTP,RealAudio以及其它类型的东西。
  • Squid可运行在大多数Unix和OS/2版本的系统之上,已知的可工作的有:Windows,AIX,Digital Unix,FreeBSD,HP-UX,Irix,Linux,NetBSD,Nextstep,SCO,Solaris

1.Squid代理的工作机制

  • 基于硬盘的缓存方式,支持正向及反向两种代理

第一种情况:Squid服务器中有缓存

  • 当客户机通过代理来请求Web页面时,指定的代理服务器会先检查自己的缓存,如果缓存中已经有客户机需要的页面,则直接将缓存中的页面内容反馈给客户机;

第二种情况:Squid服务器中没有缓存

  • 如果缓存中没有客户机要访问的页面,则由代理服务器向Internet发送访问请求,当获得返回的Web页面以后,将网页数据保存到缓存中并发送给客户机
  • HTTP代理的缓存加速对象主要是文字、图像等静态Web元素。使用缓存机制后,当客户机在不同的时候访问同一Web元素,或者不同的客户机访问相同的Web元素时,可以直接从代理服务器的缓存中获得结果。这样就大大减少了向Internet提交重复的Web请求的过程,提高了客户机的Web访问响应速度
  • 由于客户机的Web访问请求实际上是由代理服务器来代替完成的,从而可以隐藏用户的真实IP地址,起到一定的保护作用。另一方面,代理服务器担任着类似“经纪人”的角色,所以有机会针对要访问的目标、客户机的地址、访问的时间段等进行过滤控制

2.代理的基本类型

根据实现方式不同,代理服务可分为传统代理透明代理两种常见的代理服务

  • a.传统代理:也就是普通的代理服务,首先必须在客户机的浏览器、QQ聊天工具、下载软件等程序中手动设置代理服务器的地址和端口,然后才能使用代理来访问网络。对于网页浏览器,访问网站时的域名解析请求也会发给指定的代理服务器

  • b.透明代理:提供与传统代理相同的功能和服务,其区别在于客户机不需要指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将Web访问重定向,实际仍然交给代理服务器来处理。重定向的过程对客户机来说是“透明”的,用户甚至都不知道自己在使用代理服务,所以称为“透明代理”。使用透明代理时,网页浏览器访问网站时的域名解析请求将优先转发给DNS服务器

实际应用中,传统代理多见于Internet环境,如为QQ程序使用代理可以隐藏本机真实IP地址,为下载工具使用多个代理可以规避服务器的并发连接限制。而透明代理多见于局域网环境,如在Linux网关中启用透明代理后,局域网主机无需进行额外设置就可以享受更好的上网速度

三、部署squid正向代理(传统代理)


环境准备

两台,一台linu作为squid代理及网关(两块网卡,第一块vmnet1、第二块桥接),另一台windows客户端(vmnet1)

部署gateway

1.IP配置

vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.1.1
NETMASK=255.255.255.0
cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth1
vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=dhcp
/etc/init.d/network restart

2.开启路由功能

vim /etc/sysctl.conf
  net.ipv4.ip_forward = 1
sysctl -p
iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 192.168.13.206

部署squid

1.编译安装Squid

配置Squid的编译选项时,将安装目录设为/usr/local/squid,其他具体选项根据实际需求来定,配置前可参考“./configure --help”给出的说明

tar -zxvf squid-3.4.6.tar.gz -C /usr/src/
cd /usr/src/squid-3.4.6/
./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

选项详解
--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正则表达式--enable-gnuregex

make && make install
echo "PATH=$PATH:/usr/local/squid/sbin" >>/etc/profile && source /etc/profile
useradd -M -s /sbin/nologin squid
chown -R squid:squid /usr/local/squid/var/

2.更改配置

vim /etc/squid.conf
 56 http_access allow all           #允许所有访问
 61 cache_effective_user squid          #指定运行用户
 62 cache_effective_group squid         #指定运行组
 63 visible_hostname xueluo.org         #指定当前主机名
 65 cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256   #启用缓存
 68 #coredump_dir /usr/local/squid/var/cache/squid      #注释改行
squid -k parse  #检测配置文件(/etc/squid.conf)是否有问题
squid -z        #创建缓存目录

3.启动服务

vim /etc/init.d/squid
#!/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
chmod +x /etc/init.d/squid
chkconfig --add squid
/etc/init.d/squid start
netstat -utpln | grep 3128

4.验证

IE-->代理服务器(192.168.1.1 3128) --> 119.75.213.61

tail -f /usr/local/squid/var/logs/access.log    //查看代理访问日志

四、部署squid正向代理(透明代理)


环境准备

两台,一台linu作为squid代理及网关(两块网卡,第一块vmnet1、第二块桥接),另一台windows客户端(vmnet1)

部署gateway

1.IP配置

vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.1.1
NETMASK=255.255.255.0
cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth1
vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=dhcp
/etc/init.d/network restart

2.开启路由功能

vim /etc/sysctl.conf
  net.ipv4.ip_forward = 1
sysctl -p
iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 192.168.13.206

部署squid

1.编译安装Squid

配置Squid的编译选项时,将安装目录设为/usr/local/squid,其他具体选项根据实际需求来定,配置前可参考“./configure --help”给出的说明

tar -zxvf squid-3.4.6.tar.gz -C /usr/src/
cd /usr/src/squid-3.4.6/
./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

选项详解
--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正则表达式--enable-gnuregex

make && make install
echo "PATH=$PATH:/usr/local/squid/bin:/usr/local/squid/sbin" >>/etc/profile
source /etc/profile
useradd -M -s /sbin/nologin squid
chown -R squid:squid /usr/local/squid/var/

2.更改配置

vim /etc/squid.conf
 56 http_access allow all           #允许所有访问
 60 http_port 192.168.1.1:3128 transparent
 61 cache_effective_user squid          #指定运行用户
 62 cache_effective_group squid         #指定运行组
 63 visible_hostname xueluo.org         #指定当前主机名
 65 cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256   #启用缓存
 68 #coredump_dir /usr/local/squid/var/cache/squid      #注释改行
iptables -t nat -I PREROUTING -i eth0 -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
squid -k parse  #检测配置文件(/etc/squid.conf)是否有问题
squid -z        #创建缓存目录

3.启动服务

vim /etc/init.d/squid
#!/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
chmod +x /etc/init.d/squid
chkconfig --add squid
/etc/init.d/squid start
netstat -utpln | grep 3128

4.测试

IE --> 119.75.213.61

tail -f /usr/local/squid/var/logs/access.log

五、Squid的ACL


  • Squid提供了强大的代理控制机制,通过合理设置ACL(Access Control List,访问控制列表)并进行限制,可以针对源地址、目标地址、访问的URL路径、访问的时间等各种条件进行过滤

  • 在配置文件squid.conf中,ACL访问控制通过以下两个步骤来实现:其一,使用acl配置项定义需要控制的条件;其二,通过http_access配置项对已定义的列表做“允许”或“拒绝”访问的控制

1.定义访问控制列表

每一行acl配置可以定义一条访问控制列表,格式如下所示

acl 列表名称 列表类型 列表内容 ...

  • 其中,“列表名称”由管理员自行指定,用来识别控制条件;“控制类型”必须使用Squid预定义的值,对应着不同类别的控制条件;“列表内容”是要控制的具体对象,不同类型的列表所对应的内容也不一样,可以有多个值(以空格分割,为“或”的关系)

  • 通过上述格式可以发现,定义访问控制列表时,关键在于选择“列表类型”并设置具体的条件对象。Squid预定义类型有很多种,常用的包括源地址、目标地址、访问时间、访问端口等
列表类型 列表内容示例 含义/用途
src 192.168.1.168192.1681.0/24192.168.1.0-192.168.3.0/24 源IP地址、网段、IP地址范围
dst 216.163.137.361.135.167.0/24www.playboy.com 目标IP地址、网段、主机名
port 80 443 8080 20 21 目标端口
dstdomain .qq.com .msn.com 目标域,匹配域内所有站点
time MTWHF 8:30-17:3012:00-13:00AS 字母表示一星期天中各天的缩写M--MondayT--TuesdayW--WednesdatH--ThursdayF--FridatA--SaturdatS--Sunday
maxconn 20 每个客户机的并发连接数
url_regex url_regex -i ^rtsp://url_regex -i ^emule:// 目标资源的URL地址,-i表示忽略大小写
urlpath_regex urlpath_regex -i sex adulturlpath_regex -i .mp3$ 目标资源的整个URL路径,-i表示忽略大小写
  • 在定义访问控制列表时,应结合当前网络环境正确分析用户的访问需求,准确定义使用代理服务的控制条件。例如,针对不同的客户机地址,需要限制访问的目标网站、特定的时间段......,分别定义列表

[[email protected] ~]# vim /etc/squid.conf

......

acl localhost src 127.0.0.1/255.255.255.255 //源地址为127.0.0.1

acl MYLAN src 192.168.1.0/24 192.168.4.0/24 //客户机网段

acl to_localhost dst 127.0.0.0/8 //目标地址为127.0.0.0/8网段

acl MC20 maxconn 20 //最大并发连接20

acl BlankURL url_regex -i ^rtsp:// ^emule:// //以rtsp://等开头的URL

acl MEDIAFILE urlpath_regex -i .mp3& .mp4& .rmvb& //以.mp3、.mp4等结尾的URL路径

acl WORKTIME time MTWHF 08:30-17:30 //时间为周一至周五08:30-17:30

  • 当需要限制的同一类对象较多时,可以使用独立的文件来存放,在acl配置行的列表内容处指定对应的文件位置即可。例如,若要针对目标地址建立黑名单文件,可以参考一下操作

[[email protected] ~]# mkdir /etc/squid

[[email protected] ~]# cd /etc/squid/

[[email protected] squid]# vim ipblock.list //建立目标IP地址名单

61.135.167.36

125.39.127.25

60.28.14.0/24

[[email protected] squid]# vim dmblock.list //建立目标域地址名单

.qq.com

.msn.com

.live.com

.verycd.com

[[email protected] ~]# vim /etc/squid.conf

......

acl IPBLOCK dst "/etc/squid/ipblock.list" //调用指定文件中的列表内容

acl DMBLOCK dstdomain "/etc/squid/dmblock.list"

2.设置访问权限

定义好各种访问控制列表以后,需要使用http_access配置项来进行控制。必须注意的是,http_access配置行必须放在对应的acl配置行之后。每一行http_access配置确定一条访问控制规则。格式如下所示

http_access allow或deny 列表名 ......

在每一条http_accsess规则中,可以同时包含多个访问控制列表名,各个列表之间以空格分隔,为“与”的关系,表示必须满足所有访问控制列表对应的条件才会进行限制。需要使用取反条件时,可以在访问控制列表前添加“!”符号

[[email protected] ~]# vim /etc/squid.conf

......

http_access deny MYLAN MEDIAFILE //禁止客户机下载MP3、MP4等文件

http_access deny MYLAN IPBLOCK //禁止客户机访问黑名单中的IP地址

http_access deny MYLAN DMBLOCK //禁止客户机访问黑名单中的网站域

http_access deny MYLAN MC20 //客户机的并发连接超过20时将被阻止

http_access allow MYLAN WORKTIME //允许客户机在工作时间上网

http_access deny all //默认禁止所有客户机使用代理

  • 执行访问控制时,Squid将按照各条规则的顺序依次进行检查,如果找到一条相匹配的规则就不再向后搜索(这点与iptables的规则匹配类似)。因此,规则的顺序安排是非常重要的,以下两种默认情况需要我们注意

  • 没有设置任何规则时:Squid服务将拒绝客户端的请求

  • 有规则但找不到相匹配的项:Squid将采用最后一条规则相反的权限,即如果最后一条规则时allow,就拒绝客户机的请求,否则允许该请求

  • 通常清空下,把最常用的控制规则放在最前面,以减少Squid的负载。在访问控制的总体策略上,建议采用“先拒绝后允许”或“先允许后拒绝”的方式,最后一条规则设为默认策略,设置“http_access allow all”或者“http_access deny all”

3.验证访问控制效果

  • 关于Squid服务的访问控制效果,无外乎两种情况:一种是能够正常访问,另一种时禁止访问。当客户机的代理访问请求被Squid服务被拒绝时,在浏览器中会看到ERROR报错页面,具体内容会根据限制条件不同有些细小差别

六、squid的日志分析


1.安装GD库,安装sarg

yum -y install gd httpd
yum -y localinstall gd-devel-2.0.35-11.el6.x86_64.rpm
mkdir /var/log/sarg
tar zxvf /root/sarg-2.3.7.tar.gz
cd sarg-2.3.7
./configure --prefix=/usr/local/sarg --sysconfdir=/etc/sarg --enable-extraprotection
//--enable-extraprotection添加额外的安全保护
make && make install

2.配置

vim /etc/sarg/sarg.conf
  access_log /usr/local/squid/var/logs/access.log       //第7行
  title "Squid user Access reports"                 //第25行
  output_dir /var/www/html/sarg/                //第120行
  overwrite_report no                       //第257行
  mail_utility mailx                        //第289行
  topsites_num 100                      //第294行
  max_elapsed 28800000                      //第324行
  charset UTF-8                         //第434行
  topuser_sort_field connect reverse bytes reverse      //第184行 
  user_sort_field connect reverse BYTES reverse         //第190行
  resolve_ip no                         //第153行
  user_ip no                            //第178行
  weekdays 0-6                          //第518行
  hours 0-8,9-12,13-23                      //第523行

3.运行

echo "PATH=$PATH:/usr/local/sarg/bin" >>/etc/profile
sarg                //执行启动记录一次
/etc/init.d/httpd  start
chkconfig httpd on

4.计划任务

crontab -e
  0 0 * * *  /usr/local/sarg/bin/sarg

以上是关于Squid代理服务器的主要内容,如果未能解决你的问题,请参考以下文章

squid代理服务器应用

squid代理服务器应用

Squid代理服务器(传统代理透明代理)(图文详解)

squid代理服务,搭建传统代理和透明代理案例

squid代理服务,搭建传统代理和透明代理案例

squid 代理