目录:
1· Squid代理的概述原理
2· 代理的基本类型
3· Squid 服务脚本
4· 构建代理服务器(传统代理、透明代理)
5· 总结
Squid代理的概述原理
1)代理的工作机制
1.什么是 Squid ?
Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher、HTTPS和HTTP协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。
2·缓存的工作原理
squid 是工作在应用层的代理服务软件,squid 主要提供缓存加速和应用层过滤控制的功能。在这里举个列子:当客户机通过代理来请求 web 页面时,那么代理服务器会检查自己有没有你请求的页面,有的话就直接发送给客户端,没有的话,代理服务器就会向web发送请求,当获得了web页面后,就会把数据保存到缓存中,并发给客户端。
2)·HTTP 代理的缓存说明:
HTTP代理的缓存加速对象主要针对文字、图像等静态 Web 元素。使用缓存机制后,客户端在访问 同一 Web 元素,就可以直接从代理服务器的缓存中得到你想要的。这样做的好处就减少 对 Web 请求的过程,提高了客户端的访问速度
还有就是客户机访问的 Web 访问请求实际上是由代理服务器带完成的,这样就可以隐藏用户的真实 IP,有一定的保护作用,代理服务器还有机会对访问的目标、客户机的地址、访问的时间段进行过滤控制。
代理的基本类型与应用方向:
1)传统代理:
也就是普通的代理服务,比如我们用的浏览器、QQ聊天工具等需要手动设置代理服务器的地址和端口,才能使用代理服务的。
下图是浏览器设置代理服务器地址图:
对以上图说明:每个软件或者是浏览器设置代理服务器的位子是不一样的,只要找到选项,几乎就在里面,设好代理服务器的地址与端口即可。
2)应用方向
传统代理:多用于 Internet 环境,QQ 程序、下载工具等,可以规避服务器的并发连接。
透明代理:多用于局域网环境,比如在 Linux 网关中启用代理,局域网主机就不用再进行额外的设置就能更快的访问。
传统代理服务器部署
部署前说明:
1·部署环境是:CenOS 7.4
2·部署方式:手工编译, 版本为 Squid 3.4.6
3·提供源码包下载地址:Squid 缓存源码包,需要请点击 密码:63xn
传统代理服务器拓扑图如下:
开始部署:
1)编译安装 Squid,现在是手工编译的,在这之前我们需要把源码包下载,进行解压,安装编译环境、指定安装路径与功能模块等
[root@localhost ~]# tar zxvf squid-3.4.6.tar.gz -C /opt/ ----(解压到 /opt 目录下)
[root@localhost ~]# yum install gcc gcc-c++ make -y ----(安装编译环境)
[root@localhost ~]# cd /opt/squid-3.4.6/
[root@localhost squid-3.4.6]# ./configure --prefix=/usr/local/squid \--sysconfdir=/etc \
--enable-arp-acl \
--enable-linux-netfilter \
--enable-linux-tpoxy \
--enable-async-io=100 \
--enable-err-language="Simplify_Chinese" \
--enable-underscore \
--enable-poll \
--enable-gnuregex
2)对以上模块解释:
1·指定安装路径
2·单独将配置文件放在 /etc
3·可以在规则中设置为直接通过客户端MAC进行管理,防止客户端使用IP欺骗
4·使用内核过滤
5·支持透明模式
6·异步 I/O,提升存储性能
7·错误信息的显示语言
8·允许 URL 中有下划线
9·使用POLL()模式,提升性能
10·使用GNU 正则表达式
[root@localhost squid-3.4.6]# make && make install ----(制作、编译安装,这里等待的时间需要稍长一点,请耐心等待)
3)安装完毕,现在需要对 Squid 进行一些优化,使以后我们用起来更加符合日常日操作习惯
[root@localhost squid-3.4.6]# ln -s /usr/local/squid/sbin/ /usr/local/sbin ——(创建软连接)
[root@localhost squid-3.4.6]# useradd -M -s /sbin/nologin squid ---(创建管理用户)
[root@localhost squid-3.4.6]# chown -R squid.squid /usr/local/squid/var/
4)修改主配置文件,有图有文字说明:
[root@localhost squid-3.4.6]# vim /etc/squid.conf ----(在编译的时候就指定了主配置文件放在 /etc 下)
修改如下内容:
http_access allow all -----(需要添加,意思是运行所有人访问http,这里相当于是一个ACL访问控制列表)
cache_effective_user squid ------(添加指定的程序用户)
cache_effective_group squid ------(添加 指定的账号基本组)
下图是配置文件添加内容:
检查配置文件语法,看看是否有报错:
[root@localhost squid-3.4.6]# squid -k parse ---(检查语法,有报错问题几乎是配置文件的问题)
编写 Squid 启动脚本
[root@localhost squid-3.4.6]# 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 -antp | grep squid &> /dev/null
if [ $? -eq 0 ]
then
echo "squid is running"
else
echo "正在启动 squid...."
$CMD
fi
;;
stop)
$CMD -k kill &> /dev/nulll
rm -rf $PID &> /dev/null
;;
status)
[ -f $PID ] &> /dev/null
if [ $? -eq 0 ]
then
netstat -antp | 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
优化 squid 与 启动脚本
[root@localhost squid-3.4.6]# chmod +x /etc/init.d/squid ---(给脚本执行权限)
[root@localhost squid-3.4.6]# chkconfig --add squid ----(加入系统服务)
[root@localhost squid-3.4.6]# chkconfig --level 35 squid on ----(设置开机自启)
到此 Squid 服务基本配置完成。接下来我们需要先来做传统代理模式
[root@localhost squid-3.4.6]# vim /etc/squid.conf ---(修改配置文件)
添加内容如下:
cache_mem 64 MB ---(#指定缓存功能使用的内存空间大小,以便于保持访问较频繁的web对象,容量最好为4的倍数,单位为MB,建议设为物理内存的1/4)
reply_body_max_size 10 MB ----(允许用户下载的最大文件大小,以字节为单位,默认0,表示不限制
)
maximum_object_size 4096 KB ---(允许保存到缓存空间的最大对象大小,以KB为单位,超过大小限制的文件将不被缓存,而是直接转发给用户)
启动前准备:
[root@localhost squid-3.4.6]# squid -k parse ---(再次检查配置文件语法)
[root@localhost squid-3.4.6]# squid -z ---(初始化缓存目录)
[root@localhost squid-3.4.6]# iptables -F ----(清空防火墙规则,便于之后我们自己填写策略)
[root@localhost squid-3.4.6]# iptables -t nat -F
[root@localhost squid-3.4.6]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT ---(添加防火墙策略:允许 tcp 协议 3128端口通过)‘
[root@localhost squid-3.4.6]# setenforce 0 ---(关闭增强功能)
[root@localhost squid-3.4.6]# service squid start ----(启动服务)
正在启动 squid...
[root@localhost squid-3.4.6]# netstat -antp | grep 3128 ----(查看启动端口)
tcp6 0 0 :::3128 :::* LISTEN 36813/(squid-1)
验证传统代理服务器:
方法:搭建 Apache 网站服务器,用 windows 客户端 IE 浏览器设置代理服务器,访问 Apache 网站服务器,然后查看Apache 日志文件,查看是谁访问的Apache。如果是代理服务器说明我们部署成功。
1)在另外一台服务器上搭建 Apache 服务器:
[root@localhost ~]# yum install httpd -y ---(注意这里是在其他服务器上安装Apache)
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl start httpd.service
2)在客户机上给 IE 浏览器设置 Squid 代理服务器的地址与端口
以上图说明:访问成功,但是我们需要知道是谁去访问的,所以现在需要看看 apache 的日志文件。
上图说明:传统代理服务器部署成功!
透明代理部署:
透明代理提供的服务功能与传统代理是一致的,但是其 ” 透明 “ 的实现依赖默认路由和防火墙的重定向策略。
在Linux 网关上,构架squid 为客户机访问 Internet 提供代理服务
在所有的局域网客户机上,只需要争取设置IP地址、默认网关,而不需要手动指定代理服务器的地址、端口等信息。
根据以上的理论,所以我们应该把 Squid 代理服务器 再添加一块新的网卡,透明代理的拓扑图如下:
开始部署:
[root@localhost ~]# vim /etc/squid.conf ---(修改配置文件)
修改内容如下:
http_port 192.168.100.1:3128 transparent ----(修改监听地址,因为是内网需要访问外网,所以监听的是内网 transparent:意思就是透明模式)
配置文件修改得不多,接下来就是需要设置 iptables 的重定向策略:
[root@localhost ~]# iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
[root@localhost ~]# iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
开启路由转发功能:
[root@localhost ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
重启 squid 代理服务器
[root@localhost ~]# service squid restart
正在关闭 squid...
正在启动 squid...
透明模式验证:
说明:透明模式 是不需要手动设置代理服器的,访问如下图:
下图是apache 日志分析,看看是那一台主机访问的web
结论:如上图,是不需要手动设置代理服务器,访问web服务器是由代理服务器去访问!
如果要再Linux客户机的命令行界面中使用代理服务器(比如:elinks 网页浏览器、wget 下载工具),必须通过环境变量来指定代理服务器的地址、端口等信息。
[root@localhost ~]# vim /etc/profile ---(添加如下内容到环境变量中)
添加如下内容:
HTTP_PROXY=http:192.168.100.50:3128 ---(为使用HTTP协议指定代理)
HTTPS_PROXY=http:192.168.100.50:3128 ---(为使用HTTPS协议指定代理)
FTP_PROXY=http:192.168.100.50:3128 ----(为使用FTP协议指定代理)
NO_RPOXY=192.168.20.,192.168.30. ---(对两个局域网段不使用代理)
export HTTP_PROXY HTTPS_PROXY FRP_PROXY NO_PROXY**[root@localhost ~]# source /etc/profile
总结:
1·要知道,我们访问的是web服务器,如果 Squid缓存代理服务器有访问的数据,代理服务器就会直接给予回馈,如果没有,squid 就会去找web服务器要数据,再返回给客户端。
2·代理的基本类型有:传统代理、透明代理。之间最大的区别是:需要手动设置代理服务器的地址和端口。
3·排错可能性:·访问的时候,web服务器的防火墙没有关闭;防火墙策略写入有误、修改配置文件后是否重启服务,查看端口服务是否启动。