1. 程式人生 > >Squid-4.1(最新)安裝及構建代理服務器

Squid-4.1(最新)安裝及構建代理服務器

.com 訪問日誌 加載 常見 tap imu 成功 local load

Squid-4.1(最新)安裝及構建代理服務器

緩存代理簡介

Squid作為應用層代理服務軟件,主要提供緩存加速和應用層過濾控制的功能。本次實驗使用的是Squid 4.1版本,和以往版本有較多不同,經過幾天的摸索,終於成功實現了傳統代理、透明代理及反向代理等功能。技術分享圖片

代理的工作機制

代理服務器(Proxy Server)是個人網絡和Internet服務商之間的中間代理機構,負責轉發合法的網絡信息,對轉發進行控制和登記。其最基本的功能就是連接,此外還包括安全性、緩存,內容過濾,訪問控制管理等功能。當客戶機通過代理請求Web頁面時,執行的代理服務器會先檢查自己的緩存,當緩存中有客戶機需要訪問的頁面,則直接將緩存服務器中的頁面內容反饋給客戶機;如果緩存中沒有客戶機需要訪問的頁面,則由代理服務器想Internet發送訪問請求,當獲得返回的Web頁面以後,將頁面數據保存到緩存中並發送給客戶機。

代理的基本類型

根據實現的方式不同,代理服務可以分為傳統代理和透明代理兩種常見的代理服務。

1、傳統代理:普通代理服務,必須在瀏覽器、QQ聊天工具,下載團建等程序中手動設置代理服務器的地址和端口,然後才能使用代理服務來訪問網絡,對於網頁瀏覽器,訪問網站時的域名解析請求也會發送給指定的代理服務器。

2、透明代理:提供與傳統代理相同的功能和服務,其區別在於客戶機不需要指定代理服務器的地址和端口,而是通過默認路由、防火墻策略將Web訪問重定向,實際上仍然交給代理服務器來處理。重定向的過程對客戶機“透明”的,用戶甚至不知道自己在使用代理服務,所以稱為“透明代理”。使用透明代理時,網頁瀏覽器訪問網站時的域名解析請求將優先發給DNS服務器。

安裝及運行控制

下面以最新版Squid 4.1版本為例,介紹其安裝和運行控制。

編譯安裝Squid

首先將下載下來的源代碼包,解壓到指定目錄中。

[root@promote ~]# tar xfvz squid-4.1.tar.gz -C /opt/
[root@promote ~]# cd /opt/squid-4.1/
[root@promote squid-4.1]# ./configure --prefix=/usr/local/squid \ #指定安裝目錄
> --sysconfdir=/etc \   #單獨將配置文件修改到其他目錄
> --enable-arp-acl \    #可以在規則中設置通過客戶端MAC進行管理,防止IP欺騙
> --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@promote squid-4.1]# make && make install

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

[root@promote squid-4.1]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/
#創建軟鏈接,這樣可以直接使用squid相關的命令
[root@promote squid-4.1]# useradd -M -s /sbin/nologin squid
#創建管理進程的用戶
[root@promote squid-4.1]# chown -R squid.squid /usr/local/squid/var/
#將文件的屬主和屬組修改

修改Squid的配置文件,Squid服務的配置文件位於/etc/squid.conf。

[root@promote squid-4.1]# vim /etc/squid.conf
cache_effective_user squid       #添加指定程序用戶   
cache_effective_group squid      #添加指定賬號基本組

其他的先保持默認的

[root@promote squid-4.1]# squid -k parse   #檢查配置文件語法
[root@promote squid-4.1]# squid -z         #初始化緩存目錄
[root@promote squid-4.1]# 2018/07/22 20:03:12| Created PID file (/usr/local/squid/var/run/squid.pid)
2018/07/22 20:03:12 kid1| Set Current Directory to /usr/local/squid/var/cache/squid
2018/07/22 20:03:12 kid1| Creating missing swap directories
2018/07/22 20:03:12 kid1| No cache_dir stores are configured.
2018/07/22 20:03:12| Removing PID file (/usr/local/squid/var/run/squid.pid)
[root@promote squid-4.1]# squid            #啟動Squid服務
[root@promote squid-4.1]# netstat -ntap | grep squid       #服務啟動,Squid服務處於正常監聽狀態
tcp6       0      0 :::3128                 :::*                    LISTEN      90280/(squid-1)   

創建Squid服務腳本,為了使Squid服務啟動、停止、重載等操作更加方便,可以編寫Squid服務腳本,並使用chkconfig和service工具進行管理。

[root@promote squid-4.1]# 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 -natp | grep squid &> /dev/null
     if [ $? -eq 0 ]
     then
       echo "squid is running"
       else
       echo "正在啟動 squid..."
       $CMD
     fi
   ;;
   stop)
     kill -9 `expr $(cat $PID) + 2`   #squid.pid中的數字和進程號相差2,直接殺死進程,後續實驗發現不一定相差2,暫時找不到原因,希望大佬出來能解答一下。
   ;;
   status)
     [ -f $PID ] &> /dev/null
        if [ $? -eq 0 ]
          then
            netstat -natp | 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

