Squid 代理服务器应用

目录

一、Squid 服务基础

1.1、缓存代理概述 

1)代理的工作机制 

2)代理的基本类型 

1.2、安装及运行控制 

1)编译安装 Squid 

2)Squid 的配置文件 

3)Squid 的运行控制 

二、构建代理服务器 

2.1、传统代理 

1)Squid 服务器的配置 

2)客户机的代理配置

3)代理服务的验证方法

2.2、透明代理 

1)配置 Squid 支持透明代理 

2)设置 firewalld 的重定向策略 

3)验证透明代理的使用 


Squid 是 Linux 系统中最常用的一款开源代理服务软件(官方网站为 http://www.squid-cache.org),可以很好地实现 HTTP 和 FTP,以及 DNS 查询、SSL 等应用的缓存代理,功能十分强大。

一、Squid 服务基础

本节将介绍缓存代理的工作机制、类型,以及 Squid 服务的安装和运行控制、主配置文件。 

1.1、缓存代理概述 

作为应用层的代理服务软件,Squid 主要提供缓存加速、应用层过滤控制的功能。 

1)代理的工作机制 

当客户机通过代理来请求 Web 页面时,指定的代理服务器会先检查自己的缓存。如果缓存中已经有客户机需要的页面,则直接将缓存中的页面内容反馈给客户机。如果缓存中没有客户机要访问的页面,则由代理服务器向 Internet 发送访问请求,获得返回的 Web 页面以后,将网页数据保存到缓存中并发送给客户机,如下图所示。 

代理服务的缓存机制 

HTTP 代理的缓存加速对象主要是文字、图像等静态 Web 元素。使用缓存机制后,当客户机在不同的时候访问同一 Web 元素,或者不同的客户机访问相同的 Web 元素时,可 以直接从代理服务器的缓存中获得结果。这样就大大减少了向 Internet 提交重复的 Web 请求的过程,提高了客户机的 Web 访问响应速度。 

由于客户机的 Web 访问请求实际上是由代理服务器来代替完成的,从而可以隐藏用户的真实 IP 地址,起到一定的保护作用。另一方面,代理服务器担任着类似“经纪人”的角色, 可以针对要访问的目标、客户机的地址、访问的时间段等进行过滤控制。 

2)代理的基本类型 

根据实现方式不同,代理服务可分为传统代理和透明代理两种常见的代理服务。 

  • 传统代理:也就是普通的代理服务,首先必须在客户机的浏览器、QQ 聊天工具、下载软件等程序中手动设置代理服务器的地址和端口,然后才能使用代理来访问网络。对于网页浏览器,访问网站时的域名解析请求也会发给指定的代理服务器。 
  • 透明代理:提供与传统代理相同的功能和服务,其区别在于客户机不需要指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将 Web 访问重定向,实际仍然交给代理服务器来处理。重定向的过程对客户机是“透明”的,用户甚至并不知道自己在使用代理服务,所以称为透明代理。使用透明代理时,网页浏览器访问网站时的域名解析请 求将优先发给 DNS 服务器。

实际应用中,传统代理多见于 Internet 环境,如为 QQ 程序使用代理可以隐藏本机真实 IP 地址、为下载工具使用多个代理可以规避服务器的并发连接限制。而透明代理多见于局域网环境,如在 Linux 网关中启用透明代理后,局域网主机无须进行额外设置就可以享受更好的上网速度。 

1.2、安装及运行控制 

下面以 Squid 3.5.23 版为例,介绍其安装和运行控制。 

1)编译安装 Squid 

配置 Squid 的编译选项时,将安装目录设为/usr/local/squid,其他具体选项根据实际需要来定,配置前可参考“./configure --help”给出的说明。 

[root@centos7-7 ~]# yum -y install gcc gcc-c++
[root@centos7-7 ~]# tar zxf squid-3.5.23.tar.gz -C /usr/src/
[root@centos7-7 ~]# cd /usr/src/squid-3.5.23/
[root@centos7-7 squid-3.5.23]# ./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
[root@centos7-7 squid-3.5.23]# make && make install

