Linux系统架构-----Squid---反向代理

一.反向代理详解

  • squid作为代理服务软件,其主要功能是使用代理上网可以节约紧缺的IP地址资源,而且可以阻断外部主机对内部主机的访问,有一定的安全性,但是如果想让互联上的主机访问内部网的主机资源(例如:web站点),又想使内部主机免受外部网主机攻击,一般的代理服务是不能实现的这就需要反向代理来实现
  • 什么是反向代理呢?其实,反向代理也就是通常所说的web服务器加速,它是一种通过在繁忙的WEB服务器和internet之间增加一个高速的web缓冲服务器(即:web反向代理服务器)来降低实际的web服务器的负载

  •  Web服务器加速(反向代理)是针对Web服务器提供加速功能的。它作为代理Cache,但并不针对浏览器用户,而针对一台或多台特定Web服务器(这也是反向代理名称的由来)。实施反向代理(如上图所示),只要将Reverse Proxy Cache设备放置在一台或多台Web服务器前端即可。当互联网用户访问某个WEB服务器时,通过DNS服务器解析后的IP地址是Reverse Proxy Server的IP地址,而非原始Web服务器的IP地址,这时Reverse Proxy Server设备充当Web服务器,浏览器可以与它连接,无需再直接与Web服务器相连。因此,大量Web服务工作量被卸载到反向代理服务上。不但能够防止外部网主机直接和web服务器直接通信带来的安全隐患,而且能够很大程度上减轻web服务器的负担,提高访问速度。
  • 下面将对几种典型的代理服务作一个简单的比较。在网络上常见的代理服务器有三种:

  1. 标准的代理缓冲服务器(传统代理)

  一个标准的代理缓冲服务被用于缓存静态的网页(例如:html文件和图片文件等)到本地网络上的一台主机上(即代理服务器)。当被缓存的页面被第二次访问的时候,浏览器将直接从本地代理服务器那里获取请求数据而不再向原web站点请求数据。这样就节省了宝贵的网络带宽,而且提高了访问速度。但是,要想实现这种方式,必须在每一个内部主机的浏览器上明确指明代理服务器的IP地址和端口号。客户端上网时,每次都把请求送给代理服务器处理,代理服务器根据请求确定是否连接到远程web服务器获取数据。如果在本地缓冲区有目标文件,则直接将文件传给用户即可。如果没有的话则先取回文件,先在本地保存一份缓冲,然后将文件发给客户端浏览器。

  2. 透明代理缓冲服务器

  透明代理缓冲服务和标准代理服务器的功能完全相同。但是,代理操作对客户端的浏览器是透明的(即不需指明代理服务器的IP和端口)。透明代理服务器阻断网络通信,并且过滤出访问外部的HTTP(80端口)流量。如果客户端的请求在本地有缓冲则将缓冲的数据直接发给用户,如果在本地没有缓冲则向远程web服务器发出请求,其余操作和标准的代理服务器完全相同。对于Linux操作系统来说,透明代理使用Iptables或者Ipchains实现。因为不需要对浏览器作任何设置,所以,透明代理对于ISP(Internet服务器提供商)特别有用。

  3. 反向代理缓冲服务器

  反向代理是和前两种代理完全不同的一种代理服务。使用它可以降低原始WEB服务器的负载。反向代理服务器承担了对原始WEB服务器的静态页面的请求,防止原始服务器过载。它位于本地WEB服务器和Internet之间,处理所有对WEB服务器的请求,阻止了WEB服务器和Internet的直接通信。如果互联网用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发送给用户。这种方式通过降低了向WEB服务器的请求数从而降低了WEB服务器的负载。

  • 反向代理工作原理
  • 当用户浏览器发出一个HTTP请求时,通过域名解析将请求定向到反向代理服务器(如果要实现多个WEB服务器的反向代理,需要将多个WEB服务器的域名都指向反向代理服务器)。由反向代理服务器处理器请求。反向代理一般只缓存可缓冲的数据(比如html网页和图片等),而一些CGI脚本程序或者ASP之类的程序不缓存。它根据从WEB服务器返回的HTTP头标记来缓冲静态页面。有四个最重要HTTP头标记:

  Last-Modified: 告诉反向代理页面什么时间被修改

  Expires: 告诉反向代理页面什么时间应该从缓冲区中删除

  Cache-Control: 告诉反向代理页面是否应该被缓冲

  Pragma: 告诉反向代理页面是否应该被缓冲.

  例如:在默认情况下,ASP页面返回” Cache-control: private.” ,所以ASP页面时不会在反向代理服务器缓存的

二.实验分析以及结构图

  • 客户机处于仅主机模式,web服务器处于NAT模式下
  • 由于代理服务器和web服务器之间没有网关关系,所有必须在web服务器添加一条静态路由方便返回
  • 此外也可以客户机使用NAT模式,但是要在浏览器上设置,虚拟IP地址和虚拟IP地址,如下

三.实验环境

类型 IP地址 系统 软件包
squid代理服务器

ens33:192.168.43.101/24

ens37:192.168.10.1/24

centos7 squid-3.4.6.tar.gz
web服务器1 192.168.43.102/24 centos7  
web服务器2 192.168.43.103/24 centos7  
客户机 192.168.10.10/24 centos7  

四.具体操作分析

  • 配置squid代理服务器
