设为首页 收藏本站
查看: 1046|回复: 0

[经验分享] squid配置-cache_peer和cache_peer_domain详解

[复制链接]

尚未签到

发表于 2018-12-28 07:35:44 | 显示全部楼层 |阅读模式
acl allowuser 192.168.1.1/32cache_peer 192.168.1.50 parent 81 0 no-query originserver weight=1 name=a  cache_peer 192.168.1.50 parent 82 0 no-query originserver weight=1 name=b
cache_peer 192.168.1.50 parent 80 0 no-query originserver weight=1 name=c  cache_peer_domain a
www.serverA.com  cache_peer_domain b www.serverB.com
cache_peer_domain c www.serverC.com  #以上六行配置表示:
  #从客户端过来的请求,如果是 www.serverA.com,则Squid向 Server 192.168.1.50的端口81发送请求;
  #从客户端过来的请求,如果是 www.serverB.com,则Squid向 Server 192.168.1.50的端口82发送请求;
  #从客户端过来的请求,如果是 www.serverC.com,则Squid向 Server 192.168.1.50的端口80发送请求;
#换句话说:设定不同域名转发到不同的cache_peer上,如果没有这项.不同的域名可能被分发到同一台服务 器(或同一台服务器的端口)上.#name=a表示给cache_peer一个别名 cache_peer_access a allow all  cache_peer_access b allow all
  cache_peer_access c allow all
  #设置访问权限,允许所有外部客户端访问 a b c
#如果是cache_peer_access a allow allowuser#表示只允许allowuser访问 www.serverA.com  另一个例子:acl user1 src 192.168.2.68/32  acl user2 src 192.168.2.94/32
#定义两个user IP  cache_peer 192.168.2.172 parent 80 0 no-query no-digest originserver name=www1  sourcehash
  cache_peer 192.168.2.173 parent 81 0 no-query no-digest originserver name=www2  sourcehash
  cache_peer_domain www1 www.domain.com
  cache_peer_domain www2 www.domian.com
#表明对www.domian.com的请求,squid向192.168.2.172的80端口和192.168.2.173的81端口发出请求cache_peer_access www1 allow user1  cache_peer_access www2 allow user2
#允许user1访问192.168.2.172的80端口#允许user2访问192.168.2.173的81端口  设置子父代理的cache_peer:
如果要设置父级的代理服务器,例如proxy.test.edu.cn那么可以这样配置

在#cache_peer hostname type 3128 3130 之下加入

cache_peer proxy.test.edu.cn parent 3128 3130 no-query no-netdb-exchange


如果要设置同级的代理服务器,如:192.168.1.41 192.168.1.42则可以这样来配置

cache_peer 192.168.1.41 sibling 3128 3130 proxy-only

....

注意目前各单位施行代理服务器分级管理,设置父级代理服务器,还必须取得上层单位的同意


说明:

(1)命令cache_peer的定义格式是:

cache_peer hostname type 3128 3130

hostname 是用来指定获取缓冲的PROXY主机的名字

type 是PROXY主机的类型,有以上PARENT SIBLING两种

3128:HTTP_PORT

3130:ICP_PORT


(2)附加配置选项(注意应为小写,配置时)

NO-QUERY:不做查询操作,直接获取数据

NO-NETDB-EXCHANGE:代理服务器之间不交互信息

NO-DIGEST:代理服务器之间不做摘要表查询,直接用ICP协议沟通(同级代理)

PROXY-ONLY:直接获取对方缓冲,转交给代理服务器的客户端,而不存入本地

ROUND-ROBIN:如果设置数部上层服务器,那么轮流查询父级服务器

LOGIN=USER:PASSWD:要求对方做帐号及密码验证,例如

cache_peer 192.168.1.41 sibling 3128 3130 login=kao:123456


