squid代理

一、緩存代理概述

1、代理的工作原理。

wKioL1g66QiysJuoAACnW7rtJcc055.png

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操作系統的防火牆上進行操作。操作上不是很靈活。

    說完了兩種正向代理,我們來看一反向代理的工作原理:

wKiom1g66RmQc54fAADgu93vRWY271.png

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、傳統代理:

我們通過一個案例案進行解讀

wKioL1g66S2A29zrAAEavhwClYE869.png

3


    現在局域網內部需要通過域名www.qwe.com訪問web服務器,由於併發訪問量過多,公司現在要求加快訪問internet的速度,決定採用傳統代理的方式。

    公司要求禁止通過代理下載超過100MB的文件

    實驗步驟:

        1)在外網的DNS添加一個A記錄記錄的IP地址執行squid服務器的地址

        2)修改squid。conf配置文件實現公司的需求。

    由於是測試環境,這裏只需要三臺計算機就可以了。並且與internet的IP地址採用了同一個網段,這裏linux網關服務區兼squid代理服務器需要開啓路由轉發並且需要設置iptables的snat共享上網。

    實驗拓撲就按圖3搭建。

開始實驗

web/dns

wKiom1g66UKwkdFCAAAV6cOUqfk807.png


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)設置

    按照下圖所寫輸入

wKioL1g66VHBG_JQAAA2VDnMkG0161.png

5

    現在可以通過www.qwe.com上網了

wKiom1g66WaiCQphAAOQ6XcGsCo629.png

6

    到此爲止傳統代理就做完了。

    總結一下:我們主要就是在dns服務器上建立一個a記錄,在squid服務器上允許了所有的地址使用squid,並且可以緩存qwe.com目標域的所有地址,並且在網關上開啓路由轉發,並且可以共享上網,允許53端口入站。配置客戶端指向squid緩存代理

    ps:如果不用域名的時候不用這麼麻煩,網關什麼都不需要操作,也不需要開啓路由轉發,只需要修改配置文件即可

    通過上面的配置我們可以看出局域網有少量的PC時還可以應用,但是一旦數量過多的時候就不好設置了,這時我們可以通過透明代理,前面說過了,透明代理,不需要在客戶端進行任何操作。

    拓撲圖還是一樣

wKioL1g66XShpqWoAADYlVSicyE204.png

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  ]

    將防火牆的規則進行保存。

    現在我們將客戶端上指定的緩存服務器地址去掉

wKiom1g66YaiYS3sAAAxlh2c3Jw320.png

8

    去掉勾之後在使用域名訪問

wKioL1g66ZnhDI1TAAOPsDNDSD4273.png

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

wKiom1g66anz_o-0AAAMQw2soe4649.png

10

    已經不能訪問到圖片了,但是還是可以訪問網站的只是以.png爲結尾的圖片不能訪問了以.jpg格式的圖片還是可以訪問的


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