Squid代理----基礎理論+傳統代理和透明代理搭建

前言:

Squid是Web的緩存代理,支持HTTP,HTTPS,FTP等。通過緩存和重用經常請求的網頁,它減少了帶寬並縮短了響應時間。Squid具有廣泛的訪問控制,是一個出色的服務器加速器。它可以在大多數可用的操作系統(包括Windows)上運行,並且已獲得GNU GPL的許可。

一、Squid概述

1.1 Squid 緩存服務器
  • Squid緩存服務器:即用來存儲(內存及硬盤)用戶訪問的網頁、圖片、文件*等等信息的專用服務器,這種服務器不僅可以使用戶最快的得到他們想要的信息,而且大大減少了網絡傳輸的數據量,緩存服務器經常是代理服務器。對於用戶是不可見。
1.2 Squid 概述
  • Squid是一款緩存internet數據的軟件,它接收用戶的下載申請,並自動處理所下載的數據。
  • 當一個用戶象要訪問一個url時,它向Squid發出一個申請,請求squid替它下載,然後Squid連接所申請網站並請求該主頁,接着把該主頁傳給用戶同時保留一個備份,當別的用戶申請同樣的頁面時,Squid將緩存的該頁面立即傳給用戶,加速用戶的訪問。
  • Squid 可以代理HTTP, FTP, GOPHER, SSL 和 WAIS 協議,
  • Squid暫不能代理POP, NNTP等協議。

二、Squid 主要功能

  • ① 緩存網站內容,以達到爲用戶提供Web訪問加速。
  • ② 對用戶的Web訪問進行過濾控制
  • ③ 熱點緩存,只緩存訪問熱度到達設定級別的網站內容。
  • ④ 合併回源,多個相同的請求只回源一次。
  • ⑤ ACL訪問控制,可針對源IP、目的地IP、域名、URL、訪問時間、單一最大連接數限制訪問行爲。或通過外部程序驗證訪問者(proxy_auth)。
  • ⑥ 網頁內容篡改,可根據需求篡改網站內容。
  • ⑦ 網站頭部篡改,可根據需求篡改請求頭部。
  • ⑧ 可針對不同的域名或url配置不同的緩存規則。

三、Squid 工作流程

3.1 Squid 簡易工作流程圖
3.1.1 Squid 工作流程
  • ① 當代理服務器中有客戶端需求的數據時
    • 客戶端向代理服務器發送數據請求
    • 代理服務器檢查自己的數據緩存
    • 代理服務器在緩存中找到用戶需要的數據,取出數據
    • 代理服務器將從緩存中取得的數據返回給客戶端
  • ② 當代理服務器中沒有客戶端需求的數據時
    • 客戶端向代理服務器發送數據請求
    • 代理服務器檢查自己的數據緩存
    • 代理服務器向internet上的遠端服務器發送數據請求
    • 遠端服務器響應,返回相應的數據
    • 代理服務器取得元端服務器的數據,返回給客戶端,並保留一份到自己的數據緩存中

四、Squid三種代理服務器

4.1 Squid 代理類型
  • Squid 有三種代理類型

    傳統代理:也叫做正向代理,適用internet,需要明確指定服務端

    透明代理:客戶機不需要指定代理服務器的地址和端口,而是通過默認路由、防火牆策略將Web訪問重定向給代理服務器處理

    反向代理:反向代理也就是通常所說的WEB服務器加速,它是一種通過在繁忙的WEB服務器和Internet之間增加一個高速的WEB緩衝服務器(即:WEB反向代理服務器)來降低實際的WEB服務器的負載

