Squid缓存代理服务器

一、Squid相关概述

  • Squid: Linux 系统中一款最常用的 开源的代理服务软件,提供 缓存代理功能
  • 工作原理: 当客户机通过代理去访问各种服务时,代理服务器会先检查自己的缓存,缓存中有结果,直接返回,如果缓存中没有用户需要的信息时,代理服务器会转给Internet(互联网),获取用户需要的信息,保存到缓存中,并且返回给用户,用户再次访问相同信息时,会直接调取服务器中的缓存信息从而提高访问速度
  • web代理的工作机制: 缓存网页对象,减少重复请求,提高访问速度
  • 代理缓存加速的对象: 文字、图像等静态的web元素
  • 优势: 提高web访问速度,隐藏客户机的ip地址,还可以针对访问目标、时间等进行访问控制 (过滤机制)
  • 代理的类型:
    (1)传统代理: 需要在客户端去指定代理服务器 (一般用于Internet环境)
    (2)透明代理: 不需要指定代理服务器的地址和端口 (一般用于局域网环境,无需额外设置即可实现上网,squid服务器充当网关)
    squid代理服务器

二、构建Squid代理服务器

(1)安装

******上传源码包,配置、编译并安装(时间较长)
[root@Squid ~]# ll
总用量 4728
-rw-------. 1 root root    1263 10  8 17:22 anaconda-ks.cfg
-rw-r--r--  1 root root 4835525 12 24 17:36 squid-3.5.23.tar.gz
[root@Squid ~]# tar zxvf squid-3.5.23.tar.gz 
[root@Squid squid-3.5.23]# ./configure  --prefix=/usr/local/squid --sysconfdir=/etc --enable-linux-netfilter --enable-async-io=240 --enable-default-err-langugae=Simplify_Chinese --disable-poll --enable-epoll --enable-gnuregex  && make && make install
******优化执行路径
[root@Squid squid-3.5.23]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/
******创建Squid程序运行账户和组(不创建宿组目录,并且是程序用户无法登录系统)
[root@Squid squid-3.5.23]# useradd -M -s /sbin/nologin squid
******设置Squid服务目录下的属主和属组
[root@Squid squid-3.5.23]#  chown -R squid:squid /usr/local/squid/var/
******修改squid配置文件(/etc/squid.conf)
[root@Squid squid-3.5.23]# vim /etc/squid.conf
  1 #
  2 # Recommended minimum configuration:
  3 #
  4 cache_effective_user squid   (添加,指定squid 的程序用户,用来设置初始化、运行时缓存的账户)
  5 cache_effective_group squid   (添加,指定squid 的程序组,用来设置初始化、运行时缓存的组账户)
  6 # Example rule allowing access from your local networks.
  7 # Adapt to list your (internal) IP networks from where browsing
  8 # should be allowed
  。。。。。。

(2)squid的运行控制

******检查配置文件语法是否正确
[root@Squid squid-3.5.23]#  squid  -k  parse
******启动,停止Squid服务 (第一次启动时,会自动初始化缓存目录)
[root@Squid squid-3.5.23]# squid -z (初始化缓存目录)
[root@Squid squid-3.5.23]# squid    (启动squid服务)
[root@Squid squid-3.5.23]# netstat -anpt | grep squid  (监听端口,发现已经成功启动)
tcp6       0      0 :::3128                 :::*                    LISTEN      43547/(squid-1)     
******为了方便对squid 服务的启动、停止、重新加载更加方便,需要编写squid 服务脚本
(使用chkconfig  systemctl 工具进行管理)
[root@Squid squid-3.5.23]# vim /etc/init.d/squid  (编写脚本)
写入:
#!/bin/bash
# chkconfig: 35 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服务已经开启"
                else
                        echo "squid服务正在开启"
                $CMD
        stop)
                $CMD -k kill &> /dev/null
                rm -f $PID &> /dev/null
                       echo "squid服务已经关闭"
        ;;
        status)
                 [ -f $PID ] &> /dev/null
                        if [ $? -eq 0 ];then
                                netstat -anpt |grep squid
                        else
                                echo "squid服务没有开启"
                        fi
        ;;
        restart)
                $0 stop &> /dev/null
                echo "stoping squid"
                $0 start &> /dev/null
                echo "squid已经重新启动"
        ;;
        reload)
                $CMD -k reconfigure
        ;;
        check)
                $CMD -k parse
        ;;
        *)
                echo "当前脚本 $0 后面只能写{start|stop|restart|reload|check|status}"
esac
                                                 46,1   
