简介

Squid cache(简称为Squid)是一个流行的自由软件,它符合GNU通用公共许可证。Squid作为网页服务器的前置cache服务器,可以代理用户向web服务器请求数据并进行缓存,也可以用在局域网中,使局域网用户通过代理上网。Squid主要设计用于在Linux一类系统运行。

原理

简单来说,当一个用户想要下载一个主页时,可以向Squid 发出一个申请,让Squid 代替其进行下载,然后Squid 连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户申请同样的页面时,Squid 把保存的备份立即传给用户,使用户觉得速度相当快。Squid 可以代理HTTP、FTP、GOPHER、SSL和WAIS等协议并且Squid 可以自动地进行处理,可以根据自己的需要设置Squid,使之过滤掉不想要的东西。

其原理图如下:

​​‌‌​​​‌‌​‌​​‌‌‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌​​‌​​​‌​​​‌‌​‍​‌​‌‌​​​‌‌​​​​​‍​​‌​‌‌‌‌‌‌‌‌​​​‍​‌‌​​‌‌‌​‌‌​​‌‌‌‍​‌‌​​​‌‌‌​​​‌​‌‍​​‌‌‌‌‌‌‌‌​​‌‌‍‌​‌​‌‌​​‍‌​​​‌‌‌​‍‌​​​‌​‌​‍‌​​‌​‌‌​‍‌​​‌‌​‌‌‍​‌‌​​​‌​​​‌‌‌​​‍​​​‌​‌‌‌‌‌‌‌​​‌‍​​‌‌​​​‌‌‌‌​​‌​‍​‌​‌‌​‌​‌​‌‌‌‌​‍​‌​‌​​‌‌​​‌​‌‌‌‍​​​‌​​‌​‌‌‌‌​‌‌‍​​​​‌​​​‌‌‌‌‌‌‌‍​‌​‌‌​​‌​‌​‌​‌​‍​‌‌​‌‌‌​‌​‌‌​​‌​‍​​​​​​​‌​​‌​​​‌‍​‌‌​​​‌‌‌‌‌​​​‌‍​‌‌​​​​‌​​​​​​​‍​​​‌​‌​‌‌​‌​‌‌‌‍​​‌‌‌‌‌‌‌‌​​‌​‍​​​​​​​​‌‌‌‌​​‌‌‍​​​‌​‌​‌‌​​‌‌‌​‍‌​​‌‌‌‌​‍‌​​‌‌​‌‌‍‌​​‌​​‌​‍‌​​‌​‌‌​‍‌​​‌​​​‌‍​‌‌​​​‌​‌‌‌​​​‌‍‌‌​​‌‌​‌‍‌‌​​‌‌‌‌‍‌‌​​‌‌‌​‍‌‌​​​‌‌‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌​​​‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​​‌‌‌‍​‌​‌‌​‌‌‌‌​​‌​​‍​‌‌​​​​‌​‌​​​‌‌‍​​​​​​​​‌‌‌‌​​‌‌‍​‌​‌‌​​​‌‌​​​​​‍​​‌‌​‌​​‌‌‌‌​​​‍​‌​‌​​​‌‌​​‌‌‌‌‍​‌​‌​​​‌​‌‌‌‌‌‌‍​​​​​​​​‌‌‌​​‌​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌‌‍‌​​​‌‌‌‌‍‌​​​‌‌​​‍‌‌​​​‌​‌‍‌​‌​​​‌‌‍‌​‌​​​‌‌‍‌​​‌​‌‌​‍‌​​‌​‌​​‍‌​​‌​‌‌​‍‌​​​‌​​​‍‌​​‌​‌‌​‍‌‌​‌​​​‌‍‌​​‌​​‌​‍‌​​‌‌​‌​‍‌​‌​​​‌‌‍‌​​‌‌‌‌​‍‌​​​‌‌​‌‍‌​​‌‌‌​​‍‌​​‌​‌‌‌‍‌​​‌​‌‌​‍‌​​​‌​​‌‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌​‌​​​‌‌‍‌‌​​‌​‌​‍‌‌​​​‌‌‌‍‌‌​​‌‌‌​‍‌‌​‌​​​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​‌​​‌​‍‌​​‌​​‌‌

相关定义

按照代理类型的不同,可以将Squid 代理分为正向代理和反向代理,正向代理中,根据实现方式的不同,又可以分为普通代理和透明代理。

  • 标准正向代理:需要客户机在浏览器中指定代理服务器的地址、端口;
  • 透明代理:适用于企业的网关主机(共享接入Internet)中,客户机不需要指定代理服务器地址、端口等信息,代理服务器需要设置防火墙策略将客户机的Web访问数据转交给代理服务程序处理;
  • 反向代理:是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

安装过程

在线安装

Redhat/CentOS

yum -y install epel-release
yum -y install squid

Debian/Ubuntu

sudo apt-get update
sudo apt-get install squid

离线安装

源码编译安装

