CentOS8 Squid代理服务器部署(包教包会,不会,你又没给钱)

Squid代理缓存服务器部署

Squid是Linux系统中最为流行的一款高性能代理服务软件,通常用作web网站的前置缓存服务,能够替代用户向网站服务器请求页面数据并进行缓存



一、Squid代理服务器简介

Squid服务程序会按照收到的用户请求向网站资源服务器请求数据,并将数据存储在Squid服务器上,减少用户等待时间,减轻网站服务器负载。
Squid服务程序功能:

  1. 支持HTTP、FTP、SSL等多种协议的缓存
  2. 支持基于访问控制列表(ACL)和访问权限列表(ARL)执行内容过滤与权限管理功能
  3. 支持基于多种条件禁止用户访问存在威胁或不适宜的网站资源

Squid服务程序优势: 配置简单、效率高、功能丰富,保护企业内网安全、提升用户网络体验、节省网络带宽
Squid服务程序缺点: 消耗大量硬件资源,需要大网络贷款、运营成本高

Squid服务器一般部署在网关服务器上,因为网关服务器是内网和外网互联互通的必经之路。将Squid服务器部署在网关服务器上是为了使用Squid的ACL功能和ARL功能对内外网的访问请求进行审计和限制。

Squid工作模式如下图所示
在这里插入图片描述

  1. 正向代理模式: 用户听过Squid服务器进行互联网访问,Squid接收到的用户请求,再根据用户请求获取互联网资源再返回给用户。正向代理又分为标准代理模式和透明代理模式。
  2. 标准代理模式: 把网站数据缓存到服务器本地,提高数据资源被再次访问时的效率,但是用户必须在使用的软件中填写代理服务器的IP地址和端口号信息。
  3. 透明代理模式: 与标准代理模式基本相同,区别只是用户不需要手动设置IP地址和端口号
  4. 反向代理模式: 让多台节点主机反向缓存网站数据,从而加快用户访问速度。当外网用户发起访问网站数据请求时,首先要请求Squid服务器,Squid服务器上缓存了网站的静态数据资源。当Squid服务器缓存的静态数据资源中有用户请求的数据时,直接发送给用户,从而降低了网站服务器的负载。

正向代理模式和反向代理模式的区别:
正向代理模式一般用于企业局域网之中,主要服务的对象是内网中的主机,其功能是对内网中主机访问外网的行为进行审计和限制。
反向代理模式一般是为大中型网站提供缓存服务,主要服务的对象是外网中的主机想要访问内网中网站数据,其功能是提高外网用户访问网站的速度。
正向代理模式和反向代理模式不能在同一个Squid服务器中共存,Squid服务器要么只能使用正向代理模式为内网用户服务,要么只能使用反向代理模式为外网用户服务。


二、Squid服务程序部署实验

在squid服务器上使用两个网卡,一个网卡使用桥接模式,另一个使用主机模式。再使用一台电脑作为squid的内网客户端。
首先设置squid内网客户端的ip地址,如下图所示

Ubuntu客户端
客户端网卡需要设置为仅主机模式,因为要用来模拟内网squid客户端。

root@ubuntu:~# nmcli
ens33: connected to ens33
        "Intel 82545EM"
        ethernet (e1000), 00:0C:29:64:0D:61, hw, mtu 1500
        ip4 default
        inet4 192.168.127.199/24
        route4 192.168.127.0/24
        route4 169.254.0.0/16
        route4 0.0.0.0/0
        inet6 fe80::a83d:7292:a833:b5a0/64
        route6 ff00::/8
        route6 fe80::/64

lo: unmanaged
        "lo"
        loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536

DNS configuration:
        servers: 114.114.114.114 8.8.8.8
        interface: ens33

CentOS8服务器
再设置squid服务器时,将ens33网卡设置为连接外网的网卡,将ens37设置为连接内网的网卡。外网网卡需要设置为桥接模式,内网网卡需要设置为仅主机模式

虚拟机桥接模式大坑:

在虚拟机中,点击编辑----->虚拟网络编辑器

坑一 虚拟机网卡设置

步骤一
在这里插入图片描述
步骤二
在这里插入图片描述
步骤三
在这里插入图片描述
步骤四

在这里插入图片描述

坑二 服务器和客户机网卡设置

