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和虛擬端口

五.驗證結果

  • 由於使用輪詢算法,權重唯一,所以當訪問代理服務器時,刷新一次就會調轉頁面

 

 

發佈了118 篇原創文章 · 獲贊 132 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章