1. 程式人生 > >【實戰】Squid 緩存服務器 之 傳統代理 + 透明代理

【實戰】Squid 緩存服務器 之 傳統代理 + 透明代理

用法 保護 安裝 cmd star 類型 link cep 訪問控制

目錄:

1· Squid代理的概述原理
2· 代理的基本類型
3· Squid 服務腳本
4· 構建代理服務器(傳統代理、透明代理)
5· 總結


Squid代理的概述原理

1)代理的工作機制


1.什麽是 Squid ?

Squid是一個高性能的代理緩存服務器,Squid支持FTP、gopher、HTTPS和HTTP協議。和一般的代理緩存軟件不同,Squid用一個單獨的、非模塊化的、I/O驅動的進程來處理所有的客戶端請求。


2·緩存的工作原理

squid 是工作在應用層的代理服務軟件,squid 主要提供緩存加速和應用層過濾控制的功能。在這裏舉個列子:當客戶機通過代理來請求 web 頁面時,那麽代理服務器會檢查自己有沒有你請求的頁面,有的話就直接發送給客戶端,沒有的話,代理服務器就會向web發送請求,當獲得了web頁面後,就會把數據保存到緩存中,並發給客戶端。


下圖是代理服務的緩存機制過程:
技術分享圖片


2)·HTTP 代理的緩存說明:


HTTP代理的緩存加速對象主要針對文字、圖像等靜態 Web 元素。使用緩存機制後,客戶端在訪問 同一 Web 元素,就可以直接從代理服務器的緩存中得到你想要的。這樣做的好處就減少 對 Web 請求的過程,提高了客戶端的訪問速度


還有就是客戶機訪問的 Web 訪問請求實際上是由代理服務器帶完成的,這樣就可以隱藏用戶的真實 IP,有一定的保護作用,代理服務器還有機會對訪問的目標、客戶機的地址、訪問的時間段進行過濾控制。


代理的基本類型與應用方向:

1)傳統代理:

也就是普通的代理服務,比如我們用的瀏覽器、QQ聊天工具等需要手動設置代理服務器的地址和端口,才能使用代理服務的。


下圖是瀏覽器設置代理服務器地址圖:


技術分享圖片


對以上圖說明:每個軟件或者是瀏覽器設置代理服務器的位子是不一樣的,只要找到選項,幾乎就在裏面,設好代理服務器的地址與端口即可。


2)應用方向

傳統代理:多用於 Internet 環境,QQ 程序、下載工具等,可以規避服務器的並發連接。


透明代理:多用於局域網環境,比如在 Linux 網關中啟用代理,局域網主機就不用再進行額外的設置就能更快的訪問。


傳統代理服務器部署

部署前說明:

1·部署環境是:CenOS 7.4


2·部署方式:手工編譯, 版本為 Squid 3.4.6


3·提供源碼包下載地址:Squid 緩存源碼包,需要請點擊 密碼:63xn


傳統代理服務器拓撲圖如下:


技術分享圖片


開始部署:
1)編譯安裝 Squid,現在是手工編譯的,在這之前我們需要把源碼包下載,進行解壓,安裝編譯環境、指定安裝路徑與功能模塊等

[root@localhost ~]# tar zxvf squid-3.4.6.tar.gz -C /opt/ ----(解壓到 /opt 目錄下


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


[root@localhost ~]# cd /opt/squid-3.4.6/
[root@localhost squid-3.4.6]# ./configure --prefix=/usr/local/squid \
> --sysconfdir=/etc \
> --enable-arp-acl \
> --enable-linux-netfilter \
> --enable-linux-tpoxy \
> --enable-async-io=100 \
> --enable-err-language="Simplify_Chinese" \
> --enable-underscore \
> --enable-poll \
> --enable-gnuregex


2)對以上模塊解釋:

