Squid 代理服務的配置與應用

 

squid是一個基於http1.0(目前幾乎可以和1.1兼容)的全功能的代理服務器

功能:1 共享網絡

2 加快訪問速度,節約通信帶寬

3 防止內部主機受到***

4 限制用戶訪問,完善網絡管理

主要實現網絡訪問加速的功能。

clip_p_w_picpath002

1 客戶端A向代理服務器提出訪問Internet的請求;

2 代理服務器接收到請求後,首先與訪問控制列表中的訪問規則相對照,如果滿足規則,在在緩存中查找是否存在需要的信息。

3 如果緩存中存在客戶端A需要的信息,則將信息傳送給客戶端。如果不存在,代理服務器就代替客戶端向Internet上的主機請求指定的信息;

4 Internet上的主機將代理服務器的請求信息發送到代理服務器中,同時代理服務會將信息存入到緩存中;

5 代理服務器將Internet上主機的迴應信息傳送給客戶端A;

6 客戶端B向代理服務器提出相同的請求;

7 代理服務器也首先與訪問控制列表中的訪問規則相對照;

8 如果滿足,則將緩存中的信息傳送給客戶端B。

普通代理服務

即標準的、傳統的代理服務

需要客戶機在瀏覽器中指定代理服務器的地址、端口

透明代理服務

適用於企業的網關主機(共享接入Internet)中

客戶機不需要指定代理服務器地址、端口等信息

需要設置防火牆策略將客戶機的Web訪問數據轉交給代理服務程序處理

ICP protocol 因特網緩存協議,用於在代理服務器之間交換緩存,使用UDP協議3130端口。

Proxy:Squid,Varnish,ATS,Nginx

傳統代理,即正向代理,類似於SNAT

反向代理 類似於DNAT,實現反向代理加速。

CDN:內容分發網路 Content Delievery Network

clip_p_w_picpath004

反向代理

Squid是開源界比較流行的應用層代理服務器,具有權限管理靈活,性能高和效率快等特點。

squid軟件包

軟件包名:squid-2.6.STABLE6

服務名:squid

主程序:/usr/sbin/squid

配置目錄:/etc/squid/

主配置文件:/etc/squid/squid.conf

默認監聽端口:TCP 3128

默認訪問日誌文件:/var/log/squid/access.log

squid的主配置文件:

[root@station39 ~]# cat /etc/squid/squid.conf | grep -v "^#" | grep -v "^$"

acl all src 0.0.0.0/0.0.0.0

acl manager proto cache_object

acl localhost src 127.0.0.1/255.255.255.255

acl to_localhost dst 127.0.0.0/8

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 Safe_ports port 591 # filemaker

acl Safe_ports port 777 # multiling http

acl CONNECT method CONNECT

http_access allow manager localhost

http_access deny manager

http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow localhost

http_access deny all

icp_access allow all

http_port 3128 //**監聽內網網卡

hierarchy_stoplist cgi-bin ?

access_log /var/log/squid/access.log squid

acl QUERY urlpath_regex cgi-bin \?

cache deny QUERY

refresh_pattern ^ftp: 1440 20% 10080

refresh_pattern ^gopher: 1440 0% 1440

refresh_pattern . 0 20% 4320

acl apache rep_header Server ^Apache

broken_vary_encoding allow apache

coredump_dir /var/spool/squid

幾個常用配置項:

# cache_mem 8 MB //**代理進程所使用的內存的大小

# maximum_object_size_in_memory 8 KB //**最大緩存對象

#reply_body_max_size 10240000 allow all //**請求的最大文件大小

#access_log /var/log/squid/access.log squid //**訪問日誌存放位置

#visible_hostname proxy.test.com //**可見主機名

#cache_dir ufs /var/spool/squid 100 16 256 //**指定緩存目錄 ufs:所使用的文件系統,

比較快,適合存放小文件;緩存目錄;100:緩存目錄可是使用的

緩存空間的大小;16:一級緩存子目錄的個數; 256:二級緩存子

目錄的個數

下面我們來模擬使用squid代理上網的場景:

clip_p_w_picpath006

代理服務器eth0網卡192.168.0.39使用代理可以上網。所以我們假設這裏是公網。目的是局域網內的PC機通過代理服務器來上網。

我們來配置代理服務器:

修改/etc/squid/squid.conf主配置文件

[root@station39 ~]# vim /etc/squid/squid.conf

http_port 192.168.10.11:3128

visible_hostname proxy.a.com

cache_mem 128 MB

cache_dir ufs /var/spool/squid 1024 16 256

error_directory /usr/share/squid/errors/Simplify_Chinese //**將錯誤日誌改爲中文

http_access allow all //**修改默認訪問策略

