Squid是Web的缓存代理,支持HTTP,HTTPS,FTP等。通过缓存和重用经常请求的网页,它减少了带宽并缩短了响应时间。Squid具有广泛的访问控制,是一个出色的服务器加速器。它可以在大多数可用的操作系统(包括Windows)上运行,并且已获得GNU GPL的许可。
Squid 有三种代理类型:
传统代理:也叫做正向代理,适用internet,需要明确指定服务端
透明代理:客户机不需要指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将Web访问重定向给代理服务器处理
反向代理:反向代理也就是通常所说的WEB服务器加速,它是一种通过在繁忙的WEB服务器和Internet之间增加一个高速的WEB缓冲服务器(即:WEB反向代理服务器)来降低实际的WEB服务器的负载
① 传统代理缓冲服务器
前提条件
工作流程
② 透明代理缓冲服务器
与传统代理服务器区别
工作流程
③ 反向代理缓冲服务器
以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从内部服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外表现为一个服务器。
作用
① 可以降低原始WEB服务器的负载。
② 反向代理服务器承担了对原始WEB服务器的静态页面的请求,防止原始服务器过载。
③ 它位于WEB服务器和Internet之间,阻止了WEB服务器和Internet的直接通信。
工作流程
正向代理(本地网关)
透明代理(cdn,架设于网络运营商主干机房)
反向代理(网站前端)
squid主要组成部分
服务名:squid
主程序:/usr/sbin/squid
配置目录:/etc/squid
主配置文件:/etc/squid/squid.conf
监听tcp端口号:3128
默认访问日志文件:/var/log/squid/access.log
两台centos虚拟机、一台win10虚拟机
一台作为Squid服务器,IP地址为: 192.168.226.128,NAT模式
主要软件:squid-3.5.27.tar.gz
一台作为web服务器,IP地址为:192.168.226.132,NAT模式
主要软件:Apache
win10作为Client测试机,NAT模式
主要软件:谷歌浏览器
[root@squid ~]# mount.cifs //192.168.226.1/LAMP-C7 /mnt
Password for root@//192.168.226.1/LAMP-C7:
[root@squid ~]# cd /mnt
[root@squid ~]# tar zxvf squid-3.4.6.tar.gz -C /opt
.....省略部分内容
[root@squid ~]# cd /opt/squid-3.4.6
[root@squid squid-3.4.6]# yum install gcc gcc-c++ -y
[root@squid squid-3.4.6]# ./configure \
--prefix=/usr/local/squid \ #安装路径
--sysconfdir=/etc \ #配置文件目录
--enable-arp-acl \ #支持acl访问控制列表
--enable-linux-netfilter \ #内核过滤
--enable-linux-tproxy \ #支持透明模式
--enable-async-io=100 \ #io优化
--enable-err-language="Simplify_Chinese" \ #支持简体中文报错提示
--enable-underscore \ #在url中支持下划线
--enable-poll \ #poll 关闭默认适用poll模式,开启epoll模式提升性能
--enable-gnuregex #支持正则表达
[root@squid squid-3.4.6]# make && make install
......省略部分内容
[root@squid squid-3.4.6]# ln -s /usr/local/squid/sbin/* /usr/local/sbin
[root@squid squid-3.4.6]# useradd -M -s /sbin/nologin squid
[root@squid squid-3.4.6]# chown -R squid.squid /usr/local/squid/var
[root@squid squid-3.4.6]# vim /etc/squid.conf
#56行 添加允许所有
http_access allow all
#http_access deny all
#61行 添加:指定程序用户
#62行 添加:指定账号用户
cache_effective_user squid
cache_effective_group squid
#68行为容灾文件目录
coredump_dir /usr/local/squid/var/cache/squid
-----》wq
#检查语法
[root@squid squid-3.4.6]# squid -k parse
.....省略部分内容
#初始化缓存
[root@squid squid-3.4.6]# squid -z
[root@squid squid-3.4.6]# squid
2020/03/22 21:53:35 kid1| Set Current Directory to /usr/local/squid/var/cache/squid
2020/03/22 21:53:35 kid1| Creating missing swap directories
2020/03/22 21:53:35 kid1| No cache_dir stores are configured.
[root@squid squid-3.4.6]# netstat -natp | grep 3128
tcp6 0 0 :::3128 :::* LISTEN 4387/(squid-1)
[root@squid squid-3.4.6]# cd /etc/init.d/
[root@squid init.d]# vim squid
#!/bin/bash
#chkconfig: 2345 90 25
PID="/usr/local/squid/var/run/squid.pid" #PID文件squid运行进程号
CONF="/etc/squid.conf" #主配置文件'
CMD="/usr/local/squid/sbin/squid" #启动命令
case "$1" in
start)
netstat -ntap | grep squid &> /dev/null
if [ $? -eq 0 ]
then
echo "squid is running"
else
echo "正在启动 squid...."
$CMD
fi
;;
stop)
$CMD -k kill &> /dev/null #关闭squid
rm -rf $PID &> /dev/null #删除PID运行文件
;;
status)
[ -f $PID ] &> /dev/null
if [ $? -eq 0 ]
then
netstat -ntap | 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|reload|status|check|restart}"
;;
esac
---------》wq
#增加执行权限
[root@squid init.d]# chmod +x squid
# 添加到service列表
[root@squid init.d]# chkconfig --add squid
#在init 3 和init 5的模式开机自启动
[root@squid init.d]# chkconfig --level 35 squid on
[root@squid init.d]# vim /etc/squid.conf
#63-65行 添加功能
cache_mem 64 MB #自定义缓存空间大小,容量最好为4的倍数
reply_body_max_size 10 MB #允许下载最大文件大小,以字节为单位,默认设置0表示不进行限制
maximum_object_size 4096 KM #允许保存到缓存空间的最大对象的大小,以KB为单位,超过限制不会缓存,直接转到web端
------》wq
#清空防火墙表内容
[root@squid init.d]# iptables -F
#查看防火墙表内容
[root@squid init.d]# iptables -L
[root@squid init.d]# setenforce 0
#新增规则,允许3128端口通过
[root@squid init.d]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
#重载服务
[root@squid init.d]# service squid reload
firewalld 介绍可查看之前的博客:Linux基础:Firewalld防火墙基础
[root@web ~]# yum install httpd
[root@web ~]# systemctl stop firewalld.service
[root@web ~]# setenforce 0
[root@web ~]# systemctl start httpd.service
测试web页面
默认的谷歌浏览器
设置Squid代理
① 清理客户端缓存
② 手动设置代理
③ 再次访问web端
④ 查看web端httpd访问日志(查看访问源地址)
清理客户端缓存
[root@web ~]# cat /var/log/httpd/access_log
192.168.226.128 - - [23/Mar/2020:14:50:21 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "http://192.168.226.132/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
......省略部分内容
#可见访问源地址为Squid服务器的IP地址
[root@squid init.d]# cd /etc/sysconfig/network-scripts/
[root@squid network-scripts]# cp -p ifcfg-ens33 ifcfg-ens36
[root@squid network-scripts]# vi ifcfg-ens36
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens36"
DEVICE="ens36"
ONBOOT="yes"
IPADDR=192.168.200.1
NETMASK=255.255.255.0
------>wq
[root@squid network-scripts]# systemctl restart network
#查看网卡设置
[root@squid network-scripts]# ifconfig
①关闭代理服务
② 修改网卡为仅主机模式
[root@squid network-scripts]# vi /etc/sysctl.conf
#行尾添加以下内容开启路由转发功能
net.ipv4.ip_forward = 1
----》wq
#加载生效
[root@squid network-scripts]# sysctl -p
net.ipv4.ip_forward = 1
[root@squid network-scripts]# vim /etc/squid.conf
#60行 修改,添加ens36(仅主机)的地址,开启透明模式
http_port 192.168.200.1:3128 transparent
-----》wq
[root@squid network-scripts]# service squid stop
[root@squid network-scripts]# service squid start
squid is running
#设置防火墙规则
#清空规则表
[root@squid network-scripts]# iptables -F
#清空nat表内容
[root@squid network-scripts]# iptables -t nat -F
#定义规则入口(ens36网卡),http协议80端口重定向到3128端口
[root@squid network-scripts]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.200.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
#定义规则入口ens36网卡,hhttpd协议443端口重定向到3128端口
[root@squid network-scripts]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.200.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
#新增规则,允许3128端口
[root@squid network-scripts]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
#配置前,无法ping通ens36
[root@web ~]# ping 192.168.200.1
PING 192.168.200.1 (192.168.200.1) 56(84) bytes of data.
^C
#配置静态路由
[root@web ~]# route add -net 192.168.200.0/25 gw 192.168.226.128
#再次ping ens36,可以ping通
[root@web ~]# ping 192.168.200.1
PING 192.168.200.1 (192.168.200.1) 56(84) bytes of data.
64 bytes from 192.168.200.1: icmp_seq=1 ttl=64 time=0.398 ms
64 bytes from 192.168.200.1: icmp_seq=2 ttl=64 time=0.450 ms
使用client客户端访问Web端地址
在Web端查看日志
[root@web ~]# cat /var/log/httpd/access_log
#在来访日志中可见源地址为Squid的ens33IP地址
小结
透明模式中,不需要在Client开启Squid代理服务,客户端访问Web端也会显示Squid代理IP,这就是Squid透明模式的作用
本篇博客介绍了Squid代理的基础理论,介绍了传统模式、透明模式的部署,后续将继续介绍反向代理模式部署、配置ACL访问控制与sarg日志