以squid-3.5.28为例:

wget http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.28.tar.bz2
tar -jxf squid-3.5.28.tar.bz2
cd squid-3.5.28
./configrue --prefix=/usr/local/squid/
make
make install

离线安装包

所有离线包可去https://pkgs.org/查找并下载

Redhat/CentOS

Squid-3.5.20为例,其所需的依赖包如下,

libecap-1.0.0-1.el7.x86_64.rpm
libtool-ltdl-2.4.2-22.el7_3.x86_64.rpm
perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64.rpm
perl-Compress-Raw-Zlib-2.061-4.el7.x86_64.rpm
perl-Data-Dumper-2.145-3.el7.x86_64.rpm
perl-DBI-1.627-4.el7.x86_64.rpm
perl-Digest-1.17-245.el7.noarch.rpm
perl-Digest-MD5-2.52-3.el7.x86_64.rpm
perl-IO-Compress-2.061-2.el7.noarch.rpm
perl-Net-Daemon-0.48-5.el7.noarch.rpm
perl-PlRPC-0.2020-14.el7.noarch.rpm
squid-3.5.20-12.el7.x86_64.rpm
squid-migration-script-3.5.20-12.el7.x86_64.rpm

将以上RPM包放到同一目录下,在当前目录下离线安装:

yum localinstall *.rpm
Debian/Ubuntu

提前准备好离线安装包:

squid_3.5.12-1ubuntu7.5_amd64.deb

本地安装:

dpkg -i squid_3.5.12-1ubuntu7.5_amd64.deb

配置内容

配置文件/etc/squid/squid.conf,内容如下:

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localnet
http_access allow localhost
http_access deny all
http_port 3128
coredump_dir /var/spool/squid
refresh_pattern ^ftp:        1440    20%    10080
refresh_pattern ^gopher:    1440    0%    1440
refresh_pattern -i (/cgi-bin/|\?) 0    0%    0
refresh_pattern .        0    20%    4320

常用的Squid服务程序配置参数以及作用:

参数作用
http_port 3128监听的端口号
cache_mem 64M内存缓冲区的大小
cache_dir ufs /var/spool/squid 2000 16 256硬盘缓冲区的大小
cache_effective_user squid设置缓存的有效用户
cache_effective_group squid设置缓存的有效用户组
dns_nameservers [IP地址]一般不设置,而是用服务器默认的DNS地址
cache_access_log /var/log/squid/access.log访问日志文件的保存路径
cache_log /var/log/squid/cache.log缓存日志文件的保存路径
visible_hostname linuxprobe.com设置Squid服务器的名称

应用场景

Squid服务器和客户端的操作系统和IP地址信息:

主机名称操作系统IP地址
Squid服务器CentOS 7外网卡:桥接DHCP模式 内网卡:172.16.1.150
Squid客户端CentOS 7172.16.1.100(仅主机模式)

两台虚拟机的网络模式均为仅主机模式(无法连接外网),且服务器端添加一块桥接模式的外网网卡。这样配置好后,服务端能够连外网,客户端无法连接外网。

标准正向代理

在标准正向代理模式中,用户需要在浏览器或其他软件中配置代理服务器地址、端口号等信息,所有访问将通过代理服务器转发出去。

  • 客户端测试连接外网,正常情况下应无法连接外网:
[root@linux_100 ~]# curl www.baidu.com -I
curl: (6) Could not resolve host: www.baidu.com; Unknown error
  • 服务端配置Squid代理服务,修改如下参数,其余保持默认参数不变:
[root@linux_150 ~]# vim /etc/squid.conf
......
http_port 172.16.1.150:3128     //只在单IP地址上提供服务
[root@linux_150 ~]# systemctl start squid
[root@linux_150 ~]# netstat -ntpl | grep 3128
tcp6       0      0 :::3128       :::*          LISTEN    2513/(squid-1)
  • 客户端配置全局代理
[root@linux_100 ~]# cat >/etc/profile.d/proxy.sh<<'EOF'
export http_proxy=http://172.16.1.150:3128
EOF
[root@linux_100 ~]# source /etc/profile
  • 客户端再次测试,对比返回结果,发现已经能正常访问外网:
[root@linux_100 ~]# curl www.baidu.com -I
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Content-Length: 277
Content-Type: text/html
Date: Tue, 23 Oct 2018 15:13:31 GMT
ETag: "575e1f80-115"
Last-Modified: Mon, 13 Jun 2016 02:50:40 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
X-Cache: MISS from linux_150
X-Cache-Lookup: MISS from linux_150:3128
Via: 1.1 linux_150 (squid/3.5.20) #通过linux_150上的squid代理访问
Connection: keep-alive

透明正向代理

在透明代理模式中,用户无须在浏览器或其他软件中配置代理服务器地址、端口号等信息,而是由DHCP服务器将网络配置信息分配给客户端主机。这样只要用户打开浏览器便会自动使用代理服务了。本次实验使用iptables的snat技术来模拟网关服务器的代理过程。

  • 将客户端恢复至最初状态,取消全局代理配置,确保无法连接上网,此时域名也无法解析。