上述选项含义如下:

  • --prefix=/usr/local/squid:安装目录。
  • --sysconfdir=/etc:单独将配置文件修改到其他目录。
  • --enable-linux-netfilter:使用内核过滤。
  • --enable-async-io= 值 : 异步 I/O, 提升存储性能,相当于 “--enable-pthreads --enable-storeio= ufs,aufs --with -pthreads --with-aufs-thread=值”。
  •  --enable-default-err-language=Simplify_Chinese:错误信息的显示语言。
  • --disable-poll 与--enable-epoll:关闭默认使用 poll 模式,开启 epoll 模式提升性能。
  • --enable-gnuregex:使用 GNU 正则表达式。

安装完后,创建链接文件、创建用户和组。 

[root@centos7-7 squid-3.5.23]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/
[root@centos7-7 squid-3.5.23]# useradd -M -s /sbin/nologin squid
[root@centos7-7 squid-3.5.23]# chown -R squid:squid /usr/local/squid/var/

2)Squid 的配置文件 

Squid 服务的配置文件位于/etc/squid.conf,充分了解配置行的作用将有助于管理员根据实际情况灵活配置代理服务。 

[root@centos7-7 ~]# vim /etc/squid.conf
......//省略其他内容
 58 # Squid normally listens to port 3128
 59 http_port 3128
 60 cache_effective_user squid  //添加此行
 61 cache_effective_group squid  //添加此行
 62 # Uncomment and adjust the following to add a disk cache directory.
 63 #cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256
......//省略其他内容

默认情况下,配置文件中不包括 cache_effective_user 与 cache_effective_group 配置项,需要手动添加。 

3)Squid 的运行控制 

下面是 Squid 的运行控制步骤

  • 检查配置文件语法是否正确 
[root@centos7-7 ~]# squid -k parse
  • 启动、停止 Squid 

第一次启动 Squid 服务时,会自动初始化缓存目录。在没有可用的 Squid 服务脚本的情况下,也可以直接调用 Squid 程序来启动服务,这时需要先进行初始化。 

[root@centos7-7 ~]# squid -z  //-z选项用来初始化缓存目录
[root@centos7-7 ~]# 2024/03/18 19:54:14 kid1| Set Current Directory to /usr/local/squid/var/cache/squid
2024/03/18 19:54:14 kid1| Creating missing swap directories
2024/03/18 19:54:14 kid1| No cache_dir stores are configured.

[root@centos7-7 ~]# squid   //启动 Squid 服务

确认 Squid 服务处于正常监听状态 

[root@centos7-7 ~]# netstat -anpt | grep "squid"
tcp6       0      0 :::3128                 :::*                    LISTEN      48525/(squid-1) 
  • 使用 Squid 服务脚本 

为了使 Squid 服务的启动、停止、重载等操作更加方便,可以编写 Squid 服务脚本, 并使用 chkconfig 和 systemctl 工具来进行管理。 

[root@centos7-7 ~]# vim /etc/init.d/squid
#!/bin/bash
# chkconfig: 2345 90 25
# config: /etc/squid.conf
# pidfile: /usr/local/squid/var/run/squid.pid
# Description: Squid - Internet Object Cache.
PID="/usr/local/squid/var/run/squid.pid"
CONF="/etc/squid.conf"
CMD="/usr/local/squid/sbin/squid"
case "$1" in
 start)
     netstat -anpt | 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 -anpt | 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 | restart | reload | check | status}"
;;
esac


[root@centos7-7 ~]# chmod +x /etc/init.d/squid
[root@centos7-7 ~]# chkconfig --add squid
[root@centos7-7 ~]# reboot
[root@centos7-7 ~]# systemctl restart squid

这样一来,就可以通过 Squid 脚本来启动、停止、重启、重载 Squid 服务器了,方法是在执行/etc/init.d/squid 脚本时添加相应的 start、stop、restart 参数或通过 systemctl 命令控制 Squid 服务。 

二、构建代理服务器 

本节主要从三个方面来学习 Squid 服务的构建和使用,分别为传统代理、透明代理和 ACL 访问控制。传统代理的实现最为简单,透明代理还需要结合默认路由、防火墙策略等 一起来完成,ACL 列表主要用来针对客户机的 Web 访问过程进行过滤控制。

2.1、传统代理 

使用传统代理的特点在于客户机的相关程序(如 IE 浏览器、QQ 聊天软件)必须指定代理服务器的地址、端口等基本信息。下面通过一个简单的应用案例来学习传统代理的配置 和使用方法。 

