Squid代理服务器应用
- 1.Squid代理服务器
- 1.1 正向代理的工作机制
- 1.2 代理服务器的概念及其作用
- 1.3 代理服务器主要作用
- 1.4 Squid代理的类型
- 2.CDN
- 2.1 CDN概述
- 2.2 CDN优势
- 2.3 CDN对网络的优化作用
- 2.4 CDN访问过程
- 2.5 CDN网络的组成要素
- 3.安装Squid服务
- 3.1 使用脚本启动和关闭squid服务
- 3.2 使用supervisor命令启动和关闭squid服务
- 4.搭建传统代理服务器
- 4.1 安装nginx服务端
- 4.2 搭建squid代理服务器
- 5.搭建透明代理服务器
- 5.1 nginx服务器配置
- 5.2 网关服务器配置
- 5.3 客户端配置
- 6.ACL访问控制
1.Squid代理服务器
Squid主要提供缓存加速、应用层过滤控制的功能。
1.1 正向代理的工作机制
(1)代替客户机向网站请求数据,从而可以隐藏用户的真实IP地址。
(2)将获得的网页数据(静态Web元素)保存到缓存中并发送给客户机,以便下次请求相同的数据时快速响应。
1.2 代理服务器的概念及其作用
代理服务器是一个位于客户端和原始(资源)服务器之间的服务器,为了从原始服务器取得内容,客户端向代理服务器发送一个请求并指定目标原始服务器,然后代理服务器向原始服务器转交请求并将获得的内容返回给客户端。
缓存代理对于Web至关重要,尤其对于大型高负载Web站点。缓存可作为性能优化的一个重要手段,可以极大减轻后端服务器的负载。通常对于静态资源,即较少经常更新的资源,如图片,css或js等进行缓存,从而在每次刷新浏览器的时候,不用重新请求,而是从缓存里面读取,这样就可以减轻服务器的压力。
1.3 代理服务器主要作用
资源获取:代替客户端实现从原始服务器的资源获取;
加速访问:代理服务器可能离原始服务器更近,从而起到一定的加速作用;
缓存作用:代理服务器保存从原始服务器所获取的资源,从而实现客户端快速的获取;
隐藏真实地址:代理服务器代替客户端去获取原始服务器资源,从而隐藏客户端真实信息。
Squid Nginx Varnish CDN
1.4 Squid代理的类型
- 传统代理:适用于Internet正向代理,需在客户机指定代理服务器的地址和端口。
- 透明代理:客户机不需指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将Web访问重定向给代理服务器处理。
- 反向代理:如果Squid反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端;否则反向代理服务器将向后台的WEB服务器请求资源,然后将请求的应答返回给客户端,同时也将该应答缓存在本地,供下一个请求者使用。
2.CDN
2.1 CDN概述
CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的Internet中增加一层新的CACHE(缓存)层,将网站的内容发布到最接近用户的网络”边缘“的节点,使用户可以就近取得所需的内容(就近原则),提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因,提高用户访问网站的响应速度。
简单的说,CDN的工作原理就是将源站的资源缓存到位于全球各地的CDN节点上,用户请求资源时,就近返回节点上缓存的资源,而不需要每个用户的请求都发送到源站获取,避免网络拥塞、缓解源站压力,保证用户访问资源的速度和体验。
2.2 CDN优势
(1)CDN节点解决了跨运营商和跨地域访问的问题,访问延时大大降低;
(2)大部分请求在CDN边缘节点完成,CDN起到了分流作用,减轻了源站的负载。
2.3 CDN对网络的优化作用
- 解决服务器端的“第一公里”问题
- 缓解甚至消除了不同运营商之间互联的瓶颈造成的影响
- 减轻了各省的出口带宽压力
- 缓解了骨干网的压力
- 优化了网上热点内容的分布
2.4 CDN访问过程
(1)用户输入访问的域名,操作系统向LocalDns查询域名的ip地址.
(2)LocalDns向ROOT DNS查询域名的授权服务器(这里假设LocalDns缓存过期)
(3)ROOT DNS将域名授权dns记录回应给LocalDns
(4)LocalDns得到域名的授权dns记录后,继续向域名授权dns查询域名的ip地址
(5)域名授权dns查询域名记录后(一般是CNAME),回应给LocalDns
(6)LocalDns得到域名记录后,向智能调度DNS查询域名的ip地址
(7)智能调度DNS根据一定的算法和策略(比如静态拓扑,容量等),将最适合的CDN节点ip地址回应给LocalDns
(8)LocalDns将得到的域名ip地址,回应给用户端
(9)用户得到域名ip地址后,访问站点服务器
(10)CDN节点服务器应答请求,将内容返回给客户端.(缓存服务器一方面在本地进行保存,以备以后使用;二方面把获取的数据返回给客户端,完成数据服务过程)
通过以上的分析我们可以得到,为了实现对普通用户透明(使用缓存后用户客户端无需进行任何设置)访问,需要使用DNS(域名解析)来引导用户来访问Cache服务器,以实现透明的加速服务. 由于用户访问网站的第一步就是域名解析,所以通过修改dns来引导用户访问是最简单有效的方式.
2.5 CDN网络的组成要素
对于普通的Internet用户,每个CDN节点就相当于一个放置在它周围的网站服务器. 通过对dns的接管,用户的请求被透明地指向离他最近的节点,节点中CDN服务器会像网站的原始服务器一样,响应用户的请求. 由于它离用户更近,因而响应时间必然更快.
CDN层位于用户端和站点服务器之间.
-
智能调度DNS(比如f5的3DNS)
智能调度DNS是CDN服务中的关键系统.当用户访问加入CDN服务的网站时,域名解析请求将最终由 “智能调度DNS”负责处理。它通过一组预先定义好的策略,将当时最接近用户的节点地址提供给用户,使用户可以得到快速的服务。同时它需要与分布在各地的CDN节点保持通信,跟踪各节点的健康状态、容量等信息,确保将用户的请求分配到就近可用的节点上. -
缓存功能服务
负载均衡设备(如lvs,F5的BIG/IP)
内容Cache服务器(如squid)
共享存储
3.安装Squid服务
###关闭和禁止防火墙开机自启功能
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
(1)编译安装Squid
yum -y install gcc gcc-c++ make
cd /opt
rz -E
#squid-3.5.28.tar.gz
tar xf squid-3.5.28.tar.gz -C /opt/
cd /opt/squid-3.5.28
./configure --prefix=/usr/local/squid \ #指定安装目录路径
--sysconfdir=/etc \ #指定配置文件路径
--enable-arp-acl \ #MAC地址管控,防止客户端使用IP欺骗
--enable-linux-netfilter \ #使用内核过滤
--enable-linux-tproxy \ #支持透明模式
--enable-async-io=100 \ #异步IO,提升存储性能
--enable-err-language="Simplify_Chinese" \ #错误信息的显示语言
--enable-underscore \ #允许URL中有下划线
--disable-poll \ #关闭默认使用 poll 模式
--enable-epoll \ #开启epoll模式提升性能
--enable-gnuregex #使用GNU正则表达式
----------------------------------------------------------------------------------------------------------
./configure --prefix=/usr/local/squid \
--sysconfdir=/etc \
--enable-arp-acl \
--enable-linux-netfilter \
--enable-linux-tproxy \
--enable-async-io=100 \
--enable-err-language="Simplify_Chinese" \
--enable-underscore \
--disable-poll \
--enable-epoll \
--enable-gnuregex
make && make -j2 install
(2)制作squid的软链接,便于系统能够识别squid服务
ln -s /usr/local/squid/sbin/* /usr/local/sbin/
useradd -M -s /sbin/nologin squid
chown -R squid:squid /usr/local/squid/var/ #此目录用于存放缓存文件
(3)修改Squid的配置文件
vim /etc/squid.conf
......
--56行--插入
http_access allow all #放在http_access deny all之前,允许任意客户机使用代理服务,控制规则自上而下匹配
http_access deny all
http_port 3128 #用来指定代理服务监听的地址和端口(默认的端口号为 3128)
--61行--插入
cache_effective_user squid #添加,指定程序用户,用来设置初始化、运行时缓存的账号,否则启动不成功
cache_effective_group squid #添加,指定账号基本组
coredump_dir /usr/local/squid/var/cache/squid #指定缓存文件目录
(4)Squid的运行控制
#检查配置文件语法是否正确
squid -k parse
#启动Squid,第一次启动Squid服务时,会自动初始化缓存目录
squid -z #-z选项用来初始化缓存目录
squid #启动squid服务
netstat -anpt | grep squid
3.1 使用脚本启动和关闭squid服务
vim /etc/init.d/squid
#!/bin/bash
#chkconfig: 2345 90 25
PID="/usr/local/squid/var/run/squid.pid"
CONF="/etc/squid.conf"
CMD="/usr/local/squid/sbin/squid"
case "$1" in
start)
netstat -natp | grep squid &> /dev/null
if [ $? -eq 0 ]
then
echo "squid is running"
else
echo "正在启动 squid..."
$CMD
fi
;;
stop)
$CMD -k kill &> /dev/null
rm -rf $PID &> /dev/null
;;
status)
[ -f $PID ] &> /dev/null
if [ $? -eq 0 ]
then
netstat -natp | grep squid
else
echo "squid is not running"
fi
;;
restart)
$0 stop &> /dev/null
echo "正在关闭 squid..."
$0 start &> /dev/null
echo "正在启动 squid..."
;;
reload)
$CMD -k reconfigure
;;
check)
$CMD -k parse
;;
*)
echo "用法:$0{start|stop|status|reload|check|restart}"
;;
esac
#2345是默认自启动级别,如是-代表任何级别都不自启动;90是启动优先级,25是停止优先级,优先级范围是0-100,数字越大,优先级越低。
chmod +x /etc/init.d/squid
chkconfig --add squid
chkconfig --level 35 squid on
3.2 使用supervisor命令启动和关闭squid服务
(1)安装supervisor工具
yum install -y epel-release
yum install -y supervisor
注意:
使用yum安装的supervisor会在/etc/目录下,生成一个supervisord.conf 文件及一个supervisor.d文件目录。
(2)修改/etc/supervisord.conf配置文件
vim /etc/supervisord.conf
###取消第5行前面的;号注释,并修改权限为766
chmod=0766
###取消第129行的;号注释,并在130行添加下面内容
files = /etc/supervisord.d/*.conf
(3)添加squid服务的进程管理配置文件/etc/supervisord.d/squid.conf
vim /etc/supervisord.d/squid.conf
###第2行的-N -d1:表示前台启动squid服务
[program:squid]
command=/usr/local/squid/sbin/squid -N -d1
stdout_logfile=/var/log/supervisor/logs/run.log
stderr_logfile=/var/log/supervisor/logs/error.log
autostart=true
startsecs=10
autorestart=true
startretries=3
user=squid
priority=998
stdout_logfile_maxbytes=200MB
stdout_logfile_backups=20
stopasgroup=true
killasgroup=true
redirect_stderr=true
(4)启动supervisor服务
mkdir -p /var/log/supervisor/logs
systemctl start supervisord
systemctl enable supervisord
supervisord -c /etc/supervisord.conf
supervisorctl reload #重新启动配置中的所有程序
(5)使用supervisor命令启动squid服务
supervisorctl start squid #启动进程
supervisorctl status squid #查看所有进程的状态
supervisorctl stop squid #停止进程
supervisorctl restart squid #重启进程
netstat -lntp | grep squid
4.搭建传统代理服务器
4.1 安装nginx服务端
###关闭和禁止防火墙开机自启功能
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
(1)上传nginx在线源并安装nginx
cd /etc/yum.repos.d
rz -E
#nginx.repo
yum install -y nginx
(2)修改/etc/nginx/nginx.conf配置文件,关闭长连接保持功能
vim /etc/nginx/nginx.conf
###在第27行关闭长连接保持功能
keepalive_timeout 0;
(3)制作网页目录访问的数据内容
cd /usr/share/nginx/html/
echo '<h1>IP:192.168.80.40,gzy like mygirl!!!</h1>' > test.html
(4)启动nginx服务
systemctl restart nginx
systemctl enable --now nginx
systemctl status nginx
netstat -lntp | grep nginx
4.2 搭建squid代理服务器
(1)修改/etc/squid.conf配置文件,修改squid服务的缓存参数
vim /etc/squid.conf
......
http_access allow all
http_access deny all
http_port 3128
cache_effective_user squid
cache_effective_group squid
--63行--插入
cache_mem 1024 MB #指定缓存功能所使用的内存空间大小,便于保持访问较频繁的WEB对象,容量最好为4的倍数,单位为MB,一般设为物理内存的1/3
cache_swap_high 95 #cache目录使用量大于95%时,开始清理旧的cache
cache_swap_low 90 #cache目录清理到90%时停止
reply_body_max_size 100 MB #允许用户下载的最大文件大小,以字节为单位,当下载超过指定大小的Web对象时,浏览器的报错页面中会出现“请求或访问太大”的提示默认设置0表示不进行限制
maximum_object_size 512000 KB #设置squid磁盘缓存最大文件,以KB为单位,超过的文件不保存到硬盘,而是直接转发给用户
maximum_object_size_in_memory 512 KB #设置squid内存缓存最大文件,超过的文件不保存到内存
minimum_object_size 0 KB #设置squid磁盘缓存最小文件
(2)重新启动squid服务
squid -k parse #检查配置文件是否正确
supervisorctl restart squid
netstat -lntp | grep squid
(3)修改防火墙规则,开通squid服务的3128端口
#生产环境中还需要修改防火墙规则
iptables -F
iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
(4)使用客户端验证squid服务的代理
设置客户端与服务端位于同一网段内;
客户机的代理配置,打开浏览器,工具–>Internet选项–>连接–>局域网设置–>开启代理服务器(地址:Squid服务器IP地址,端口:3128)
客户端浏览器访问;
http://192.168.80.40/test.html
squid正向代理服务器,查看Squid访问日志的新增记录中的缓存命中情况;
tail -f /usr/local/squid/var/logs/access.log
服务端查看Web访问日志的新增记录;
tail -f /var/log/nginx/access.log
#在浏览器输入Web服务器IP地址访问,查看Web服务器访问日志,显示的是由代理服务器替客户机在访问。
(5)重新在打开一台linux虚拟机进行访问验证测试;
linux客户端没有连接代理服务器,访问web页面的情况;
linux客户端连接代理服务器后,访问web页面的情况;
开启代理服务器:常规-网络设置
相应于HTTP请求,下列标签可能出现在access.log文件的第四个域
TCP_HIT #Squid发现请求资源的貌似新鲜的拷贝,并将其立即发送到客户端
TCP_MISS #Squid没有请求资源的cache拷贝
TCP_REFERSH_HIT(squid3.0改为TCP_REFRESH_UNMODIFIED) #Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。原始服务器返回304(未修改)响应,指示squid的拷贝仍旧是新鲜的。
TCP_REF_FAIL_HIT #Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。然而,原始服务器响应失败,或者返回的响应Squid不能理解。在此情形下,squid发送现有cache拷贝(很可能是陈旧的)到客户端
TCP_REFRESH_MISS(squid3.0改为TCP_REFRESH_MODIFIED) #Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。原始服务器响应新的内容,指示这个cache拷贝确实是陈旧的
TCP_CLIENT_REFRESH_MISS #Squid发现了请求资源的拷贝,但客户端的请求包含了Cache-Control: no-cache指令。Squid转发客户端的请求到原始服务器,强迫cache确认
TCP_IMS_HIT #客户端发送确认请求,Squid发现更近来的、貌似新鲜的请求资源的拷贝。Squid发送更新的内容到客户端,而不联系原始服务器。
TCP_SWAPFAIL_MISS #Squid发现请求资源的有效拷贝,但从磁盘装载它失败。这时squid发送请求到原始服务器,就如同这是个cache丢失一样。
TCP_NEGATIVE_HIT #在对原始服务器的请求导致HTTP错误时,Squid也会cache这个响应。在短时间内对这些资源的重复请求,导致了否命中。negative_ttl 指令控制这些错误被cache的时间数量。请注意这些错误只在内存cache,不会写往磁盘。下列HTTP状态码可能导致否定cache(也遵循于其他约束): 204, 305, 400, 403, 404, 405, 414, 500, 501, 502, 503, 504
TCP_MEM_HIT #Squid在内存cache里发现请求资源的有效拷贝,并将其立即发送到客户端。注意这点并非精确的呈现了所有从内存服务的响应。例如,某些cache在内存里,但要求确认的响应,会以TCP_REFRESH_HIT, TCP_REFRESH_MISS等形式记录
TCP_DENIED #因为http_access或http_reply_access规则,客户端的请求被拒绝了。注意被http_access拒绝的请求在第9域的值是NONE/-,然而被http_reply_access拒绝的请求,在相应地方有一个有效值
TCP_OFFLINE_HIT #当offline_mode激活时,Squid对任何cache响应返回cache命中,而不用考虑它的新鲜程度
TCP_REDIRECT #重定向程序告诉Squid产生一个HTTP重定向到新的URI(见11.1节)。正常的,Squid不会记录这些重定向。假如要这样做,必须在编译squid前,手工定义LOG_TCP_REDIRECTS预处理指令
NONE #无分类的结果用于特定错误,例如无效主机名
相应于ICP查询,下列标签可能出现在access.log文件的第四域
UDP_HIT #Squid在cache里发现请求资源的貌似新鲜的拷贝
UDP_MISS #Squid没有在cache里发现请求资源的貌似新鲜的拷贝。假如同一目标通过HTTP请求,就可能是个cache丢失。请对比UDP_MISS_NOFETCH
UDP_MISS_NOFETCH #跟UDP_MISS类似,不同的是这里也指示了Squid不愿去处理相应的HTTP请求。假如使用了-Y命令行选项,Squid在启动并编译其内存索引时,会返回这个标签而不是UDP_MISS
UDP_DENIED #因为icp_access规则,ICP查询被拒绝。假如超过95%的到某客户端的ICP响应是UDP_DENIED,并且客户端数据库激活了(见附录A),Squid在1小时内,停止发送任何ICP响应到该客户端。若这点发生,你也可在cache.log里见到一个警告
UDP_INVALID #Squid接受到无效查询(例如截断的消息、无效协议版本、URI里的空格等)。Squid发送UDP_INVALID响应到客户端
5.搭建透明代理服务器
5.1 nginx服务器配置
nginx服务器端修改网卡配置
vim /etc/sysconfig/network-scripts/ifcfg-ens33
###按照拓扑图架构修改网卡配置
IPADDR=12.0.0.40
NETMASK=255.255.255.0
GATEWAY=12.0.0.20
###重新启动nginx服务器和网卡服务
systemctl restart network nginx
systemctl restart nginx
5.2 网关服务器配置
网关服务器添加一张新的网卡
修改网关服务器的内网网卡配置
vim /etc/sysconfig/network-scripts/ifcfg-ens33
###删除网关地址和DNS地址
GATEWAY=192.168.80.2
DNS1=192.168.80.2
修改网关服务器的外网网卡配置
cd /etc/sysconfig/network-scripts
cp ifcfg-ens33 ifcfg-ens35
vim /etc/sysconfig/network-scripts/ifcfg-ens35
###修改外网网卡名称和IP地址,删除UUID
NAME=ens35
DEVICE=ens35
ONBOOT=yes
IPADDR=12.0.0.20
NETMASK=255.255.255.0
开启网关服务器的路由转发功能
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
添加网关服务器的重定向改写规则
iptables -F && iptables -t nat -F
iptables -nL -t nat
iptables -t filter -A INPUT -p tcp --dport 3128 -j ACCEPT
iptables -t nat -A PREROUTING -i ens33 -s 192.168.80.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 3128
iptables -t nat -A PREROUTING -i ens33 -s 192.168.80.0/24 -p tcp --dport 443 -j REDIRECT --to-ports 3128
iptables -nL -t nat
修改/etc/squid.conf的监听地址
vim /etc/squid.conf
###修改59行,监听内网网卡地址
http_port 192.168.80.20:3128 transparent
重启squid服务
supervisorctl reload
supervisorctl restart squid
netstat -lntp | grep squid
5.3 客户端配置
客户端的网关地址修改为网关服务器内网网卡的IP地址
客户端访问验证
切记:此时客户端一定要先关闭代理服务器功能;
http://12.0.0.40/test.html
在服务器端追踪日志查看访问路径信息
tail -f /var/log/nginx/access.log
在网关服务器端追踪日志查看访问路径信息
tail -f /usr/local/squid/var/logs/access.log
6.ACL访问控制
在/etc/squid.conf配置文件中,添加acl拒绝访问规则
vim /etc/squid.conf
###在26行添加拒绝的访问要求
acl deny_host src 192.168.80.120
http_access deny deny_host
###也可以指定具有特殊地址的文件进行加载,/usr/local/squid/hostlist文件中保存有大量拒绝访问的IP地址
#acl deny_host src "/usr/local/squid/hostlist"
#http_access deny deny_host
重新启动squid服务
supervisorctl reload
supervisorctl restart squid
netstat -lntp | grep squid
客服端访问验证
http://12.0.0.40/test.html