Squid做爲應用層代理服務軟件,主要提供緩存加速和應用層過濾控制的功能。本次實驗使用的是Squid 4.1版本,和以往版本有較多不一樣,通過幾天的摸索,終於成功實現了傳統代理、透明代理及反向代理等功能。linux
代理服務器(Proxy Server)是我的網絡和Internet服務商之間的中間代理機構,負責轉發合法的網絡信息,對轉發進行控制和登記。其最基本的功能就是鏈接,此外還包括安全性、緩存,內容過濾,訪問控制管理等功能。當客戶機經過代理請求Web頁面時,執行的代理服務器會先檢查本身的緩存,當緩存中有客戶機須要訪問的頁面,則直接將緩存服務器中的頁面內容反饋給客戶機;若是緩存中沒有客戶機須要訪問的頁面,則由代理服務器想Internet發送訪問請求,當得到返回的Web頁面之後,將頁面數據保存到緩存中併發送給客戶機。web
根據實現的方式不一樣,代理服務能夠分爲傳統代理和透明代理兩種常見的代理服務。正則表達式
一、傳統代理:普通代理服務,必須在瀏覽器、QQ聊天工具,下載團建等程序中手動設置代理服務器的地址和端口,而後才能使用代理服務來訪問網絡,對於網頁瀏覽器,訪問網站時的域名解析請求也會發送給指定的代理服務器。vim
二、透明代理:提供與傳統代理相同的功能和服務,其區別在於客戶機不須要指定代理服務器的地址和端口,而是經過默認路由、防火牆策略將Web訪問重定向,實際上仍然交給代理服務器來處理。重定向的過程對客戶機「透明」的,用戶甚至不知道本身在使用代理服務,因此稱爲「透明代理」。使用透明代理時,網頁瀏覽器訪問網站時的域名解析請求將優先發給DNS服務器。瀏覽器
下面以最新版Squid 4.1版本爲例,介紹其安裝和運行控制。緩存
首先將下載下來的源代碼包,解壓到指定目錄中。安全
[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正則表達式
配置完成後,進行編譯安裝bash
[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控制訪問、日誌分析和反向代理。就這樣!