Squid 傳統代理 和 透明代理 (內附軟件包)

緩存代理概述

作爲應用層的代理服務軟件,Squid 主要提供緩存加速和應用層過濾控制功能。

1.代理的工作機制

        當客戶機通過代理來請求 Web 頁面時,指定的代理的服務器會首先檢查自己的緩存,如果緩存中已經有客戶機需要訪問的頁面,則直接將緩存中的頁面內容反饋給客戶機;如果緩存中沒有客戶機需要訪問的頁面,則有代理服務器向 Internet 發送訪問請求,當獲得返回的Web 頁面以後,將網頁數據保存到緩存中併發送給客戶機。

2.代理的基本類型

     (1)傳統代理:必須在客戶機的瀏覽器、下載軟件等程序中手動設置代理服務器的地址和端口,然後才能使用代理服務器來訪問代理服務器。

     (2)透明代理:提供與傳統代理相同的功能和服務,器區別在於客戶機不需要指定代理服務器的地址和端口,而是通過默認路由、防火牆策略將Web訪問重定向。

Squid 安裝包

鏈接:https://pan.baidu.com/s/17qg-G8L19Ch2YCSKo-3H4A 密碼:8hul

一 .安裝及運行控制

1.編譯安裝Squid

[root@squid ~]# yum install gcc gcc-c++ make –y                           //安裝編譯環境

[root@squid ~]#tar zxvf  squid-3.5.23.tar.gz -C /opt/                      //解壓 squid 軟件包

[root@squid Y2C7]# cd /opt/squid-3.5.23/
[root@squid 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 \                                                           //提升存儲性能
> --enable-err-language="Simplify_Chinese" \                        //錯誤信息顯示語言
> --enable-underscore \                                                               //允許URL中有下劃線
> --enable-poll \                                                                             //使用Poll()模式,提升性能
> --enable-gnuregex                                                                      //使用GNU正則表達式

2.安裝完成後,創建鏈接文件、創建用戶和組。

[root@squid squid-3.5.23]# make && make install                  (此過程時間會很長)

[root@squid squid-3.5.23]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/
[root@squid squid-3.5.23]# useradd -M -s /sbin/nologin squid
[root@squid squid-3.5.23]# chown -R squid:squid /usr/local/squid/var/

3.修改Squid 的配置文件

[root@squid squid-3.5.23]# vim /etc/squid.conf

# And finally deny all other access to this proxy
http_access allow all
http_access deny all

# Squid normally listens to port 3128
http_port 3128                          //指定默認端口爲3128
cache_effective_user squid           //指定 squid的程序用戶,用來設置初始化,運行時的緩存
cache_effective_group squid          //指定賬戶的基本組

4.Squid 的運行控制

(1)檢查配置文件的語法是否正確

[root@squid squid-3.5.23]# squid -k parse

(2)啓動、停止 Squid

[root@squid squid-3.5.23]# squid –z                                //初始化緩存目錄
[root@squid squid-3.5.23]# 2018/09/19 14:23:40 kid1| Set Current Directory to /usr/local/squid/var/cache/squid
2018/09/19 14:23:40 kid1| Creating missing swap directories
2018/09/19 14:23:40 kid1| No cache_dir stores are configured.

[root@squid squid-3.5.23]# squid                                    //啓動服務
[root@squid squid-3.5.23]# netstat -ntap | grep squid                          //查看squid 的默認端口3128是否開啓
tcp6       0      0 :::3128                 :::*                    LISTEN      48596/(squid-1)
  

(3)使用Squid服務腳本。爲了使squid 服務的啓動、停止、重載等操作更加方便,可以編寫Squid 的服務腳本,並使用 chkconfig 和 service 工具進行管理

[root@squid squid-3.5.23]# cd /etc/init.d/
[root@squid init.d]# vim 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..."
        $CMD
       fi
      ;;
      stop)
        $CMD -k kill &> /dev/null
        rm -rf $PID &> /dev/null

;;
     status)
        [ -f $PID ] &> /dev/null
           if [ $? -eq 0]
              then
            netstat -antp | gerp 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|restart|check|reload|status}"
           ;;
esac

(4)給啓動腳本執行權限

[root@squid init.d]# chmod +x squid
[root@squid init.d]# chkconfig --add squid                       //將 squid 添加爲系統服務
[root@squid init.d]# chkconfig --level 35 squid on           //開機自啓動

二 .搭建Web 服務器

安裝http服務

[root@localhost ~]# hostnamectl set-hostname web
[root@localhost ~]# bash
[root@web ~]# systemctl stop firewalld.service                //關閉防火牆
[root@web ~]# setenforce 0
[root@web ~]# yum install httpd –y                                       //安裝 http服務

啓動 httpd 服務

[root@web ~]# systemctl start httpd.service                     //啓動http 服務


三 .構建傳統代理服務器

   傳統代理 :使用傳統代理的特點在於,客戶機的相關程序(如IE瀏覽器)必須指定代理服務器的地址、端口等信息。如圖所示

10

1 .Squid服務器的配置

(1)修改 squid.conf 配置文件