保存退出
[root@Squid squid-3.5.23]# chmod +x /etc/init.d/squid   (给脚本添加可执行权限)
[root@Squid squid-3.5.23]# chkconfig --add squid        (添加squid为系统服务,这个命令每次重新启动服务器后可能会失效,重新添加一下就好了)
******现在已经可以使用systemctl来管理squid服务了
[root@Squid ~]# systemctl start squid
[root@Squid ~]# netstat -anpt | grep squid
tcp6       0      0 :::3128                 :::*                    LISTEN      955/(squid-1)  

(一)构建Squid的传统代理

名称 扮演角色 ip地址
Squid 代理服务器 192.168.100.11
Web web服务器 192.168.100.12
win7 普通客户机 192.168.100.13

要求: 在Squid构建代理服务,来隐藏客户机的访问ip地址,禁止通过代理去下载超过10MB的文件

(1)Squid代理服务器的配置

******修改squid.conf配置文件(前提是已经安装了squid服务)
[root@Squid ~]# vim /etc/squid.conf 
。。。。。。
 52 # from where browsing should be allowed
 53 http_access allow localnet
 54 http_access allow localhost
 55 http_access allow all   (添加,允许任意客户机使用代理服务,在“http_access deny all”之前就行)
 56 
 57 # And finally deny all other access to this proxy
 58 http_access deny all
 59 reply_body_max_size 10 MB  (添加,允许下载的最大文件为10MB)
 60 # Squid normally listens to port 3128
 61 http_port 3128
 。。。。。。
 保存退出
 ******重启squid服务
 [root@Squid ~]# systemctl restart squid
至此传统代理的squid服务器配置完成

(2)Web服务器的配置

******安装httpd服务并且写入页面即可
[root@Web ~]# mount /dev/cdrom /media/cdrom/
mount: /dev/sr0 写保护,将以只读方式挂载
[root@Web ~]# yum -y install httpd
。。。。。。
完毕!
[root@Web ~]# echo "123.com" > /var/www/html/index.html
[root@Web ~]# systemctl start httpd
[root@Web ~]# curl 127.0.0.1
123.com

(3)Win7的配置

  • 打开Win7的“运行”,输入“inetcpl.cpl”
    运行
  • 弹出一个“internet属性”的窗口,点击“连接”,点击“局域网设置”
    在这里插入图片描述
  • 弹出“局域网(LAN)设置”的窗口,把“为LAN使用代理服务器(这些设置不用于拨号或VPN连接)”的选项勾选,填写地址为Suid代理服务器的地址,端口为3128 (默认端口就是3128,可以在/etc/squid.conf进行修改) ,点击“确定”
    在这里插入图片描述
  • 打开浏览器访问Web服务器(192.168.100.12)
    在这里插入图片描述

(4)验证代理是否成功

******在squid服务器上查看日志
[root@Squid sbin]# tail -3 /usr/local/squid/var/logs/access.log  (发现都是192.168.100.13也就是win7在访问)
1608806412.148  28960 192.168.100.13 TAG_NONE/503 0 CONNECT urs.microsoft.com:443 - HIER_NONE/- -
1608806412.148  28960 192.168.100.13 TAG_NONE/503 0 CONNECT urs.microsoft.com:443 - HIER_NONE/- -
1608806412.148  34477 192.168.100.13 TAG_NONE/503 0 CONNECT urs.microsoft.com:443 - HIER_NONE/- -
******在web服务器上访问日志
[root@Web ~]# tail /var/log/httpd/access_log  (发现都是192.168.100.11,也就是squid代理服务器在访问)
127.0.0.1 - - [24/Dec/2020:18:25:29 +0800] "GET / HTTP/1.1" 200 8 "-" "curl/7.29.0"
192.168.100.11 - - [24/Dec/2020:18:36:20 +0800] "GET / HTTP/1.1" 200 8 "-" "curl/7.29.0"
192.168.100.11 - - [24/Dec/2020:18:39:36 +0800] "GET / HTTP/1.1" 200 8 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"
192.168.100.11 - - [24/Dec/2020:18:39:37 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"
至此,squid传统代理搭建成功!!!!隐藏了win7的地址

(二)透明代理

名称 扮演角色 ip地址
Squid 代理服务器 192.168.100.11/200.0.0.1
Web web服务器 200.0.0.2
Win7 普通客户端 192.168.100.13

要求: 实现透明代理,squid代理服务器充当客户端的网关,隐藏客户端访问web的地址
(这里的squid服务器要添加网卡VM2,web服务器换成VM2网卡并修改地址)

(1)Squid代理服务器的配置

(在上面传统代理的基础上配置)

******添加一块新的网卡VM2,并且配置ip地址
[root@Squid ~]# cd /etc/sysconfig/network-scripts/
[root@Squid network-scripts]# cp ifcfg-ens33 ifcfg-ens37 
(要先ip a,看一下添加的网卡名叫什么,然后把原来的网卡名复制一份到新的网卡名)
[root@Squid network-scripts]# vim ifcfg-ens37  (编写的网卡)
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=9d46d645-9072-4138-9eca-f2f2709d4cba
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.100.11
PREFIX=24
IPV6_PRIVACY=no
修改为:
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens37
DEVICE=ens37
ONBOOT=yes
IPADDR=200.0.0.1
PREFIX=24
IPV6_PRIVACY=no
保存退出
[root@Squid network-scripts]# systemctl restart network (重启网卡)
[root@Squid network-scripts]# ip a  (再次查看,发现成功添加地址)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:d8:4c:da brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.11/24 brd 192.168.100.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::abff:f1ab:2782:8087/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:d8:4c:e4 brd ff:ff:ff:ff:ff:ff
    inet 200.0.0.1/24 brd 200.0.0.255 scope global noprefixroute ens37
       valid_lft forever preferred_lft forever
    inet6 fe80::a8fc:44a7:d5f6:8e44/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@Squid network-scripts]# cd
