Squid代理服务器
  AWkq7aIjuRwO 2023年11月02日 59 0

*客户端直接去访问web服务器是一种形式

客户端去访问web服务器的时候web服务器上的网页一般存放在硬盘上,而作为缓存服务来讲一般就是大内存的,当客户端去访问web服务器的时候先去访问缓存服务器,缓存服务器看自己内存当中有没有缓存有直接给客户端相应这样速度比较快,如果缓存服务器没有,缓存服务区会去找web服务器,找到以后web服务器从磁盘当中读取相关的网页内容,给这个代理服务器随后代理服务器会给客户端相应的同时在内存中进行缓存这样的话可以提高客户端重复访问的效率

缓存服务器在这种环境中 大量存在的

缓存服务:可以通过软件实现也可以通过硬件服务器实现(更快速的处理器更高效的内存系统)

Squid代理服务器_web服务器



今天通过软件实现,在一台服务器上通过安装软件来实现

软件名:sguid (开源软件) 

为啥称为代理服务器 因为客户端在访问的时候,他作为代理方式去访问的,也就是客户端访问的时候访问的代理服务器,就不用去找真实的web服务器了,我帮你去问,问完了以后自己缓存一份然后提供给你,再有人问的时候就直接找我,称为代理服务器。


代理服务有

正向代理:以公司内部作为出发点,访问外网,称为正向代理 ,我们去访问别人给我们自己提供代理。

反向代理:我们内部有服务器,外部主机通过代理服务器访问内部服务器,给外人提供访问,称为反向代理,作用是一样的,正向代理和反向代理在一台主机不能同时实现。

正向代理是网关范畴,给内部员工提供一个代理,访问外部网络的时候,提高重复访问的效率。

而把自己的服务器发布出去让别人访问,提高别人访问的效率,是系统工程师范畴。我们进行服务器维护的范畴。

正向代理分为

1传统代理:需要在客户端的浏览器手动指定代理服务器的ip地址和断口号,每个客户端都要做,就比较麻烦

2 不对客户端做设置,访问网站的时候正常访问,代理服务器会截获你的相关报文,比如你访问网站的时候,你对应的应该给你转发出去,但是我一看访问你访问网站,我就送给代理服务器这个程序,由他来帮你代理,这样的话,就不用在客户端去设置代理服务器是谁了,让大家感觉不到代理服务器的存在,称为透明代理。

Squid代理服务器_客户端_02


如果从左向右访问 Squid提供代理,叫正向代理

如果从右向左访问Squid提供代理,叫反向代理

需要用到三台主机

一台做客户端,v8

一台做Squid代理服务器 需要加块网卡 一块v8  一块v1

一台做服务器v1


Squid代理服务器:

先获取地址

cd /usr/src

把源码包 传进来

yum -y install gcc gcc-c++

yum安装 gcc 和gcc-c++

tar xf squid-3.5.28.tar.gz

解包

cd squid-3.5.28/

进去

./configure --prefix=/usr/local/squid --sysconfdir=/etc --enable-linux-netfilter --enable-async-io=240 --enable-default-err-language=Simplify_Chinese --disable-poll --enable-epoll --enable-gnuregex

配置

--prefix=/usr/local/squid 安装目录

--sysconfdir=/etc 系统配置文件路径

--enable-linux-netfilter  因为数据包经过Squid,他可以进行过滤,过滤的时候可以调用linux的内核防火墙

--enable-async-io=240  连接数处理机制 异步I/O 提升存储性能

--enable-default-err-language=Simplify_Chinese 有错误的显示对应的语言信息Chinese 简体中文

--disable-poll --enable-epoll  内核处理机制 有事件发生的时候该怎么处理 epoll 增强型的poll

--enable-gnuregex  进行过滤的时候 Squid 也可以作为防火墙使用,在进行过滤的时候可以对字符串进行匹配 匹配的时候可以使用gnu的egex  使用GNU的正则表达式

Squid代理服务器_客户端_03


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/

创建用户和组 并设为/usr/local/squid/var/的属主属组

/usr/local/squid/var/ 是squid的缓存目录


vim /etc/squid.conf

修改配置文件

cache_effective_user squid
cache_effective_group squid

指明程序用户和程序组

