squid代理

 

课程目标

  • 了解squid的应用场景

  • 理解squid的工作原理和作用

  • 理解squid的代理类型(重点)

  • 掌握squid的正向和透明代理的配置(重点)

  • 能够根据需求对squid服务器做简单的访问控制

一、squid基本概述

1. squid是什么?用来做什么?

Squid cache(简称为Squid)是流行最广的,使用最普遍的开源缓存代理服务器

2. squid的作用和应用场景有哪些?

  • 用来做前置的Web缓存,加快用户访问Web的速度

  • 代理内网用户访问互联网资源

  • 设置访问控制策略,控制用户的上网行为

  • 主要支持http、ftp等应用协议

  • 官网地址:squid : Optimising Web Delivery

3. 常见的代理服务器软件

  • squid 非常古老,功能齐全

  • varnish 性能优于squid,功能相对没有squid多

  • 其他 haproxy 、nginx等

4. squid的工作原理

二、squid代理类型

1. 正向代理

2. 透明代理

正向代理的过程隐藏了真实的请求客户端,服务器不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替请求。我们常说的代理也就是正向代理,正向代理代理的是请求方,也就是客户端;

3. 反向代理

反向代理的过程隐藏了真实的服务器,客户不知道真正提供服务的人是谁,客户端请求的服务都被代理服务器处理。反向代理代理的是响应方,也就是服务端;

总结:

  1. 正向代理和透明代理中的代理服务器和客户端同属一个LAN,对server端是透明的,服务器并不知道自己为谁提供服务。作用都是让内网用户可以通过代理服务器上互联网,也可以提高访问速度,并且可以通过代理服务器的访问控制限制内网用户的上网行为。

  2. 反向代理的过程隐藏了真正的服务器,对client端是透明的,客户端并不知道真正提供服务的服务器。可以起到负载均衡的作用,提高用户的访问速度。

  3. 两者的区别在于代理的对象不一样:正向代理代理的对象是客户端,反向代理代理的对象是服务端

  4. 应用场景

    • 正向和透明代理:一般用于公司内网用户访问互联网,根据需求进行访问控制

    • 反向代理:一般用于公司服务器集群前做web缓存,提高用户访问效率,同时可以起到负载均衡作用,为互联网提供可持续的web服务

三、squid代理服务器和SNAT|DNAT的区别

1. SNAT和DNAT

  • 网络层次:网络层

    局域网用户访问外网走snat模式,同一个数据包,改变数据包头部的来源地址,再把数据包发到internet。

  • 作用:内网用户上外网(SNAT)和内网服务发布到公网(DNAT)

2. 代理服务器模式

  • 网络层次:应用层

    不改变数据包头信息,把数据包代理给internet的服务器,基于应用层的过滤。

  • 应用层:

    • 协议:http、ftp、pop、smtp、p2p等

  • 作用:缓存页面,加速访问,ACL资源访问控制

  • 反向代理:

    • internet用户访问局域网服务器

    • Squid做反向代理服务器,把用户的请求转发到后方的真实的服务器,可以做到负载均衡的效果,同时缓冲用户经常访问的页面提高访问速度

四、了解squid代理软件相关信息

1. 安装软件

//squid在本地镜像里有,只需要配置好本地yum源即可
[root@squid-server ~]# yum -y install squid

2. 软件的文件列表

[root@squid-server ~]# rpm -ql squid
/etc/squid/squid.conf           //配置文件
/etc/rc.d/init.d/squid              //启动脚本
/usr/sbin/squid                     //二进制命令
/usr/share/doc/squid-3.1.10          //手册
/var/log/squid                      //日志目录
/var/spool/squid                    //缓存目录

3. 配置文件说明

