Squid正向代理和反向代理


  1.简单介绍一下squid

     什么是squid?squid是一种用来缓存Internet数据的软件。接受来自人们需要下载的目标(object)的请求并适当的处理这些请求。

也就是说,如果一个人想下载一web界面,他请求squid为他取得这个页面。squid随之连接到远程服务器并向这个页面发出请求。然后,

squid显式地聚集数据到客户端机器,而且同时复制一份。当下一次有人需要同一页面时, squid可以简单的从磁盘中读到它,那样数据

会立即传输到客户机上。

Squid正向代理与反向代理详解_squid

  2.squid的代理的作用

    当用户访问web网站时,会先访问代理服务器,squid代理服务器将数据缓存在自身内存中,并向用户反馈数据。

● 大大减少web服务器的压力

● 通过缓存的方式为用户访问web服务加速

● 对用户访问进行一些控制过滤

    3.squid代理模式介绍

正向代理

1)标准模式

   标准的代理缓冲服务被用于缓存静态的网页到本地网络上的一台主机上(即代理服务器)。当被缓存的页面被第二次访问的时候,

浏览器将直接从本地代理服务器那里获取请求数据而不再向原web站点请求数据。这样就节省了宝贵的网络带宽,而且提高了访问速度。

但是,要想实现这种方式,必须在每一个内部主机的浏览器上明确指名代理服务器的IP地址和端口号。客户端上网时,每次都把请求发

送给代理服务器处理,代理服务器根据请求确定是否连接到远程web服务器获取数据。


2)透明模式

   透明代理缓冲服务器和标准代理服务器的功能完全相同。但是,代理操作对客户端的浏览器是透明的(即不需指明代理服务器的IP和端口)。

透明代理服务器阻断网络通信,并且过滤出访问外部的HTTP(80端口)流量。如果客户端的请求在本地有缓冲则将缓冲的数据直接发给用户,

如果在本地没有缓冲则向远程web服务器发出请求,其余操作和标准的代理服务器完全相同。对于linux操作系统来说,透明代理使用Iptables

或者Ipchains实现。因此不需要对浏览器作任何设置。


反向代理

   反向代理是和前两种代理完全不同的一种代理服务。使用它可以降低原始WEB服务器的负载。反向代理服务器承担了对原始WEB服务器的静态

页面的请求,防止原始服务器过载。它位于WEB服务器和Internet之间,处理所有对WEB服务器的请求,组织了WEB服务器和Internet的直接通

信。如果互联网用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,

取回数据,本地缓存后再发给用户。这种方式通过降低了WEB服务器的请求数从而降低了WEB服务器的负载。


      

    4、实验环境介绍


               操作系统            ip地址        服务职能

   centos7

ens33: 192.168.60.135/24

ens36: 12.0.0.1/24

squid缓存服务器
  centos7ens33: 192.168.60.136/24httpd,提供网站服务
  centos7ens33: 192.168.60.143/24httpd,提供网站服务
  win7ipv4: 12.0.0.12client客户机测试

 

   5、实验所用squid源码包

     链接:https://pan.baidu.com/s/1Tj3DXqBGMQKOr-qeL-OC6g 

      密码:ml3m


一、首先搭建httpd服务

1)关闭防火墙和增强安全组件,yum安装httpd服务

systemctl stop firewalld.service

setenforce 0

yum install httpd -y


2)到站点下写入测试内容

cd /var/www/html              #httpd网站站点

echo "this is test01" >index.html

echo "this is test02" > index.html

Squid正向代理与反向代理详解_正向代理_02

Squid正向代理与反向代理详解_反向代理_03


systemctl start httpd.service      #启动服务


3)本地自测,httpd服务已被提供出来

Squid正向代理与反向代理详解_正向代理_04


二、搭建squid缓存服务器

yum install gcc gcc-c++ make -y     #安装编译环境

tar zxf squid-3.5.23.tar.gz -C /opt/   #解压到opt目录下