4.2 Squid 三種代理服務器原理
  • ① 傳統代理緩衝服務器

  • 前提條件

    • 必須在每一個內部主機的瀏覽器上明確指名代理服務器的IP地址和端口號
  • 工作流程

    • ① 客戶端上網時,每次都把請求發送給代理服務器處理,代理服務器根據請求確定是否連接到遠程web服務器獲取數據。
    • ② 如果在本地緩衝區有目標文件,則直接將文件傳給用戶即可。
    • ③ 如果沒有的話則先取回文件,先在本地保存一份緩衝,然後將文件發送給客戶端瀏覽器。
  • ② 透明代理緩衝服務器

  • 與傳統代理服務器區別

    • 透明代理緩衝服務器和標準代理服務器的功能完全相同。但是,代理操作對客戶端的瀏覽器是透明的(即不需指明代理服務器的IP和端口),對於linux操作系統來說,透明代理使用Iptables或者Ipchains實現。因此不需要對瀏覽器作任何設置。
  • 工作流程

    • 透明代理服務器阻斷網絡通信,並且過濾出訪問外部的HTTP(80端口)流量。如果客戶端的請求在本地有緩衝則將緩衝的數據直接發給用戶,如果在本地沒有緩衝則向遠程web服務器發出請求,其餘操作和標準的代理服務器完全相同。
  • ③ 反向代理緩衝服務器

  • 以代理服務器來接受internet上的連接請求,然後將請求轉發給內部網絡上的服務器,並將從內部服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外表現爲一個服務器。

    • 作用

      ① 可以降低原始WEB服務器的負載。

      ② 反向代理服務器承擔了對原始WEB服務器的靜態頁面的請求,防止原始服務器過載。

      ③ 它位於WEB服務器和Internet之間,阻止了WEB服務器和Internet的直接通信。

  • 工作流程

    • 如果互聯網用戶請求的頁面在代理服務器上有緩衝的話,代理服務器直接將緩衝內容發送給用戶。
    • 如果沒有緩衝則先向WEB服務器發出請求,取回數據,本地緩存後再發給用戶。
4.3 三種代理應用場景
  • 正向代理(本地網關)

    • ① 正向代理的典型用途是爲在防火牆內的局域網客戶端提供訪問Internet的途徑。
    • ② 正向代理還可以使用緩存特性減少網絡使用率。
    • ③ 正向代理允許客戶端通過它訪問任意網站並且隱藏客戶端自身,因此你必須採取安全措施以確保僅爲經過授權的客戶端提供服務。
  • 透明代理(cdn,架設於網絡運營商主幹機房)

    • ① 提高各個地區訪問者的訪問速度。
    • ② 減少源站壓力。
    • ③ 減少網絡運營商的網間結算費用。
    • ④ 節省網絡運營商帶寬資源。
  • 反向代理(網站前端)

    • ① 降低源站服務器的負載。
    • ② 隱藏源站真實ip。
  • squid主要組成部分

    服務名:squid

    主程序:/usr/sbin/squid

    配置目錄:/etc/squid

    主配置文件:/etc/squid/squid.conf

    監聽tcp端口號:3128

    默認訪問日誌文件:/var/log/squid/access.log

五、Squide 傳統代理部署(實驗)

5.1 實驗環境
  • 兩臺centos虛擬機、一臺win10虛擬機

    • 一臺作爲Squid服務器,IP地址爲: 192.168.226.128,NAT模式

      主要軟件:squid-3.5.27.tar.gz

    • 一臺作爲web服務器,IP地址爲:192.168.226.132,NAT模式

      主要軟件:Apache

    • win10作爲Client測試機,NAT模式

      主要軟件:谷歌瀏覽器

5.2 部署Squid
5.2.1 Squid安裝
[root@squid ~]# mount.cifs //192.168.226.1/LAMP-C7 /mnt
Password for root@//192.168.226.1/LAMP-C7:
[root@squid ~]# cd /mnt
[root@squid ~]# tar zxvf squid-3.4.6.tar.gz -C /opt
.....省略部分內容
[root@squid ~]# cd /opt/squid-3.4.6
[root@squid squid-3.4.6]# yum install gcc gcc-c++ -y
[root@squid squid-3.4.6]# ./configure \
--prefix=/usr/local/squid \					#安裝路徑
--sysconfdir=/etc \						#配置文件目錄
--enable-arp-acl \						#支持acl訪問控制列表
--enable-linux-netfilter \					#內核過濾
--enable-linux-tproxy \						#支持透明模式
--enable-async-io=100 \						#io優化
--enable-err-language="Simplify_Chinese" \			#支持簡體中文報錯提示
--enable-underscore \						#在url中支持下劃線
--enable-poll \							#poll 關閉默認適用poll模式,開啓epoll模式提升性能
--enable-gnuregex						#支持正則表達

