前言:
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日誌