Squid代理服务器:
Nginx也可以代理:反向代理-----实现负载均衡
Nginx也可以缓存
Nginx无法做正向
Proxy_pass 反向代理
Squid:正向代理服务器,VPN
Squid作用:正向代理,缓存加速,基于ACL过滤控制
代理的工作机制:
- 代替客户端向网站请求数据,不需要访问代理的IP地址,直接请求目的的网站,有代理服务器进行请求和访问,可以隐藏用户的真实IP
- 客户端访问目标网站之后(静态web元素)保存到缓存中,发送给客户端,下一次客户端都可以使用缓存访问,加快访问速度
核心图:
Squid代理的主要作用:
- 资源获取,代替客户端获取目标服务器的资源
- 就是访问的作用;代理服务器可能和目标服务器(网站)距离更近,可以起到一定的加速作用
- 缓存作用,代理服务器保存从目标服务器获取的资源,客户端下一次再请求目标服务器可以直接访问缓存即可,减轻目标服务器的压力,
- 隐藏真实的IP地址,代理服务器代替客户端请求,客户端的信息不会显示
Squid代理的类型:
- 传统代理,正向代理,需要在客户端上指定好代理服务器的地址和端口
- 透明代理,客户端不再指定代理服务器的地址和端口,而是通过默认路由来进行转发(squid服务器,网关)
- 反向代理,在反向代理的squid服务器当中缓存了请求资源,将资源直接返回给客户端,否则,代理服务器会代替客户端向web服务器发起请求,然后把请求的资源响应给客户端,同时把响应缓存在本地,后续请求可以使用
区别:
SNAT和DNAT
网络层
改变数据包头部
的源IP地址和目
的地址
代理服务器squid
应用层
不改变数据包的任何信息,直接把数据包发给代理,代理
过应用层过滤的方式来实现转发(有点像路由器)
实验部分:
客户端:20.0.0.51
Squid:20.0.0.52 (做透明代理需要双网卡)
Web页面:
Nginx1:20.0.0.53
Nginx2:20.0.0.54
解压包:
安装编译环境:
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
./configure --prefix=/usr/local/squid \
--sysconfdir=/etc \
--enable-arp-acl \
--enable-linux-netfilter \
--enable-linux-tproxy \
--enable-async-io=100 \
--enable-err-language="Simplify_Chinese" \
--enable-underscore \
--disable-poll \
--enable-epoll \
--enable-gnuregex
make -j 6 && 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
http_access allow all
cache_effective_user squid
cache_effective_group squid
检测配置文件语法是否正确
squid -k parse
启动,初始化
squid -z
启动,
squid
检测运行过程是否正确
squid -N -d1
查看端口
netstat -antp | grep squid
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 /etc/init.d/squid
chkconfig --level 35 squid on #35 启动优先级 0-100 数字越大优先级越低
systemctl restart squid
netstat -antp | grep squid
给文件执行权限,然后添加到系统服务控制当中
然后
35,启动优先级,0-100数字越大,优先级越低
重启和查看端口
systemctl restart squid
netstat -antp | grep squid
构建传统代理服务器(正向代理)
回到配置文件,添加支持缓存大小
cache_mem 缓存功能使用的内存空间大小,容量最好为4的倍数,单位用MB,建议是内存的四分之一
replyy_body_max_size 100M 允许用户下载最大文件的大小,浏览器会提示请求或访问大小
maximum_object_size 100M 能够缓存的对象的最大值,超过这个单位不会被缓存
给数据流量放行
iptables -F
iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
开一个相同的squid终端,查看缓存日志
tail -f /usr/local/squid/var/logs/access.log
开一台Nginx
客户端指向squid
命中缓存的标志
透明代理:
先取消这个
Squid配置双网卡
Web 12.0.0.12
Squid添加网络适配器,指向网关
配置ens33
配置ens36
配置Nginx1
systemctl restart network
打开squid转发功能
打开squid配置文件,支持透明代理打开
squid -k parse
squid -N -d1
systemctl restart squid
修改防火墙的规则
iptables -t nat -vnL
iptables -t nat -I PREROUTING -i ens33 -s 20.0.0.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
iptables -t nat -I PREROUTING -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
客户端修改网关
systemctl restart network
注意事项:
双网卡分别指向网关:
- 配置文件写错了,重启没有任何报错
- 添加了IP之后一定要查看IP+端口是否生效
- 客户端和服务端都要指向网关
- Iptables的策略,在代理服务器要改配置,
vim /etc/squid.conf
配置ACL策略,并且让其生效
以列表的形式来做
添加策略
删掉策略
结果:
反向代理:
Squid恢复之前的网卡
也就是去掉网关
客户端也还原,网关重新指向squid
配置squid
iptables -F
iptables -t nat -F
vim /etc/squid.conf
http_port 20.0.0.52:80 accel vhost vport
Squid从一个缓存变成一个web服务器反向代理的加速模式 squid监听的80端口请求,同时混合web服务器的请求端口绑定,squid不是转发请求,而是要么从缓存获取数据,要么请求绑定的web端口
Accel:反向代理加速模式
Vhost:支持域名或者主机名来代表服务器
Vport:支持IP+端口来表示代理服务器
cache_peer 20.0.0.52 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web1
cache_peer 20.0.0.53 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web2
缓存获取失败,请求的服务器名
Parent:上下的关系 80
0:表示就是一台代理服务器,不涉及运营商
No-query:不查询,直接获取数据
Originserver:指定源服务器
Round-robin max_conn=30 weight=1 name=web1
Squid通过轮询的方式来将请求分发到
80端口要起
声明域名做一下映射
在客户端把代理地址做映射
实现轮询