[root@linux_100 ~]# curl www.baidu.com -I
curl: (6) Could not resolve host: www.baidu.com; Unknown error
[root@linux_100 ~]# ping  www.baidu.com
ping: www.baidu.com: Name or service not known
  • 服务端配置路由转发:
[root@linux_150 ~]# iptables -F && iptables -t nat -F
[root@linux_150 ~]# setenforce 0
[root@linux_150 ~]# iptables -t nat -A POSTROUTING -p udp --dport 53 -o eth0 -j MASQUERADE
[root@linux_150 ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@linux_150 ~]# sysctl -p 
net.ipv4.ip_forward = 1
  • 客户端再次测试,与第一次测试结果相对比,发现虽然依旧连不通外网,但域名已经能够正常解析了:
[root@linux_100 ~]# curl www.baidu.com -I
curl: (7) Failed connect to www.baidu.com:80; Operation now in progress
[root@linux_100 ~]# ping www.baidu.com
PING www.a.shifen.com (180.97.33.107) 56(84) bytes of data.
^C
--- www.a.shifen.com ping statistics ---
64 packets transmitted, 0 received, 100% packet loss, time 63239ms
  • 服务端配置Squid代理服务,修改如下:增加参数transparent(透明):
[root@linux_150 ~]# vim /etc/squid.conf
......
# Squid normally listens to port 3128
http_port 172.16.1.150:3128 transparent  //只在单IP地址上提供服务,且模式为透明
[root@linux_150 ~]# systemctl restart squid
[root@linux_150 ~]# netstat -ntpl | grep 3128
tcp6       0      0 :::3128       :::*          LISTEN    2574/(squid-1)
  • 服务器配置iptables转发策略。eth0为桥接网卡,192.168.0.103为eth0的IP地址
[root@linuxprobe ~]# iptables -t nat -A PREROUTING  -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
[root@linuxprobe ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to 192.168.0.103
[root@linuxprobe ~]# service iptables save
  • 客户端再行测试,发现已经能够正常访问外网了:
[root@linux_100 ~]# ping www.baidu.com
PING www.a.shifen.com (180.97.33.107) 56(84) bytes of data.
64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=1 ttl=53 time=16.6 ms
64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=2 ttl=53 time=19.6 ms
64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=3 ttl=53 time=17.1 ms
64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=4 ttl=53 time=47.6 ms
^C
--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3022ms
rtt min/avg/max/mdev = 16.686/25.300/47.679/12.971 ms
[root@linux_100 ~]# curl www.baidu.com -I
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Content-Length: 277
Content-Type: text/html
Date: Tue, 23 Oct 2018 16:10:55 GMT
ETag: "575e1f7b-115"
Last-Modified: Mon, 13 Jun 2016 02:50:35 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
X-Cache: MISS from linux_150
X-Cache-Lookup: MISS from linux_150:0
Via: 1.1 linux_150 (squid/3.5.20)
Connection: keep-alive

反向代理

反向代理是Squid服务程序的一种重要模式,其原理是指让多台节点主机反向缓存网站数据,从而加快用户访问速度。因为一般来讲,网站中会普遍加载大量的文字、图片等静态资源,而且它们相对来说都是比较稳定的数据信息,当用户发起网站页面中这些静态资源的访问请求时,我们可以使用Squid服务程序提供的反向代理模式来进行响应。而且,如果反向代理服务器中恰巧已经有了用户要访问的静态资源,则直接将缓存的这些静态资源发送给用户,这不仅可以加快用户的网站访问速度,还在一定程度上降低了网站服务器的负载压力。

使用Squid服务程序来配置反向代理服务,需要用到源站服务器的IP地址(源服务器需要开启反向代理以及关闭CDN等防护)。需要修改的配置如下所示:

[root@linux_150 ~]# vim /etc/squid/squid.conf
………………省略部分输出信息……………… 
 # Squid normally listens to port 3128
http_port 您的桥接网卡IP地址:80 vhost
cache_peer 网站源服务器IP地址 parent 80 0 originserver

………………省略部分输出信息………………
[root@linux_150 ~]# systemctl restart squid

此次演示使用自己的博客地址做演示。启动代理服务器后,访问Squid服务端桥接网卡IP,会发现访问正常且跳转到了博客地址。

[root@linux_150 ~]# curl http://10.100.2.35 -I
HTTP/1.1 301 Moved Permanently
Server: nginx/1.15.3
Date: Wed, 24 Oct 2018 01:21:21 GMT
Content-Type: text/html
Content-Length: 185
Location: http://www.ikiwi.me/
X-Cache: MISS from linux_150
X-Cache-Lookup: MISS from linux_150:80
Via: 1.1 linux_150 (squid/3.5.20)
Connection: keep-alive
文章目录