Linux 笔记 - 第十九章 配置 Squid 正向代理和反向代理服务
一、简介
Squid 是一个高性能的代理缓存服务器,对应中文的乌贼,鱿鱼的意思。Squid 支持 FTP,gopher 和 HTTP 协议。和一般的代理缓存软件不同,Squid 用一个单独的,非模块化的,I/O 驱动的进程来处理所有的客户端请求。
Squid 将数据元缓存在内存和硬盘中,同时也缓存 DNS 查询的结果。Squid 支持 SSL,支持访问控制。由于使用了 ICP(轻量 Internet 缓存协议),Squid 能够实现层叠的代理阵列,从而最大限度的节约带宽。
Squid Cache(简称 Squid)是一个流行的代理服务器和 Web 缓存服务器软件。Squid 可以做正向代理,也可以做反向代理。官方网站地址为:http://www.squid-cache.org/
1.1 正向代理
当 Squid 做正向代理时,Squid 后面是客户端,客户端想访问外部网络资源,必须经过 Squid。正向代理按其客户端配置方式不同,又可以分为标准(普通)代理模式和透明代理模式。
标准(普通)代理模式,是代理内部网络用户访问 internet 上服务器的连接请求,客户端必须指定代理服务器,并将本来要直接发送到 internet 上服务器的连接请求发送给代理服务器处理。用户在上网时必须在浏览器等软件中填写代理服务器的 IP 地址与端口号信息,否则默认不使用代理。
透明代理模式,是相对于代理服务器而言,客户端不需要做任何和代理服务器相关的设置和操作,对用户而言,感觉不到代理服务器的存在,所以称之为透明代理。即把代理服务器部署在核心的上网出口,当用户上网浏览页面时,会交给代理服务器向外请求,如果结合iptables,可以实现代理+网关+内容过滤+流量安全控制等完整的上网解决方案。
1.2 反向代理
反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从内部服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
综上,正向代理是代理客户端,为客户端收发请求,使真实客户端对服务器不可见;而反向代理是代理服务器端,为服务器收发请求,使真实服务器对客户端不可见。
二、配置 Squid 正向代理
2.1 安装 squid
可以使用源码编译安装,或者使用 yum 直接安装,如下:
[root@masternode ~]# yum install -y squid [root@masternode ~]# squid -v Squid Cache: Version 3.5.20 ......
使用 yum 安装后,系统会自动生成 squid 用户和用户组,如下:
2.2 配置 squid
可以使用 squid 默认的配置文件,因为默认的配置文件其实就已经设置了正向代理,也可以修改默认的配置文件,如下:
[root@masternode ~]# vim /etc/squid/squid.conf # 默认对外端口为3128 http_port 3128 cache_effective_user squid cache_effective_group squid # 内网控制,按需修改 acl manager proto cache_object acl localnet src 10.0.0.0/8 # RFC1918 possible internal network acl localnet src 172.16.0.0/12 # RFC1918 possible internal network acl localnet src 192.168.0.0/16 # RFC1918 possible internal network # 配置可访问的端口 acl SSL_ports port 443 acl Safe_ports port 80 8080 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT # 允许本机访问 http_access allow manager localhost http_access deny manager http_access deny !Safe_ports # 拒绝443以外的端口访问 http_access deny CONNECT !SSL_ports # 允许内网 http_access allow localnet http_access allow localhost http_access allow all # 设置缓存文件位置、cache目录容量(单位M)、一级缓存目录数量、二级缓存目录数量 cache_dir ufs /var/spool/squid 128 16 256 cache_mem 128 MB 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
其中 http_port 设置监听的端口号,cache_mem 设置内存缓冲区的大小,cache_dir 设置硬盘缓存区的大小,cache_effective_user 设置缓存的有效用户,cache_effective_group 设置缓存的有效用户组。
2.3 启动 squid
启动 squid 并检查配置文件,如下:
[root@masternode ~]# systemctl start squid
[root@masternode ~]# squid -kcheck
# squid -kcheck(可简写为 squid -kch)可以检查配置文件是否有错,修改配置建文件后,可以使用 # squid -kreconfigure(可简写为 # squid -krec)来重新加载配置文件。
2.4 验证代理
可以使用浏览器设置代理的方式,也可以直接使用 curl 命令来测试,其中 -x 选项即 --proxy,添加代理服务器地址和端口,如下:
显示了百度首页的 html 源码,说明 squid 正向代理设置成功。
然后我们再来看 squid 对图片的缓存。如下:
其中 MISS 表示丢失,HIT 表示命中。当 cache server 第一次接收到对第一个新资源的请求时,就会产生一个 cache 丢失,而 cache 命中是在 cache server 每次从它的缓存里满足客户端 HTTP 请求时发生。
我在 Windows 宿主机上面使用代理访问百度,如下:
2.5 ACL 访问控制
1)只允许 IP 地址为 192.168.0.105 的客户端使用服务器上的 squid 服务程序提供的代理服务,禁止其余所有的主机代理请求
编辑 /etc/squid/squid.conf,添加如下设置:
acl client src 192.168.0.105
http_access allow client
http_access deny all
由于虚拟机网络使用了桥接模式,今天启动 squid 服务器之后,发现 IP 地址变成了 192.168.0.107,所以代理服务器的地址就要变成这个新的地址。
宿主机的 IP 地址为 192.168.0.101,使用代理服务器访问百度时,返回 403 Forbidden,如下:
而 另一台 虚拟机 backupnode 的 IP 地址为 192.168.0.105,所以它使用代理服务器访问百度时返回 200 OK,如下:
2)禁止所有客户端访问网址中包含 taobao 关键词的网站
编辑 /etc/squid/squid.conf,添加如下设置:
acl deny_keyword url_regex -i taobao
http_access deny deny_keyword
-i 表示不区分大小写,可以看到访问的网址中包含 taobao 时,返回 403 Forbidden,如果访问不带 taobao,比如换成 baobao 时,可以正常访问,如下:
3)禁止所有客户端访问某个特定的网站
如上面所示,编辑 /etc/squid/squid.conf,添加如下设置:
acl deny_url url_regex http://www.youku.com
http_access deny deny_url
4)禁止下载带有某些后缀的文件,比如 .rar 和 .avi
编辑 /etc/squid/squid.conf,添加如下设置:
acl badfile urlpath_regex -i \.rar$ \.avi$
http_access deny badfile
如有有人使用迅雷等 P2P 下载软件来下载资源的话,就只能使用专业级的应用防火墙来禁止了。
三、配置 Squid 反向代理
网站页面是由静态资源和动态资源一起组成的,其中静态资源包括网站架构 CSS/js 文件、大量的图片、视频等数据,这些数据相对于动态资源来说更加稳定,一般不会经常发生改变。但是随着建站技术的更新换代,外加人们不断提升的审美能力,这些静态资源占据的网站空间也越来越多。如果能够把这些静态资源从网站页面中抽离出去,然后在全国各地部署静态资源的缓存节点,这样不仅可以提升用户访问网站的速度,而且网站源服务器也会因为这些缓存节点的存在而降低负载。
方向代理是 Squid 服务程序的一种重要模式,其原理是把一部分原本向网站源服务器发起的用户请求交给 Squid 服务器缓存节点来处理。但是这种技术的弊端也很明显,如果有心怀不轨的人将自己的域名和服务器反向代理到某个知名的网站上面,从理论上来讲,当用户访问到这个域名时,也会看到与那个知名网站一样的内容(有些诈骗网站就是这样骗取用户信任的)。因此,当前许多网站都默认禁止了反向代理功能。开启了 CDN(内容分发网络)服务的网站也可以避免这种窃取行为。如果访问开启了防护功能的网站,一般会提示 500 错误。
将端口号 "http_port 3128" 修改为 "http_port 80 accel vhost vport",此时正向解析会被暂停,它不能与反向代理服务同时使用,然后再增加你要代理的后端真实服务器的信息。
编辑 /etc/squid/squid.conf,添加如下设置:
# 默认对外端口为3128 #http_port 3128 # 配置反向代理 http_port 80 accel vhost vport cache_peer 14.215.177.38 parent 80 0 originserver name=baidu cache_peer 61.151.166.146 parent 80 0 originserver name=qq cache_peer_domain baidu www.baidu.com cache_peer_domain qq www.qq.com
可以看到我们分别设置代理了后面的真实服务器, baidu 和 qq。
可以正常访问 baidu(返回 200,正常) 和 qq(返回 302,要求浏览器重定向到 https。解释一下:当客户端访问 http://www.qq.com 时,先经过了 squid 反向代理服务器,由于 squid 反向代理了 www.qq.com,于是将请求转发给 61.151.166.146,真实服务器检测到该请求为 http 请求,返回 302 响应码,要求临时重定向到 https://www.qq.com)。
由于没有配置反向代理 sina 和 sohu,所以上述请求都返回 500 错误。
四、Squid 服务常用命令选项
[root@masternode squid]# squid -h Usage: squid [-cdhvzCFNRVYX] [-n name] [-s | -l facility] [-f config-file] [-[au] port] [-k signal] -a port Specify HTTP port number (default: 3128). -d level Write debugging to stderr also. -f file Use given config-file instead of /etc/squid/squid.conf -h Print help message. -k reconfigure|rotate|shutdown|restart|interrupt|kill|debug|check|parse Parse configuration file, then send signal to running copy (except -k parse) and exit. -n name Specify service name to use for service operations default is: squid. -s | -l facility Enable logging to syslog. -u port Specify ICP port number (default: 3130), disable with 0. -v Print version. -z Create missing swap directories and then exit. -C Do not catch fatal signals. -D OBSOLETE. Scheduled for removal. -F Don't serve any requests until store is rebuilt. -N No daemon mode. -R Do not set REUSEADDR on port. -S Double-check swap during rebuild. -X Force full debugging. -Y Only return UDP_HIT or UDP_MISS_NOFETCH during fast reload.
虽然命令有很多,但是常用的选项就是上面提到的 squid -k check,squid -k reconfigure 和 squid -k parse,这些命令均可以简写成:
# squid -kche(或 squid -k che),表示检查 squid.conf 配置文件是否有语法或配置错误。
# squid -krec(或 squid -k rec),表示当 squid.conf 进行过配置更改后,可以使用该命令进行 squid 配置重载,而不用重启 squid 服务,相当于热加载。
# squid -kpar(或 squid -k par),表示如果 squid.conf 有语法或配置错误,这里会返回提示你,如果没有返回,尝试启动 squid。