Squid代理服务

Squid代理服务

一、squid概述

1、squid简介

​ Squid cache(简称为Squid)是流行最广的,使用最普遍的开源缓存代理服务器。squid的主要作用和应用场景有:

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

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

  • 设置访问控制策略,控制用户的上网行为
  • 主要支持http、ftp等应用协议

2、工作原理

Squid代理服务_第1张图片

二、squid代理类型

1、正向代理

Squid代理服务_第2张图片

2、透明代理

Squid代理服务_第3张图片

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

3、反向代理

Squid代理服务_第4张图片

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

总结:

  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、相关软件

官网地址:http://www.squid-cache.org/

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 %&gt;a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>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 123456@qq.com 

五、squid的正向代理

  • 需求:client通过代理服务器squid-server访问web-server服务器
client: 192.168.221.129
squid-server: 192.168.221.139192.168.226.137
web-server192.168.226.135

squid-server设置:
[root@squid-server ~]# vim /etc/squid/squid.conf
 59 #http_access deny all
 60 http_access allow all                           //允许访问

 69 cache_dir ufs /var/spool/squid 100 16 256         //打卡缓存
 70 visible_hostname min1.yu.net                     //设置主机名
 71 access_log      /var/log/squid/access.log         //定义访问日志

[root@squid-server ~]# service squid start           //启动服务
init_cache_dir /var/spool/squid... Starting squid: .   [  OK  ]

[root@squid-server ~]# ls /var/spool/squid/
00  02  04  06  08  0A  0C  0E  swap.state
01  03  05  07  09  0B  0D  0F
//服务器启动后会再缓存目录里产生以下一级、二级缓存目录文件
[root@squid-server ~]# netstat -ntpl |grep squid     //检查端口
tcp        0      0 :::3128                     :::*                        LISTEN      3355/(squid)        

注意:

​ 若重启squid会报如下警告:

[root@squid-server ~]# service squid restart
Stopping squid: 2018/06/30 20:55:58| WARNING cache_mem is larger than total disk cache space!
................                                       [  OK  ]
Starting squid: .                                      [  OK  ]

原因:
    默认情况下,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-server端:搭建web服务
  • client端:设置访问代理
