實踐出真知——基於squid實現正向代理實踐

實踐出真知——基於squid實現正向代理實踐

前言

​ 俗話說得好:時間是治癒一切傷口的良藥,實踐是檢驗真理的唯一標準!本文將結合代理服務器的基本原理,進行基於squid軟件實現傳統(標準)代理(正向代理)以及透明代理的實例演示。

先說說squid是個啥

​ 避(kai)免(ge)被(wan)噴(xiao),還是介紹一下什麼是squid吧。

squid的概念

​ squid是一種用來緩存Internet數據的軟件。用於接受來自客戶端需要下載對象(object)的請求並適當的處理這些請求。也就是說,如果一個客戶端想下載一個web頁面,就可以通過請求squid(代理服務器)爲其獲取並響應(返回)這個頁面的數據到客戶端;squid(代理服務器)隨之連接到遠程服務器並向該web頁面發出請求。然後,squid聚集數據到客戶端機器,而且同時複製一份。當下一次有人需要同一頁面時, squid可以簡單的從磁盤(自身)中讀取到,那樣數據會立即傳輸到客戶機上,從而節省網絡資源(例如帶寬)。

​ 說白了,squid就是一個軟件,運行在代理服務器上,用來真正實現代理的功能。

squid代理的作用

  • 通過緩存的方式爲用戶提供Web訪問加速
  • 對用戶的Web訪問進行過濾控制

基於squid實現傳統代理實例演示

一、規劃實驗環境和所需資源

實例核心:兩臺服務器,一臺客戶機

squid代理服務器ip:20.0.0.128
web真實服務器ip:20.0.0.130
client客戶機ip(測試用):20.0.0.138

軟件包資源:squid軟件包鏈接如下:

鏈接:https://pan.baidu.com/s/1ZlyhLhdxhz57pfNEyCMvIg
提取碼:6qf3

二、網絡拓撲結構

實踐出真知——基於squid實現正向代理實踐

三、實操流程

由於web真實服務器設置比較簡單,安裝一個Apache web服務即可,先來看一下squid代理服務器上的配置,爲了方便演示,對服務器更改一下名稱也是必要的

1、在代理服務器上手工編譯安裝squid軟件

熟悉手工編譯的話其實步驟就是那些,只是具體的內容不一樣而已,無需多言,直接開始:

[root@localhost ~]# hostnamectl set-hostname squid
[root@localhost ~]# su
[root@squid ~]# ls
anaconda-ks.cfg       sarg-2.3.7.tar.gz   公共  視頻  文檔  音樂
initial-setup-ks.cfg  squid-3.4.6.tar.gz  模板  圖片  下載  桌面
[root@squid ~]# tar zxf squid-3.4.6.tar.gz -C /opt/ #解壓軟件包
[root@squid ~]# yum install gcc gcc-c++ make -y #安裝編譯環境(如果安裝了開發工具一般無需該步驟)