Squid代理服务器_客户端_04


把#去掉改为

cache_dir ufs /usr/local/squid/var/cache/squid 1000 16 256

缓存目录 他的缓存服务器 除了利用内存空间外会把有些不常用的东西放到硬盘上去,也作为缓存出现的cache缓存dir 目录 子目录是/usr/local/squid/var/cache/squid

1000 是在磁盘划分多大空间 默认是100M 改成1000M 

划分出1000M 在/usr/local/squid/var/cache/squid这个目录下穿件16个一级目录

在每个一级目录下创建256个二级目录,这样的话有大量的目录存在 可以存放 更多东西 可以分明别类进行存放

Squid代理服务器_web服务器_05

Squid代理服务器_web服务器_06

squid 端口号3128 一会做传统代理的时候从客户端指定代理服务器需要填端口号


squid -k parse

检查squid语法有没有问题  不执行这个动作也没有问题 因为启动的时候语法错误起不来


ls /usr/local/squid/var/cache/squid

Squid代理服务器_客户端_07

查看初始化目录 现在是没有 需要生成一下


squid -z

初始化目录

在查看一下就有了

squid

然后启动squid

netstat -antup | grep squid

查看一下是否启动

关闭的话输入 killall squid

Squid代理服务器_web服务器_08


传统代理:

下图是默认开启的

Squid代理服务器_代理服务器_09


配置下客户端

固化ip 192.168.1.2
子网255.255.255.0
网关192.168.1.1
给web服务器固化ip:200.0.0.2
子网255.255.255.0

可以不设网关 ,不设网关的目的是外边主机访问我的时候肯定访问不到,因为我不认识192.168.1.0网段 我就不回包 我就不会送给网关 但是最终能访问到我的网页 原因是 客户端去访问外部的时候 去找squid 代理服务器 代理服务器会问web服务器 因为他俩是直连的  最终可以看到效果 这样能验证代理服务器的工作原理

Squid代理服务器_代理服务器_10

客户端与web服务器通信的时候 原来是两边都设置网关 网关的话 我访问别的网段 我会把包交给下一个路由器   然后路由器转发出来 到web服务器  web服务器认识1.0网段 他会把包 交给 路由器 因为他有网关 路由器又转发给 客户端 所以通信是通过路由转发的 今天不设置网关 不设置网关的目的是 正常通信 是 客户端 去访问web服务器的时候 一看和自己不同网段 他就把包交给 网关  网关再交给 web服务器   结果web服务器要回包的时候 一看是192.168.1.2  和自己不同网段 按说应该交给 网关 但是没有设置网关所以 他就不知道要交给谁了 所以通信不了了 

但是最终是能访问到的 客户端要和web通信  把包交给squid  squid说我是代理 不需要把客户端的信息转发出去  我就把你的信息 拿到以后 我去问 squid和web服务器是直连的 所以说 squid就能到web服务器  web服务器 也能给他回复  随后squid缓存一份 再给内部主机提供服务  


曾经在 squid 这个主机上做过路由转发的开启 作用是 客户端有数据包过来的时候 如果目标是web服务器 那就转发出去  这是个转发的开关,如果没开开关 即使两边都认识 也都设置网关了 我也不转发 也通信不了


客户端要和web通信 把包交给squid  以squid的身份去问 没有吧客户端的请求转发出去 squid问完后 自己缓存一份 再给客户端  


systemctl start httpd
启动apache
systemctl stop firewalld
setenforce 0
关闭防火墙
echo test,wan > /var/www/html/index.html
产生测试页44.55

给squid 固化ens33 ip 192.168.1.1 子网255.255.255.0 网关192.168.1.1
ens37 ip 200.0.0.1 子网255.255.255.0  网关200.0.0.1  
关闭防火墙-

客户端打开 浏览器

Squid代理服务器_客户端_11


Squid代理服务器_代理服务器_12

Squid代理服务器_web服务器_13

然后 访问即可

Squid代理服务器_代理服务器_14

缓存的话 web服务器更新了  客户 再访问 会不会看到旧东西 ?

squid工作方式:

当客户端把请求发过来的时候找代理服务器,代理服务器一看自己有缓存但是不会马上提供服务,他会产生一个校验码 ,然后向源主机发出一个查询 对方对目标 也产生了一个校验码,两个比较一下看看一不一样,如果一样那就说明没有更新,直接给客户端相应,如果不一样,他会从新获取新的,然后缓存一份 给客户端提供相应。


传统代理比较啰嗦,每个用户都需要做这个设置,让客户端不做操作

透明代理:

客户端感觉不出来代理服务器存在,但是他发的请求是个web请求,squid的端口号是3128

客户端访问网站的时候 正常的是访问80端口如果是https的话是443(加密访问是443)

当客户端发请求过来的时候目标端口是80 结果squid端口是3128,如果我们把所有80端口的访问全都送到3128上去,这样的话就交给squid完成代理工作了,如果不做这个工作的话那最终内部主机是访问不到外部网络的,这个动作叫重定向,我本身想去访问web网站的的80-端口,结果到squid服务器的时候就改位置了,去张三家送到李四家去了

这时候送到squid上去了,  squid一看 你访问80-的  正好我能代理这个工作,然后squid去问 问完了告你客户端就行了  

重定向工作 把数据包准发位置送到了squid 代理服务器上了  


先去把刚才浏览器设置的代理给改掉 然后就访问不到了

Squid代理服务器_客户端_15

去squid代理服务器 更改配置文件

vim /etc/squid.conf
http_port 3128 后面加上 transparent

http_port 192.168.1.1:3128 transparent
指定了监听那个地址的3128  写不写无所谓 不写的话 来自任何访问3128的 启用透明代理 规范写的 话 只监听192.168.1.1 这个网卡
从内部主机发送的报文通过192.168.1.1 进来的报文 让他支持透明代理

Squid代理服务器_web服务器_16


保存退出
killall squid  
关闭squid
squid
启动
netstat -antup | grep squid
可能启动 会慢 多启动几次

查看

Squid代理服务器_客户端_17

监听192.168.1.1 3128  只是从内部主机访问的这种squid请求 才会提供代理


如果有80的访问 我送到3128上去

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 3128

-p代表协议 tcp  --dport 80 代表目标的意思 –dport 代表目标端口 只要是访问tcp 80端口的-j 代表动作的意思 REDIRECT 重定向 到3128

向t-A PREROUTING 这里面添加一条规则 目标端口是80 的 我就送到3128上去

这是一种防火墙规则


然后客户端再打开浏览器去访问就可以 了

Squid代理服务器_web服务器_18


客户端不需要做任何操作了访问网站就正常访问,当客户端把请求交给squid的时候他会把去往80端口的报文送到3128上去。这样就可以实现重定向的工作,也就是交给代理,交给squid ,客户端不知道代理服务器存在但是确实代理服务在工作。这是网管范畴




如果去web服务器 做网页改变

那去客户端再次访问 是可以看到改变的

因为

squid工作方式:

当客户端把请求发过来的时候找代理服务器,代理服务器一看自己有缓存但是不会马上提供服务,他会产生一个校验码 ,然后向源主机发出一个查询 对方对目标 也产生了一个校验码,两个比较一下看看一不一样,如果一样那就说明没有更新,直接给客户端相应,如果不一样,他会从新获取新的,然后缓存一份 给客户端提供相应。




反向代理:

将刚才的客户端 改为内部主机

ip 192.168.1.2 /24 网关192.168.1.1

systemctl start httpd

启动apache服务


systemctl stop direwalld
setenforce 0

关闭防火墙


echo lan-tstt > /var/www/html/index.html

产生测试页


systemctl stop httpd

web主机  关闭apache

web主机 改为 外部客户端  

Squid代理服务器_客户端_19



作为外网客户端来讲 去访问内部服务器 肯定是访问不到的,能访问的位置就是200.0.0.1这个地址 ,但是外部主机根本不知道代理服务器的存在,他正常访问网站的时候 访问默认端口号80

作为外部主机访问 squid  的时候 把squid的配置文件改下 改为80端口 但是这个端口号是个假的 还需要描述出真实的web服务器是谁,需要在配置文件中指明 真实服务器是谁

作为squid来讲他的配置文件中 默认给私有网络提供代理服务,现在是公网来访问,不包含在配置文件中指定的私网网段,所以要在配置文件中,开启对所有主机提供代理的一个功能。