# cat /etc/squid/squid.conf
//设置监听的IP与端口号
http_port 3128
​
//额外提供给squid使用的内存大小
cache_mem   默认256 MB   
​
//设置squid磁盘缓存最大文件,超过4M的文件不保存到硬盘
maximum_object_size 4 MB   
​
//设置squid磁盘缓存最小文件
minimum_object_size 0 KB 
​
//设置squid内存缓存最大文件,超过4M的文件不保存到内存
maximum_object_size_in_memory 4096 KB   
​
//定义squid的cache存放路径 、cache目录容量(单位M)、一级缓存目录数量、二级缓存目录数量
cache_dir ufs /var/spool/squid 100 16 256   
​
//log文件日志格式
logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %h" "%{User-Agent}>h" %Ss:%Sh        
​
//log文件存放路径和日志格式
access_log /var/log/squid/access.log combined  
​
//设置缓存日志
cache_log /var/log/squid/cache.log   
​
//log轮转60天
logfile_rotate 60   
​
//cache目录使用量大于95%时,开始清理旧的cache
cache_swap_high 95  
​
//cache目录清理到90%时停止
cache_swap_low 90   
​
//定义本地网段
acl localnet src 192.168.1.0/24  
​
//允许本地网段使用
http_access allow localnet  
​
//拒绝所有
http_access deny all  
​
//主机名
visible_hostname xxx.xxxx.xxxx 
​
//管理员邮箱
cache_mgr [email protected]             

五、squid的正向代理配置

需求:内网用户通过浏览器指定代理服务器的IP和端口访问互联网中的web服务

环境:
client:10.1.1.2
squid-server:10.1.1.1 和 2.2.2.1
web-server: 2.2.2.2
​
思路:
1. squid-server需要2个IP,一个公网一个私网
2. client端只需要和squid-server能互通即可,不需要指定gw和dns;
3. client端需要在浏览器上设置代理服务器的IP和端口
4. squid-server可以上外网,client不能上外网,目的就是让squid代理内网用户访问互联网web服务
5. 搭建一个web服务
​
步骤:
搭建squid-server服务器:
1. 安装软件
yum -y install squid
​
2. 根据需求修改配置文件
需求:代理内网所有用户访问互联网的web服务
[root@squid-server ~]# vim /etc/squid/squid.conf
...
#http_access deny all       //注释掉这行
http_access allow all       //将原来的deny all 改成 allow all,允许所有人来访问该代理服务器
​
cache_dir ufs /var/spool/squid 100 16 256   //取掉前面的注释,打开缓存目录
//增加以下2行
visible_hostname squid-server.itcast.cc     //定义squid服务器主机名
access_log      /var/log/squid/access.log   //定义访问日志
​
3. 启动squid服务
[root@squid-server ~]# service squid start
init_cache_dir /var/spool/squid... Starting squid: .       [  OK  ]
​
//服务器启动后会再缓存目录里产生以下一级、二级缓存目录文件
[root@squid-server ~]# ls /var/spool/squid/
00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F  swap.state
​
//查看端口3128已经处于监听状态
[root@squid-server ~]# netstat -nltp|grep squid
tcp        0      0 :::3128         :::*       LISTEN      31722/(squid)  
​
注意:如果再次重启会报以下警告
WARNING cache_mem is larger than total disk cache space!
原因:默认情况下,cache_mem为256M,而squid的配置里磁盘缓存默认为100M
解决:
方法1:调小cache_mem的值
在配置文件中增加:cache_mem 100 MB
方法2:调大磁盘缓存
修改配置文件中如下内容:
cache_dir ufs /var/spool/squid 256 16 256   ——>把100换成256
​
说明:squid缓存从  内存     ————>   磁盘
                cache_mem       /var/spool/squid
​
搭建web服务:
web-server:2.2.2.2
​
​
客户端测试:
client:10.1.1.2 注意:不需要设置网关和DNS
配置代理服务器前:不能够直接访问web服务
[root@client ~]# ping 2.2.2.2
connect: Network is unreachable
[root@client ~]# wget http://2.2.2.2
--2018-05-05 11:48:12--  http://2.2.2.2/
Connecting to 2.2.2.2:80... failed: Network is unreachable.
​
浏览器配置代理服务器:指定代理服务器的IP和端口
Firefox:
Edit————>Preference————>Advanced————>Network————>Settings————>Manual proxy configuration
编辑--首选项--高级--网络--设置-- 手动填写代理服务器的IP和代理端口
​
Chrome:
设置——>高级——>打开代理设置——>连接——>局域网设置——>为LAN使用代理服务器前打勾并填上代理服务器的内网IP及其代理端口
IE:
设置——>Internet选项——>连接——>局域网设置--为LAN使用代理服务器前打勾并填上代理服务器的内网IP及其代理端口
​
测试访问web页面:
1. client端:打开浏览器,输入:http://2.2.2.2      可以看到web-server的web页面
2. web-server端:查看/var/log/httpd/access.log日志
3. squid-server端:查看/var/log/squid/access.log日志
4. 测试web-server服务停止,squid-server是否缓存
​