[root@promote squid-4.1]# cd /etc/init.d/
[root@promote init.d]# chmod +x squid                  #添加執行權限
[root@promote init.d]# chkconfig --add squid           #使用chkconfig管理
[root@promote init.d]# chkconfig --level 35 squid on   #設置開機啟動

構建代理服務器

傳統代理

技術分享圖片
修改配置文件,在配置傳統代理時,需要添加http_access allow all訪問策略,允許任意客戶機使用代理。除此以外還要設置reply_body_max_size項,其他參數保持默認。

[root@promote init.d]# vim /etc/squid.conf
http_access allow all  #允許任意客戶機使用代理
http_port 3128         #使用3128端口
cache_mem 64 MB        #指定緩存功能所使用的內存空間大小,便於保持訪問較頻繁的WEB對象,容量最好為4的倍數,單位為MB,建議設為物理內存的1/4
reply_body_max_size 10 MB   #允許用戶下載的最大文件大小,以字節為單位。默認設置0表示不進行限制
maximum_object_size 4096 KB   #允許保存到緩存空間的最大對象大小,以KB為單位,超過大小限制的文件將不被緩存,而是直接轉發給用戶

在防火墻添加允許策略:

[root@promote run]# iptables -F              #清除防火墻filter表中規則
[root@promote run]# setenforce 0             #關閉增強安全×××
[root@promote run]# iptables -I INPUT -p tcp --dport 3218 -j ACCEPT
#這句策略就是允許訪問3218端口的tcp數據包通過
[root@promote run]# service squid reload     #重新加載服務配置

客戶機的代理配置,在IE瀏覽器中,選擇“工具”->“Internet選項”,子啊彈出的“Internet選項”對話框,在“連接”選項中的“局域網(LAN)設置”選項組中單機“局域網設置”按鈕,彈出“局域網(LAN)設置”對話框,設置如下:

技術分享圖片
開啟web服務器的httpd服務。
技術分享圖片
使用192.168.58.130這臺虛擬機訪問192.168.58.156,訪問成功,查看web服務器的訪問日誌,查看是那個ip地址訪問的,如果是代理服務器ip訪問的話,說明傳統代理部署成功。
技術分享圖片
的確是代理服務器訪問的,說明傳統代理部署成功。
技術分享圖片

透明代理

透明代理提供的服務功能與傳統代理一致的,但是其“透明”的實現依賴於默認路由和防火墻重定向策略。因此更適用於為局域網主機服務,而不適合Internet中的客戶機提供服務。針對下面的拓撲,透明代理的關鍵在於Linux網關服務器,對於客戶機僅需要正確配置網絡地址和默認網關,並不需要指定代理服務器,拓撲圖如下:

首先設置Squid代理服務器的雙網卡配置。
技術分享圖片
然後修改squid配置文件,主要修改http_port,這裏和4.1版本前的修改方法不太一樣,若和以前一樣,服務會無法啟動,而且查看/usr/local/squid/var/logs/cache.log日誌,會發現會有報錯。
技術分享圖片
技術分享圖片
這裏需要換種方式,因為可能4.1版本透明代理默認就是3128,那麽3128端口就會被占用,無法再做透明代理,這裏的方法就是重新使用一個端口,專門用來做透明代理,配置方法如下圖,然後重啟服務。
技術分享圖片
技術分享圖片
開啟防火墻路由轉發功能以及重定向策略。路由轉發功能只需要在/etc/sysctl寫入net.ipv4.ip_forward=1,再刷新配置文件即可。

[root@localhost ~]# vim /etc/sysctl.conf 
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@localhost ~]# !v
vim /etc/sysctl.conf 

技術分享圖片
接著設置iptables重定向策略。

[root@localhost ~]# iptables -F
#清空防火墻filter表中策略
[root@localhost ~]# iptables -F -t nat
#清空防火墻nat表中策略
[root@localhost ~]# iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 80 -j REDIRECT --to 3129
#將80端口(http)的請求重新定向到3128端口
[root@localhost ~]# iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 443 -j REDIRECT --to 3129
#將443端口(https)的請求重新定向到3128端口
[root@localhost ~]# iptables -I INPUT -p tcp --dport 3129 -j ACCEPT
#允許來自192.168.100.0網段來自3129端口的tcp數據包通過

配置Web服務器的網卡信息。(配置好網關)
技術分享圖片
配置客戶端網卡信息。(一定要配置好網關)
技術分享圖片
都配置完後,驗證效果,訪問成功,我們再查看web服務器的access.log日誌,檢查到底是哪個ip對web服務器訪問的。可以看到是12.0.0.1這個IP對即代理服務器的訪問記錄。
技術分享圖片
技術分享圖片
本篇先介紹到這裏,下篇介紹Squid 4.1版本的額ACL控制訪問、日誌分析和反向代理。就這樣!

Squid-4.1(最新)安裝及構建代理服務器