自由论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 789|回复: 0
打印 上一主题 下一主题

[学习笔记]代理服务器的应用

[复制链接]

85

主题

97

帖子

9829

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9829
跳转到指定楼层
楼主
发表于 2016-1-10 11:14:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
squid  
http://www.squid-cache.org/

代理服务器的作用

共享网络,加快网络访问速度(缓存),防止内部主机受攻击,限制用户访问(七层限制)等

   外网
    |
    |
   路由器
    |
    |
      squid正向代理
    |
    |
  |----------------------|
      上网用户一      上网用户二


三种代理类型
正向代理 客户端需要设置代理服务器的IP和代理端口
  --代理内部主机上网(共享上网,并可以进行用户限制等功能)
透明代理 客户端不需要设置代理服务器的IP和代理端口,对用户是透明的

反向代理 从网络访问内部服务器,与正向相反
   client
     |
     |
   反向代理
     |
     |
     web

--关于它们的应用:
正向和透明用于控制上网行为,共享上网等网络管理功能
反向代理主要应用于架构。 有四层和七层等之分,可用于动静分离等架构。

硬件反向代理负载均衡调度:F5 BIG-IP

squid varnish haproxy apache nginx

客户端  缓存(正向代理)   ---   缓存(反向代理)  apache+php(缓存)   memcache(缓存)   mysql(query-cache 缓存)


实验环境

   公网
    |
    |
   eth0 172.16.2.35
   squid 服务器
   vmnet1 192.168.1.1     

内网用户VM1                内网用户VM2
eth0     eth0
192.168.1.128    192.168.1.129

准备这个拓扑图要注意的地方
1,宿主机(squid服务器)需要能上外网,在这里就是指向公司的路由器
2,192.168.1.0网络,我这里使用vmware的vmnet1网段来模拟
3,内网用户只要与squid服务器能ping通就行,不用指网关和DNS
4,内网用户需要安装图形界面,并安装firefox浏览器
5,squid服务器能上外网,但内网用户不能上外网,我们的目地就是让squid代理内网用户上外网

第一步:安装squid

www.squid-cache.org

# yum install squid -y

第二步:修改配置文件
rhel6.5下自带的squid(主配置文件少了很多参数,文档都写到了/usr/share/doc/squid-3.1.10/squid.conf.documented这个文件里)
--rhel6.5下的配置
vim /etc/squid/squid.conf
59 http_access allow all  --把deny all改民allow all
68 cache_dir ufs /var/spool/squid 100 16 256 --把缓存目录这一句打开注释

如果你第二次重启squid时报下面的错误,表示内存高速缓存大于磁盘缓存的总空间
WARNING cache_mem is larger than total disk cache space!
原因:默认情况下,cache_mem为256M,而squid的配置里磁盘缓存默认为100M

如果你要解决这个问题的话:
1,第一种方式:调小cache_mem,因为磁盘缓存默认是100M,所以你加上一句cache_mem 100 MB
2,第二种方式:调大磁盘缓存;如cache_dir ufs /var/spool/squid 256 16 256;把100换成256

---------------------------------------------------------

第三步:
初始化缓存目录   --在rhel6的启动脚本里也会帮你初始化,如果你是第一次启动的话
ls /var/spool/squid    --初始化之前为空
squid -zX         --z参数创建缓存目录,X参数是打开调试功能,在这里就是可以看到创建过程

ls /var/spool/squid   --初始化之后再查看,就创建了16个目录,每个目录里256个子目录
du -sh /var/spool/squid/ --查看一下大小,目前为17M
# du -sh /var/spool/squid/
17M     /var/spool/squid/
# du -s /var/spool/squid/
16452   /var/spool/squid/

第三步:
启动服务
/etc/init.d/squid start
重新装载的话可以使用
/etc/init.d/squid  reload
或者使用
squid -k reconfig
停服务可以使用
/etc/init.d/squid stop
或者使用
squid -k shutdown

[root@li ~]# lsof -i:3128 --查看3128端口
COMMAND  PID  USER   FD   TYPE DEVICE SIZE NODE NAME
squid   4937 squid   12u  IPv4  36871       TCP *:squid (LISTEN)

第四步:
客户端的测试
不用设置网关和DNS指向

主要是修改浏览器
--filefox配置
编辑--性能--高级--网络--设置--  手动填写代理服务器的IP和代理端口
--IE配置
右键IE图标--连接--局域网设置--为LAN使用代理服务器前打勾并填上代理服务器的内网IP及其代理端口

