天天看点

Squid 详解

Squid是基于应用层的网关防火墙,它的作用是:

####通过缓存的方式为用户提供Web访问加速

####对用户的Web访问进行过滤控制

但是squid只支持如:http、ftp、https等少数协议

代理分为:正向代理、反向代理、透明代理

正向代理又分为:

####普通代理:即标准的、传统的代理服务,需要客户机在浏览器中指定代理服务器的地址、端口

####透明代理:适用于企业的网关主机(共享接入Internet)中,客户机不需要指定代理服务器地址、端口等信息,需要设置防火墙策略将客户机的Web访问数据转交给代理服务程序处理

反向代理:为Internet用户访问企业Web站点提供缓存加速

squid软件包名:squid-2.6.STABLE6

服务名:squid

主程序:/usr/sbin/squid

配置目录:/etc/squid/

主配置文件:/etc/squid/squid.conf

默认监听端口:TCP  3128

默认访问日志文件:/var/log/squid/access.log

squid  -z (初始化缓存目录结构)

squid   -D(也可启动squid服务,但不做dns解析测试)

常用配置项如:

http_port 3128 (定义监听端口为3128)

cache_mem 64 MB (定义缓存大小为64MB)

cache_mgr [email protected](定义服务器管理员)

maximum_object_size 4096 KB (定义最大的缓存对象为4096KB)

reply_body_max_size 10240000 allow all(定义访问响应对象不能大于10MB)

access_log /var/log/squid/access.log squid(定义访问日志位置)

visible_hostname proxy.test.com(定义可用主机名)

cache_dir ufs /var/spool/squid 100 16 256(其中ufs 为缓存数据的存储格式;100表示为缓存目录分配的磁盘空间,并以MB为单位;16表示缓存空间的一级子目录个数;256表示缓存空间的二级子目录个数)

###############################################################################

Squid代理时可以做的一些限制规则这里我们用实验来演示,实验网络环境:

Squid服务器内网卡 192.168.10.10
Squid服务器外网卡 192.168.0.103
Squid内网中的客户端 192.168.10.11
外网地址 192.168.0.254

Squid服务器上:

[root@server5 ~]# yum list all |grep squid(列出squid软件包)

[root@server5 ~]# yum install squid(安装squid软件包)

[root@server5 ~]# service squid start(启动squid服务)

[root@server5 ~]# chkconfig squid on(添加squid到开机自启动列表)

[root@server5 ~]# netstat -tunlp |grep :3128(查看端口是否开放)

tcp        0      0 0.0.0.0:3128                0.0.0.0:*                   LISTEN      9750/(squid)       

[root@server5 ~]# cd /etc/squid/(切换到squid配置目录)

[root@server5 squid]# ls

[root@server5 squid]# grep -v "^#" squid.conf | cat –s(显示squid已启用的选项,并若有多个空白行则只显示一个空白行)

acl all src 0.0.0.0/0.0.0.0

acl manager proto cache_object

acl localhost src 127.0.0.1/255.255.255.255

acl to_localhost dst 127.0.0.0/8

acl SSL_ports port 443

acl Safe_ports port 80        

acl Safe_ports port 21        

acl Safe_ports port 70         

acl Safe_ports port 443        

acl Safe_ports port 210        

acl Safe_ports port 1025-65535 

acl Safe_ports port 280        

acl Safe_ports port 488        

acl Safe_ports port 591       

acl Safe_ports port 777       

acl CONNECT method CONNECT

http_access allow manager localhost

http_access deny manager

http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow localhost

http_access deny all

icp_access allow all

http_port 3128

hierarchy_stoplist cgi-bin ?

access_log /var/log/squid/access.log squid

acl QUERY urlpath_regex cgi-bin \?

cache deny QUERY

refresh_pattern ^ftp:           1440    20%     10080

refresh_pattern ^gopher:        1440    0%      1440

refresh_pattern .               0       20%     4320

acl apache rep_header Server ^Apache

broken_vary_encoding allow apache

coredump_dir /var/spool/squid

[root@server5 squid]# cp squid.conf squid.conf2(为了防止出错嘿嘿咱先保存一份)

[root@server5 squid]# squid -k parse(分析squid系统初始化是否有错误)

验证代理服务器功能

在squid服务器上:

[root@station5squid]# ls /usr/share/squid/errors/(查看语言类型)

[root@server5 ~]# vim /etc/squid/squid.conf

reply_body_max_size 10240000 allow all(访问对象只能小于等于10M才可以被访问)

#http_access allow localhost(默认只允许为本机代理,其它均拒绝)

#http_access deny all

http_access allow all(把http_access deny all修改为所有的都允许)

http_port 192.168.10.10:8080(指定代理网关和端口)

visible_hostname  proxy.benet.com (指定代理主机名)

error_directory /usr/share/squid/errors/Simplify_Chinese(修改访问出错信息为中文显示)

[root@server5 ~]# service squid restart( 重启生效)

在squid内网中的客户端上:

[root@station19 ~]# export HTTP_PROXY=192.168.10.10:8080(指定代理网关、代理端口)

[root@station19 ~]# echo $HTTP_PROXY

192.168.10.10:8080

[root@station19 ~]# elinks 192.168.0.254:80(squid客户端访问并以图形界面显示)

在squid服务器上验证:

[root@server5~]# tail -f /var/log/squid/access.log(

检查代理服务器的日志文件应发现客户机的 HTTP 访问记录

1267970936.677     78 192.168.10.11 TCP_MISS/301 702 GET http://192.168.0.254/course - DIRECT/192.168.0.254 text/html(表明代理访问已成功)

在squid客户端上访问:

http://192.168.0.254/course/ 在浏览器中下载看到小于10M 大小的文件时允许保存 在浏览器中下载看到超过10M 大小的文件时则被拒绝 基于 ACL 的访问控制代理:

可以从客户机的IP地址、请求访问的URL/域名/文件类型、访问时间、并发请求数等各方面进行控制

应用访问控制的方式:

定义acl列表

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

针对acl列表进行限制

        http_access allow或deny 列表名……

常用的ACL列表类型有:src、dst、port、srcdomain、dstdomain、time、maxconn、url_regex、urlpath_regex

例:禁止任何客户机使用代理服务器

列表定义示例 acl LAN1 src 192.168.10.0/24 acl PC1 src 192.168.10.12/32 acl Blk_Domain dstdomain .qq.com acl Work_Hours time MTWHF 08:30-17:30 acl Max20_Conn maxconn 20 acl Blk_URL url_regex -i ^rtsp:// ^mms:// acl Blk_Words urlpath_regex -i sex adult acl RealFile urlpath_regex -i \.rmvb$ \.rm$ 根据已经定义的部分ACL 列表进行访问控制 http_access deny LAN1 Blk_URL http_access deny LAN1 Blk_Words http_access deny PC1 RealFile http_access deny PC1 Max20_Conn http_access allow LAN1 Work_Hours 访问控制规则的匹配顺序 没有设置任何规则时,将拒绝所有客户端的访问请求 有规则但找不到相匹配的项时将采用与最后一条规则相反的权限,即如果最后一条规则是allow ,那么就拒绝客户端的请求,否则允许该请求 如何实现透明代理: 前提: 客户机的Web 访问数据要能经过防火墙 代理服务构建在网关(防火墙)主机中 配置要求: 代理服务程序能够支持透明代理 设置防火墙规则,将客户机的Web 访问数据自动重定向给代理服务程序处理 配置简要步骤: 修改squid.conf 配置文件,并重新加载该配置  http_port 192.168.10.1:8080 transparent 添加iptables 规则  iptables -t nat -I PREROUTING -i eth1 -s 192.168.10.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 8080 客户机浏览器 不需要在浏览器中指定代理服务器的地址、端口 验证透明代理的实施效果 反向代理实现步骤: 文件,并重新加载该配置 http_port  218.29.30.31:80 vhost cache_peer 192.168.10.7 parent 80 0 originserver weight=5 max-conn=30 cache_peer 192.168.10.8 parent 80 0 originserver weight=5 max-conn=30 cache_peer 192.168.10.9 parent 80 0 originserver weight=5 max-conn=30 cache_peer 192.168.10.6 parent 80 0 originserver weight=1 max-conn=8 cache_peer Web 服务器地址 服务器类型 http 端口 icp 端口 [ 可选项] 验证反向代理的实施效果 在上游Web 服务器(192.168.10.6 ~192.168.10.9 )中开启httpd 服务 在Internet 中的客户机(218.29.30.29 )中访问反向代理服务器主机(http://218.29.30.31 ),应能够看到实际由上游Web 服务器提供的网页内容 查看反向代理服务器的访问日志信息 [root@localhost ~]# tail -1  /var/log/squid/access.log 1231256531.038     35 218.29.30.29 (客户及地址) TCP_MISS/200 2869 GET http://218.29.30.31/ (反向代理服务器地址)/index.php? - FIRST_UP_PARENT/192.168.10.6 (第一台上有web 服务器地址)p_w_picpath/gif 1) src 是基于来源的控制 若允许