[root@squid squid-3.4.6]# make && make install
......省略部分內容
  • 創建軟鏈接
[root@squid squid-3.4.6]# ln -s /usr/local/squid/sbin/* /usr/local/sbin
  • 創建程序用戶、設置目錄屬主屬組
[root@squid squid-3.4.6]# useradd -M -s /sbin/nologin squid
[root@squid squid-3.4.6]# chown -R squid.squid /usr/local/squid/var
5.2.1 修改Squid配置文件
[root@squid squid-3.4.6]# vim /etc/squid.conf
#56行 添加允許所有
http_access allow all
#http_access deny all


#61行 添加:指定程序用戶
#62行 添加:指定賬號用戶
cache_effective_user squid
cache_effective_group squid

#68行爲容災文件目錄
coredump_dir /usr/local/squid/var/cache/squid
-----》wq

#檢查語法    
[root@squid squid-3.4.6]# squid -k parse
.....省略部分內容
    
#初始化緩存
[root@squid squid-3.4.6]# squid -z
  • 開啓服務、檢查狀態
[root@squid squid-3.4.6]# squid
2020/03/22 21:53:35 kid1| Set Current Directory to /usr/local/squid/var/cache/squid
2020/03/22 21:53:35 kid1| Creating missing swap directories
2020/03/22 21:53:35 kid1| No cache_dir stores are configured.
[root@squid squid-3.4.6]# netstat -natp | grep 3128
tcp6       0      0 :::3128                 :::*                    LISTEN      4387/(squid-1)   
  • 將服務添加到service管理
[root@squid squid-3.4.6]# cd /etc/init.d/
[root@squid init.d]# vim squid
#!/bin/bash
#chkconfig: 2345 90 25
PID="/usr/local/squid/var/run/squid.pid"	#PID文件squid運行進程號
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 running"
                 else
                 echo "正在啓動 squid...." 
                 $CMD
                fi
                ;;
stop)
                $CMD -k kill &> /dev/null			#關閉squid
                rm -rf $PID &> /dev/null			#刪除PID運行文件
                ;;
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|reload|status|check|restart}"
                ;;
esac
---------》wq

#增加執行權限
[root@squid init.d]# chmod +x squid
# 添加到service列表
[root@squid init.d]# chkconfig --add squid
#在init 3 和init 5的模式開機自啓動
[root@squid init.d]# chkconfig --level 35 squid on
  • 配置傳統代理服務
[root@squid init.d]# vim /etc/squid.conf
#63-65行 添加功能
cache_mem 64 MB						#自定義緩存空間大小,容量最好爲4的倍數
reply_body_max_size 10 MB			#允許下載最大文件大小,以字節爲單位,默認設置0表示不進行限制
maximum_object_size 4096 KM			#允許保存到緩存空間的最大對象的大小,以KB爲單位,超過限制不會緩存,直接轉到web端
------》wq
  • 防火牆規則
#清空防火牆表內容
[root@squid init.d]# iptables -F
#查看防火牆表內容
[root@squid init.d]# iptables -L
[root@squid init.d]# setenforce 0
#新增規則,允許3128端口通過
[root@squid init.d]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
#重載服務
[root@squid init.d]# service squid reload

firewalld 介紹可查看之前的博客Linux基礎:Firewalld防火牆基礎

  • 安裝http服務
[root@web ~]# yum install httpd
[root@web ~]# systemctl stop firewalld.service 
[root@web ~]# setenforce 0
[root@web ~]# systemctl start httpd.service 
  • 測試web頁面

    默認的谷歌瀏覽器

在這裏插入圖片描述

  • 設置Squid代理

    ① 清理客戶端緩存

    ② 手動設置代理

    ③ 再次訪問web端

    ④ 查看web端httpd訪問日誌(查看訪問源地址)

  • 清理客戶端緩存

在這裏插入圖片描述

  • 手動設置代理

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

  • 再次訪問Web端