客户端不需要设置网关和DNS:
[root@client ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.221.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.221.1   0.0.0.0         UG    0      0        0 eth0

配置代理服务器前:不能够直接访问web服务
[root@client ~]# ping 192.168.226.135
PING 192.168.226.135 (192.168.226.135) 56(84) bytes of data.
^C
--- 192.168.226.135 ping statistics ---
14 packets transmitted, 0 received, 100% packet loss, time 13245ms
[root@client ~]# curl 192.168.226.135
curl: (7) couldn't connect to host

浏览器配置代理服务器:指定代理服务器的IP和端口
Firefox:
Edit————>Preference————>Advanced————>Network————>Settings————>Manual proxy configuration
编辑--首选项--高级--网络--设置-- 手动填写代理服务器的IP和代理端口

Chrome:
设置——>高级——>打开代理设置——>连接——>局域网设置——>为LAN使用代理服务器前打勾并填上代理服务器的内网IP及其代理端口
IE:
设置——>Internet选项——>连接——>局域网设置--为LAN使用代理服务器前打勾并填上代理服务器的内网IP及其代理端口

若是Linux命令行界面,需要修改环境变量
[root@client ~]# vim /etc/profile
81 http_proxy=192.168.221.139:3128      //http协议访问时使用代理,也可以设置https,ftp等协议
82 export http_proxy
[root@client ~]# source /etc/profile

//测试
[root@client ~]# curl 192.168.226.135      //curl测试
this is squid-server  test page ,IP is 192.168.226.135

[root@client ~]# wget 192.168.226.135      //wget测试
--2018-06-30 21:14:23--  http://192.168.226.135/
Connecting to 192.168.221.139:3128... connected.
Proxy request sent, awaiting response... 200 OK
Length: 55 [text/html]
Saving to: “index.html.2100%[==============>] 55          --.-K/s   in 0s      

2018-06-30 21:14:23 (4.86 MB/s) - “index.html.2” saved [55/55]

六、squid的透明代理

  • 需求:内网用户通过代理服务器可以直接访问互联网中的web服务,不用指定proxy地址和端口
实验环境:
client: 192.168.221.129
squid-server: 192.168.221.139192.168.226.137
web-server192.168.226.135

client配置:
1、清空刚才的代理设置。
2、指定自己的默认网关为squid-server的私有地址192.168.221.139
[root@client ~]# route add default gw 192.168.221.139
[root@client ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.221.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.221.139 0.0.0.0         UG    0      0        0 eth0
0.0.0.0         192.168.221.1   0.0.0.0         UG    0      0        0 eth0
3、清空squid-server缓存
[root@squid-server ~]# cd  /var/spool/squid/
[root@squid-server squid]# ls
00  02  04  06  08  0A  0C  0E  swap.state
01  03  05  07  09  0B  0D  0F
[root@squid-server squid]# rm -rf *
//清空之前的缓存

squid-server端配置:
[root@squid-server ~]# vim /etc/squid/squid.conf
63 http_port 3128 transparent           //在代理端口后面加上transparent(透明),代表透明代理

[root@squid-server ~]# service squid restart       //重启服务
Stopping squid:                                        [FAILED]
init_cache_dir /var/spool/squid... Starting squid:     [  OK  ]

[root@squid-server ~]# iptables -t nat -I PREROUTING -s 192.168.221.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128    //添加防火墙规则 将访问80端口的报文重定向到3128端口
[root@squid-server ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
REDIRECT   tcp  --  192.168.221.0/24     anywhere            tcp dpt:http redir ports 3128 

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

//client 访问测试
[root@client ~]# curl 192.168.226.135
this is squid-server  test page ,IP is 192.168.226.135
[root@client ~]# wget 192.168.226.135
--2018-06-30 21:49:08--  http://192.168.226.135/
Connecting to 192.168.221.139:3128... connected.
Proxy request sent, awaiting response... 200 OK
Length: 55 [text/html]
Saving to: “index.html.4100%[==============>] 55          --.-K/s   in 0s      

2018-06-30 21:49:08 (15.4 MB/s) - “index.html.4” saved [55/55]
//访问成功
[root@client ~]# curl -I 192.168.226.135   //查看是否缓存
HTTP/1.0 200 OK
Last-Modified: Sat, 30 Jun 2018 10:38:20 GMT
Accept-Ranges: bytes
Content-Length: 55
Content-Type: text/html; charset=UTF-8
Date: Sat, 30 Jun 2018 11:28:18 GMT
Server: Apache/2.2.15 (CentOS)
ETag: "80c51-37-56fd9902ac503"
Age: 8529
X-Cache: HIT from min1.yu.net               //缓存成功代理服务器是min1.yu.net(也就是squid-server)
X-Cache-Lookup: HIT from min1.yu.net:3128
Via: 1.0 min1.yu.net (squid/3.1.10)
Connection: keep-alive

//停止server端httpd服务,依然可以访问web,证明缓存成功!
[root@server html]# service httpd stop
Stopping httpd:                                        [  OK  ]
[root@client ~]# wget 192.168.226.135
--2018-06-30 21:53:34--  http://192.168.226.135/
Connecting to 192.168.221.139:3128... connected.
Proxy request sent, awaiting response... 200 OK
Length: 55 [text/html]
Saving to: “index.html.5100%[==============>] 55          --.-K/s   in 0s      

2018-06-30 21:53:34 (18.0 MB/s) - “index.html.5” saved [55/55]

七、反向代理

  • 某公司内网搭建了一台web服务器,希望互联网用户来访问该web服务,越多越好
环境:
client:192.168.221.129
squid-server:192.168.221.139和192.168.226.137
web-server:192.168.226.135

搭建反向代理服务器:
修改squid配置文件:/etc/squid/squid.conf
[root@squid-server ~]# vim /etc/squid/squid.conf
 63 http_port  80 vhost
 64 cache_peer 192.168.226.135 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:代表权重
可查看 /usr/share/doc/squid-3.1.10/squid.conf.documented找详细信息

//测试
[root@client ~]# curl 192.168.221.139
this is test page
[root@client ~]# wget 192.168.221.139
--2018-07-02 17:10:26--  http://192.168.221.139/
Connecting to 192.168.221.139:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 18 [text/html]
Saving to: “index.html.10”

100%[=============>] 18          --.-K/s   in 0s      

2018-07-02 17:10:26 (5.25 MB/s) - “index.html.10” saved [18/18]

//访问成功

八、squid的访问控制

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. 禁止用户访问域名包含有163.com的网站
    acl test url_regex –i 163.com           //使用正则表达式匹配URL地址 
    http_access deny test

6. 禁止用户访问包含有itcast关键字的URL
    acl test url_regex –i itcast
    http_access deny test

7. 禁止用户访问多个网址
    acl  test  dstdom_regex "/etc/squid/baddsturl"  
    //如果网址太多,可以写成一个文件,然后在这个文件里一行一个网站写上你要禁止的
    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

你可能感兴趣的:(Linux服务)