192.168.10.0/24网段可以被访问

http_access allow mynetwork acl mynetwork src 192.168.10.0/24 [root@server5 ~]# service squid restart

     在squid客户机上访问http://192.168.0.254/course

     在squid代理服务器上查看客户机的http访问记录日志信息:

     [root@server5 ~]# tail /var/log/squid/access.log

     1267975971.422    739 192.168.10.11 TCP_MISS/404 616 GET http://192.168.0.254/favicon.ico - DIRECT/192.168.0.254 text/html

    (看到192.168.10.0/24网段可以被访问)

2) dst基于目标的访问控制:

       假设

不允许访问 的服务器  [root@server5 ~]# vim /etc/squid/squid.conf    acl mynetwork src 192.168.10.0/24

   acl myserver dst 192.168.0.254/32

   http_access deny mynetwork !myserver

 [root@server5 ~]# service squid restart 在squid 客户端访问http://192.168.0.254/course, 看到访问被拒绝 服务器上查看日志:    [root@server5 ~]# tail /var/log/squid/access.log    1267977109.278      7 192.168.10.11 TCP_DENIED/403 1520 GET http://192.168.0.254/course/ - NONE/- text/html

3) url_regex针对完整的URL 做正则表达式匹配的,注意必须是完整的url

若可以下载包含pdf格式的文

       acl notpdf url_regex -i ^http.*\.pdf(其中-i表示忽略大小写)

http_access allow mynetwork .notpdf

在squid上测试:http://192.168.0.254/yum/books/

看到pdf格式的可以被下载

4) urlpath_regex表示忽略了协议、主机、端口,则只对它们后边的路径做匹配的

       若chm形式的文件不可以被下载

acl notchm urlpath_regex -i .chm \.chm$

http_access allow mynetwork !notchm

在squid客户端上测试:

http://192.168.0.254/yum/books/

看到下载被拒绝掉了

5)browser用来定义浏览类型的

       若我们定义不用firefox浏览起来浏览

       acl mynetwork src 192.168.10.0/24

acl notfirefox browser MOZILLA

http_access allow mynetwork !notfirefox

       在squid客户端上用Firefox浏览器测试结果已经浏览不到页面了

       而打开一个终端用elinks测试则仍可以浏览到页面

6)time 基于时间的控制

        若我们打算从早上8:00到第二天6:00这期间为上班时间,我们不允许上网,其他时间仍可上网,其实这里只是为了演示跨越00:00点的效果

        acl worktime time 8:00-23:59 (这样会取时间的并集) acl worktime time 00:00-5:59 http_access allow mynetwork !worktime 客户端上,在这个时间范围内尝试上外网结果被拒绝掉了 7 配置透明代理(透明代理表示不用指定代理服务器就可以上外网)        [root@server5 ~]# vim /etc/squid/squid.conf http_port 192.168.10.10:8080 transparent [root@server5 ~]# iptables -t nat -A PREROUTING -i eth1 -s 192.168.10.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 8080 [root@server5 ~]# service iptables save [root@server5 ~]# iptables -t nat -L -n

      [root@server5 ~]# service iptables restart

去掉Firefox上的代理端口照样可以访问

[root@station19 ~]# unset HTTP_PROXY

[root@station19 ~]# echo HTTP_PROXY

HTTP_PROXY

去掉elinks代理也可以访问了

8)maxconn表示最多允许连接的个数

       acl twoconn maxconn 2

       http_access allow mynetwork !twoconn

       在squid客户机上用Firefox打开浏览器,再用elinks也去连接浏览器,查看日志此时已经不允许再有其他连接了

注意:正向代理、反向代理、透明代理均不可同时

使用任意两者。

继续阅读