六、squid的透明代理配置

需求:内网用户通过代理服务器可以直接访问互联网中的web服务,不用指定proxy地址和端口

思路:
1. squid-server需要2个IP,一个公网一个私网
2. client端浏览器不需要指定代理服务器的IP和端口,但是需要指定网关为squid-server的私网地址;
3. squid-server需要借助iptables将内网的80端口重定向到自己的3128端口帮内网用户代理上网
4. 搭建一个web服务
​
步骤:
client端浏览器清空刚刚的代理设置(不要忘记)
client端指定自己的默认网关为squid-server的私有地址:
[root@client ~]# route add default gw 10.1.1.1
​
squid-server端配置透明代理服务并添加iptables规则:
1. 修改squid配置文件
[root@squid-server ~]# vim /etc/squid/squid.conf
http_port 3128 transparent          //在代理端口后面加上transparent(透明),代表透明代理
​
重启服务:
service squid restart
​
2. 添加防火墙规则
[root@squid-server ~]# iptables -t nat -A PREROUTING -s 10.1.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128
[root@squid-server ~]# iptables -t nat -nL
​
说明:
-j REDIRECT 表示端口重定向,仅用于tcp和udp协议
This is only valid if the rule also specifies -p tcp or -p udp
​
3. 客户端测试验证
1). client端:打开浏览器,输入:http://2.2.2.2     可以看到web-server的web页面
[root@client ~]# curl -I http://2.2.2.2/index.html  //查看是否缓存
...
X-Cache: HIT from squid-server.itcast.cc
X-Cache-Lookup: HIT from squid-server.itcast.cc:3128    //HIT代表命中,缓存
​
...
X-Cache: MISS from squid-server.itcast.cc
X-Cache-Lookup: MISS from squid-server.itcast.cc:3128   //MISS代表没有命中,没有缓存
​
2). web-server端:查看/var/log/httpd/access.log日志
3). squid-server端:查看/var/log/squid/access.log日志
4). 测试web-server服务停止,squid-server是否缓存

七、squid实现访问控制

1. 访问控制配置语法

1. 禁止IP地址为192.168.0.100的客户机上网
    acl test src 192.168.0.100      //定义来源IP,test可以自己定义,代表定义的IP
    http_access deny test           //拒绝test后面定义的源IP:192.168.0.100上网
​
2. 禁止192.168.1.0这个网段里的所有客户机上网
    acl test src 192.168.1.0/255.255.255.0
    或者
    acl test src 192.168.1.0/24
    http_access deny test
​
3. 禁止用户访问IP为210.21.118.68的网站
    acl test dst 210.21.118.68
    http_access deny test
    
4. 禁止用户访问域名为www.163.com的网站
    acl test dstdomain –i www.163.com                   //-i: 忽略大小写
    http_access deny test
​
5. 禁止用户访问多个网址
    acl  test  dstdom_regex "/etc/squid/baddsturl"  
    //如果网址太多,可以写成一个文件,然后在这个文件里一行一个网站写上你要禁止的
    http_access deny test   
    
问题:拒绝了域名访问,IP理论上是可以访问,但是不能访问?why?
原因:通过查看官方手册,发现如下说明:
For dstdomain and dstdom_regex a reverse lookup is tried if a IP based URL is used and no match is found. The name "none" is used if the reverse lookup fails.
​
对于dstdomain和dstdomregex来说,如果使用基于IP的URL,并且没有找到匹配的话,就会尝试反向查找。如果反向查找失败,则使用“none”这个名称
​
​
6. 禁止用户访问域名包含有163.com的网站
    acl test url_regex –i 163.com           //使用正则表达式匹配URL地址 
    http_access deny test
    
7. 禁止用户访问包含有itcast关键字的URL
    acl test url_regex –i itcast
    http_access deny test
    
​
8. vip用户没有任何限制
    acl vip  arp  00:0C:29:79:0C:1A     //绑定mac地址
    http_access allow  vip 
​
9. 禁止192.168.2.0这个子网里所有客户机在周一至周五的9点到18点上网
    acl test1 src 192.168.2.0/255.255.255.0
    acl test2 time D 9:00-18:00
    http_access deny test1 test2
    
    时间列表:
        S   Sunday      周日
        M   Monday      周一
        T   Tuesday     周二
        W   Wednesday   周三
        H   Thursday    周四
        F   Friday      周五
        A   Saturday    周六
        D   All weekdays (M-F)  周一到周五
            
