squid代理服务器

Posted 阳光小王子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了squid代理服务器相关的知识,希望对你有一定的参考价值。

squid代理服务器

一:squid代理服务器概述

1.1:squid简介

  • squid是一个支持http、https、ftp等服务的web缓存代理软件,通过缓存页面实现降低宽带占用提高页面响应时间。
  • 另外,squid提供访问控制,squid的缓存页面存放在内存和硬盘中,在选择服务器时候内存和硬盘要求高,对于数据过期更新,需要不定期的清理缓存的数据。

1.2:squid代理请求流程

  1. 客户端访问squid代理服务器
  2. 代理服务器代表客户端访问后端真实服务器
  3. 真实服务器把数据返回给squid代理服务器
  4. 代理服务器吧响应数据发送给客户端,并把页面缓存在本地的内存及磁盘中
  5. 客户端再次请求相同数据是,代理服务器直接将缓存的数据返回给客户端

1.3:squid代理服务类型

  1. 正向代理:主要应用于内部网络访问外部网络时缓存页面数据,提供统一网络接口连接到外网,所有的内网客户端无需配置外网IP即可通过squid上网,在这种模式下,squid主要负责提供缓存加速及访问控制的功能
  2. 透明代理:与正向代理类似,不需要终端用户进行特殊设置,需要结合网管部署,所有操作均由管理员在网关服务器和代理服务器进行设置,这些对用户透明的。
  3. 反向代理:反向代理集合智能DNS可以实现基本的CDN框架,此时的squid代理服务器可以直接代表后端服务器提供页面访问,用户并感觉不到自己是直接访问代理服务器,有利于减轻真实服务器压力,提高并发和响应速度。

二:部署环境实验操作

2.1:环境案例

主机IP地址
squid20.0.0.20
web120.0.0.21
web220.0.0.22

2.2:安装squid服务

--------------------------------------------安装squid服务-----------------------------------------------------------------
squid服务器:
[root@localhost ~]# hostnamectl set-hostname squid	#设置主机名squid
[root@localhost ~]# su				                #刷新
web服务器:
[root@localhost ~]# hostnamectl  set-hostname web	#设置主机名web
[root@localhost ~]# su



squid服务器配置:
将软件包上传到服务器中
[root@squid ~]# tar zxvf squid-3.4.6.tar.gz  -C /opt/	###将包解压到/opt目录下
[root@squid ~]# cd /opt/squid-3.4.6/
[root@squid squid-3.4.6]# yum -y install gcc gcc-c++	###安装编译工具gcc、gcc-c++
[root@squid squid-3.4.6]# ./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 \\
--enable-poll \\
--enable-gnuregex

--------------------------------------------上面配置的解释---------------------------------------------------------
./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" \\	#支持err语言(也就是报错是简体中文形式)
--enable-underscore \\		                #url支持下划线
--enable-poll \\			                    #字符设备驱动函数(内核函数)
--enable-gnuregex \\			#支持正则表达式
----------------------------------------------------------------------------------------------------------
[root@squid squid-3.4.6]# make -j4 && 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    #改主配置文件
#http_access deny all  	                         #默认拒绝所有,注销掉,或者放下面,从上往下读,不会拒绝掉
http_access  allow all	                         #加上这条allow,允许所有终端来访问,并且可用访问其他的源端服务器
	