[root@squid init.d]# vim /etc/squid.conf

# Squid normally listens to port 3128
http_port 3128
cache_mem 64 MB    //指定緩存功能所使用的內存空間大小,便於保持問較頻繁地WEB對象

reply_body_max_size 10 MB      //允許用戶下載的最大文件大小
maximum_object_size 4096 KB  //允許保存到緩存空間的最大對象大小,

                                                             //超過大小限制的文件將不被緩存,而是直接發給用戶

cache_effective_user squid
cache_effective_group squid

(2)重啓squid 服務

[root@squid init.d]# service squid stop
[root@squid init.d]# service squid start
grep: $: No such file or directory
正在啓動 squid...
[root@squid init.d]# netstat -ntap |grep squid
tcp6       0      0 :::3128                 :::*                    LISTEN      82846/(squid-1)
    

(3)在防火牆上添加允許策略

[root@squid init.d]# iptables –F                  //先清空防火牆規則
[root@squid init.d]# setenforce 0
[root@squid init.d]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT               //允許轉發

2 .客戶機代理配置

(1)在客戶機上在暫時不設置代理功能,使用客戶機訪問web 服務器,

4

查看Web 訪問日誌的新增記錄。在被訪問的的web 服務器中,通過追蹤 httpd 服務的訪問日誌文件。

[root@web logs]# cd /var/log/httpd/
[root@web httpd]# ls
access_log  error_log                         //訪問日誌和錯誤日誌
[root@web httpd]#
[root@web httpd]# vim access_log
             //查看訪問日誌

2

由此可以看出,在客戶端沒有指定代理服務器是,就是通過客戶端直接訪問 Web 服務器。

(2)客戶機的代理配置,在IE瀏覽器設置代理。選擇  工具---》Internet選項--》 連接--》 局域網設置。如下圖所示

指定代理服務器的 IP 地址及默認端口 3128

1

訪問Web服務器,查看訪問日誌(先清空緩存)

4

       查看 Web 訪問日誌的新增記錄,能夠發現來自代理服務器 192.168.91.130 的訪問記錄。這說明當客戶機使用代理後, Web 服務並不知道客戶機的真實 IP 地址,因爲實際上是由代理服務器在替它訪問

3


四.透明代理

        透明代理提供的服務功能與傳統代理是一致的,但是其“透明”的實現依賴於默認路由和防火牆的重定向策略,因此更適應於局域網主機服務,而不適合爲Internet 中的客戶提供服務。

        基於局域網主機通過Linux網關訪問Internet 的環境。在Linux網卡上,構建Squid 爲客戶機訪問Internet提供代理服務;在所有局域網客戶機上,只需要正確設置IP地址、默認網關,不需要手動指定代理服務器的地址、端口等信息。如圖所示

9

 squid 代理服務器雙網卡    內網 ens-33  :192.168.100.1   外網 ens-36   :12.0.0.1

Web 服務器 :12.0.0.12

客戶端           :192.168.100.30

        爲了驗證透明代理的效果,如果存在手動指定的代理服務器設置,應在客戶機中將其去除。例如,在IE 瀏覽器的連接設置中不要勾選使用代理服務器;在Linux 客戶機中,可以通過命令 unset HTTP_PROXY HTTPS_PROXY

(1)配置 Squid 支持透明代理

[root@squid ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
[root@squid ~]# vim /etc/squid.conf

# Squid normally listens to port 3128
http_port 192.168.100.1:3128 transparent                         //這個IP 地址提供透明代理服務

(2)重新啓動 squid 服務

[root@squid ~]# service squid restart
正在關閉 squid...
正在啓動 squid...
[root@squid ~]# netstat -ntap | grep squid
tcp        0      0 192.168.100.1:3128      0.0.0.0:*               LISTEN      84473/(squid-1)
    

(3)設置 iptables de 重定向策略

          透明代理中的 Squid 服務實際上是構建在 Linux 網關主機上,因此只需要正確設置防火牆策略,就可以將局域網主機訪問 Internet 的數據包交給 Squid 進行處理。這需要用到 iptables 的 REDIRECT (重定向)策略,其作用是實現本機端口的重新定向,將訪問網站協議 HTTP 、HTTPS 的外發數據包轉交給本機的 Squid 服務 (3128 端口)

        防火牆做重定向操作,將訪問本機 80、443 端口的請求重定向到 3128 端口。

[root@squid ~]# iptables -F
[root@squid ~]# iptables -t nat -F
[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 -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
[root@squid ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT           //允許轉發

(4)在客戶端訪問web 服務器

7

(5)查看訪問日誌

[root@web ~]# cd /var/log/httpd/
[root@web httpd]# ls
access_log  error_log
[root@web httpd]# vim access_log

8


總結:

     (1)使用傳統代理,需要手動指定代理服務器的地址、端口等信息

     (2)使用透明代理時,需要結合客戶機的默認路由、網關的 REDIRECT 策略來實現,因此不適用於 Internet 環境。

     (3)構建透明代理服務時, http_port 行需要添加 transparent 監聽選項,另外還需要設置防火牆的 REDIRECT 策略

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章