檢查語法:

[root@station39 ~]# squid -k parse

初始化緩存

[root@station39 ~]# squid -z

2011/03/10 19:13:39| Creating Swap Directories

[root@station39 ~]# service squid start

[root@station39 ~]# netstat -ntlp | grep 3128

tcp 0 0 192.168.10.11:3128 0.0.0.0:* LISTEN 13129/(squid)

添加網關:

[root@station39 ~]# route add default gw 192.168.0.254 //**由於我們這裏是內網地址,所

以需要通過指定網關的方式來上網

客戶端需要在瀏覽器中設置使用代理訪問:

clip_p_w_picpath008

看!已經可以訪問外網了!

clip_p_w_picpath010

當勾選use this proxy server for all protocols 時,我們就可以通過代理服務器來訪問所有的服務,包括ftp。

clip_p_w_picpath012

clip_p_w_picpath014

幾個常用功能的使用:

reply_body_max_size 10240000 allow all //限制用戶所能訪問的最大資源 line 780

acl 訪問控制列表

基於源地址的訪問控制

允許來自192.168.10.0/24網段能夠訪問外網

先定義acl

acl LAN src 192.168.10.0/24 //** line 628

再使用

http_access allow LAN //** line 635

修改默認策略

http_access deny all //**line 639

clip_p_w_picpath016

基於目標地址的訪問控制

禁止所有人訪問QQ

acl QQ dstdomain .qq.com

http_access deny QQ

clip_p_w_picpath018

禁止192.168.10.0/24訪問QQ

acl LAN src 192.168.10.0/24

acl QQ dstdomain .qq.com

http_access allow LAN !QQ

clip_p_w_picpath020

基於url_regex的訪問控制

acl GUGE url_regex -i ^http://www.google.com.hk/index.html

http_access allow LAN !GUGE

clip_p_w_picpath022

通過url拒絕對*.iso的訪問

acl NOTISO url_regex -i ^.*tp://.*\.iso$

http_access allow LAN !NOTISO

clip_p_w_picpath024

根據時間來做控制:

定義時間段:

acl WORKTIME time MTWHF 08:00-18:00

http_access allow LAN !NOTISO WORKTIME

clip_p_w_picpath026

PS:當兩個列表一樣時,將以兩個列表的並集作爲參數的值。

透明代理

透明代理是NAT和代理的完美結合,在這種工作方式下用戶感覺不到代理服務器的存在。當客戶訪問Internet時,請求數據包經過Linux服務器轉發時,linux服務器上的iptables將客戶機的HTTP請求重定向到Squid代理服務器,由代理服務器代理客戶機訪問外部信息資源,再將獲取的數據傳回客戶機。

修改squid的主配置文件

http_port 192.168.10.11:8080 transparent //**實現透明代理

添加一條iptables規則:

iptables -t nat -A PREROUTING -i eth1 -s 192.168.10.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 8080

這樣客戶端依舊無法上網,因爲客戶端的DNS請求無法發送出去,怎麼辦?

我們需要再添加一條規則,使內網的DNS請求能夠出去

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 192.168.0.127

打開內核路由功能:

echo 1 > /proc/sys/net/ipv4/ip_forward

也許這裏由會有疑問了,使用源地址轉換直接就可以上網了,那我們的數據還通過squid服務器不?答案是肯定的,因爲SNAT是在POSTROUTING鏈上做的,而我們做透明代理的話是在PREROUTING鏈上做的,數據包在進入服務器的時候已經被重定向到squid上去了,所以無論如何基於80端口的訪問是繞不開squid的。

客戶端指定網關:

route add default gw 192.168.10.11

反向代理 reverse proxy

我們來假設一個反向代理的場景

clip_p_w_picpath028

在虛擬機裏構建實驗環境:

192.168.10.1 192.168.10.11 僅主機 我們假設這是外網

192.168.0.127 192.168.0.254 橋接 我們假設這是一個網站的內部架構

最終目的是讓PC機通過squid代理來訪問web 服務。

配置squid服務器:

編輯/etc/squid/squid.conf 主配置文件:

http_port 192.168.10.11:80 vhost //** line 919

cache_peer 192.168.0.254 parent 80 0 originserver weight=1 max-conn=1000

//** line 1449

http_access allow all //** line 637 修改ACL

保存退出。

清除緩存

[root@station39 squid]# rm -rf /var/spool/squid/*

重建緩存

[root@station39 squid]# squid -z

2011/03/11 15:52:38| Creating Swap Directories

語法檢查

[root@station39 squid]# squid -k parse

重啓服務。

我們在客戶端使用firefox訪問一下192.168.10.11

clip_p_w_picpath030

看!已經可以訪問了。這就是反向代理。

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