Squid 是 Linux 系 统 中 最 常 用 的 一 款 开 源 代 理 服 务 软 件 ( 官 方 网 站 为 http://www.squid-cache.org),可以很好地实现 HTTP 和 FTP,以及 DNS 查询、SSL 等应用的缓存代理。缓存代理作为应用层的代理服务软件,Squid 主要提供缓存加速、应用层过滤控制的功能。
当客户机通过代理来请求 Web 页面时,指定的代理服务器会先检查自己的缓存。如果
缓存中已经有客户机需要的页面,则直接将缓存中的页面内容反馈给客户机。如果缓存中没 有客户机要访问的页面,则由代理服务器向 Internet 发送访问请求,获得返回的 Web 页面 以后,将网页数据保存到缓存中并发送给客户机。
HTTP 代理的缓存加速对象主要是文字、图像等静态 Web 元素。使用缓存机制后,当客户机在不同的时候访问同一 Web 元素,或者不同的客户机访问相同的 Web 元素时,可 以直接从代理服务器的缓存中获得结果。这样就大大减少了向 Internet 提交重复的 Web 请求的过程,提高了客户机的 Web 访问响应速度。
由于客户机的 Web 访问请求实际上是由代理服务器来代替完成的,从而可以隐藏用户 的真实 IP 地址,起到一定的保护作用。另一方面,代理服务器担任着类似“经纪人”的角色,可以针对要访问的目标、客户机的地址、访问的时间段等进行过滤控制。
传统代理:也就是普通的代理服务,首先必须在客户机的浏览器、QQ 聊天工具、下载软件等程序中手动设置代理服务器的地址和端口,然后才能使用代理来访问网络。对于网页浏览器,访问网站时的域名解析请求也会发给指定的代理服务器。
透明代理:提供与传统代理相同的功能和服务,其区别在于客户机不需要指定代理服务 器的地址和端口,而是通过默认路由、防火墙策略将 Web 访问重定向,实际仍然交给代理服务器来处理。重定向的过程对客户机是“透明”的,用户甚至并不知道自己在使用代理服务,所以称为透明代理。使用透明代理时,网页浏览器访问网站时的域名解析请求将优先发给DNS 服务器。
传统代理多见于 Internet 环境,透明代理多见于局域网环境
通过代理服务器实现对web网页的访问
VMware软件
一台centos7虚拟机作为squid服务器,IP地址为:14.0.0.7
一台centos7虚拟机作为web服务器,IP地址为:14.0.0.110
一台win10虚拟机作为client测试机,IP地址为:14.0.0.128
在代理服务器上(14.0.0.7)
[root@localhost ~]# hostnamectl set-hostname squid
[root@localhost ~]# su
将软件包拷贝到当前目录下
[root@squid squid-3.4.6]# yum install gcc gcc-c++ -y
[root@squid ~]# tar xzvf squid-3.4.6.tar.gz -C /opt
[root@squid ~]# cd /opt/squid-3.4.6/
[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 \ ##支持下划线功能
--enable-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 ##注释
# Squid normally listens to port 3128
http_port 3128
cache_effective_user squid ##添加指定用户squid
cache_effective_group squid ##添加指定组squid
[root@squid squid-3.4.6]# squid -k parse ##检查语法
[root@squid squid-3.4.6]# squid -z ##初始化缓存
[root@squid squid-3.4.6]# squid ##开启服务
[root@squid squid-3.4.6]# netstat -ntap | grep 3128 ##检查端口是否开启
tcp6 0 0 :::3128 :::* LISTEN 49346/(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"
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
rm -rf $PID &> /dev/null
;;
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
[root@squid init.d]# chmod +x squid ##赋予执行权限
[root@squid init.d]# chkconfig --add squid ##添加到service管理
[root@squid init.d]# chkconfig --level 35 squid on ##设置开机自启动,可以不设置
[root@squid init.d]# vim /etc/squid
cache_effective_user squid
cache_effective_group squid
在这个位置下写入以下配置
cache_mem 64 MB ##自定义缓存空间大小,容量最好为4的倍数
reply_body_max_size 10 MB ##允许下载最大文件大小,以字节为单位,默认设置0表示不进行限制
maximum_object_size 4096 KB ##允许保存到缓存空间的最大对象的大小,以KB为单位,超过限制不会缓存,直接转到web端
[root@squid init.d]# iptables -F
[root@squid init.d]# iptables -t nat -F
[root@squid init.d]# setenforce 0
[root@squid init.d]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT ##新增规则,允许3128端口
[root@squid init.d]# service squid reload ##重载服务
[root@web ~]# systemctl stop firewalld.service
[root@web ~]# setenforce 0
[root@web ~]# yum install httpd -y
[root@web ~]# systemctl start httpd
win10虚拟机上IP设置为自动获取,我这里获取的IP是14.0.0.128
在浏览器中进行服务器代理设置(我使用的是谷歌浏览器,其他浏览器都差不多是同样的配置)
这样就设置好了,对apache进行访问
在web服务器上查看日志文件
[root@web ~]# cat /var/log/httpd/access_log
web服务器的httpd访问日志显示是代理服务器进行访问,说明实验成功
在传统模式的配置下做出以下修改
squid服务器添加一块网卡:192.168.10.1(仅主机模式)
web服务器不变
client客户端修改网卡为仅主机模式,IP地址修改为192.168.10.10,且浏览器关闭代理功能
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp -p ifcfg-ens33 ifcfg-ens36
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ifconfig
将客户端改为仅主机模式
修改win10客户端的IP地址,并将浏览器的代理服务器功能关闭
[root@squid ~]# vim /etc/squid.conf
http_port 192.168.10.1:3128 transparent
[root@squid ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@squid ~]# sysctl -p ##加载配置
net.ipv4.ip_forward = 1
[root@squid ~]# iptables -F
[root@squid ~]# iptables -t nat -F
[root@squid ~]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.10.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
[root@squid ~]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.10.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
[root@squid ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
[root@squid ~]# service squid restart
正在关闭 squid...
正在启动 squid...
[root@squid ~]# netstat -ntap | grep 3128 ##一定要看到端口开启再进行测试
tcp 0 0 192.168.10.1:3128 0.0.0.0:* LISTEN 53476/(squid-1)