测试:
访问已经访问过的页面是否能感觉到页面加快
再次查看 du -s /var/spool/squid 发现增大,因为缓存了对象
查看相关日志 /var/log/squid/squid/*.log

================================================================

透明(transparent)代理:

第一步:
在squid服务器上打开路由转发功能

# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1  --因为要使用iptables写NAT表的规则,所以要打开ip_forward
# sysctl -p

第二步:修改配置文件
# vim /etc/squid/squid.conf
http_port 3128 intercept
# /etc/init.d/squid restart


第三步:配置iptables
client          squid        公司路由器
      vmnet1      eth0   
192.168.1.128  192.168.1.1 172.16.2.35--> 172.16.1.1   公网IP
     |     
     |   
     |   
client网关指向192.168.1.1--     
clientDNS指向8.8.8.8  ---------------------------------->外网DNS


由上面的分析,需要在squid服务器上写上一句snat,让DNS能正常访问外网
# iptables -t nat -A POSTROUTING -p udp --dport 53 -o eth0 -j SNAT --to-source 172.16.2.35

这样的话,内网客户端的DNS OK了,但是http的80端口的访问如果也做一个SNAT的话,如下的规则:
# iptables -t nat -A POSTROUTING -p tcp --dport 80 -o eth0 -j SNAT --to-source 172.16.2.35
那么这就做的是完全的通过iptables来上外网;与squid无关
所以应该换成下面一句规则,把80端口的访问都重定向到3128端口
# iptables -t nat -A PREROUTING -p tcp --dport 80 -i vmnet1 -j REDIRECT --to-port 3128
# iptables -t nat -A PREROUTING -p tcp --dport 443 -i vmnet1 -j REDIRECT --to-port 3128

第四步:客户端验证
省略

总结:
--上面所做的透明代理其实和上次iptables所讲的几乎一样,唯一不同的就是把80端口的SNAT换成了端口的转换,把它交给3128的squid来上网
--但就上面这样做,并没有看出比使用iptables上网有什么优势
--squid共享上网的优势就在于使用acl访问控制,缓存,资源控制等

=================================================================

squid  里的 ACL   访问控制列表

acl denyip src  192.168.1.129/32 --拒绝内网的192.168.1.129/32上网
http_access deny denyip

acl denyip src 192.168.1.129-192.168.1.132/255.255.255.255
http_access deny denyip

acl  baddsturl2  dst   220.11.22.33  --不能访问这个外网IP的网站
http_access deny baddsturl2

acl  baddsturl  dstdomain -i  www.baidu.com  --不能访问www.baidu.comWWW.BAIDU.COM;-i参数定义大小写都匹配;  但是可以访问zhidao.baidu.com或tieba.baidu.com,并且可以使用www.baidu.com的IP也可以访问
http_access deny baddsturl

acl  baddsturl  dstdom_regex -i  baidu.com --这是把baidu.com以下的所有域名都禁止  ,但直接使用IP仍然是可以访问的
http_access deny baddsturl

acl  baddsturl  dstdom_regex "/etc/squid/baddsturl"  --如果网址太多,可以写成一个文件,然后在这个文件里一行一个网站写上你要禁止的
http_access deny baddsturl

acl baddsturl3  url_regex  -i  baidu   --拒绝访问url里有baidu这个关键字的网站
http_access deny baddsturl3

acl badfile  urlpath_regex -i \.mp3$ \.rmvb$ \.exe$ \.zip$ \.mp4$ \.avi$  \.rar$
http_access deny badfile --禁止下载带有定义后缀名的文件

acl vip  arp  00:0C:29:79:0C:1A    --rhel5系列里的rpm版不支持,需要编译版squid加上此功能;如果用的是rhel6的rpm版,支持MAC地址功能
http_access allow  vip

acl badipclient2  src 192.168.1.0/255.255.255.0
acl worktime time  MTWHF 9:00-17:00
http_access deny badipclient2 worktime  --拒绝192.168.1.0网段工作时间不能上网

acl badipclient3  src 192.168.1.128
acl conn5  maxconn  5
http_access deny badipclient3 conn5 --最大连接数为5

实现如下要求:
1,允许周一到周五12:00-14:00和17:30-21:00和双休能上网,别的时间不能上网
2,禁止下载.exe  .rar  .mp3  .avi   .rmvb .mp4后缀的文件
3,禁止访问qq.com,mop.com,sina.com,163.com,youku.com
4,禁止访问网址中包含某些关键字的网站:比如 sex  news  movie sport game stock
5, vip没有任何限制

--把上面五点情况做成两种需求:
1,上课时间不能上任何网站,休息时间可以上网,但受限
2,上课时间可以上网,但受限,休息时间可以无限制上网
acl lunchtime time MTWHF 12:00-14:00
acl dinnertime time MTWHF 17:30-21:00
acl weekend time SA 00:00-24:00
acl badfile urlpath_regex -i \.mp3$ \.rmvb$ \.exe$ \.zip$ \.mp4$ \.avi$  \.rar$
acl badweb  dstdom_regex "/etc/squid/denywebsite"
acl badword  url_regex  -i sex news movie sport game stock
acl vip mac 00:0C:29:79:0C:1A
vim /etc/squid/denywebsite
qq.com
sina.com
mop.com
163.com
youku.com

第一种需求
http_access allow vip
http_access deny badfile
http_access deny badweb
http_access deny badword
http_access allow lunchtime
http_access allow dinnertime
http_access allow weekend
http_access deny all
第二种
http_access allow vip
http_access allow lunchtime
http_access allow dinnertime
http_access allow weekend
http_access deny badfile
http_access deny badweb
http_access deny badword
http_access allow all

====================================================================

   客户端
     |
     |
    反向代理(缓存加速,网站数据切分)  
     |
     |
   web服务器
     |
   amoeba
     |
    mysql




实验环境
  
   内网web服务器     squid    VM2
eth0  vmnet1  eth1  eth0
192.168.1.128           192.168.1.1    172.16.2.35     172.16.2.x
   

--注意:
192.168.1.1为squid的一个内网IP
172.16.2.35为squid的外网IP(也就是说在这个架构里squid在最前端)
172.16.2.x 为外网客户端


第一步:
在内网web服务器上安装httpd,并做一个主页用于测试
yum install httpd* -y
echo "内网web" > /var/www/html/index.html
/etc/init.d/httpd restart



第二步:
在squid服务器上安装,并进行配置
yum install squid -y
用一个新的配置文件;如果是在上面的透明代理基础上再做反向代理,先注释掉前面所有的配置
vim /etc/squid/squid.conf
62 http_port 80 accel vhost vport
   --accel 反向代理加速模式
   --vhost 支持域名
   --vport 支持IP
cache_peer 192.168.1.128 parent 80 0 no-query originserver name=web
  --192.168.1.128  内网web服务器的IP
  --parent 上下关系,非平级关系
  --80 代理内部web服务器的80端口
  --0 没有使用icp,表示就一台squid服务器
  --no-query 不去查询邻居,与上面的0结合使用
  --originserver 表示源实际服务器
  --name=web 定义一个名字,让后面的参数引用
cache_peer_domain web web.cluster.com   --对web.cluster.com的请求会给web这台服务器(也就是上面定义的192.168.1.128);如果有多台web的话,可以多台web绑定同一个域名,还可以实现RR轮循调度
cache_peer_domain web 172.16.2.35 --光写上面一条,客户端只能通过web.cluster.com访问,再加上这条,客户端就可以使用172.16.2.35来访问

59 http_access allow all
cache_dir ufs /var/spool/squid 256 16 256

保存后,先不要重启squid;因为我这是在透明代理的基础上再做的,所以要把前面做的缓存和日志给删除,清除iptables规则
# rm /var/spool/squid/* -rf
# rm /var/log/squid/*.log -rf
# iptables -t nat -F
# squid -zX   --重新初始化

重启服务,注意不要与apache的80端口冲突

--测试:
所以这里客户端的DNS解析web.cluster.com应该得到172.16.2.35的结果

所以这里不做DNS的话,就直接在/etc/hosts里写上
172.16.2.35  web.cluster.com

再使用http://web.cluster.com 就可以访问到内部的web服务器了

可以使用curl -I http://web.cluster.com去查有没有命中缓存
=================================================================
多台squid反向代理
参考
http://www.ibm.com/developerworks/cn/linux/l-cn-squid

    客户端
   
     DNS轮叫(round-robin)
        www.abc.com

   squid1  squid2
   web1  web2


参考它实现

   client
     |
     |
  |-----------|
  squid 1    squid 2
  |       |  
  |-----------|
     |
     |
  |-----------|
  lamp1   lamp 2
  |-----------|
     |
     |
       mysql + nfs

两台squid1使用icp协议共同工作
两台lamp可以安装一个phpwind或discuz论坛
lamp里mysql独立出来,lamp的网站家目录也独立出来,使用nfs共享(--注意其权限)
把mysql和nfs做在同一台

--在这里我实现下面的架构

   client
li.cluster.com    |     squid2.cluster.com
外网 172.16.2.4   | 172.16.2.130
  |-----------|
  squid 1    squid 2
  |       |  
  |-----------|
内网 1.1.1.1     |      1.1.1.149
     |
  |-----------|
  web1    web 2
  |-----------|
web内网    1.1.1.128   1.1.1.131   

第一步:
主机名绑定
时间同步
防火墙关闭
yum配置

第二步:
squid1 上的配置
yum install squid* -y
# vim /etc/squid/squid.conf  --下面只列出需要修改的参数
http_port 80 accel vhost vport

icp_port 3130
icp_access allow all  --在rhel6.5下的squid3.1版加上这一句

cache_peer 1.1.1.149 sibling 80 3130

cache_peer 1.1.1.128 parent 80 0 no-query originserver round-robin name=web1
cache_peer 1.1.1.131 parent 80 0 no-query originserver round-robin name=web2
cache_peer_domain web1 web2 web.cluster.com

http_access allow all
保存配置文件后
squid -zX  --初始化缓存目录
/etc/init.d/squid start --启动

第三步
squid2上的配置
yum install squid -y
# vim /etc/squid/squid.conf
修改配置文件,和squid1的配置几乎一样,把squid1的配置文件拷过来,再修改两个参数
cache_peer 1.1.1.1 sibling 80 3130 --IP改为squid1的内网IP

保存配置文件后
squid -zX  --初始化缓存目录
/etc/init.d/squid start --启动

第四步:
配置两个内网web服务器
yum install httpd* -y
--因为我这里没有做共享存储,所以这里估计分别做两个不同的主页,来测试
在web1 128上
echo 128 > /var/www/html/index.html
在web1 129上
echo 129 > /var/www/html/index.html
/etc/init.d/httpd start --再把两个web启起来

第五步:
我现在使用172.16.2.108做外网的一个客户端来验证
--因为我的架构是做了DNS的轮叫,也就是网站域名为web.cluster.com,但轮叫两个IP172.16.2.4和172.16.2.130
vim /etc/hosts --为了方便,我这里没有做DNS,使用hosts文件来模拟DNS轮叫
172.16.2.4   web.cluster.com
172.16.2.130  web.cluster.com

[root@108 ~]# elinks web.cluster.com  --得到的结果怎么样都是128的主页

[root@108 ~]# curl -I http://web.cluster.com
HTTP/1.0 200 OK
Date: Tue, 10 Apr 2012 09:01:42 GMT
Server: Apache/2.2.3 (Red Hat)
Last-Modified: Tue, 10 Apr 2012 09:01:35 GMT
ETag: "1546ce-c-5ea859c0"
Accept-Ranges: bytes
Content-Length: 12
Content-Type: text/html; charset=UTF-8
Age: 1
X-Cache: HIT from li.cluster.com
X-Cache-Lookup: HIT from li.cluster.com:80 --HIT表示命中缓存
Via: 1.0 li.cluster.com:80 (squid/2.6.STABLE21)
Connection: close

--结果多次删除两台squid的/var/spool/squid/*缓存信息,多台客户端的测试,有时是128的主页,有时是129的主页,说明是正常的轮叫成功
--或者清空两个缓存,重启,只启动一个httpd,那客户端就只能访问这个启动的httpd
--但实际应用时,128和129应该是经过同步或共享存储的同一网站,内容是一致的

--上面的架构,坏掉任意一台内网web或squid,不影响网站的运行

测试:当缓存查不到,是否可以去找sibling的另一台squid
1,在两台web建立一个同名文件(内容不同)
2, 客户端去访问squid1的那个文件,得到内容缓存起来
3,关闭两台web ,然后客户端去访问squid2的那个文件,会得到同样的内容,说明是当缓存查不到,是先去查sibling的另一台
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Prostar Inc.

GMT+8, 2024-11-22 20:40 , Processed in 0.041025 second(s), 9 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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