缓存代理概述
作为应用层的代理服务软件, Squid 主要提供缓存加速和应用层过滤控制功能.
1. 代理的工作机制
当客户机通过代理来请求 web 页面时, 指定的代理的服务器会首先检查自己的缓存, 如果缓存中已经有客户机需要访问的页面, 则直接将缓存中的页面内容反馈给客户机; 如果缓存中没有客户机需要访问的页面, 则有代理服务器向 Internet 发送访问请求, 当获得返回的 Web 页面以后, 将网页数据保存到缓存中并发送给客户机.
2. 代理的基本类型
(1)传统代理: 必须在客户机的浏览器, 下载软件等程序中手动设置代理服务器的地址和端口, 然后才能使用代理服务器来访问代理服务器.
(2)透明代理: 提供与传统代理相同的功能和服务, 器区别在于客户机不需要指定代理服务器的地址和端口, 而是通过默认路由, 防火墙策略将 Web 访问重定向.
Squid 安装包
链接: https://pan.baidu.com/s/17qg-G8L19Ch2YCSKo-3H4A 密码: 8hul
一 . 安装及运行控制
1. 编译安装 Squid
- [root@squid ~]# yum install gcc gcc-c++ make -y // 安装编译环境
- [root@squid ~]#tar zxvf squid-3.5.23.tar.gz -C /opt/ // 解压 squid 软件包
- [root@squid Y2C7]# cd /opt/squid-3.5.23/
- [root@squid squid-3.5.23]# ./configure --prefix=/usr/local/squid \ // 安装目录
- > --sysconfdir=/etc \ // 单独将配置文件修改到其他目录
- > --enable-arp-acl \ // 在规则中设置为直接通过客户端 Mac 进行管理, 防止客户端使用 IP 欺骗
- > --enable-Linux-netfilter \ // 使用内核过滤
- > --enable-Linux-tproxy \ // 支持透明模式
- > --enable-async-io=100 \ // 提升存储性能
- > --enable-err-language="Simplify_Chinese" \ // 错误信息显示语言
- > --enable-Underscore \ // 允许 URL 中有下划线
- > --enable-poll \ // 使用 Poll()模式, 提升性能
- > --enable-gnuregex // 使用 GNU 正则表达式
2. 安装完成后, 创建链接文件, 创建用户和组.
- [root@squid squid-3.5.23]# make && make install (此过程时间会很长)
- [root@squid squid-3.5.23]# ln -s /usr/local/squid/sbin/*/usr/local/sbin/
- [root@squid squid-3.5.23]# useradd -M -s /sbin/nologin squid
- [root@squid squid-3.5.23]# chown -R squid:squid /usr/local/squid/var/
3. 修改 Squid 的配置文件
- [root@squid squid-3.5.23]# VIM /etc/squid.conf
- # And finally deny all other access to this proxy
- http_access allow all
- http_access deny all
- # Squid normally listens to port 3128
- http_port 3128 // 指定默认端口为 3128
- cache_effective_user squid // 指定 squid 的程序用户, 用来设置初始化, 运行时的缓存
- cache_effective_group squid // 指定账户的基本组
4.Squid 的运行控制
(1)检查配置文件的语法是否正确
[root@squid squid-3.5.23]# squid -k parse
(2)启动, 停止 Squid
- [root@squid squid-3.5.23]# squid -z // 初始化缓存目录
- [root@squid squid-3.5.23]# 2018/09/19 14:23:40 kid1| Set Current Directory to /usr/local/squid/var/cache/squid
- 2018/09/19 14:23:40 kid1| Creating missing swap directories
- 2018/09/19 14:23:40 kid1| No cache_dir stores are configured.
- [root@squid squid-3.5.23]# squid // 启动服务
- [root@squid squid-3.5.23]# netstat -ntap | grep squid // 查看 squid 的默认端口 3128 是否开启
- tcp6 0 0 :::3128 :::* LISTEN 48596/(squid-1)
(3)使用 Squid 服务脚本. 为了使 squid 服务的启动, 停止, 重载等操作更加方便, 可以编写 Squid 的服务脚本, 并使用 chkconfig 和 service 工具进行管理
- [root@squid squid - 3.5.23]#cd / etc / init.d / [root@squid init.d]#VIM 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 - antp | gerp 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|restart|check|reload|status}";;esac
(4)给启动脚本执行权限
- [root@squid init.d]# chmod +x squid
- [root@squid init.d]# chkconfig --add squid // 将 squid 添加为系统服务
- [root@squid init.d]# chkconfig --level 35 squid on // 开机自启动
二 . 搭建 Web 服务器
安装 http 服务
- [root@localhost ~]# hostnamectl set-hostname Web
- [root@localhost ~]# bash
- [root@Web ~]# systemctl stop firewalld.service // 关闭防火墙
- [root@Web ~]# setenforce 0
- [root@Web ~]# yum install httpd -y // 安装 http 服务
启动 httpd 服务
[root@Web ~]# systemctl start httpd.service // 启动 http 服务
三 . 构建传统代理服务器
传统代理 : 使用传统代理的特点在于, 客户机的相关程序 (如 IE 浏览器) 必须指定代理服务器的地址, 端口等信息. 如图所示
1 .Squid 服务器的配置
(1)修改 squid.conf 配置文件
- [root@squid init.d]# VIM /etc/squid.conf
- # Squid normally listens to port 3128
- http_port 3128
- cache_mem 64 MB // 指定缓存功能所使用的内存空间大小, 便于保持问较频繁地 Web 对象
- reply_body_max_size 10 MB // 允许用户下载的最大文件大小
- maximum_object_size 4096 KB // 允许保存到缓存空间的最大对象大小,
- // 超过大小限制的文件将不被缓存, 而是直接发给用户
- cache_effective_user squid
- cache_effective_group squid
(2)重启 squid 服务
- [root@squid init.d]# service squid stop
- [root@squid init.d]# service squid start
- grep: $: No such file or directory
正在启动 squid...
- [root@squid init.d]# netstat -ntap |grep squid
- tcp6 0 0 :::3128 :::* LISTEN 82846/(squid-1)
(3)在防火墙上添加允许策略
- [root@squid init.d]# iptables -F // 先清空防火墙规则
- [root@squid init.d]# setenforce 0
- [root@squid init.d]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT // 允许转发
2 . 客户机代理配置
(1)在客户机上在暂时不设置代理功能, 使用客户机访问 Web 服务器,
查看 Web 访问日志的新增记录. 在被访问的的 Web 服务器中, 通过追踪 httpd 服务的访问日志文件.
- [root@Web logs]# cd /var/log/httpd/
- [root@Web httpd]# ls
- access_log error_log // 访问日志和错误日志
- [root@Web httpd]#
- [root@Web httpd]# VIM access_log // 查看访问日志
由此可以看出, 在客户端没有指定代理服务器是, 就是通过客户端直接访问 Web 服务器.
(2)客户机的代理配置, 在 IE 浏览器设置代理. 选择 工具 ---》Internet 选项 --》 连接 --》 局域网设置. 如下图所示
指定代理服务器的 IP 地址及默认端口 3128
访问 Web 服务器, 查看访问日志(先清空缓存)
查看 Web 访问日志的新增记录, 能够发现来自代理服务器 192.168.91.130 的访问记录. 这说明当客户机使用代理后, Web 服务并不知道客户机的真实 IP 地址, 因为实际上是由代理服务器在替它访问
四. 透明代理
透明代理提供的服务功能与传统代理是一致的, 但是其 "透明" 的实现依赖于默认路由和防火墙的重定向策略, 因此更适应于局域网主机服务, 而不适合为 Internet 中的客户提供服务.
基于局域网主机通过 Linux 网关访问 Internet 的环境. 在 Linux 网卡上, 构建 Squid 为客户机访问 Internet 提供代理服务; 在所有局域网客户机上, 只需要正确设置 IP 地址, 默认网关, 不需要手动指定代理服务器的地址, 端口等信息. 如图所示
squid 代理服务器双网卡 内网 ens-33 :192.168.100.1 外网 ens-36 :12.0.0.1
Web 服务器 :12.0.0.12
客户端 :192.168.100.30
为了验证透明代理的效果, 如果存在手动指定的代理服务器设置, 应在客户机中将其去除. 例如, 在 IE 浏览器的连接设置中不要勾选使用代理服务器; 在 Linux 客户机中, 可以通过命令 unset HTTP_PROXY HTTPS_PROXY
(1)配置 Squid 支持透明代理
- [root@squid ~]# echo "1"> /proc/sys.NET/ipv4/ip_forward
- [root@squid ~]# VIM /etc/squid.conf
- # Squid normally listens to port 3128
- http_port 192.168.100.1:3128 transparent // 这个 IP 地址提供透明代理服务
(2)重新启动 squid 服务
[root@squid ~]# service squid restart
正在关闭 squid...
正在启动 squid...
- [root@squid ~]# netstat -ntap | grep squid
- tcp 0 0 192.168.100.1:3128 0.0.0.0:* LISTEN 84473/(squid-1)
(3)设置 iptables de 重定向策略
透明代理中的 Squid 服务实际上是构建在 Linux 网关主机上, 因此只需要正确设置防火墙策略, 就可以将局域网主机访问 Internet 的数据包交给 Squid 进行处理. 这需要用到 iptables 的 REDIRECT (重定向)策略, 其作用是实现本机端口的重新定向, 将访问网站协议 HTTP ,HTTPS 的外发数据包转交给本机的 Squid 服务 (3128 端口)
防火墙做重定向操作, 将访问本机 80,443 端口的请求重定向到 3128 端口.
- [root@squid ~]# iptables -F
- [root@squid ~]# iptables -t nat -F
- [root@squid ~]# iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
- [root@squid ~]# iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
- [root@squid ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT // 允许转发
(4)在客户端访问 Web 服务器
(5)查看访问日志
- [root@Web ~]# cd /var/log/httpd/
- [root@Web httpd]# ls
- access_log error_log
- [root@Web httpd]# VIM access_log
总结:
(1)使用传统代理, 需要手动指定代理服务器的地址, 端口等信息
(2)使用透明代理时, 需要结合客户机的默认路由, 网关的 REDIRECT 策略来实现, 因此不适用于 Internet 环境.
(3)构建透明代理服务时, http_port 行需要添加 transparent 监听选项, 另外还需要设置防火墙的 REDIRECT 策略
来源: http://blog.51cto.com/13706703/2177369