******编写Squid主配置文件
[root@Squid ~]# vim /etc/squid.conf 
。。。。。。
 57 http_access deny all
 58 
 59 reply_body_max_size 10 MB
 60 # Squid normally listens to port 3128
 61 http_port 192.168.100.11:3128  transparent
 62  63 # Uncomment and adjust the following to add a disk cache direc    tory.
。。。。。。
保存退出
[root@Squid ~]# systemctl restart squid (重启squid服务)
******在squid服务器上开启路由转发功能  (因为squid服务器要当作win7的网关)
[root@Squid ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf 
[root@Squid ~]# sysctl -p
net.ipv4.ip_forward = 1
******开启防火墙并设置重定向策略
[root@Squid ~]# systemctl start firewalld
[root@Squid ~]#  iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
[root@Squid ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT

(2)Web服务器配置

[root@Web ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=ce896eb0-2544-440a-a54d-f8633b2e9496
DEVICE=ens33
ONBOOT=yes
IPADDR=200.0.0.2
PREFIX=24
IPV6_PRIVACY=no
[root@Web ~]# systemctl restart network (重启网卡)
[root@Web ~]# ip a   (查看地址发现已经成功更改)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:46:da:b9 brd ff:ff:ff:ff:ff:ff
    inet 200.0.0.2/24 brd 200.0.0.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::ea8f:4112:94bb:75f7/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

(3)Win7的配置

  • 配置网关为Squid服务器(192.168.100.11)
    网卡配置
  • 打开运行输入“inetcpl.cpl”
    在这里插入图片描述
  • “连接”——“局域网设置”
    在这里插入图片描述
  • 把“代理服务器”的选项勾掉,点击确认即可
    在这里插入图片描述
    在这里插入图片描述
  • 使用浏览器访问web服务器(200.0.0.2)
    在这里插入图片描述

(4)验证透明代理

******Squid服务器验证(发现有win7主机的访问记录)
[root@Squid ~]# tail -3 /usr/local/squid/var/logs/access.log 
1608806412.148  34477 192.168.100.13 TAG_NONE/503 0 CONNECT urs.microsoft.com:443 - HIER_NONE/- -
1608824055.115    335 192.168.100.13 TCP_MISS/200 328 GET http://200.0.0.2/ - ORIGINAL_DST/200.0.0.2 text/html
1608824055.157      0 192.168.100.13 TCP_MISS/404 450 GET http://200.0.0.2/favicon.ico - ORIGINAL_DST/200.0.0.2 text/html
******web服务器验证 (发现都是squid服务器的第二块网卡的200.0.0.1在访问)
[root@Web ~]# tail -3 /var/log/httpd/access_log 
200.0.0.1 - - [24/Dec/2020:23:33:44 +0800] "GET / HTTP/1.1" 200 8 "-" "curl/7.29.0"
200.0.0.1 - - [24/Dec/2020:23:34:13 +0800] "GET / HTTP/1.1" 200 8 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"
200.0.0.1 - - [24/Dec/2020:23:34:13 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"
至此透明代理构建成功!!!!

猜你喜欢

转载自blog.csdn.net/rzy1248873545/article/details/111573335