http_port 3128
cache_effective_user squid		###在端口下面加上缓存管理用户
cache_effective_group 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 -anpt | grep 3128    ###可用查看一下启动了没
tcp6       0      0 :::3128                 :::*                    LISTEN      40026/(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"   ##定义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   ##关闭squid
                rm -rf $PID &> /dev/null    ##删除PID文件
                ;;
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 "用法:$0start|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]# service squid stop		    ###关闭squid服务网
[root@squid init.d]# netstat -anpt | grep 3128	###查看一下是否关闭掉了
[root@squid init.d]# service squid start		###在启动
正在启动 squid....


2.3:传统代理模式(正向)


------------------------------------------配置传统代理服务器(传统模式),还在squid服务器上配置--------------------------------------------------------
[root@squid init.d]# vim /etc/squid.conf		
#配置主配置文件,在端口下面添加这三条!
cache_mem 64 MB			
#指定缓存功能所使用的内存空间大小
reply_body_max_size 10 MB	          
#允许用户下载的单个文件最大文件大小,以字节为单位。设置0表示不限制
maximum_object_size 4096 KB		
#允许保存到缓存空间的最大对象大小,以KB为单位,超过大小限制的文件将不被缓存,优化指令(大文件保存在用户浏览器缓存里,不用来找服务器了,不然会占用服务器的资源)

[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 	###-I在开头插入input链(一个链包含多个规则),-p定义一个tcp协议,-dport 端口,-j 允许操作

[root@squid init.d]# service squid reload  #重载配置文件	
  • 配置web1端
[root@web ~]# systemctl stop firewalld	  #关闭防火墙
[root@web ~]# setenforce 0			      #关闭核心防护
[root@web ~]# yum -y install httpd		  #安装Apache
[root@web ~]# systemctl start httpd		  #启动Apache服务
  • 测试
1、打开谷歌浏览器
2、打开设置
3、点开高级
4、点击左下角系统
5、点击页面上的  打开您计算机的代理设置
6、手动设置代理下面设置,使用代理,地址是你的代理服务器的ip地址,端口是3128,点击保存
7、然后浏览器输入20.0.0.21,去访问web服务器
  • web1服务器上查看
[root@web httpd]# cd /var/log/httpd/		###到httpd目录下
[root@web httpd]# cat access_log 	    	###查看access日志
20.0.0.20 - - [30/Oct/2020:00:28:16 -0400] "GET /noindex/css/fonts/Bold/OpenSans-Bold.ttf HTTP/1.1" 404 238 "http://20.0.0.21/noindex/css/open-sans.css" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
20.0.0.20 - - [30/Oct/2020:00:28:16 -0400] "GET /noindex/css/fonts/Light/OpenSans-Light.ttf HTTP/1.1" 404 240 "http://20.0.0.21/noindex/css/open-sans.css" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"

-------从上面的就能看出,访问web服务器的是代理服务器的ip,并不是真机的ip地址

2.4:透明模式

------------------------------------------配置透明代理服务器,还在squid服务器配置----------------------------------------------------
在代理服务器上添加一块网卡,设置成主机模式
[root@squid ~]# cd /etc/sysconfig/network-scripts/
[root@squid network-scripts]# cp -p ifcfg-ens33 ifcfg-ens36
[root@squid network-scripts]# vim ifcfg-ens36
NAME=ens36 		
DEVICE=ens36		
ONBOOT=yes
IPADDR=192.168.10.3	
NETMASKE=255.255.255.0	
UUID、DNS都不用设置,可以删掉
[root@squid network-scripts]# systemctl  restart network	
[root@squid network-scripts]# vim /etc/sysctl.conf 
net.ipv4.ip_forward=1                       #开启路由转发功能,1是开启,0是不开启
[root@squid network-scripts]# sysctl -p		#加载一下

-------------------------------------web1端上也要配置一个回去的路由----------------------------------------------------

[root@web ~]# route add -net 192.168.10.0/24 gw 20.0.0.20

----------------------------------------squid服务器配置--------------------------------------------------------
[root@squid network-scripts]# vim /etc/squid.conf
http_port 192.168.10.3:3128 transparent			      #3182端口的地方改成透明模式
[root@squid network-scripts]# service squid start	  #重启服务
[root@squid network-scripts]# iptables -F		      #清除一下防火墙规则
[root@squid network-scripts]# iptables -t nat -F	  #清除一下表缓存
[root@squid network-scripts]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.10.0/24 -p tcp --dport 80 -j REDIRECT --to 3128	     #添加一个80端口访问的规则
[root@squid network-scripts]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.10.0/24 -p tcp --dport 443 -j REDIRECT --to 3128     #访问的是https的就要改成443端口
[root@squid network-scripts]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT	
  • 测试
客户端的网关填写刚刚配置的代理服务器ens36网卡的ip地址,192.168.10.3

然后浏览器输入20.0.0.21访问apache网站

在Apache服务器查看
[root@web httpd]# cd /var/log/httpd/	   #到httpd目录下
[root@web httpd]# cat access_log 		   #查看access日志
20.0.0.20 - - [30/Oct/2020:03:03:55 -0400] "GET /favicon.ico HTTP/1.1" 404 209 "http://20.0.0.21/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"

只要访问的ip地址是代理服务器的就可以了!!!

2.5:ACL访问控制

---------------------------squid代理服务器操作,在透明模式之后做--------------------------
[root@squid ~]# vim /etc/squid.conf	
acl hostlocal   src 192.168.10.99/32	#写在acl第一个就行,
http_access deny hostlocal		        #调用上面的ip地址和名称拒绝访问,写在http格式的第一个就行
[root@squid ~]# service squid reload    #重启

测试:客户端浏览器输入20.0.0.21就显示访问被拒绝了!

2.6:反向代理(客户端访问代理服务器就能到web服务器的网站上)

--------------------------------------------------反向代理---在web1服务器------------------------------------------
[root@web httpd]# cd /var/www/html/		
[root@web html]# echo "this is test1 web" > index.html	###创建一个网站,网页要区分

测试:浏览器输入:20.0.0.21,就能看见 this is test1 web

-------------------------------------------------squid代理服务器操作-------------------------------------------
[root@web html]# systemctl start firewalld	###开启防火墙

[root@web html]# iptables -F			###清除一下防火墙规则
[root@web html]# iptables -t nat -F		###清除一下防火墙表缓存
[root@web html]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT	#

以上是关于squid代理服务器的主要内容,如果未能解决你的问题,请参考以下文章

Squid缓存代理服务器!

了解Squid代理服务器应用

Squid代理服务器(传统代理透明代理)(图文详解)

squid代理服务,搭建传统代理和透明代理案例

squid代理服务,搭建传统代理和透明代理案例

squid代理服务器(传统代理透明代理反向代理ACL日志分析)