一. 缓存代理概述
Squid 是linux 操作系统中最常用的一款开源代理服务软件, 可以很好地实现 HTTP 和FTP 以及DNS查询 SSL 等应用的缓存代理 功能十分强大
1.1 ) 代理的工作机制
当客户机通过代理来请求 Web 页面时, 指定的代理服务器会先检查自己的缓存, 如果缓存中已经有客户机需要的页面, 则直接将缓存中的页面内容反馈给客户机;
如果缓存中没有客户机要访问的页面,则由代理服务器向 lnternet 发送访问请求,获得返回的 Web 页面后,将页面数据保存到缓存中并发送给客户机;
如图所示--
1.2) 代理的基本类型
> 传统代理: 也就是普通的代理服务 使用于 lnternet 需明确指定服务端
>透明代理: 客户机不需要指定代理服务器的地址和端口 而是通过默认路由 防火墙策略 将Web 访问重定向给代理服务器处理
1.3) 使用代理的原因及作用
缓存网页对象,减少重复请求 提高客户机的 Web 访问响应速度
1.4) 使用代理的好处
提高 Web 访问速度
隐藏客户机的真实IP地址
使用 systemctl 方式 打开/关闭Squid服务
为了使 Squid 服务的启动. 停止. 重载. 等操作更加方便 可以编写 Squid 脚本, 并使用 chkconfig 和 systemctl 工具进行管理
1) 使用 Squid 脚本
1 |
[root@localhost ~] vim /etc/init.d/squid | // 创建脚本服务 |
添加如下内容:
#!/bin/bash
# chkconfig: 35 90 25
# config file:/etc/squid.conf
# Description: squid - internet object cache.
PID="/usr/local/squid/var/run/squid.pid"
CONF="/etc/squid.conf"
CMD="/usr/local/squid/sbin/squid"
case "$1" in
start)
netstat -utpln |grep squid &>/dev/null
if [ $? -eq 0 ];then
echo "squid is running."
else
echo "squid is starting."
$CMD
fi
;;
stop)
$CMD -k kill &>/dev/null
rm -rf $PID &>/dev/null
echo "squid is stoped."
;;
status)
[ -f $PID ] &>/dev/null
if [ $? -eq 0 ];then
netstat -anpt |grep squid
else
echo "squid is not running" &&/bin/false
fi
;;
restart)
$0 stop
$0 start
;;
reload)
$CMD -k reconfigure
;;
check)
$CMD -k parse
;;
*)
echo "Usage:$0 {start|stop|restart|reload|check|status}"
exit 1
;;
esac
1 | [root@localhost ~]# chmod +x /etc/init.d/squid | // 为此目录添加执行权限 |
2 | [root@localhost ~]# chkconfig --add squid | // 添加为系统服务 |
3 | [root@localhost ~]# systemctl restart squid |
// 重启 Squid 服务 |
构建代理服务器
1. Squid 服务器的配置
配置 Squid 实现传统代理服务时.需要注意添加 http_access allow all 访问策略 以便允许任意客户机使用代理服务. 初次之外 为了限制下载的文件大小,还需要设置 reply_body_max_size 项, 其他各种参数可保持默认
1.1) 修改 Squid.conf 配置文件
1 | [root@localhost ~]# vim /etc/squid.conf | // 编辑 Squid 主配置文件 |
2 | http_port 3128 | |
3 | reply_body_max_size 10MB | // 允许下载的最大文件大小 (10MB) |
4 | http_access allow all | // 允许任意客户机使用代理服务器 allow:允许 all:所有 |
5 | ~~~~~ // 省略部分内容 |
1.2) 重载 Squid 服务配置
修改 Squid.conf 配置文件后, 需要重新启动服务方可生效. 执行 "systemctl restart squid" or "squid -k reconfigure" 命令 都可以重新加载服务配置
客户机的代理设置:
win10 找到设置--------网络和Internet------代理------打开"使用代理服务器"------输入代理IP地址及服务端口号-----保存
2.代理服务的验证方式
在客户机中通过浏览器访问目标网站 然后观察 Sqid 代理服务器 , Web服务器的访问日志 验证代理服务是否发挥作用
2.1) 查看Squid 访问日志的新增记录
在Squid代理服务器中 通过跟踪 Squid服务的访问日志文件 应该能够发现客户机访问网站服务器的记录
1 | [root@localhost ~]# tail -f /usr/local/squid/var/logs/access.log | // Squid 代理访问日志路径 |
2.2) 查看Web 访问日志的新增路径
在被访问的 Web服务器中,通过跟踪 httpd 服务的访问日志文件 应该能够发现来自代理服务器的访问记录. 这说明当客户机使用代理后 Web并不知道客户机的真实IP地址 因为实际上是由代理服务器替客户机进行访问的
1 | [root@localhost ~]# tail -f /var/log/httpd/access_log | // httpd 服务访问日志路径 |
当客户机再次访问同一Web页面时 Squid访问日志会增加新的记录, 但Web访问日志中的记录不会有变化, 这说明当客户机重复访问同一静态页面时,实际是有代理服务器通过缓存提供的 当客户机访问Web页面时 首先去代理服务器中查找 当代理服务器中没有时 再又代理向 lnternet 查找 ,从而实现隐藏客户机真实IP地址 代理找到后缓存到自己本地 再反馈给客户机
配置Squid 透明代理
实验环境:两台Centos7 一台win7/10
1.Linux-1
squid上添加两块网卡 Vmnet1: 192.168.10.1(内网)
Vmnet8: 200.1.1.1((外网)
2.Linux-2
外网Web服务器 Vmnet8: 200.1.1.2 (不指网关)
3.Win 客户端
Vmnet1: 192.168.10.2 (指网关)
1.配置 Squid 支持透明代理
Squid 服务器默认配置并不支持透明代理 因此需要调整相关配置, 只要在 http_port 配置行添加 "transparent" (透明) 选项 即可支持透明代理 (把原先的 http_port 3128 配置行删除or覆盖 否则重启错误)
1 | [root@localhost ~]# vim /etc/squid.conf | // Squid配置文件 |
2 | 61 http_port 192.168.10.1:3128 transparent | // 使 Squid 支持透明代理 |
2.开启路由功能 实现本机中不同网段的地址转发
1 | [root@localhost ~]# vi /etc/sysctl.conf | |
2 | net.ipv4.ip_forward = 1 | // 开启路由转发功能 |
3 | [root@localhost ~]# sysctl -p | // 让上边配置立即生效 |
3. 设置 firewalld 的重定向策略
设置防火墙规则---重定向策略
15、开启防火墙,添加防火墙规则
ens33----内网网关
ens36----外网接口
[root@localhost ~]# systemctl start firewalld
[root@localhost ~]# iptables -t nat -I PREROUTING -i ens33 -s 192.168.10.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
[root@localhost ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
测试:
1.内网客户机 windows 192.168.10.2内网网关指向 Squid 服务器
浏览器访问 http://200.1.1.2 网站2.squid 服务器查看日志验证:
[root@www ~]# tail -f /usr/local/squid/var/logs/access.log3.外网web服务器查看网站验证
tail -f /var/log/httpd/access_log
当查看squid访问日志的时候,是192.168.10.2在访问
当查看web访问日志的时候,是200.1.1.1在访问web服务器