举例:

  以下为squid1机器上的配置
  icp_port 3130
  acl domian dst www.domian.com
  acl squid2 src xx.xx.xx.xx
  acl squid3 src xx.xx.xx.xx
  http_access allow  squid2
  http_access allow  squid3
  1.配置 squid2、squid3 为其邻居,当 squid1 在其缓存中没有找到请求的资源时,通过 ICP 查询去其邻居中取得缓存
  cache_peer squid2 sibling 80 3130
  cache_peer squid3 sibling 80 3130
  2.squid1的三个父节点,originserver 参数指明是源服务器,round-robin 参数指明 squid 通过轮询方式将请求分发到其中一台父节点;squid 同时会对这些父节点的健康状态进行检查,如果父节点down了,那么 squid 会从剩余的 origin 服务器中抓取数据。
  cache_peer 192.168.1.1 parent 8080 0 no-query originserver round-robin name=www1
  cache_peer 192.168.1.2 parent 8080 0 no-query originserver round-robin name=www2
  cache_peer 192.168.1.3 parent 8080 0 no-query originserver round-robin name=www3
  3.将 www.domian.com 域的请求通过 RR 轮询方式转发到三个父节点中的一个。
  cache_peer_domain www1 domian
  cache_peer_domain www2 domian
  cache_peer_domain www3 domian
  4.always_direct会导致所有请求都直接发送到原始服务器。而不会去查询sibling,对于www.domian.com这个域名不需要直接出去,而是要询问sibling。其余的域名,squid依然通过hosts去进行转发
  always_direct allow !domain


  Cache_peer的理解
  1) cache_peer邻居分为parent(父邻居),sibling(子邻居).parent和sibling的区别在于父邻居能为子cache转发丢失的Cache,而子邻居不可能.
  2) cache_peer通过cache_peer_access和cache_peer_domain来控制邻居的访问.二者的区别在于前者一般需要先定义一个ACL而后者都直接匹配相应的域名就可以了.
  如:
  cache_peer 192.168.0.1 parent 3128 3130
  acl AllowDomain dst www.abc.com
  cache_peer_access AllowDomain 192.168.0.1
  cache_peer_domain 192.168.0.1  parent .xyc.com
  3) cache_peer通过never_direct,always_direct,hierarchy_stoplist等限制对邻居的访问.
  4) squid与邻居cache的通信一般为先为never_direct,always_direct确定怎么样转发(根据相应的标识driect, never_direct标识为direct_no,always_direct标识为direct_yes即直接转发到原始服务器等等 direct_maybe详情见Squid中文权威指南10.10.1),接着Squid根据Squid的设置查看耕邻居的摘要是否命中(根据ICP或 HCTP的请求所发现的),若命中则立即放入转发列表中.这一切也依靠cache_peer_access,cache_peer_domain的.同时 squid检查netdb侦测的RTT是否最优,决定是否选择此邻居转发.
  5)子邻居不转发任何命中丢失的请求,而父邻居可以转发,若Squid发现父邻居到原始服务器的RTT(往返时间)小于自已到原始服务器的RTT,将此请求转发给此父邻居.(RTT时间需借助Netdb选项的检测,对于父邻居的选择还有另外一些定义选项如:Weigh=N设置父邻居的权重来给予他更高的优先级)
ICP/HCTP和Cache摘要以及CARP一样,都是判断请求的URI是否在邻居中被命中。ICP是发送URL请求,Squid等待着邻居的回应,网络的延迟也是很大的,而且在姐妹Cache中假命中又显得很突出。No-Query,禁用ICP协议! Cache摘要是在邻居中生成摘要信息,摘要往往把反应在Cache中的信息,邻居下载每个Cache中的摘要,发送URI请求时查看URL是否在某个摘要中。  摘录两个 squid.conf 的主要配置,如下
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  $vi etc/squid.conf
  http_port 8080
  cache_peer 10.10.2.53 parent 6666 7 login=username:password default no-query
  cache_mem 60 MB
  cache_mgr zdysgs@zju.edu.cn
  dns_nameservers 10.10.0.21
  visible_hostname zdysgs.zju.edu.cn
  cache_dir ufs /usr/local/squid/var/cache 500 16 256
  http_access allow all
  never_direct allow all
  error_directory /usr/local/squid/share/errors/Simplify_Chinese
  cache_swap_low 80
  cache_swap_high 97
  #这两行是设置cache进行替换的闸值。当占用到97%的cache后,cache中的内容将被清空20%
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  第二个是网上找来的,比较简略,一目了然, 如下
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  一. Squid二级代理
在10.2.1.213上/usr/local/squid安装了 squid-2.5.STABLE7  将此squid配置成二级代理,上级代理IP:10.1.1.12,端口 3128
  修改squid.conf使之包含类似如下内容:
  cache_peer 10.1.1.12 parent 3128 0 no-query ###定义父代理10.1.1.12,端口3128
  acl all src 0.0.0.0/0.0.0.0 ###acl控制列表
  http_access allow all
  never_direct allow all ###所有请求转发至上级代理
  运行squid: # /usr/local/squid/squid -D