在這裏插入圖片描述

  • 查看web端httpd訪問日誌
[root@web ~]# cat /var/log/httpd/access_log 
192.168.226.128 - - [23/Mar/2020:14:50:21 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "http://192.168.226.132/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
......省略部分內容
#可見訪問源地址爲Squid服務器的IP地址
  • 以上爲傳統代理設置

六、透明代理部署

6.1 實驗環境
  • ① 以傳統代理的環境爲基礎
  • ② 在Squid服務器上添加一塊網卡(僅主機模式)IP爲:192.168.200.1
  • ③ Web服務器不用做修改
  • ④ Client客戶端將網卡修改爲僅主機模式,IP地址修改爲192.168.200.10,同時關閉服務器代理
6.2 環境配置
6.2.1 添加網卡並配置

在這裏插入圖片描述

[root@squid init.d]# cd /etc/sysconfig/network-scripts/
[root@squid network-scripts]# cp -p ifcfg-ens33 ifcfg-ens36
[root@squid network-scripts]# vi ifcfg-ens36
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="ens36"
DEVICE="ens36"
ONBOOT="yes"
IPADDR=192.168.200.1
NETMASK=255.255.255.0
------>wq
[root@squid network-scripts]# systemctl restart network
#查看網卡設置
[root@squid network-scripts]# ifconfig
6.2.2 客戶端配置
  • ①關閉代理服務

  • ② 修改網卡爲僅主機模式

在這裏插入圖片描述

  • ③ 手動設置IP地址
    在這裏插入圖片描述
6.3 Squid 服務器配置
  • 修改配置文件
[root@squid network-scripts]# vi /etc/sysctl.conf 
#行尾添加以下內容開啓路由轉發功能
net.ipv4.ip_forward = 1
----》wq
#加載生效
[root@squid network-scripts]# sysctl -p
net.ipv4.ip_forward = 1
  • 修改Squid主配置文件(配置透明代理)
[root@squid network-scripts]# vim /etc/squid.conf
#60行 修改,添加ens36(僅主機)的地址,開啓透明模式
http_port 192.168.200.1:3128 transparent
-----》wq
[root@squid network-scripts]# service squid stop
[root@squid network-scripts]# service squid start
squid is running

#設置防火牆規則
#清空規則表
[root@squid network-scripts]# iptables -F
#清空nat表內容
[root@squid network-scripts]# iptables -t nat -F
#定義規則入口(ens36網卡),http協議80端口重定向到3128端口   
[root@squid network-scripts]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.200.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
#定義規則入口ens36網卡,hhttpd協議443端口重定向到3128端口
[root@squid network-scripts]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.200.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
#新增規則,允許3128端口
[root@squid network-scripts]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
6.4 Web端設置
  • 添加一條靜態路由、下一條指向Squid 服務器的ens33網卡
#配置前,無法ping通ens36
[root@web ~]# ping 192.168.200.1
PING 192.168.200.1 (192.168.200.1) 56(84) bytes of data.
^C

#配置靜態路由
[root@web ~]#  route add -net 192.168.200.0/25 gw 192.168.226.128

#再次ping ens36,可以ping通
[root@web ~]# ping 192.168.200.1
PING 192.168.200.1 (192.168.200.1) 56(84) bytes of data.
64 bytes from 192.168.200.1: icmp_seq=1 ttl=64 time=0.398 ms
64 bytes from 192.168.200.1: icmp_seq=2 ttl=64 time=0.450 ms
6.5 訪問測試
  • 使用client客戶端訪問Web端地址

  • 在Web端查看日誌

[root@web ~]# cat /var/log/httpd/access_log 
#在來訪日誌中可見源地址爲Squid的ens33IP地址
  • 小結

    透明模式中,不需要在Client開啓Squid代理服務,客戶端訪問Web端也會顯示Squid代理IP,這就是Squid透明模式的作用

總結

本篇博客介紹了Squid代理的基礎理論,介紹了傳統模式、透明模式的部署,後續將繼續介紹反向代理模式部署、配置ACL訪問控制與sarg日誌

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