10. 禁止用户下载*.mp3,*.exe,*.zip,*.rar带有定义后缀名的文件
    acl test urlpath_regex –i \.mp3$ \.exe$ \.zip$ \.rar$ \.txt$
    //urlpath_regex:正则表达式匹配URI地址
    http_access deny test
​
注意:
    http_access deny的行为要写在allow的上方    先拒绝再允许
​
总结:acl访问控制,从上往下匹配,如果匹配到了规则不会往下走,如果都没有匹配上规则,则看最后面的
http_access allow|deny all

2. 应用案例

2.1 根据IP地址访问控制

acl deny_ip src 10.1.1.4
http_access deny deny_ip
​
注意:如果有多个不同ip地址可以放到一个文件中,如下:
acl deny_ip src "/tmp/ip.txt"
http_access deny deny_ip

2.2 根据域名访问控制

acl deny_dom dstdomain -i www.misshou.cc        //拒绝具体某个域
http_access deny deny_dom
​
acl deny_dom url_regex -i misshou.cc            //拒绝包含misshou.cc关键字的域
http_access deny deny_dom

2.3 根据时间和日期访问控制

acl idle_time time SA       //课余时间,周六周日
acl work_time time D  9:00-12:00 14:30-17:30    //工作时间周一到周五的上课时间
http_access deny work_time      //上课时间不能上网
http_access allow idle_time     //业余时间可以上网
​
注意:关于时间的几种错误写法
acl idle_time time A 14:00-18:00 S 9:00-12:00   //错误,只取周六和周天的9:00-12:00
​
正确写法如下:分成2行写
acl idle_time1 time A 14:00-18:00
acl idle_time2 time S 9:00-12:00
​
acl idle_time time 20:00-04:00  跨越子夜  //错误
正确写法如下:
acl idle_time time !04:00-20:00

2.4 根据文件名访问控制

acl idle_time time SA
acl work_time time D  9:00-12:00 14:30-17:30
acl content urlpath_regex \.mp4$ \.rmvb$ \.avi$ \.txt$
http_access deny work_time
http_access deny content
http_access allow idle_time
​
注意:
先deny在allow,匹配规则从上往下一条一条匹配,如果没有匹配到看最后的http_access deny|allow all
​
​

3. 综合案例(自己完成)

根据需求控制内网用户访问互联网:

  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

  5. vip没有任何限制

具体步骤:
1. squid-server上修改配置文件squid.conf
1) 定义访问控制资源
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 arp 00:0C:29:BB:F6:14
​
2) 创建禁止访问的网站
vim /etc/squid/denywebsite
qq.com
sina.com
mop.com
163.com
youku.com
​
​
3) 根据需求对以上资源做出访问控制
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
​
2. 测试验证

总结:

八、反向代理(扩展)

需求:某公司内网搭建了一台web服务器,希望互联网用户来访问该web服务,越多越好

画图理解:反向代理

环境:
client:2.2.2.2  互联网用户
squid-server:2.2.2.1和10.1.1.1   2个IP,一个公网一个私网
web-server:10.1.1.3  公司内网web服务器
​
搭建反向代理服务器squid步骤:
1. 清空之前的环境
[root@squid-server ~]# iptables -t nat -nL
​
2. 修改squid.conf配置文件来配置反向代理
[root@squid-server ~]# vim /etc/squid/squid.conf
...
http_port 80 vhost
cache_peer 10.1.1.3 parent 80 0 originserver 
​
解释说明:
[root@squid-server ~]# less /usr/share/doc/squid-3.1.10/squid.conf.documented
...
cache_peer hostname type http-port icp-port [options]
​
cache_peer:做反向代理的关键字
hostname:代表后台真正的web服务器
type:代表代理服务器的类型,有PARENT和SIBLING两种;parent代表父亲,sibling代表兄弟伙伴
http-port:后台web服务的端口
icp-port:代表代理服务器之间通讯的端口(用于查询兄弟缓存的端口)
[options]:代表可选项
originserver:代表原始服务器(真正的web服务)
weight:代表权重
max-conn:代表
...
​
3. 测试验证
在client端:2.2.2.2上直接访问代理服务器:
http://2.2.2.1
​
​
​

你可能感兴趣的:(linux,nginx,服务器,代理模式)