cd /opt/squid-3.5.23/ 

    ./configure --prefix=/usr/local/squid \      #指定安装目录    

    --sysconfdir=/etc \     #配置文件存放位置

    --enable-arp-acl \       #可在规则中设置通过MAC地址进行管理,防止IP欺骗

    --enable-linux-netfilter \   #使用内核过滤

    --enable-linux-tproxy \     #可以支持透明代理

    --enable-async-io=100 \   #\异步I/O,提升存储性能

    --enable-err-language="Simplify_Chinese"  \      #误信息简体中文显示

    --enable-underscore \          #允许URL中有下划线

    --enable-poll \      #指定使用epoll()函数,提升性能

    --enable-gnuregex     #使用GNU正则表达式


make && make install     #进行安装

ln -s /usr/local/squid/sbin/* /usr/local/sbin     #将squid/sbin/下命令建立软链接,方便使用

useradd  -M -s /sbin/nologin squid     #创建squid管理用户,不建立家目录

chown  -R squid.squid /usr/local/squid/var/    #将文件缓存的目录属主属组变成squid


修改配置文件

vim /etc/squid.conf

# And finally deny all other access to this proxy   在该行下添加

http_access allow all

# Squid normally listens to port 3128   在该行下添加

http_port 3128

cache_effective_user squid       #管理用户为squid

cache_effective_group squid   #管理组为squid

Squid正向代理与反向代理详解_反向代理_05

修改完成后检查语法

squid -k parse     #不能有error报错

squid -z               #初始化缓存空间


添加启动脚本

vim /etc/init.d/squid  


#!/bin/bash

#chkconfig:2345 90 25

PID="/usr/local/squid/var/run/squid.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 runing"

         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 -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 "用法 $0{start|stop|status|reload|check|restart}"

        ;;

esac


chmod +x /etc/init.d/squid       #添加执行权限

chkconfig --add squid               #添加启动项

chkconfig --level 35 squid on    #3,5级别启动


启动服务,这样squid缓存服务就是搭建完成了


三、正向代理(配置标准模式和透明模式详解)

   标准模式

    使用标准模式的特点在于客户机的相关程序必须指定代理服务器的地址、端口等信息,

下面我们通过一个简单的应用实例来学习标准代理模式的配置和使用。

●  在Linux主机B上,构建squid为客户机访问各种网站提供代理地址,但禁止通过代理下载超过10M的文件。

●  在客户机C上,指定主机B作为web访问代理,以隐藏自己的真实IP地址


标准模式示例图如下

    


Squid正向代理与反向代理详解_反向代理_06

1、squid服务器配置

vim /etc/squid.conf

# Squid normally listens to port 3128    #此行下添加

http_port 3128   

cache_mem 64 MB              #指定缓存功能所使用的内存空间大小           

reply_body_max_size 10 MB       #允许下载的最大文件大小

maximum_object_size 4096 KB   #允许保存到缓存空间最大文件大小

Squid正向代理与反向代理详解_正向代理_07

service squid restart


2、清空防火墙规则并重新添加策略

iptables -F

iptables -t nat -F

iptables -I INPUT -p tcp --dport 3128 -j ACCEPT

Squid正向代理与反向代理详解_正向代理_08


3、客户机代理设置

打开IE浏览器>工具>internet选项>连接>局域网设置

Squid正向代理与反向代理详解_squid_09


4、访问网站服务、查看httpd日志

Squid正向代理与反向代理详解_正向代理_10

Squid正向代理与反向代理详解_反向代理_11

    从这里可以看出,访问web服务器的请求实际上交给了squid缓存服务器去请求,然后再反馈给客户端,

当下次客户端再去访问该页面时,squid缓存服务器则会再次将数据给客户端,不会反复请求web服务器。



   透明模式

      透明代理模式的功能和服务与传统代理是一致的,但是其“透明”的实现依赖于默认路由和防火

墙的重定向策略,因此更适合用于为局域网主机服务,而不适合为Internet中的客户机提供服务。

下面也通过一个简单的应用案例来学习透明代理的配置和使用。

●  在Linux网关上,构建squid为客户机访问Internet提供代理服务

●  在所有的局域网客户机上,只需要设置ip地址默认网关,而不需要手动指定代理服务器的地址端口等。


透明模式示例图如下


Squid正向代理与反向代理详解_反向代理_12


1、添加网卡,修改配置文件

cd /etc/sysconfig/network-scripts/

cp ifcfg-ens33 ifcfg-ens36      #复制ens33文件

vim ifcfg-ens36

Squid正向代理与反向代理详解_正向代理_13

Squid正向代理与反向代理详解_反向代理_14


service network restart     #重启网卡服务

Squid正向代理与反向代理详解_反向代理_15


2、配置squid支持透明代理

vim /etc/squid.conf


# Squid normally listens to port 3128      #此行下添加

http_port 12.0.0.1:3128 transparent      #http_port 内网网关:3128 transparent

cache_mem 64 MB

reply_body_max_size 10 MB

maximum_object_size 4096 KB

cache_effective_user squid

cache_effective_group squid


3、重启服务,设置iptables的重定向策略

service squid restart 

iptables -t nat -I PREROUTING -i ens36 -s 12.0.0.0/24 -p tcp --dport 80 -j REDIRECT --to 3128

iptables -t nat -I PREROUTING -i ens36 -s 12.0.0.0/24 -p tcp --dport 443 -j REDIRECT --to 3128

iptables -I INPUT -p tcp --dport 3128 -j ACCEPT


4、访问web网页,在httpd日志中查看访问IP


注意:透明模式不需要指定squid缓存服务器

Squid正向代理与反向代理详解_正向代理_16

Squid正向代理与反向代理详解_squid_17


    通过查看httpd的日志可以看出,透明模式通过iptables的重定向访问网页,客户机不需要做任何设定,

根本感觉不到有squid代理服务器的存在。


四、squid反向代理

    如下图所示,通过squid反向代理可以加速网站的访问速度,可将不同的URL请求分发

到后台不同的web服务器上,同时互联网用户只能看到反向代理的地址,加强了网站的访问安全。

Squid正向代理与反向代理详解_正向代理_18


Squid反向代理原理

    (1)squid反向代理服务器位于本地web服务器和internet之间,客户端请求访问web服务时,

DNS将访问的域名解析为squid反向代理服务器的IP地址,客户端将访问Squid代理服务器。

    (2)如果Squid反向代理服务器中缓存了改请求的资源,则将该请求的资源返回给客户端,否则反向

代理服务器将向后台的web服务器请求资源,然后将应答资源返回给客户端,同时也将该资源缓存在本地。


Squid反向代理配置

    1、修改配置文件,安装Apache服务

vim  /etc/squid.conf

# Squid normally listens to port 3128      #此模块下

http_port 12.0.0.1:80 accel vhost vport    #本机外网IP

cache_peer 192.168.60.136 parent 80 0 no-query originserver round-robin weight=1 name=web1 #添加网站

cache_peer 192.168.60.143 parent 80 0 no-query originserver round-robin weight=1 name=web2 #添加网站

cache_peer_domain web1 web2 www.test.com   #匹配网址用域名访问

cache_mem 64 MB

reply_body_max_size 10 MB

maximum_object_size 4096 KB

cache_effective_user squid

cache_effective_group squid

修改完后重启服务,并且安装apche

service squid restart

yum install httpd -y  


   2、客户端添加地址解析

windows添加地址解析的路径:C:\Windows\System32\drivers\etc\hosts

使用记事本打开

Squid正向代理与反向代理详解_反向代理_19


    3、客户端访问,验证

Squid正向代理与反向代理详解_反向代理_20


   反向代理设置成功。