squid是一個基於http1.0(目前幾乎可以和1.1兼容)的全功能的代理服務器
功能:1 共享網絡
2 加快訪問速度,節約通信帶寬
3 防止內部主機受到***
4 限制用戶訪問,完善網絡管理
主要實現網絡訪問加速的功能。
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
反向代理
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代理上網的場景:
代理服務器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 //**由於我們這裏是內網地址,所
以需要通過指定網關的方式來上網
客戶端需要在瀏覽器中設置使用代理訪問:
看!已經可以訪問外網了!
當勾選use this proxy server for all protocols 時,我們就可以通過代理服務器來訪問所有的服務,包括ftp。
幾個常用功能的使用:
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
基於目標地址的訪問控制
禁止所有人訪問QQ
acl QQ dstdomain .qq.com
http_access deny QQ
禁止192.168.10.0/24訪問QQ
acl LAN src 192.168.10.0/24
acl QQ dstdomain .qq.com
http_access allow LAN !QQ
基於url_regex的訪問控制
acl GUGE url_regex -i ^http://www.google.com.hk/index.html
http_access allow LAN !GUGE
通過url拒絕對*.iso的訪問
acl NOTISO url_regex -i ^.*tp://.*\.iso$
http_access allow LAN !NOTISO
根據時間來做控制:
定義時間段:
acl WORKTIME time MTWHF 08:00-18:00
http_access allow LAN !NOTISO WORKTIME
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
我們來假設一個反向代理的場景
在虛擬機裏構建實驗環境:
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
看!已經可以訪問了。這就是反向代理。