昨天晚上明辉打电话过来,说访问错误,以前与遇到过,估计不是Squid问题,我很郁闷,正好那天,公司申请的无线上网卡没钱,只能打电话让韩飞看看,他边测试,我边给我说情况,起初确定问题不再Squid,因为出现的是403,而错误页面不是Squid生成的,只得让他赶紧从lvs中移除,等今天早上来公司解决!  早上来到公司立马检查,先查看
  1:access_log
  先查看日志,发现是403,而且缓存了403,PURGE还是403!
  2:tcpdump
  发现数据包没到指定cache_peer,但是别的域名能够正常访问!
  3:squid -k debug
  最后修改端口,开启debug 才找到问题
  是因为定义了一个cache_peer,但是没有cache_peer_[domain|access] 引用,结果选择Parent的时候,成了FIRST_UP_PARENT,就导致发送错误IP,返回403,而别的域名能够访问是因为正好发送到的IP是源站!
  lvs的另外一台机器也正常,分析日志是TCP_MISS:CARP,CARP不了解,也算巧合把!
  现在就将故障重现!

  1:配置环境
  172.16.1.1
  C:\WINDOWS\system32\drivers\etc\HOSTS
  172.16.1.54        www.ming.com
  172.16.1.54        xin.ming.com
  172.16.1.54        abxin.ming.com
  172.16.1.54
  [root@54 etc]# grep "^cache_peer" /opt/app/squid3/etc/squid.conf
  cache_peer 172.16.1.55 parent 80 0 no-query no-digest originserver name=ming
  cache_peer 172.16.1.56 parent 80 0 no-query no-digest originserver name=ming_2
  cache_peer_domain ming_2 www.ming.com
  cache_peer 172.16.1.57 parent 80 0 no-query no-digest originserver name=xin
  cache_peer_domain xin xin.ming.com
  [root@54 etc]#
  172.16.1.55 和 172.16.1.56
  nginx.conf
  server {
  listen 80;
  deny all;
  }
  server {
  listen 80;
  server_name www.ming.com;
  location / {
  root html;
  index index.html index.htm;
  }
  }
  172.16.1.57
  nginx.conf
  server {
  listen 80;
  deny all;
  }
  server {
  listen 80;
  server_name xin.ming.com;
  location / {
  root html;
  index index.html index.htm;
  }
  }
  2:测试
  E:\>curl -I -X GET http://www.ming.com/
  HTTP/1.0 200 OK
  E:\>curl -I -X GET http://xin.ming.com/
  HTTP/1.0 403 Forbidden
  3:分析
  抓包看到,不论是www.ming.com 还是 xin.ming.com 都匹配到了cache_peer 172.16.1.55 parent 80 0 no-query no-digest originserver name=ming
  将cache_peer_domain 修改成cache_peer_access 形式 依旧如此
  注释掉
cache_peer 172.16.1.55 parent 80 0 no-query no-digest originserver name=ming 再次测试,已经正确转发!  E:\>curl -I -X GET http://www.ming.com/
  HTTP/1.0 200 OK
  E:\>curl -I -X GET http://xin.ming.com/
  HTTP/1.0 200 OK
  疑问:
  没有使用cache_peer_access cache_peer_domain 引用,不会被匹配的把,就算匹配,也该是优先级最低啊,这样别人可以利用这点***,比如
  E:\>curl -I -X GET http://abxin.ming.com/            # 不存在的域名,结果转发了返回403
  HTTP/1.0 403 Forbidden                                     #
  试着将
cache_peer 172.16.1.55 parent 80 0 no-query no-digest originserver name=ming 放在最后,上面www.ming.com xin.ming.com 能够正常转发,abxin.ming.com 出现403,说明也是转发到1.55 了,也是没必要的,那就只能注释掉才行了!  试着用squid-2.7.STABLE9 测试,发现处理方式一样,看样子只能以后注意了,最可怕的是,知道还有哪些奇怪的方式,已经遇见几个了...
  总结:
  感觉Squid有些东西无法控制,有些东西还很混乱,比如cache_peer_domain cache_peer_access 同时使用,就很让人纠结,也许该抽空尝试下varnish了!