1.解压squid软件包
tar xzvf squid-3.4.6.tar.gz -C /opt
2.安装相关软件包
yum install gcc gcc-c++ make -y
3.配置服务模块,编译安装
cd /opt/suqid-3.4.6/
./configure \
--prefix=/usr/local/squid \
--sysconfdir=/etc --enable-arp-acl \
--enable-linux-netfilter \
--enable-linux-tproxy \       //添加透明代理功能
--enable-async-io=100 \
--enable-err-language="Simplify_Chinese" \
--enable-underscore \
--enable-poll \
--enable-gnuregex
 
make && make install
4.创建软链接,优化服务控制方式
ln -s /usr/local/squid/sbin/squid /usr/local/sbin/
5.创建squid用户
useradd -M -s /sbin/nologin squid
6.修改squid文件中的var目录的属性
chowm -R squid.squid /usr/local/squid/var/
7.编辑squid的配置文件
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 192.168.43.101:80 accel vhost vport   //定义虚拟主机和虚拟端口
    cache_peer 192.168.43.102 parent 80 no_query originserver round-robin max_conn=30 weight=1 name=web1        //编辑节点服务器
    cache_peer 192.168.43.103 parent 80 no_query originserver round-robin max_conn=30 weight=1 name=web2
    cache_peer_domain web1 web2 www.yun.com    //用域名调用节点服务器别名
 61 cache_mem 64 MB  //指定缓存功能所使用的内存空间大小
 62 reply_body_max_size 10 MB    //允许用户下载的最大文件大小
 63 maximum_object_size 4096 KB    //允许保存到缓存空间的最大对象大小
 64 cache_effective_user squid    //添加指定程序用户
 65 cache_effective_group squid    //添加指定账户基本组
 66 
 67 # Uncomment and adjust the following to add a disk cache directory.
 68 #cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256
 
8.编辑防火墙规则
iptables -F    //清除所有规则
iptables -t nat -F  //清除所有NAT规则
iptables -I INPUT -p tcp --dport 3128 -j ACCEPT //允许目标端口3128做转发
 
9.检查语法并且开启服务
squid -k parse    //检查配置文件语法
squid -z          //初始化缓存目录
squid             //启动服务
[root@localhost ~]# netstat -natp | grep squid
tcp6       0      0 :::3128                 :::*                    LISTEN      36414/(squid-1)     
[root@localhost ~]# 
 
10.编辑脚本,优化服务控制方式(service 工具)
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 -natp | grep squid &> /dev/null
      if [ $? -eq 0 ]
        then
        echo "squid is running"
        else
        echo "正在启动 squid...."
        echo "成功启动"
        $CMD
        fi
        ;;
stop)
        $CMD -k kill &> /dev/null
        rm -rf $PID &> /dev/null
        ;;
status)
         [ -f $PID ] &> /dev/null
           if [ $? -eq 0 ]
             then
              netstat -natp | grep squid
             else
              echo "squid is not running"
           fi
          ;;
restart)
          $0 stop &> /dev/null
           echo "正在关闭 squid..."
           echo "关闭成功"
          $0 start &> /dev/null
           echo "正在启动 squid..."
           echo "启动成功"
          ;;
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    //添加到service的服务列表
chkconfig --level 35 squid on    //开机自启
[root@localhost ~]# service squid restart
正在关闭 squid...
关闭成功
正在启动 squid...
启动成功
[root@localhost ~]# 

11.修改网卡信息
[root@suqid ~]# cd /etc/sysconfig/network-scripts/
[root@suqid network-scripts]# cp -p ifcfg-ens33 ifcfg-ens37
[root@suqid network-scripts]# vim ifcfg-ens37 
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
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="192.168.10.1"
PREFIX="24"
IPV6_PRIVACY="no"
~                         
[root@suqid network-scripts]# service network restart
Restarting network (via systemctl):                        [  确定  ]
[root@suqid network-scripts]# 

  • 配置web服务器
1.配置web服务器1
[root@localhost ~]# yum install httpd -y
[root@localhost ~]# cd /var/www/html
[root@localhost html]# echo "<h1>this is yun</h1>" > index.html
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl start httpd.service 
[root@localhost ~]# netstat -natp | grep 80
tcp        0      0 192.168.43.102:22       192.168.43.1:58000      ESTABLISHED 1372/sshd: root@pts 
tcp6       0      0 :::80                   :::*                    LISTEN      1633/httpd 
[root@localhost ~]# route add -net 192.168.10.0/24 gw 192.168.43.101  //添加路由表

2.配置web服务器2
[root@localhost ~]# yum install httpd -y
[root@localhost ~]# cd /var/www/html
[root@localhost html]# echo "<h1>this is data</h1>" > index.html
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl start httpd.service 
[root@localhost ~]# netstat -natp | grep 80
tcp        0      0 192.168.43.103:22       192.168.43.1:58000      ESTABLISHED 1372/sshd: root@pts 
tcp6       0      0 :::80                   :::*                    LISTEN      1633/httpd
[root@localhost ~]# route add -net 192.168.10.0/24 gw 192.168.43.101
  • 第一种模式:仅主机模式下配置客户机,访问web服务器

  • 第二种模式:在客户机上配置代理,设置虚拟IP和虚拟端口

五.验证结果

  • 由于使用轮询算法,权重唯一,所以当访问代理服务器时,刷新一次就会调转页面

发布了112 篇原创文章 · 获赞 127 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42761527/article/details/104167497
今日推荐