一、緩存代理概述
1、代理的工作原理。
圖1
我們從圖1來解釋一下squid的工作原理
首先客戶機訪問www.163.com的時候,首先到squid的緩存中進行查找如果有直接將結果應答給客戶機,如果沒有緩存則squid服務器想目www.163.com發送請求,將返回的結果存入自己的緩存並且應答給客戶端。
squid可以代理的應用層協議有http、ftp。其中應用最廣泛的是http。
HTTP代理的緩存對象主要是文字,圖像等靜態web元素,使用緩存機制後,當客戶機在不同的時候訪問統一web元素,或者不同的客戶機的訪問相同的web元素時,可以直接從緩存服務器中獲取結果,這樣就提高了用戶向internet訪問的速度。
使用squid代理服務器有以下幾點好處:
1)加快了訪問速度
2)隱藏了客戶端的IP地址
3)可以對源地址盡心過濾
4)可以控制訪問
2、代理的基本類型
根據實現的方式不同,代理服務可以分爲傳統代理和透明代理,這兩種代理服務完成的工作相差不多,而還有一種代理也就是我們今天的重點反向代理
傳統代理:在客戶端使用的時候需要在web遊覽器中進行設置,來指定服務器的端口和地址,這種代理主要是針對局域網訪問internet的時候用的比較廣泛,但由於客戶端需要進行設置,所以這種並不是最常用的。
透明代理:提供與傳統代理相同的服務,但不需要用戶進行設置,而是通過默認路由和防火牆的重定向功能,在整個過程中用戶不知道其中的過程,所以稱之爲透明代理。使用透明代理時網頁遊覽器訪問網站時的域名解析請求優先發給DNS服務進行解析。透明代理必須在linux操作系統的防火牆上進行操作。操作上不是很靈活。
說完了兩種正向代理,我們來看一反向代理的工作原理:
圖2
客戶端請求訪問 WEB 服務時,DNS 將訪問的域名解析爲 Squid 反向代理服務器的 IP 地址,這樣客戶端的 URL 請求將被髮送到反向代理服務器。如果 Squid 反向代理服務器中緩存了該請求的資源,則將該請求的資源直接返回給客戶端,否則反向代理服務器將向後臺的 WEB 服務器請求資源,然後將請求的應答返回給客戶端,同時也將該應答緩存在本地,供下一個請求者使用。
Squid 反向代理一般只緩存可緩衝的數據(比如 html 網頁和圖片等),而一些 CGI 腳本程序或者 ASP、JSP 之類的動態程序默認不緩存。它根據從 WEB 服務器返回的 HTTP 頭標記來緩衝靜態頁面。有四個最重要 HTTP 頭標記:
Last-Modified: 告訴反向代理頁面什麼時間被修改
Expires: 告訴反向代理頁面什麼時間應該從緩衝區中刪除 Cache-Control: 告訴反向代理頁面是否應該被緩衝
Pragma: 用來包含實現特定的指令,最常用的是Pragma:no-cache
原理就說到這裏。
二、安裝squid及運行控制。
本例以squid3.4.6源碼包進行演示,系統本本爲centos6.5內核2.6.26 。
基本環境:gcc編譯器,開發工具。
主機名:entos1.lzg.com
IP地址:192.168.1.1
ps:本次安裝是以單臺服務器作爲安裝,之後的代理驗收的時候會有專門的拓撲圖。
[root@centos1 tools]# ls squid-3.4.6/ -ld
rwxr-xr-x. 18 1000 1000 4096 Jun 25 2014 squid-3.4.6/
[root@centos1 tools]# cd squid-3.4.6
[root@centos1 squid-3.4.6]# ./configure --prefix=/usr/local/squid --syconfdir=/etc --enable-linux-netfilter --enable-linux-tproxy --enable-async-io=100 --enable-err-language="Simplify_Chinese" --enable-underscore --enable-poll --enable-gnuregex --enable-arp-acl
上述含義如下:
--prefix 指定安裝的位置
--sysconfdir=/etc 指定配置文件的存放位置
--enable-linux-netfilter 使用內核進行過濾
--enable-linux-tproxy 支持透明模式
--enable-arp-acl 可以直接在規則中通過客戶端MAC地址進行管理
--enable-async-io=100 提升存儲性能 值一般都爲100
--enable-err-language="Simplify_Chinese" 錯誤信息顯示爲中文
--enable-underscore 允許url路徑存在下劃線
--enable-poll 使用poll()模式,提升性能
--enable-gnuregex 使用正則表達式
[root@centos1 tools]# make && make install
[root@centos1 squid-3.4.6]# echo $? 0
使用變量$?來判斷是否安裝正確。返回0代表正確執行,squid我們就安裝完成了,這是我們只需要做一下簡單的配置即可。
因爲squid默認不存在運行用戶,我們先創建一個運行用戶名爲squid
[root@centos1 squid-3.4.6]# useradd -M -s /sbin/nologin squid
由於程序用戶不需要宿主目錄以及不需要登錄操作系統,所以添加-M -s選項
現在我們來將他的執行程序鏈接到/usr/local/sbin目錄下,方便命令的執行或者直接修改PATH環境變量。
這裏我選擇修改PATH環境變量
[root@centos1 squid-3.4.6]# echo "PATH=$PATH:/usr/local/squid/sbin/" >> /etc/profile
[root@centos1 squid-3.4.6]# . /etc/profile
之後我們將squid安裝目錄下的var子目錄的屬組和屬主改變
[root@centos1 squid-3.4.6]# chown -R squid:squid /usr/local/squid/var
可以使用whilere看一下squid的主配置文件路徑
[root@centos1 squid-3.4.6]# whereis squid
squid: /etc/squid.conf /usr/local/squid
我們來看一下squid的默認的配置文件內容
[root@centos1 squid-3.4.6]# vim /etc/squid.conf
# # Recommended minimum configuration: # # Example rule allowing access from your local networks. # Adapt to list your (internal) IP networks from where browsing # should be allowed #下面的部分爲程序定義的acl規則 acl localnet src 10.0.0.0/8 # RFC1918 possible internal network acl localnet src 172.16.0.0/12 # RFC1918 possible internal network acl localnet src 192.168.0.0/16 # RFC1918 possible internal network acl SSL_ports port 443 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl CONNECT method CONNECT # # Recommended minimum Access Permission configuration: # # Deny requests to certain unsafe ports http_access deny !Safe_ports # Deny CONNECT to other than secure SSL ports # Only allow cachemgr access from localhost http_access allow localhost manager http_access deny manager # web applications running on the proxy server who think the only # one who can access services on "localhost" is a local user #http_access deny to_localhost # # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS # # Example rule allowing access from your local networks. # from where browsing should be allowed #以http開頭的爲調用上面定義的acl規則 http_access allow localnet http_access allow localhost # And finally deny all other access to this proxy http_access deny all # Squid normally listens to port 3128 http_port 3128 # Uncomment and adjust the following to add a disk cache directory. #cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256 # Leave coredumps in the first cache dir coredump_dir /usr/local/squid/var/cache/squid # # Add any of your own refresh_pattern entries above these. # refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 refresh_pattern . 0 20% 4320
以上的配置項主要定義程序運行時需要的一些組件,和監聽地址、端口號。其中實現代理主要就是通過這個配置文件來實現的,和我們今天后面需要講解的acl也是需要應用在這個配置文件中,所以一定要及時進行備份,更多的配置項請參/etc/squid.conf.documented
我們先進性配置文件的修改,主要修改有以下幾條配置項,有的配置項需要修改,而有的配置項需要添加。
http_port 3128 squid的默認監聽端口tcp 修改
cache_effective_group squid squid的運行組 添加
cache_effective_user squidsquid的運行用戶 添加
visible_hostname centos1.lzg.com 當前系統的主機名 添加
cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256
上條配置項爲緩存的目錄位置其中
100代表緩存的大小
16表示最多可以有多少個一級子目錄
256表示最多可以有多多少個二級子目錄。
以上就是需要修改的配置文件內容。
我們保存之後使用語法檢測工具對語法進行檢查。
[root@centos1 squid-3.4.6]# squid -k parse
會輸出很多信息,只要細看一下有沒有出現錯誤就可以了。
語法沒有任何錯誤,我麼首先對緩存目錄進行初始化。
[root@centos1 squid-3.4.6]# squid -z
[root@centos1 squid-3.4.6]# echo $? 0
正確執行了,之後我們啓動squid
[root@centos1 squid-3.4.6]# squid
[root@centos1 squid-3.4.6]# netstat -anpt | grep "squid" tcp 0 0 :::3128 :::* LISTEN 37749/(squid-1)
可以看見我們的squid服務已經啓動了,並且也看見監聽的端口,地址以及進程號。爲了更好的控制squid的服務,我們可以編寫一個腳本來控制squid的服務。
[root@centos1 squid-3.4.6]# vim /tools/squid
#!/bin/bash # chkconfig: 2345 90 25 # config: /etc/squid.conf # pidfile: /usr/local/squid/var/run/squid.pid # Description: Squid - internet object cache. PID="/usr/local/squid/var/run/squid.pid" CONF="/etc/squid.conf" CMD="/usr/local/squid/sbin/squid" case "$1" in start) netstat -anpt | grep squid &> /dev/null if [ $? -eq 0 ] then echo "squid is running" else echo "正在啓動squid..." $CMD fi ;; stop) $CMD -k kill &> /dev/null rm -fr $PID &> /dev/null ;; status) [ -f $PID ] &> /dev/null if [ $? -eq 0 ] then netstat -anpt | 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 | restart | reload | check | status}" ;; esac
以上腳本使用了我們之前的cass語句。
之後將squid腳本添加爲系統服務,並設置每次開機自動運行
[root@centos1 squid-3.4.6]# cp /tools/squid /etc/init.d/ [root@centos1 squid-3.4.6]# chmod +x /etc/init.d/squid [root@centos1 squid-3.4.6]# chkconfig --add squid [root@centos1 squid-3.4.6]# chkconfig squid on [root@centos1 squid-3.4.6]# service squid start squid is running [root@centos1 squid-3.4.6]# service squid restart 正在關閉squid... 正在啓動squid...
這個服務與之前的系統服務沒有什麼區別,只是簡化了一些。基本的配置就完成了,下面我們開始構建代理服務器
三、構建代理服務器
1、傳統代理:
我們通過一個案例案進行解讀
圖3
現在局域網內部需要通過域名www.qwe.com訪問web服務器,由於併發訪問量過多,公司現在要求加快訪問internet的速度,決定採用傳統代理的方式。
公司要求禁止通過代理下載超過100MB的文件
實驗步驟:
1)在外網的DNS添加一個A記錄記錄的IP地址執行squid服務器的地址
2)修改squid。conf配置文件實現公司的需求。
由於是測試環境,這裏只需要三臺計算機就可以了。並且與internet的IP地址採用了同一個網段,這裏linux網關服務區兼squid代理服務器需要開啓路由轉發並且需要設置iptables的snat共享上網。
實驗拓撲就按圖3搭建。
開始實驗
web/dns
圖4
建一個a記錄ip地址指向web服務器地址。
安裝iis7.0不需要做任何配置。
squid/linux網關服務器
DNS指向dns服務器
開啓路由轉發
[root@centos1 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
建立防火牆規則
[root@centos1 ~]# iptables -t nat -F [root@centos1 ~]# iptables -t nat -I POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to 172.16.16.1 [root@centos1 logs]# iptables -I INPUT -p udp --dport 53 -j ACCEPT [root@centos1 ~]# service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
將防火牆規則保存
squid/linux網關服務器
vim /etc/squid.conf
reply_body_max_size 10 MB 限制最大緩存大小
http_access allow localnet 允許所有地址使用squid緩存 需要在http_access_之前添加,具體爲什麼,我們之後在講解。
acl domain dstdomain .qwe.com 定義可以緩存的目標域,匹配域內所有站點 如果需要訪問多個網站則使用空格爲分隔符寫入就好了
http_access allow domain 應用acl規則
dns_children 40 MB 定義dns緩存的大小
[root@centos1 ~]# service squid restart
重新加載配置文件
局域網pc
在web遊覽器中找到工具——internet選項——點擊鏈接選項卡——局域網(LAN)設置
按照下圖所寫輸入
圖5
現在可以通過www.qwe.com上網了
圖6
到此爲止傳統代理就做完了。
總結一下:我們主要就是在dns服務器上建立一個a記錄,在squid服務器上允許了所有的地址使用squid,並且可以緩存qwe.com目標域的所有地址,並且在網關上開啓路由轉發,並且可以共享上網,允許53端口入站。配置客戶端指向squid緩存代理
ps:如果不用域名的時候不用這麼麻煩,網關什麼都不需要操作,也不需要開啓路由轉發,只需要修改配置文件即可
通過上面的配置我們可以看出局域網有少量的PC時還可以應用,但是一旦數量過多的時候就不好設置了,這時我們可以通過透明代理,前面說過了,透明代理,不需要在客戶端進行任何操作。
拓撲圖還是一樣
圖7
默認的squid.conf配置文件並不支持透明代理,這裏我們只需在配置文件中修改一下就可以了。
前面收過了透明代理必須設置在網關上,否則是不能進行配置的,這是爲什麼呢?我們可以想象一下客戶端訪問網站的過程,首先客戶端訪問的目標端口爲80或443端口去訪問網站,網站收到之後響應請求之後建立連接,這是整個過程,但是中間加了一個緩存代理之後,就不一樣了,因爲有了代理客戶端訪問的目標地址其實是squid代理服務器,這時目標端口依然是80或443,squid代理服務器不可能響應客戶端的請求,因爲squid代理服務並不監聽80或443端口。所以這裏需要將80或443端口重定向爲3128端口這是squid服務器就可以響應客戶端的請求了,根據數據包的頭部進行判斷,如果緩存中存在則直接應答,如果不存在則訪問之後應答。
2、配置透明代理
我們開始進行透明代理的案例:
squid/網關服務器
[root@centos1 ~]# vim /etc/squid.conf
http_port 192.168.1.1: 3128 transparent
這個地址就是連接局域網接口的IP地址,後面的是開啓透明模式的選項。
之後在防火牆上添加兩條規則
[root@centos1 logs]# iptables -t nat -nL [root@centos1 logs]# iptables -t nat -I PREROUTING -s 192.168.1.0 -i eth1 -p tcp --dport 80 -j REDIRECT --to 3128 [root@centos1 logs]# iptables -t nat -I PREROUTING -s 192.168.1.0 -i eth1 -p tcp --dport 443 -j REDIRECT --to 3128
上訴兩條規則就是將來自以192.168.1.0的http或https請求交給了3128端口進行處理
[root@centos1 logs]# service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
將防火牆的規則進行保存。
現在我們將客戶端上指定的緩存服務器地址去掉
圖8
去掉勾之後在使用域名訪問
圖9
如果訪問不成功的時候,建議將之前的操作全部刪除,並且將iptables規則表全部清除重新啓動計算機在重新配置防火牆,在將之前刪除的配置項恢復回來,在訪問就可以了。
這就是透明代理。都不難,只是剛接觸感覺很亂,多配置幾遍之後就感覺也沒什麼。
3.反向代理:
我們之後在演示如何構建反向代理,因爲反向代理還需要重新編譯安裝,所以我們先來看一下今天的第三個給內容acl
四、ACL訪問控制
squid提供了強大的代理控制機制,通過合理的設置acl並進行限制,可以針對源地址,目標地址,目標url路徑等條件進行過濾,
在配置文件中ACL需要通過兩個步驟來實現:其一,使用acl配置項定義需要過濾的條件,之後使用http_access 的方式應用允許或者拒絕。
1、定義訪問控制列表
每一行acl配置可以定義一條訪問控制列表,格式如下。
acl 列表名稱 列表類型 列表內容
其中列表名稱有管理員自行定義,用來識別控制條件“列表類型必須使用squid預定義的值對應不同類別的控制條件;列表內容是要具體控制的對象列表內容可以有多個,使用空格間隔。”
我們來看一下具體的列表類型分別對應了那些列表內容
列表類型 | 列表內容 | 用途、含義 |
Src | 192.168.1.100 |
源IP地址、網段、IP範圍 |
192.168.1.0/24 | ||
192.168.1.0-192.168.3.0/24 | ||
dst | 216.163.137.3 |
目標IP地址、網段、主機名 |
67.135.167.0/24 | ||
www.lzg.com | ||
Port | 80 443 8080 21 20 | 目標端口 |
Dstdomain | .qq.com .sina.com | 目標域、匹配域內所有站點 |
Time |
MTWHFAS 12:30-13:00 | M-Monday、T-Tuesday、W-Wednesday 、H-Thursday F-Friday、A-Saurday、S-Sunday |
maxconn | 20 | 每個客戶的併發連接數 |
url_regex | url_regex -i ^rtsp:// | 目標資源的RUL路徑 -i不區分大小寫 |
urlpath_regex | Urlpath_regex -i /.mp3 /.png /.mp4 | 目標資源的整個URL路徑 -i表示忽略大小寫 |
下面我來寫幾個規則並解釋,但是不驗證結果。
[root@centos1 ~]# vim /etc/squid.conf
acl localhost src 127.0.0.1/255.255.255.255 //源地址爲127.0.0.1
acl MYLANsrc 192.168.1.0/24 192.168.4.0./24
acl to_localhost dst 127.0.0.0/8 //目標地址爲127.0.0.0/8網段
acl MC20 maxconn 20 //最大併發連接數20
acl BlackURL url_regex -i ^rtsp:// ^emule //以rtsp開頭的 ^開頭
acl MEDIAFILE urlpath_regex -i \.mp3$ /.mp4$ //以mp3、MP4、爲結尾$結尾
acl WORKTIME time MTWHF 08:30-17:30 //時間爲週一至週五8:30-17:30
上面規則定義好了,下面使用http_access 來確定允許還是拒絕。
http_access deny BlackURL //拒絕以rtsp開頭的url路徑
http_access deny MEDIAFILE //拒絕以.mp3 .mp4結尾的完整url路徑
http_access deny MC20 //併發量超過20時江北拒絕
http_access allow MYLAN WORKTIME //允許1.0 4.0網段在工作時間上網
http_access dney all/默認禁止所有客戶機使用代理
執行訪問控制室時,squid將按照各規則順序依次檢查,如果找到一條規則匹配就停止(有點類似以路由器的acl)因此規則的順序安排是非常重要的有兩點需要注意
沒有設置任何規則時squid服務器將拒絕所有客戶端的請求
有規則但沒有找到匹配的規則:squid則與最後一條規則相反的權限,即最後一條爲允許,那麼就拒絕反之就是允許
策略上最好將常用的規則放到前面,這樣可以減輕squid的負擔,在訪問控制的整體策略上建議採用先拒絕後允許的方式,先拒絕小範圍,在允許大範圍。。以上所講就是acl的內容我們做一個實驗來看一下acl的具體應用
1、需求:1.局域網的主機在上班時間可以使用代理服務。2.WEB站點的圖片(gif)拒絕訪問
2、驗證:圖片被拒絕瀏覽
[root@centos1 ~]# vim /etc/squid.conf
acl p_w_picpath urlpath_regex -i \.png$
acl WORKTIME time MTWHF 08:30-17:50
acl LAN_IP src 192.168.1.0/24
http_access deny p_w_picpath
http_access LAN_IP WORKTIME
圖10
已經不能訪問到圖片了,但是還是可以訪問網站的只是以.png爲結尾的圖片不能訪問了以.jpg格式的圖片還是可以訪問的