Squid代理服务器介绍及相关配置
  一、代理服务器的作用
  1.通过缓存的方式为用户提供Web访问加速
  2.对用户的Web访问进行过滤控制

  二、代理服务器分类
  1.普通代理服务
  即标准的、传统的代理服务
  需要客户机在浏览器中指定代理服务器的地址、端口
  2.透明代理服务
  适用于企业的网关主机(共享接入Internet)中
  客户机不需要指定代理服务器地址、端口等信息
  需要设置防火墙策略将客户机的Web访问数据转交给代理服务程序处理
  3. 反向代理服务
  为Internet用户访问企业Web站点提供缓存加速

  三、squid 基本配置
  1.所需软件包
  软件包名:squid-2.6.STABLE6(版本可能不一样)
  服务名:squid
  主程序:/usr/sbin/squid
  配置目录:/etc/squid/
  主配置文件:/etc/squid/squid.conf
  默认监听端口:TCP 3128
  默认访问日志文件:/var/log/squid/access.log
  2.主配置文件squid.conf
  常用配置项
  http_port 3128                         //默认监听端口
  cache_mem 64 MB                     //缓存所占的内存空间大小,建议为物理内存的1/4—1/3
  maximum_object_size 4096 KB           //最大缓存对象大小
  reply_body_max_size 10240000 allow all  //限定最大请求的文件大小 单位是字节 allow al表示允许所有人的请求
  access_log /var/log/squid/access.log squid   //访问日志
  visible_hostname proxy.test.com        //反向解析自己的ip地址 以获得主机名
  cache_dir ufs /var/spool/squid 100 16 256    //定义缓存目录  数据存储格式 缓存到的目录  为缓存目录分配的磁盘空间(MB) 缓存空间的一级子目录个数  二级子目录个数
  3.普通代理的相关配置
  按照上面的常用配置项修改主配置文件
  测试语法
  #  squid –k parse
  初始化squid缓存目录
  #  squid –z
  启动squid 服务
  #  service squid start
  接下来需要在客户机上做相应的代理设置,如下图所示
  服务器的地址(192.168.1.1)、端口(3128)


  验证代理服务器功能
  在客户机的浏览器上访问某个站点(外网测试机ip 218.29.30.29
  ),网页访问成功后,检查代理服务器的日志文件,应发现客户机的HTTP访问记录
  [root@localhost ~]# tail -1 /var/log/squid/access.log
  1244386040.208     62 192.168.1.100 TCP_MISS/200 2828 GET http://218.29.30.29/icons/apache_pb2.gif – DIRECT/218.29.30.29 image/gif
  检查外网测试机的Web访问日志,应发现进行访问的是代理服务器主机(218.29.30.31),而不是客户机
  [root@gw1 ~]# tail -1 /var/log/httpd/access_log
  218.29.30.31 – - [16/May/2009:12:39:39 +0800] “GET /icons/apache_pb2.gif HTTP/1.0″ 200 2414 “http://218.29.30.29″ “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 1.0.3705; aff-kingsoft-ciba)”
  4.配置透明代理
  实现透明代理的基本条件
  前提:(1)客户机的Web访问数据要能经过防火墙
  (2)代理服务构建在网关(防火墙)主机中
  配置要求:(1)代理服务程序能够支持透明代理
  (2)设置防火墙规则,将客户机的Web访问数据自动重定向给代理服务程序处理
  基本实现步骤
  (1)修改squid.conf配置文件,并重新加载该配置
  http_port 192.168.10.1:8080 transparent
  注意:不要忘了定义规则,因为默认是拒绝所有的。规则可以这样定义:
  acl myacl src 192.168.0.0/255.255.255.0
  http_access allow myacl
  (2)添加iptables规则
  # iptables -t nat -I PREROUTING -i eth1 -s 192.168.10.0/24 -p tcp –dport 80 -j REDIRECT –to-ports 8080
  (3)客户机浏览器
  不需要在浏览器中指定代理服务器的地址、端口
  (4)验证透明代理的实施效果
  5.配置反向代理
  (1)拓扑图:

  (2)基本实现步骤
  修改squid.conf文件,并重新加载该配置
  语法:cache_peer Web服务器地址 服务器类型 http端口 icp端口 [可选项]
  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
  (3)验证反向代理的实施效果
  在上游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 image/gif
  6. ACL访问控制
  (1)ACL(Access Control List,访问控制列表)
  可以从客户机的IP地址、请求访问的URL/域名/文件类型、访问时间、并发请求数等各方面进行控制
  (2)应用访问控制的方式
  定义acl列表
  acl 列表名称 列表类型 列表内容 …
  常用的acl列表类型
  src
  dst
  port
  srcdomain
  dstdomain
  time
  maxconn
  url_regex
  urlpath_regex
  ACL列表定义示例
  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 allow或deny 列表名……
  根据已经定义的部分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,那么就拒绝客户端的请求,否则允许该请求


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-656635-1-1.html 上篇帖子: squid 的配置详解 (转)--SeriesI 收藏 下篇帖子: iptables+squid经典配置实例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表