完成好以上设置之后,需要对squid服务器外网卡进行配置。将ens33设置为外网卡,在设置外网卡时,首先查看宿主机的IP地址信息。如下图所示
步骤一
在这里插入图片描述
记下宿主机的IP地址,和宿主机的网关地址,在配置squid服务器外网卡时需要用到。
步骤二

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=马赛克马赛克   <<<<<<填写宿主机的真实IP地址
PREFIX=24
GATEWAY=马赛克马赛克    <<<<<填写宿主机的网关地址
DNS1=114.114.114.114
DNS2=8.8.8.8
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=no
DHCPV6C=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=3f8baa7c-45f3-4ca9-97a8-f0f17d
ONBOOT=yes       <<<<<<加入开机自启
~             

配置ens37内网卡与之前博客的步骤一样,可以使用nmtui命令进行设置,也可以对ifcfg-ens37配置文件进行配置,或者直接在图形界面中进行设置。
设置效果如下所示

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.127.200   <<<<<内网网卡IP地址,和ubuntu客户端组成局域网
PREFIX=24
GATEWAY=192.168.127.1    <<<<<局域网网关地址
DNS1=114.114.114.114
DNS2=8.8.8.8
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=no
DHCPV6C=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens37
UUID=9cf63226-e9a5-40ec-956a-70a45a800c3b
ONBOOT=yes

服务器ping不通外网

在以下情况下

  1. 设置虚拟机网卡连接模式后
  2. 配置或修改服务器网卡配置文件后
  3. 其他造成服务器无法和外网互通的情况
尝试方法一

在遇到以上情况下,需要进行如下操作

步骤一 启动网卡管理器

[root@CentOS ~]# nmtui

步骤二 选择启用连接
在这里插入图片描述
步骤三 针对网卡进行停用再激活

尝试方法二

步骤一
在这里插入图片描述
步骤二
在这里插入图片描述
步骤三
在这里插入图片描述
将两个网卡的配置删除,再重新编辑配置文件即可。

在各项配置都正确的情况下,主机还是无法与外网互通可能的原因:
在配置完成后,服务器系统可能还没反应过来。也可能是在趁服务器系统不注意的情况下进行配置。

测试结果

局域网内互ping

[root@Mail network-scripts]# ping -c 4 192.168.127.199
PING 192.168.127.199 (192.168.127.199) 56(84) bytes of data.
64 bytes from 192.168.127.199: icmp_seq=1 ttl=64 time=0.366 ms
64 bytes from 192.168.127.199: icmp_seq=2 ttl=64 time=0.330 ms
64 bytes from 192.168.127.199: icmp_seq=3 ttl=64 time=0.347 ms
64 bytes from 192.168.127.199: icmp_seq=4 ttl=64 time=0.617 ms

--- 192.168.127.199 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 115ms
rtt min/avg/max/mdev = 0.330/0.415/0.617/0.117 ms
[root@Mail network-scripts]# 
root@ubuntu:~# ping -c 4 192.168.127.200
PING 192.168.127.200 (192.168.127.200) 56(84) bytes of data.
64 bytes from 192.168.127.200: icmp_seq=1 ttl=64 time=0.348 ms
64 bytes from 192.168.127.200: icmp_seq=2 ttl=64 time=0.413 ms
64 bytes from 192.168.127.200: icmp_seq=3 ttl=64 time=0.675 ms
64 bytes from 192.168.127.200: icmp_seq=4 ttl=64 time=0.528 ms

--- 192.168.127.200 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3075ms
rtt min/avg/max/mdev = 0.348/0.491/0.675/0.124 ms

squid 服务器ping外网

[root@Mail network-scripts]# ping wwww.baidu.com
PING ps_other.a.shifen.com (123.125.114.144) 56(84) bytes of data.
64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=1 ttl=51 time=4.31 ms
64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=2 ttl=51 time=4.75 ms
64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=3 ttl=51 time=4.20 ms
64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=4 ttl=51 time=4.15 ms
^C
--- ps_other.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 10ms
rtt min/avg/max/mdev = 4.154/4.353/4.748/0.234 ms

安装squid软件

yum install squid

------------------------------------------------------------常用Squid服务程序配置参数-----------------------------------------------------------------------

参数作用
http_port 3128监听的端口号
cache_mem 64M内存缓冲区的大小
cache_dir ufs /var/spool/squid 2000 16 256硬盘缓冲区的大小
cache_effective_user squid设置缓存的有效用户
cache_effective_group squid设置缓存的有效用户组
dns_nameservers [IP地址]一般不设置,而是使用服务器默认的DNS地址
cache_access_log /var/log/squid/access.log访问日志文件的保存路径
cache_log /var/log/squid/cache.log缓存日志文件的保存路径
visible_hostname mywebsite.com设置squid服务器的名称