ln -s /usr/local/squid/sbin/* /usr/local/sbin/

useradd -M -s /sbin/nologin squid

chown -R squid:squid /usr/local/squid/var/


在配置文件/etc/squid.conf中的http_port 3128下添加如下两行

vim /etc/squid.conf 以下几项,有的修改,没有的添加
http_port 80 accel vhost vport
http_access allow all	(加在http_access deny all上面)
cache_effective_user squid
cache_effective_group squid
cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256  \\前面的#去掉

cache_peer 192.168.32.140 parent 80 0 originserver [round-robin]

创建缓存目录
Squid -z
Squid



squid可能会启动失败,因为上面设定了squid的监听端口是80,和系统的http服务冲突,所以要将http服务停掉。

/etc/init.d/httpd stop
chkconfig httpd off

1.1.1. 重启squid

squid –k shutdown 
squid -k parse	测试语法是否正确
squid
查看状态
netstat–antp|grep squid


Squid代理服务器_客户端_20

改为

http_port 80 accel vhost vport


Squid代理服务器_代理服务器_21

http_access deny all

拒绝所有主机的意思 相当、于默认选项 拒绝所有主机


Squid代理服务器_web服务器_22


http_access allow localnet

http_access allow localhost

允许 localhost  主机  


Squid代理服务器_web服务器_23



怎么知道他是对内部主机 提供 对外部不提供的呢

这里和路由器上的acl一样的

也叫acl  

acl localnet src 10.0.0.0/8

acl  表名 localnet  src代表source 来源10.0.0.0/8 10网段 代表私有网段

来自10网段的流量 放到 localnet 这个表里

acl localnet src 172.16.0.0/12

172.16.0.0/12 指的是172.16到172.31  b类的私有网段

acl localnet src 192.168.0.0/16

192.168.0.0/16 代表的是0到256 私有网段 c类私有网段


Squid代理服务器_web服务器_24



表定完了 后去应用

http_access allow localnet

http_access allow localhost

允许 给localhost  这个表里的主机 提供代理

也就是私有网络去访问公有网络的时候 他默认就可以了 因为刚才是192.168.1.0网段的


Squid代理服务器_代理服务器_25


但是现在公网当中访问他的时候源ip不好确认

就直接把

http_access deny all

改为

http_access allow all

允许 给任何主机提供服务

Squid代理服务器_客户端_26



那么真实主机是谁 ,刚才说80端口是虚拟的

真的在任意地方添加就可以

cache_peer 192.168.1.2 parent 80 0 originserver

peer是对等体的意思 就是对端真实主机


也就是说真实主机是192.168.1.2 他的端口号是80

缓存服务器可以有多级服务器0 代表没有多级服务器 缓存服务器就这一个

 originserver 代表原始主机的意思 也就是说1.2. 才是真正的原始主机

保存退出

固化ens33 ip 192.168.1.1/24  网关192.168.1.1 
ens37 200.0.0.1/24 网关200.0.0.1


netstat -antup | grep squid

查看是否运行 squid  运行就杀死 从开


killall squid

关闭 squid

netstat -antup | grep squid

查看是否关闭成功



squid

启动squid 

netstat -antup | grep squid

查看是否运行 squid 没有就多启动几次

他打开的端口是80



Squid代理服务器_客户端_27

systemctl stop firewalld
setenforce 0
关闭防火墙

切换到外部客户端 curl访问 或者浏览器访问都可以

curl 200.0.0.1

可以查看日志

rpm包的http日志在

/var/log/httpd/access_log

Squid代理服务器_客户端_28

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  jnZtF7Co41Wg   2023年12月11日   27   0   0 nginx客户端服务端
  jnZtF7Co41Wg   2023年12月09日   26   0   0 客户端服务端数据
  38gcbVXUBcLA   2023年11月24日   22   0   0 服务器客户端HTTP
  jnZtF7Co41Wg   2023年12月10日   20   0   0 nginx客户端服务端NFS
  aYmIB3fiUdn9   2023年12月08日   49   0   0 客户端IPNATlvs
  38gcbVXUBcLA   2023年11月25日   23   0   0 服务器客户端HTTP
AWkq7aIjuRwO