1·指定安裝路徑
2·單獨將配置文件放在 /etc
3·可以在規則中設置為直接通過客戶端MAC進行管理,防止客戶端使用IP欺騙
4·使用內核過濾
5·支持透明模式
6·異步 I/O,提升存儲性能
7·錯誤信息的顯示語言
8·允許 URL 中有下劃線
9·使用POLL()模式,提升性能
10·使用GNU 正則表達式


[root@localhost squid-3.4.6]# make && make install ----(制作、編譯安裝,這裏等待的時間需要稍長一點,請耐心等待


3)安裝完畢,現在需要對 Squid 進行一些優化,使以後我們用起來更加符合日常日操作習慣


[root@localhost squid-3.4.6]# ln -s /usr/local/squid/sbin/ /usr/local/sbin ——(創建軟連接)


[root@localhost squid-3.4.6]# useradd -M -s /sbin/nologin squid ---(創建管理用戶)


[root@localhost squid-3.4.6]# chown -R squid.squid /usr/local/squid/var/


4)修改主配置文件,有圖有文字說明:

[root@localhost squid-3.4.6]# vim /etc/squid.conf ----(在編譯的時候就指定了主配置文件放在 /etc 下


修改如下內容:

http_access allow all -----(需要添加,意思是運行所有人訪問http,這裏相當於是一個ACL訪問控制列表
cache_effective_user squid ------(添加指定的程序用戶
cache_effective_group squid ------(添加 指定的賬號基本組


下圖是配置文件添加內容:


技術分享圖片


檢查配置文件語法,看看是否有報錯:

[root@localhost squid-3.4.6]# squid -k parse ---(檢查語法,有報錯問題幾乎是配置文件的問題)


編寫 Squid 啟動腳本

[root@localhost squid-3.4.6]# 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 -antp | grep squid &> /dev/null
if [ $? -eq 0 ]
then
echo "squid is running"
else
echo "正在啟動 squid...."
$CMD
fi
;;
stop)
$CMD -k kill &> /dev/nulll
rm -rf $PID &> /dev/null
;;
status)
[ -f $PID ] &> /dev/null
if [ $? -eq 0 ]
then
netstat -antp | 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|status|reload|check|restart}"
;;
esac


優化 squid 與 啟動腳本

[root@localhost squid-3.4.6]# chmod +x /etc/init.d/squid ---(給腳本執行權限
[root@localhost squid-3.4.6]# chkconfig --add squid ----(加入系統服務
[root@localhost squid-3.4.6]# chkconfig --level 35 squid on ----(設置開機自啟


到此 Squid 服務基本配置完成。接下來我們需要先來做傳統代理模式


[root@localhost squid-3.4.6]# vim /etc/squid.conf ---(修改配置文件)