正向代理

标准正向代理

squid软件程序安装完成并启动后,默认就可以提供标准正向代理模式服务,不需要修改配置文件。

在火狐浏览器中填写代理服务器信息

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在ubuntu的squid客户端浏览器中填写相应的代理信息即可实现,局域网内仅主机模式的用户通过网关的squid服务器进行网络连接。

骗你的 哪有那么简单

安装并启动squid后,在squid客户端填入代理服务器信息,访问网站时会发现
在这里插入图片描述

填坑

从以往配置总结的经验来看,必定是firewall防火墙和SELinux安全上下文在搞事情。

  1. 尝试关闭firewall防火墙,关闭SELinux安全上下文
systemctl stop firewall.service
setenforce 0
  1. 再次尝试使用squid客户端连接代理服务器
    可以发现连接外网成功
  2. 现在可以确定是防火墙和SELinux安全上下文的问题
  3. 配置firewall防火墙
[root@Mail squid]# firewall-cmd --permanent  --add-port=3128/tcp
success
[root@Mail squid]# firewall-cmd --permanent  --add-service=squid
success
[root@Mail squid]# firewall-cmd --reload 
success
[root@Mail squid]# firewall-cmd --list-all
internal (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33 ens37
  sources: 
  services: cockpit dhcpv6-client ftp imap mdns mountd nfs pop3 rpc-bind samba samba-client smtp squid ssh tftp
  ports: 69/udp 2049/tcp 2049/udp 25/tcp 110/tcp 143/tcp 587/tcp 3128/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

注意:
在设置firewall防火墙时,一定要加上 --permanent 参数
在设置firewall防火墙时,一定要加上 --permanent 参数
在设置firewall防火墙时,一定要加上 --permanent 参数

此时再使用squid客户端测试连接,即可连接外网,如下所示
在这里插入图片描述
在配置安全权限时,在最小权限程度下达到要求即可,这样才能保证计算机的安全。

默默吐槽一句:配置服务最烦的上来就是关闭防火墙,关闭SELinux安全上下文。

管理信任来源和目标

在《鸟哥的私房菜-服务器架设篇》中有关于acl(access control list)和 http_access使用参考

acl 基本语法
acl <自定义acl名称> <要控制的acl类型> <设置的内容>

管理使用proxy信任客户端的方式

src表示的源IP地址,管理内网主机。dst表示目标地址,管理访问的外网地址。如下图所示

在这里插入图片描述

  1. src ip-address/netmask
acl myallowip src 192.168.127.58/24 192.168.127.57/24  
# 定义一个myalllowip变量
#相当于定义了一个接入控制列表变量 myallowip = 两个IP地址
  1. src addr1-addr2/netmask
acl myallowip src 192.168.127.1-200/24
 # 定义一个myalllowip变量
#相当于定义了一个接入控制列表变量 myallowip = ip地址范围
  1. srcdomain .domain.name
acl myallowhostname srcdomain myhostname
 # 定义一个myalllowip变量
#相当于定义了一个接入控制列表变量 myallowhostname = 主机名
#相当于定义了一个变量,该变量包括主机名主机中的所有用户
管理proxy代理获取的数据
  1. dst ip-addr/netmask
acl mydropip dst 119.75.217.109/32
##设置外网服务器地址变量mydropip
  1. dstdomain .domain.name
acl dropbd dstdomain .baidu.com
## 设置外网服务器主机名

3.url_regex [-i] ^http://url

acl mymatchurl url_regex ^http://www.baidu.com/*
##使用正则表达式处理网址
  1. urlpath_regex [-i] \.gif$
acl sexurl urlpath_regex /sexy.*\avi$
##根据网址部分内容进行匹配处理

重点
可以使用外部文件统一处理acl内容设置值
例如:

acl dropip dst "/etc/squid/dropip.txt"

可以将要管理的IP地址写入一个文件中同一管理。

acl结合http_access管理代理数据

/etc/squid/squid.conf路径下编辑配置规则
格式:
http_access deny/allow acl
http_access有顺序要求,先将deny的规则写在前,allow规则写在后

例如:

http_access deny dropip
http_access deny sexurl
http_access allow myallowip

透明正向代理

正如前面squid代理服务器简介中介绍的一样,透明代理模式就是在用户没有任何感知的情况下使用代理模式。也就是说用户不用手动配置代理服务器的信息。正如前面介绍的,在局域网内部署Squid服务器时,一般将squid服务器部署在局域网网关中。因为要实现正向代理,网关是局域网中主机必经的一个环节,将squid部署在网关才能更方便实现对局域网内访问外界流量的控制。

因为局域网内主机要连接互联网,必定要设置局域网网关地址。而squid服务器部署在网关服务器中

透明代理模式中客户机(局域网内的主机)不需要做任何设置(或者说唯一要做,也必须要做的设置就是设置主机的网关地址,因为就算没有部署squid服务器,客户机也要将设置网关地址)。

透明代理模式流程梳理

如下图所示
在这里插入图片描述
当局域网主机向外界进行访问时,需要进行以下流程

例如使用浏览器访问互联网

  1. 局域网主机(192.168.127.199)通过80端口,向网关(192.168.127.1)发送http数据包
  2. 网关(192.168.127.1)服务器(也是squid服务器)接收访问请求,审查数据包与ACL策略进行比对
  3. 针对不符合ACL策略的数据包丢弃,符合ACL策略的数据包转发至网关外网网卡
  4. 外网网卡根据数据包向外网服务器请求数据,并返回到网关(192.168.127.1)
  5. 网关再根据数据包返回给局域网主机(192.168.127.199)

在了解以上流程后,需要进行

在squid服务器上

  1. 将squid设置为透明代理模式
  2. 设置端口转发
  3. 设置防火墙
squid设置为透明代理模式

编辑/etc/squid路径下的squid.conf文件

vim squid.conf

关键点
在新版本的squid服务程序中不再时直接在3218 后面添加transparent了。如果照原先的版本配置,则会出现

FATAL: mimeLoadIcon: cannot parse internal URL

错误

# Squid normally listens to port 3128
http_port 3128 
http_port 3129 intercept
#用户测试
# Uncomment and adjust the following to add a disk cache directory.
cache_dir ufs /var/spool/squid 100 16 256   <<<<<<<<<取消这一行的注释

cache_dir ufs /var/spool/squid 100 16 256的含义为设置缓存目录,即squid服务器从客户机和外网接收到的数据都将会暂时缓存在该目录下。磁盘高速缓存设置是影响代理服务器的一个重要参数。
cache_dir ufs /var/spool/squid 100 16 256

  1. 100代表将使用100M作为缓存目录
  2. 16代表在第一层有16个文件夹
  3. 256代表在第二次有256个文件夹

在设置完成后

squid -k parse <<<<<<<<<检查主配置文件是否有错误
squid -z <<<<对squid服务器程序透明代理技术进行初始化
firewall防火墙设置
external (active)    <<<<<<外部域
  target: default
  icmp-block-inversion: no
  interfaces: ens33 virbr0clear    <<<<<外网网卡和网桥
  sources: 
  services: http https ssh   <<<<添加允许通过的服务
  ports: 80/udp 3128/udp    <<<<添加要使用的端口
  protocols: 
  masquerade: yes
  forward-ports: port=80:proto=udp:toport=3128:toaddr=
	port=443:proto=tcp:toport=3128:toaddr=                 <<<<<添加端口转发策略,将80端口接收到的数据转发到3128端口
  source-ports: 
  icmp-blocks: 
  rich rules:


internal (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens37
  sources: 
  services: cockpit dhcpv6-client ftp imap mdns mountd nfs pop3 rpc-bind samba samba-client smtp squid ssh tftp
  ports: 69/udp 2049/tcp 2049/udp 25/tcp 110/tcp 143/tcp 587/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

在设置firewall防火墙时,使用图形界面设置更简单一些。

重启网络管理器,重启网络

结果测试

清除浏览器网络代理设置
在这里插入图片描述
测试结果:成功
在这里插入图片描述

反向代理

反向代理模式虽然能加速网站访问速度,但也带来安全隐患。如果黑客将某一具有操作权限的服务器设置为某网站的代理服务器(例如百度),则可以通过代理服务器窃取用户相关隐私。详见其他人博客 安全研究 | Nginx反向代理钓鱼

所以现在大部分网站都禁止了反向代理功能,开启了CDN(内容分发网络)避免这些危害。

反向代理配置

编辑/etc/squid路径下的squid.conf配置文件

# Squid normally listens to port 3128
http_port 桥接网卡IP地址:80 vhost
cache_peer 网站资源服务器IP地址 parent 80 originserver

桥接网卡的IP地址也就是外网网卡的IP地址。正向解析服务和反向代理时无法同时共存的。

编辑好配置文件,保存重启即可实现反向代理。

外部主机squid代理配置

一般来说squid服务器是用来为内网主机服务,但是如果某些时候需要在外网使用代理服务器时就需要使用认证模块。使用认证模块能限制使用的代理服务器的用户。squid官方提供了多种认证模块,可以通过简单的输入账号密码来登录squid代理服务器。

网卡设置

在这里插入图片描述

squid客户端设置

在这里插入图片描述
将客户端IP地址设置成与服务器IP地址不在同一个IP地址字段内,是用来模拟外网客户端。防止因为和服务器在同一个局域网内,导致客户端因为透明代理而访问外网成功。

步骤一

查看squid提供的认证模块

[root@Mail ~]# rpm -ql squid |grep ncsa
/usr/lib64/squid/basic_ncsa_auth   <<<<<<所要使用到的squid官方提供的认证模块
/usr/share/man/man8/basic_ncsa_auth.8.gz
步骤二

安装httpd(apache 万维网服务器)

[root@Mail ~]# yum install httpd   

因为之后需要使用到htpasswd创建账号密码命令

步骤三

在之前透明代理模式上设置squid配置文件。使得在内网上的主机能够使用透明代理模式使用squid服务器,在外网中的主机能够使用账号密码认证使用代理服务器。

# Recommended minimum configuration:
#
visible_hostname Mail
auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/squid_users.txt  <<<通过basic_ncsa_auth 认证模块读取账户和密码文件
auth_param basic children 5   <<<<< 启动5个squid子程序管理验证需求
auth_param basic realm welcome to wuyanzu's server  <<<<设置外网用户登入时的显示信息

......省略输出.....

acl localnet src fe80::/10              # RFC 4291 link-local (directly plugged) machines

#放行IP地址
acl mylocalip src 192.168.127.0/24   <<<< 设置放行局域网内网IP地址段
acl out_ip src 192.168.229.0/24		 <<<<<<设置放行外网IP地址段,也可改为IP地址

acl squid_users proxy_auth REQUIRED  <<<<<建立一个需验证的acl名称

.......省略输出......

# from where browsing should be allowed
http_access allow localnet
http_access allow localhost
http_access allow mylocalip   <<<<<放行局域网内网IP段
http_access allow out_ip      <<<<<放行外网IP地址段
http_access allow squid_users  <<<放行认证模块中的用户
创建squid账户

使用`htpasswd``创建账户

[root@Mail ~]# htpasswd -c /etc/squid/squid_users.txt testuser

....省略......

重启squid服务程序
[root@Mail ~]# systemctl restart squid
结果测试
将squid服务器设置成不使用代理模式,测试网络连通性。

在这里插入图片描述

网络连接成功。

原因: squid外网客户机能连接互联网,与客户机使用squid代理服务器并不冲突。因为外网客户机一定要能连接到网络,否则客户机同样无法和squid服务器建立连接。这一点和VPN相似,客户端联网不是关键,关键是通过使用代理服务器规避掉一些限制。比如说某些网站设置了某些区域的IP能够访问,而我们本身的IP地址不在这个IP域内,而我们的代理服务器在这个IP域内,就可以通过使用代理服务器向网站转发访问请求,再由代理服务器将返回的数据传输给我们,从而达到访问请求。其实就是VPN,只不过我们的服务器不在国外。

在这里插入图片描述

设置代理

在这里插入图片描述

测试结果

输入我们设置的账号密码
在这里插入图片描述

登录成功

在这里插入图片描述

总结经验

代理服务器和很久以前用的手机免流差不多,只是免流分为本地免流和云免流,但是原理都差不多,只不过免流还需要修改请求的数据包这才是免流的难点。看了些安全相关的文章,又有点想弄安全方向了。emmmmmmmmmmmmmmmmmmmm,想做的事情太多,奈何时间精力能力都有限。弄完这些要一心看论文了。。。。。。

在配置外网认证时,找同学测试了一下,发现测试不成功。但是我在虚拟机上测试是成功的。一时间也找不到问题所在,有大神知道的麻烦教一下。

使用虚拟机模拟是真的容易出问题,这个实验搞了很久,找了相当多的资料。同时也因为squid服务程序的更新迭代,有些配置方式变了导致查故障查了很久,可能是太菜了吧。

最后贴一个squid的官方指南Squid中文权威指南.CHM

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值