[root@squid ~]# cd /opt/squid-3.4.6/   #進入軟件目錄開始手工編譯安裝
[root@squid squid-3.4.6]# ls
acinclude     compat        COPYING    helpers  libltdl      README             src
aclocal.m4    configure     COPYRIGHT  icons    Makefile.am  RELEASENOTES.html  test-suite
bootstrap.sh  configure.ac  CREDITS    include  Makefile.in  scripts            tools
cfgaux        contrib       doc        INSTALL  po4a.conf    snmplib
ChangeLog     CONTRIBUTORS  errors     lib      QUICKSTART   SPONSORS
[root@squid squid-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
[root@squid squid-3.4.6]# make    
[root@squid squid-3.4.6]# make install    ##編譯安裝,時間根據硬件配置成正比

配置參數解析:

--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()模式,提升性能
--enable-gnuregex               ##支持GNU正則表達
[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/  ##給目錄所有文件屬主屬組權限

2、修改squid主配置文件,並優化啓動項

[root@squid squid-3.4.6]# vim /etc/squid.conf   ##修改squid配置文件
55 # And finally deny all other access to this proxy
56 http_access allow all   ##添加此項
57 #http_access deny all ##註釋,允許終端訪問

59 # Squid normally listens to port 3128
60 http_port 3128
cache_effective_user squid   ##指定用戶squid,自己添加
cache_effective_group squid ##指定組,自己添加
[root@squid squid-3.4.6]# squid -k parse ##檢查配置文件語法(有顯示內容)
[root@squid squid-3.4.6]# squid -z  ##初始化緩存目錄
[root@squid squid-3.4.6]# squid  ##開啓服務(有顯示內容)
[root@squid squid-3.4.6]# netstat -ntap | grep 3128  ##查看squid端口

[root@squid squid-3.4.6]# cd /etc/init.d/
[root@squid init.d]# vim squid    ##編輯service啓動squid的腳本
#!/bin/bash
#chkconfig: 2345 90 25
PID="/usr/local/squid/var/run/squid.pid"   ##PID文件進程號
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
[root@squid init.d]# chmod +x squid   ##給執行權限
[root@squid init.d]# chkconfig --add squid   ##添加到service管理中
[root@squid init.d]# chkconfig --level 35 squid on  ##開機自啓

3、設置傳統代理配置——依舊是對主配置文件進行修改

[root@squid init.d]# vim /etc/squid.conf  ##修改主配置文件
# Squid normally listens to port 3128
http_port 3128
cache_mem 64 MB   ##緩存空間大小
reply_body_max_size 10 MB  ##允許下載最大的文件大小
maximum_object_size 4096 KB   ##允許保存緩存空間最大對象的大小
[root@squid init.d]# service squid restart
[root@squid init.d]# iptables -L  ##查看錶內容(有顯示內容)
[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 ##允許基於tcp協議從3128端口進入
[root@squid init.d]# service squid reload  ##重載配置文件

4、在web服務器上安裝Apache http服務

[root@localhost ~]# hostnamectl set-hostname web
[root@localhost ~]# su
[root@web ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg  公共  模板  視頻  圖片  文檔  下載  音樂  桌面
[root@web ~]# systemctl stop firewalld.service   ##關閉防火牆
[root@web ~]# setenforce 0
[root@web ~]# yum install httpd -y  ##安裝web服務
[root@web ~]# systemctl start httpd.service

5、使用client訪問web地址,在web服務器端的日誌文件中查看日誌消息

Win7客戶端訪問web服務器ip地址,顯示正常訪問

實踐出真知——基於squid實現正向代理實踐

web服務器的日誌文件信息如下:

實踐出真知——基於squid實現正向代理實踐

Win7客戶機ip地址:

實踐出真知——基於squid實現正向代理實踐

根據上篇文章的介紹原理,在傳統(標準)代理模式下應該是squid服務器的ip地址啊?這個問題的確沒毛病,但是我們需要知道,傳統代理與透明代理的最核心的區別在於哪裏——就是我們的客戶機沒有設置代理和端口啊!

設置代理服務器IP地址和端口:

實踐出真知——基於squid實現正向代理實踐

實踐出真知——基於squid實現正向代理實踐

刷新頁面再次在web服務器上查看日誌消息,如下所示:

實踐出真知——基於squid實現正向代理實踐

小結

​ 根據此次的實踐,體驗了使用squid軟件實現傳統代理服務器的功能,也驗證了其需要在客戶端設置代理服務器地址和端口的原因。

接下來基於上面的實驗,進行透明模式的配置,首先將方纔的代理服務器ip地址和端口的設置刪除。

基於squid實現透明代理實例演示

一、實驗環境

​ 實驗環境需要修改,因爲透明模式是使用代理服務器將客戶服務器與web服務器阻斷了,所以需要在squid服務器上添加網卡實現通信。如下所示:

squid 服務器:ens33 20.0.0.128
             ens36 192.168.100.1 (僅主機)
web服務器:20.0.0.130
client 客戶機:192.168.100.100(僅主機)

二、網絡拓撲結構

這樣構建的一個網絡拓撲如下所示:

實踐出真知——基於squid實現正向代理實踐

三、實驗流程

0、刪除原來在client端的代理設置並且設置網卡爲僅主機模式且IP地址爲192.168.100.100

實踐出真知——基於squid實現正向代理實踐

1、在squid服務器上添加新網卡爲僅主機模式,並且配置IP地址爲192.168.100.1

[root@squid ~]# cd /etc/sysconfig/network-scripts/
[root@squid network-scripts]# cp -p ifcfg-ens33 ifcfg-ens36
[root@squid network-scripts]# vim ifcfg-ens36  ##修改ens36ip信息
BOOTPROTO=static
##刪除uuid修改33爲36
IPADDR=192.168.100.1
NETMASK=255.255.255.0  
[root@squid network-scripts]# service network restart   ##重啓網絡服務
[root@squid network-scripts]# vim /etc/sysctl.conf   ##開啓路由轉發
net.ipv4.ip_forward=1 #末尾加上
[root@squid network-scripts]# sysctl -p   ##加載
net.ipv4.ip_forward=1

2、在web服務器上指定靜態路由

[root@web ~]# route add -net 192.168.100.0/24 gw 192.168.13.184  ##添加靜態路由

3、在squid代理服務器上設置透明代理

前面配置(./configure時開啓了支持透明模式的功能的)

[root@squid network-scripts]# vim /etc/squid.conf   ##設置配置文件
http_port 192.168.100.1:3128 transparent   ##設置透明代理,真正修改的地方
cache_effective_user squid
cache_effective_group squid
[root@squid network-scripts]# service squid stop  ##關閉開啓squid服務
[root@squid network-scripts]# service squid start
[root@squid network-scripts]# iptables -F  ##清空表緩存
[root@squid network-scripts]# iptables -t nat -F
[root@squid network-scripts]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.100.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
##定義規則入口ens36,80端口重定向到3128
[root@squid network-scripts]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.100.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
##https443端口
[root@squid network-scripts]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
##允許3128端口訪問

4、測試驗證

實踐出真知——基於squid實現正向代理實踐

查看web日誌文件,如下圖:

實踐出真知——基於squid實現正向代理實踐

小結

​ 透明模式下的設置是對網絡的規劃以及對squid配置文件的修改,添加對應的參數即可實現透明模式下的代理功能。並且無需在客戶端設置服務器的ip地址以及端口號。

總結

​ 基於squid軟件實現的正向代理的兩種模式應該深有體會了,結合之前的原理在配置實踐中理解是不是更加事半功倍了呢?通過本文的實際操作,想必對squid的配置文件還不太熟悉(不急不急哈,未完待續,且聽下回分解~~),但是實現的整個過程應該是瞭如指掌了哈!

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