添加內容如下:
cache_mem 64 MB ---(#指定緩存功能使用的內存空間大小,以便於保持訪問較頻繁的web對象,容量最好為4的倍數,單位為MB,建議設為物理內存的1/4)


reply_body_max_size 10 MB ----(允許用戶下載的最大文件大小,以字節為單位,默認0,表示不限制


maximum_object_size 4096 KB ---(允許保存到緩存空間的最大對象大小,以KB為單位,超過大小限制的文件將不被緩存,而是直接轉發給用戶)


下圖是修改後的配置文件:
技術分享圖片


啟動前準備:


[root@localhost squid-3.4.6]# squid -k parse ---(再次檢查配置文件語法


[root@localhost squid-3.4.6]# squid -z ---(初始化緩存目錄


[root@localhost squid-3.4.6]# iptables -F ----(清空防火墻規則,便於之後我們自己填寫策略)
[root@localhost squid-3.4.6]# iptables -t nat -F


[root@localhost squid-3.4.6]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT ---(添加防火墻策略:允許 tcp 協議 3128端口通過)‘
[root@localhost squid-3.4.6]# setenforce 0 ---(關閉增強功能)


[root@localhost squid-3.4.6]# service squid start ----(啟動服務)
正在啟動 squid...


[root@localhost squid-3.4.6]# netstat -antp | grep 3128 ----(查看啟動端口
tcp6 0 0 :::3128 :::* LISTEN 36813/(squid-1)


驗證傳統代理服務器:

方法:搭建 Apache 網站服務器,用 windows 客戶端 IE 瀏覽器設置代理服務器,訪問 Apache 網站服務器,然後查看Apache 日誌文件,查看是誰訪問的Apache。如果是代理服務器說明我們部署成功。


1)在另外一臺服務器上搭建 Apache 服務器:


[root@localhost ~]# yum install httpd -y ---(註意這裏是在其他服務器上安裝Apache


[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl start httpd.service


2)在客戶機上給 IE 瀏覽器設置 Squid 代理服務器的地址與端口


這裏用圖表示:
技術分享圖片


開始訪問 apache 網站服務器:
技術分享圖片


以上圖說明:訪問成功,但是我們需要知道是誰去訪問的,所以現在需要看看 apache 的日誌文件。


下圖是 Apache 的日誌文件:
技術分享圖片


上圖說明:傳統代理服務器部署成功!


透明代理部署:

透明代理提供的服務功能與傳統代理是一致的,但是其 ” 透明 “ 的實現依賴默認路由和防火墻的重定向策略。


在Linux 網關上,構架squid 為客戶機訪問 Internet 提供代理服務
在所有的局域網客戶機上,只需要爭取設置IP地址、默認網關,而不需要手動指定代理服務器的地址、端口等信息。


根據以上的理論,所以我們應該把 Squid 代理服務器 再添加一塊新的網卡,透明代理的拓撲圖如下:
技術分享圖片


開始部署:

[root@localhost ~]# vim /etc/squid.conf ---(修改配置文件


修改內容如下:
http_port 192.168.100.1:3128 transparent ----(修改監聽地址,因為是內網需要訪問外網,所以監聽的是內網 transparent:意思就是透明模式


配置文件修改得不多,接下來就是需要設置 iptables 的重定向策略:

[root@localhost ~]# iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 80 -j REDIRECT --to 3128


[root@localhost ~]# iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 443 -j REDIRECT --to 3128


開啟路由轉發功能:
[root@localhost ~]# echo "1" > /proc/sys/net/ipv4/ip_forward


重啟 squid 代理服務器

[root@localhost ~]# service squid restart
正在關閉 squid...
正在啟動 squid...


透明模式驗證:
說明:透明模式 是不需要手動設置代理服器的,訪問如下圖:


技術分享圖片


下圖是apache 日誌分析,看看是那一臺主機訪問的web


技術分享圖片


結論:如上圖,是不需要手動設置代理服務器,訪問web服務器是由代理服務器去訪問!


如果要再Linux客戶機的命令行界面中使用代理服務器(比如:elinks 網頁瀏覽器、wget 下載工具),必須通過環境變量來指定代理服務器的地址、端口等信息。


[root@localhost ~]# vim /etc/profile ---(添加如下內容到環境變量中)


添加如下內容:

HTTP_PROXY=http:192.168.100.50:3128 ---(為使用HTTP協議指定代理)
HTTPS_PROXY=http:192.168.100.50:3128 ---(為使用HTTPS協議指定代理)
FTP_PROXY=http:192.168.100.50:3128 ----(為使用FTP協議指定代理)
NO_RPOXY=192.168.20.,192.168.30. ---(對兩個局域網段不使用代理)
export HTTP_PROXY HTTPS_PROXY FRP_PROXY NO_PROXY**

[root@localhost ~]# source /etc/profile


總結:

1·要知道,我們訪問的是web服務器,如果 Squid緩存代理服務器有訪問的數據,代理服務器就會直接給予回饋,如果沒有,squid 就會去找web服務器要數據,再返回給客戶端。


2·代理的基本類型有:傳統代理、透明代理。之間最大的區別是:需要手動設置代理服務器的地址和端口。


3·排錯可能性:·訪問的時候,web服務器的防火墻沒有關閉;防火墻策略寫入有誤、修改配置文件後是否重啟服務,查看端口服務是否啟動。


【實戰】Squid 緩存服務器 之 傳統代理 + 透明代理