目錄
squid代理
課程目標
- 了解squid的應用場景
- 理解squid的工作原理和作用
- 理squid的代理類型(重點)
- 掌握squid的正向和透明代理的配置(重點)
- 能夠根據需求對squid服務器做簡單的訪問控制
一、squid基本概述
1.squid是什么?用來做什么?
squid cache(簡稱squid)是流行最廣的,使用最普遍的開源緩存代理服務器
2.squid的作用和應用場景有哪些?
- 用來做前置的web緩存,加快用戶訪問web的速度
- 代理內網用戶訪問互聯網資源
- 設置訪問控制策略,控制用戶的上網行為
- 主要支持http、ftp等應用協議
- 官網地址:http://www.squid-cache.org/
3.常見的代理服務器軟件
- squid 非常古老,功能齊全
- varnish 性能優於squid,功能相對沒有squid多
- 其他 haproxy、nginx等
4.squid的工作原理
優點:減少訪問請求,節約帶寬
具有ACL(access control list)訪問控制列表功能,對客戶機上網行為靈活控制
對內網客戶機具有保護作用
二、squid代理類型
1.正向代理
2.透明代理
正向代理的過程隱藏了真實的請求客戶端,服務器不知道真實的客戶端是誰,客戶端請求的服務都被代理服務器代替請求。我們常說的代理就是正向代理,正向代理代理的是請求方,也就是客戶端。
3.反向代理
反向代理的過程隱藏了真實的服務器,客戶不知道真正提供服務的人是誰,客戶端請求的服務都被代理服務器處理。反向代理代理的是響應方,也就是服務端。
4.總結
- 正向代理和透明代理中的代理服務器和客戶端同屬一個LAN,對server端是透明的,服務器並不知道自己為誰提供服務。作用都是讓內網用戶可以通過代理服務器上互聯網,也可以提高訪問速度,並且可以通過代理服務器的訪問控制限制內網用戶的上網行為。
- 反向代理的過程隱藏了真實的服務器,對客戶端是透明的,客戶端並不知道真正提供訪問的服務器。可以起到負載均衡端作用,提高用戶的訪問速度。
- 兩者的區別在於代理的對象不一樣,正向代理代理的對象是客戶端,反向代理代理的對象是服務端。
- 應用場景
- 正向和透明代理:一般用於公司內網用戶訪問互聯網,根據需求進行訪問控制
- 反向代理:一般用於公司服務器集群前做web緩存,提高用戶訪問效率,同時可以起到負責均衡作用,為互聯網提供可持續端web服務。
三、squid代理服務器和SNAT|DNAT的區別
1.SNAT和DNAT
-
網絡層次:網絡層
局域網用戶訪問外圍走SNAT模式,同一個數據包,改變數據包頭部的來源地址,再把數據包發到internet
-
作用:內網用戶上外網(SNAT)和內網服務發布到公網(DNAT)
2.代理服務器模式
-
網絡層次:應用層
不改變數據包頭信息,把數據包代理給Internet的服務器,基於應用層端過濾。
-
應用層:
協議:http、ftp、pop、smtp、p2p等
-
作用:緩存頁面,加速訪問,ACL資源訪問控制
-
反向代理:
- Internet用戶訪問局域網服務器
- squid做反向代理服務器,把用戶端請求轉發到后方端真實端服務器,可以做到負載均衡端效果,同時緩存用戶經常訪問的頁面以提高訪問速度。
四、了解squid代理軟件相關信息
1.安裝軟件
squid在本地鏡像里有,只需要配置好本地端yum源即可
yum -y install squid
2.軟件的文件列表
rpm -ql squid
/etc/squid/squid.conf 配置文件
/etc/rc.d/init.d/squid 啟動腳本
/usr/sbin/squid 二進制命令
/usr/share/doc/squid-3.1.23 手冊
/var/log/squid 日志目錄
/var/spool/squid 緩存目錄
3.配置文件說明
[root@agent2 ~]# vim /etc/squid/squid.conf 簡化的配置文件
[root@agent2 ~]# vim /usr/share/doc/squid-3.1.23/squid.conf.documented 查看文檔
//設置監聽端IP和端口號
http_port 3128
//額外提供給squid使用端內存大小
cache_mem 256MB(默認大小)
//設置squid磁盤緩存最大文件,超過4M端文件不保存到磁盤
maximum_object_size 4MB
//設置squid磁盤緩存最小文件
minimum_object_size 0 KB
//設置squid內存緩存最大文件,超過4M不保存到內存
maximum_object_size_in_memory 4096 KB
//定義squid端cache存放路徑、cache目錄容量(單位M)、一級緩存目錄數量、二級緩存目錄數量
cache_dir ufs /var/spool/squid 100 16 256
//log文件日志格式
#logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
//log文件存放路徑和日志格式
# access_log /var/log/squid/access.log squid
//設置緩存日志
cache_log /var/log/suqid/cache.log
//log輪轉60天
logfile_rotate 60
//cache目錄使用量大於95%時,開始清理舊的cache
cache_swap_high 95
//cache目錄清理到90%時停止
cache_swap_low 90
//定義本地網段
acl localnet src 192.168.1.0/24
//允許本地網段使用
http_access allow localnet
//拒絕所有
http_access deny all
//主機名
visible_hostname xxx.xxxx.xxxx
//管理員郵箱
cache_mgr 123456@qq.com
五、squid端正向代理配置
需求:內網用戶通過瀏覽器指定代理服務器端ip和端口訪問互聯網中端web服務
環境:client:10.1.1.2
squid—server:10.1.1.1和2.2.2.1
web-server:2.2.2.2
(都是僅主機模式)
思路:
1.squid-server需要兩個IP,一個公網一個私網
2.client端只需要和squid-server能互通就行,不需要指定gw和dns
3.client端需要在瀏覽器上設置代理服務器端IP和端口
4.squid-server可以上外網(要能訪問2.2.2.2),client不能上外網,目的就是讓squid代理內網用戶訪問互聯網web服務
5.搭建一個web服務
步驟:
搭建squid-server服務器
1.安裝軟件
yum -y install squid
把主機名改為squid-server.itcast.cc 下面要用到,臨時改就行,要求不嚴
2.根據需求修改配置文件
需求:代理內網所有用戶訪問互聯網端web服務
cp /etc/squid/squid.conf /etc/squid/squid.conf.bak
vim /etc/squid/squid.conf
...
#http_access deny all 注釋掉這行
http_access allow all 允許所有人來訪問代理服務器
cache_dir ufs /var/spool/squid 100 16 256 取消掉前面注釋,打開緩存目錄
增加以下兩行:
visible_hostname squid-server.itcast.cc 定義squid服務器主機名
access_log /var/log/squid/access.log 定義訪問日志
3.啟動squid服務
service squid start
init_cache_dir /var/spool/squid... Starting squid: . [ ok ]
服務器啟動后會再緩存目錄里產生以下一級、二級緩存目錄文件
ls /var/spool/squid/
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F swap.state
查看端口3128已經處於監聽狀態
注意:如果再次重啟會報以下警告:
WARNING cache_mem is larger than total disk cache space!
原因:默認情況下,cache_mem為256M,而squid端配置里磁盤緩存默認為100M
解決:
方法1:調小cache_mem的值
在配置文件中增加 cache_mem 100MB
方法2:調大磁盤緩存
修改配置文件中如下內容:
cache_dir ufs /var/spool/squid 256 16 256 ——>把100換成256
說明:squid緩存從 內存 ————> 磁盤
cache_mem /var/spool/squid
搭建web服務:
web-server:2.2.2.2
rpm -q httpd
做一個網頁文件,帶圖片的,可以展示緩存,放到/var/www/html/里面
啟動httpd
客戶端測試:
client:10.1.1.2 注意:不需要設置網關和dns
配置代理服務器前:不能夠直接訪問web服務
ping 2.2.2.2 網絡不可達
客戶端內火狐瀏覽器訪問http://2.2.2.1不能連接(因為沒有打開轉發功能echo 1 > /proc/sys/net/ipv4/ip_forward,此處不需要打開)
手動配置代理服務器ip和port
edit-->preferences--advanced-->network-->connection-->setting-->manual proxy configuration
輸入代理服務器端內網地址10.1.1.1,port 3128
此時再輸入http://2.2.2.2
能夠看到自己端網頁文件
內網不直接訪問web服務器,但是通過代理服務器訪問到了,這就是代理
假設web-server宕機,
service httpd stop
客戶端重新輸入http://2.2.2.2,仍能訪問到
六、squid的透明代理配置
需求:內網用戶通過代理服務器可以直接訪問互聯網中的web服務,不用指定proxy地址和端口
思路:
1.squid-server需要兩個IP,一個公網一個私網
2.client端瀏覽器不需要指定代理服務器的IP和端口,但是需要指定網關為squid-server的私網地址
3.squid-server需要借助iptables將內網的80端口重定向到自己的3128端口幫內網用戶代理上網
4.搭建一個web服務
(僅主機模式)
步驟:
client端瀏覽器清空剛剛的代理設置(不要忘記)
client端指定自己的默認網關為squid-server的私有地址
[root@client ~] route add default gw 10.1.1.1
squid-server端配置透明代理服務器並添加iptables規則:
1.修改squid配置文件
vim /etc/squid/squid.conf
http_port 3128 transparent //在代理端口后面加上transparent(透明),代表透明代理
重啟服務:
service squid restart
2.添加防火牆規則
iptables -t nat -A PREROUTING -s 10.1.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -nL
說明:
-j REDIRECT 表示端口重定向,僅用於tcp和udp協議
This is only valid if the rule also specifies -p tcp or -p udp
3.客戶端測試驗證
1)打開瀏覽器,輸入http://2.2.2.2 可以看到web-server的web頁面
curl -I http://2.2.2.2/index.html //查看是否緩存
。。。
X-Cache:HIT from squid-server.itcast.cc
X-Cache-Lookup:HIT from squid-server.itcast.cc:3128 //HIT代表命中,緩存
。。。
X-Cache:MISS from squid-server.itcast.cc
X-Cache-Lookup:MISS from squid-server.itcast.cc:3128
2)web-server端,查看/var/log/httpd/access.log日志
3)squid-server端,查看/var/log/squid/access.log日志
4)測試web-server服務停止,squid-server是否緩存
只能上外網,訪問頁面,不能ping通2.2.2.2
另外:
windows不能訪問是因為網關不同,網絡不能訪問squid-server端
七、squid實現訪問控制
1.訪問控制配置語法
1.禁止IP地址為192.168.0.100的客戶機上網
acl test src 192.168.0.100 //定義來源IP,test可以自己定義,代表定義端IP
http_access deny test //拒絕test后面定義端源IP :192.168.0.100上網
可以把要管理的IP寫到一個文件里,然后在src后面跟上“文件路徑”
2.禁止192.168.1.0這個網段里端所有客戶機上網
acl test src 192.168.1.0/255.255.255.0
或者
acl test src 192.168.1.0/24
http_access deny test
3.禁止用戶訪問IP為210.21.118.68的網站
acl test dst 210.21.118.68
http_access deny test
4.禁止用戶訪問域名為www.163.com的網站
acl test dstdomain -i www.163.com //-i 忽略大小寫
http_access deny test
5.禁止用戶訪問域名包含有163.com的網站
acl test url_regex -i 163.com //使用正則表達式匹配URL地址
http_access deny test
6.禁止用戶訪問包含有sex關鍵字端URL
acl test url_regex -i sex
http_access deny test
7.禁止用戶訪問多個網址
acl test dstdom_regex "/etc/squid/baddaturl"
//如果網址太多,可以寫成一個文件,然后在這個文件里一行一個網站寫上要
http_access deny test
8.vip用戶沒有任何限制
acl vip arp 00:0c:29:79:0C:1A //綁定mac地址
http_access allow vip
9.禁止192.168.2.0這個子網內所有客戶機在周一到周五的9點到18點上網
acl test1 src 192.168.2.0/255.255.255.0
acl test2 time MTWHF 9:00-18:00 /S日/M一/T二/W三/H四/F五/A六/D(周一到周五)
http_access deny test1 test2
hwclock --hctosys 還原時間命令
10.禁止用戶下載*.mp3,*.exe,*.zip,*.rar帶有定義后綴名的文件
acl test urlpath_regex -i \.mp3$ \.exe$ \.zip$ \.rar$ \.txt$
//urlpath_regex 正則表達式匹配URL地址
http_access deny test
注意:設置acl訪問控制規則的時候,有先后順序。第一條規則匹配上就不再繼續往下,所以先把拒絕寫在前面
2.應用案例
2.1根據IP地址訪問控制
2.2根據域名訪問控制
2.3根據時間和日期訪問控制
2.4根據文件名訪問控制
3.綜合案例
八、反向代理(擴展)
需求:某公司內網搭建了一台web服務器,希望互聯網用戶來訪問該web服務,越多越好
環境:
client:2.2.2.2 互聯網用戶
squid-server:2.2.2.1和10.1.1.1 2個IP,一個公網一個私網
web-server:10.1.1.3 公司內網web服務器
還原acl控制
搭建反向代理服務器squid步驟:
1.清空之前的環境
iptables -t nat -F
2.修改squid.conf配置文件來配置反向代理
vim /etc/squid/squid.conf
...
http_port 80 vhost
cache_peer 10.1.1.3 parent 80 0 originserver
解釋說明:
less /usr/share/doc/squid-3.1.10/squid.conf.documented
...
cache_peer hostname type http-port icp-port [options]
cache_peer:做反向代理的關鍵字
hostname:代表后台真正的web服務器
type:代表代理服務器的類型,有PARENT和SIBLING兩種:parent代表父親,sibling代表兄弟伙伴
http-port:后台web服務的端口
icp-port:代表代理服務器之間通訊的端口(用於查詢兄弟緩存的端口)
[options]:代表可選項
originserver:代表原始服務器(真正的web服務器)
weight:代表權重
max-coon:代表
...
3.測試驗證
在client端:2.2.2.2上直接訪問代理服務器:
http://2.2.2.1 (訪問代理服務器)