基于 Internet 网络环境(如下图所示),案例的主要需求描述如下

  • 在 Linux 主机 B 上,构建 Squid 为客户机访问各种网站提供代理服务,但禁止通过代理下载超过 10MB 大小的文件
  • 在客户机 C 上,指定主机 B 作为 Web 访问代理,以隐藏自己的真实 IP 地址。

 使用 squid 传统代理 

针对上述实验环境,主机 B 作为代理服务器,必须正确构建 Squid 服务,并允许客户机使用代理。主机 C 作为客户机,需要为浏览器等程序指定所使用的代理服务器地址、端口号等信息,主机 A 作为测试网站,需要启用 httpd 服务。

关于 httpd 服务器的构建,请参考以前的课程,这里不再重复讲解。下面主要介绍 Squid 服务器的配置、客户机的代理设置,以及代理服务的验证方法。

1)Squid 服务器的配置 

配置 Squid 实现传统代理服务时,需要注意添加 http_access allow all 访问策略,以便允许任意客户机使用代理服务。除此以外,为了限制下载的文件大小,还需要设置 reply_body_max_size 项,其他各种参数均可保持默认。 

  • 修改 Squid 的配置文件
[root@centos7-7 ~]# vim /etc/squid.conf
......//省略部分内容
 55 # And finally deny all other access to this proxy
 56 http_access allow all  //添加此行
 57 http_access deny all
 58 
 59 # Squid normally listens to port 3128
 60 http_port 3128
 61 reply_body_max_size 10 MB  //添加此行(允许下载的最大文件大小10MB)
 62 cache_effective_user squid
......//省略部分内容
  • 重载 Squid 服务 

修改 squid.conf 配置文件以后,需要重新启动服务方可生效。执行“systemctl restart squid”或“squid -k reconfigure”,都可以重新加载服务配置。 

[root@centos7-7 ~]# systemctl restart squid

2)客户机的代理配置

 打开控制面板(如下图所示),然后选择“网络和 Internet ”-“ Internet 选项”-“连接”,添加代理服务器的地址和端口,保存即可

3)代理服务的验证方法

在客户机 192.168.23.100 中通过浏览器访问目标网站 http://192.168.23.206/,然后观察 Squid 代理服务器、Web 服务器的访问日志,以验证代理服务是否发挥作用。 

  • 查看 Squid 访问日志的新增记录 

在 Squid 代理服务器中,通过跟踪 Squid 服务的访问日志文件,应该能够发现客户机 192.168.23.100 访问网站服务器 192.168.23.206 的记录。 

1710809188.082      4 192.168.23.100 TCP_REFRESH_UNMODIFIED/304 218 GET http://192.168.23.206/ - HIER_DIRECT/192.168.23.206 -
1710809189.132      0 192.168.23.100 TAG_NONE/503 0 CONNECT nav-edge.smartscreen.microsoft.com:443 - HIER_NONE/- -
1710809189.147      1 192.168.23.100 TCP_REFRESH_UNMODIFIED/304 218 GET http://192.168.23.206/ - HIER_DIRECT/192.168.23.206 -
1710809189.787      1 192.168.23.100 TCP_MISS/503 4592 GET http://msedge.b.tlu.dl.delivery.mp.microsoft.com/filestreamingservice/files/74c158ad-da8f-4e86-9ac1-0fdb473a85ad? - HIER_NONE/- text/html
  • 查看 Web 访问日志的新增记录 

在被访问的 Web 服务器中,通过跟踪 httpd 服务的访问日志文件,应该能够发现来自代理服务器 192.168.23.207 的访问记录。这说明当客户机使用代理以后,Web 服务器并不知道客户机的真实 IP 地址,因为实际上是由代理服务器替它在访问。 

