squide是正向代理,缓存加速。基于aci访问控制协议。可以过滤控制。可以实现访问控制
squid代理的工作机制
nginx是转发
1、 squid是代替客户端向网站请求数据,不需要访问代理的ip地址。直接请求目的网站即可。由代理服务器处理请求和响应。squid也可以隐藏用户的真实ip地址
2、 客户端访问目标网站之后(静态web元素)保存到缓存中,发送给客户端。下一次所有的客户机都可以使用缓存访问。可以加快访问速度。
squid代理服务器的数据流向和工作架构图:
squid代理的作用
1、 资源获取:代替客户端获取目标服务器的资源
2、 加速访问:代理服务器可能和目标服务器距离更近,可以起到一定的加速作用。
3、 缓存作用:代理服务器获取到之后保存从目标服务器获取的资源。客户端下一次再请求目标服务器访问缓存即可。可以减轻目标服务器的压力。
4、 隐藏真实的ip地址:代理服务器代替客户端请求,客户端的信息不会显示。
nginx没有加速访问功能
squid代理的类型
1、 传统代理也是VPN的工作方式。正向代理。需要在客户端上指定好客户端的地址和端口。
2、 透明代理。客户端不再需要指定代理服务器的地址和端口,而是通过默认路由来进行转方法。配置在末梢网络上由默认路由转发所有流量。(squid服务器,网关)
3、 反向代理:在反向代理的squid服务器当中缓存了请求资源,将资源直接返回给客户端。否则代理服务器会继续代理客户端向web服务器发起请求。请求之后然后再把请求的资源响应给客户端。同时把响应缓存在本地,后续请求者都可以使用。
有缓存则直接响应缓存内容,没有缓存,才会代替客户端请求web资源,响应的结果保存在缓存,然后响应给客户端,下一次直接访问缓存即可。缓存是否命中。
SNAT和DNAT和squid代理服务器有什么区别
SNAT和DNAT:工作在网络层。走的是数据包会改变数据包头部的源IP地址和目的地址
squid代理服务器:工作在应用层。不会改变数据包的任何信息,是直接把数据包发给代理。代理通过应用层过滤的方式来实现转发。(通过应用层的ACL的方式来过滤,类似于路由器转发的工作过程)
实验过程
准备四台主机
客户端:20.0.0.10
squid:20.0.0.20 (透明代理会用到双网卡)
web页面:nginx1 20.0.0.30
web页面:nignx2 20.0.0.40
bash
关闭防火墙
在代理上配置
cd /opt
拖入安装包进行解压
tar -xf squid
yum -y install gcc gcc-c++ make
#安装依赖环境
进入目录开始编译
./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地址中含有下划线
--disable-poll \
--enable-epoll \
--enable-gnuregex
make && make install
#编译安装
ln -s /usr/local/squid/sbin/* /usr/local/sbin/
#开始创建软连接
useradd -M -s /sbin/nologin squid
#创建用户
chown -R squid:squid /usr/local/squid/var/
#修改归属
vim /etc/squid.conf
配置文件的匹配规则,自上而下匹配。匹配到了之后,不再向下匹配
56行插入一行
http_access allow all
61行插入两行
cache_effective_user squid
cache_effective_group squid
68行
usr/local/squid/var
squid -k parse
#检测配置文件是否正确
squid -z
#初始化squid
完成回车即可
squid
netstat -antp | grep squid
#查一下端口端口起来就代表ok了
squid -N -d1
#检测运行过程是否正常
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
chmod +x /etc/init.d/squid
#给运行权限
chkconfig --add squid
#添加进系统运行
chkconfig --level 35 squid on
#定义运行级别。启动启动的优先级
systemctl restart squid
netstat -antp | grep squid
实验1传统代理
vim /etc/squid.conf
设置缓存文件大小
到62行插入
cache_mem 2000 MB
#指定缓存功能使用的内存空间大小,容量最好是4的倍数。单位是MB建议是内存容量的4分之一
reply_body_max_size 100 MB
#允许用户下载的最大文件的大小。如果超过了这个值,浏览器会提示请求或访问太大
maximum_object_size 100 MB
#能够缓存的对象的最大值。超过这个单位不会被缓存。超过这个值,直接返回给用户
iptables -I INPUT -p tcp --dprot -j ACCEPT
#生产中需要给放行,这里不需要
tail -f /usr/local/squid/var/logs/access.log
进入虚拟机
开启nginx功能
vim /html/index.html
this is squid!
到客户端打开浏览器测试
在浏览器中配置代理
写入代理服务器的ip和端口
回到nginx1
tail -f /usr/local/nginx/
打开访问日志
回到客户端测试
实验1传统代理结果
实验2透明代理
bash
实验2:透明代理
回到客户端清除缓存
选择不需要代理
回到squid主机设置为双网卡
web 12.0.0.12
双网卡分别指向网关
vim ifcfg-ens33
注释掉网关和dns
ifconfig查看一下
cp ifcfg-ens33 ifcfg-ens36
vim ifcfg-ens36
ip地址修改为网关
网关和dns都注释掉
重启网卡
ifconfig查看一下
到nginx1
vim ifcfg-ens33
修改网关为12.0.0.254
IP地址改为12.0.0.12
注释掉dns
重启网卡
回到squid主机
开启转发功能
vim /etc/systcl.conf
net.ipv4.ip_forwart=1
#开启转发功能
sysctl -p
vim /etc/squid.conf
注释掉原端口插入新的端口
http_port 20.0.0.20:3128 transparent
#加上支持透明的选项
重启squid服务
修改一下防火墙的规则
iptables -t nat -I PREOUTING -i ens33 -s 20.0.0.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
iptables -t nat -I PREOUTING -i ens33 -s 20.0.0.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
#允许这个端口通过
回到客户端测试
修改一下客户机的网关
把网关指向20.0.0.20
注释掉dns
到客户机测试
实验2透明代理结果
透明代理:
1、 配置文件写错了,重启不会有任务报错
2、 添加了ip加端口之后一定要查看一下ip+端口是否生效
3、 客户端和服务端都要指向网关
4、 iptables的策略,在代理服务器要配置,开启转发功能
bash
实验3:配置ACL访问控制策略
vim /etc/squid.conf
acl myhost1 src 20.0.0.10/32
http_access deny myhost1
重启squid服务
squid -N -d1
#检测一下运行状态
实验4:访问列表
mkdir /etc/squid
cd /etc/squid
vim dest.list
12.0.0.12
vim /etc/squid.conf
添加策略
acl myhost2 dst "/etc/squid/dest.list"
http_access deny myhost2
重启一下squid服务
到客户端测试一下
取消掉deny再去客户端测试一下
配置ACL访问控制策略禁止访问12.0.0.12
解除限制
反向代理
bash
实验5:反向代理
在squid主机
vim ifcfg-ens33
#打开网关和dns
还原一下nginx主机
关闭防火墙和安全机制
vim /nginx/html/index.html
到客户端修改一下网关和dns
回到squid主机
iptables -F
#清空防火墙策略
vim /etc/squid.conf
http_port 20.0.0.20:80 accel vhost vport
#squid从一个缓存变成了一个web服务器的反向代理的加速模式 squid监听的80端口的请求。同时和web服务器的请求端口绑定。squid不是转发请求,要么从缓存获取数据,要么直接请求绑定的web端口
accel:反向代理开启加速模式
vhost:支持域名或主机名表示代理节点。
vport:支持ip+端口来表示代理服务器
在行后插入
cache_peer 20.0.0.30 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web1
cache_peer 20.0.0.4 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web2
cache_peer 20.0.0.30
#获取失败,请求的服务器名
parent
#下级关系。80
0
#示就是一台代理服务器,不涉及运营商
no-query
#查询,直接获取数据
originserver
#定源服务器
round-robin max_conn=30 weight=1 name=web1
#squid通过轮询的方式将请求分发到其中一台父节点
max_conn=30
#最大连接数
weight=1
#轮询权重
name=web1
#设置别名
cache_peer_domain web1 web2 www.kgc.com
重启squid服务
squid -N -d1
#查看运行是否正常
netstat -antp | grep 80
#必须是80端口
如果80端口没有起来使用kill命令清除后再尝试
kill -9 68270
在客户端把代理地址做映射
vim /etc/hosts
20.0.0.20
#做映射
实验5反向代理结果
实验完成