192.168.23.207 - - [19/Mar/2024:08:46:28 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.57"
192.168.23.207 - - [19/Mar/2024:08:46:29 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.57"

当从客户机再次访问同一 Web 页面时,Squid 访问日志中会增加新的记录,但 Web 访问日志中的记录不会有变化(除非页面变更或执行强制刷新等操作)。这说明当客户机重复访问同一静态页面时,实际上是由代理服务器通过缓存提供的。 

2.2、透明代理 

透明代理提供的服务功能与传统代理是一致的,但是其“透明”的实现依赖于默认路由和防火墙的重定向策略,因此更适用于为局域网主机服务,而不适合为 Internet 中的客户机提供服务。下面也通过一个简单的应用案例来学习透明代理的配置和使用。 

基于局域网主机通过 Linux 网关访问 Internet 的环境,如下图所示,案例的主要需求描述如下。 

  • 在 Linux 网关上,构建 Squid 为客户机访问 Internet 提供代理服务
  • 在所有的局域网客户机上,只需正确设置 IP 地址、默认网关和 DNS,不需要手动指定代理服务器的地址、端口等信息。 

 使用 Squid 透明代理 

针对上述实验环境,透明代理的关键在于 Linux 网关服务器,而对于客户机仅需正确设置网络地址、默认网关,而并不需要指定代理服务器(若指定了反而易出错)。 

关于客户机的 DNS 解析工作,最好通过正常的 DNS 服务器来提供,不建议抛给代理服务器来处理。下面主要介绍 Squid 服务的透明代理设置、防火墙策略设置,其他配置操作请参考前面的传统代理构建过程。 

1)配置 Squid 支持透明代理 

Squid 服务的默认配置并不支持透明代理,因此需要调整相关设置。对于 2.6 以上版本 的 Squid 服务,只要在 http_port 配置行加上一个“transparent”(透明)选项,就可以支持透明代理了。 

[root@centos7-7 ~]# vim /etc/squid.conf
......//省略部分内容
 62 cache_effective_user squid
 63 cache_effective_group squid
 64 http_port 192.168.244.10:128 transparent  //添加此行(只在一个IP地址上提供服务)
[root@centos7-7 ~]# systemctl restart squid.service
[root@centos7-7 ~]# vim /etc/sysctl.conf
......//省略部分内容
net.ipv4.ip_forward = 1  //添加此行(开启路由转发)

[root@centos7-7 ~]# sysctl -p
net.ipv4.ip_forward = 1

2)设置 firewalld 的重定向策略 

透明代理中的 Squid 服务实际上是构建在 Linux 网关主机上的,因此只需正确设置防火墙策略,就可以将局域网主机访问 Internet 的数据包转交给 Squid 进行处理。这需要用到firewalld 的 IP 伪装与端口转发策略,其作用是实现本机端口的重定向,将访问网站协议 HTTP、HTTPS 的外发数据包转交给本机的 Squid 服务(3128端口)。 

防火墙做端口转发操作,将访问本机 80、443 端口的请求转发到 3128 端口。

[root@centos7-7 ~]# systemctl start firewalld
[root@centos7-7 ~]# firewall-cmd --zone=external --change-interface=ens32
success
[root@centos7-7 ~]# firewall-cmd --zone=internal --change-interface=ens34
success
[root@centos7-7 ~]# firewall-cmd --zone=external --add-service=http
success
[root@centos7-7 ~]# firewall-cmd --zone=external --add-service=https
success
[root@centos7-7 ~]# firewall-cmd --zone=external --add-port=3128/tcp
success
[root@centos7-7 ~]# firewall-cmd --direct --add-rule ipv4 nat PREROUTING 0 -i ens34 -p tcp --dport 80 -j REDIRECT --to-ports 3128
success
[root@centos7-7 ~]# firewall-cmd --direct --add-rule ipv4 nat PREROUTING 0 -i ens34 -p tcp --dport 443 -j REDIRECT --to-ports 3128
success
[root@centos7-7 ~]# firewall-cmd --runtime-to-permanent
success

由于 FTP 协议涉及多个端口、多个连接,虽然也可以通过 HTTP 代理进行访问,但使用透明代理不便实现,因此最佳做法仍然是采用传统代理的方式——手动指定代理服务器的 地址、端口号。 

3)验证透明代理的使用 

为了验证透明代理的效果,如果存在手动指定的代理服务器设置应在客户机中将其去除。 例如,在控制面板设置中不要勾选使用代理服务器;在 Linux 客户机的命令行界面中,可以通过 unset 命令清除 HTTP_PROXY、HTTPS_PROXY 等变量。无论是 windows 客户机还是 linux 客户机,网关都应设为 Squid 代理服务器的地址。

在客户机 192.168.244.12 中通过浏览器访问目标网站 http://192.168.23.206/,然后观察 Squid 代理服务器、Web 服务器的访问日志,以验证透明代理是否发挥作用。对代理服务操作的验证结果保存在 Squid 代理服务器中,从中能够发现客户机 192.168.244.12 访问网站服务器 192.168.23.206 的记录;在被访问的 Web 服务器中,应该能够发现来自代理服务器 192.168.23.207的访问记录。

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值