squid http://www.squid-cache.org/ --官方網址 squid軟件主要有兩大應用:1,代理上網(正向代理,透明代理) 2,網站靜態頁面緩存加速(反向代理) 三種代理類型: 正向代理 代理內部主機上網,共享上網,緩存,控制內網用戶上網行為等功能(客戶端需要設置代理服務器的IP和代理端口) 透明代理 和正向代理的功能完全一致(客戶端不需要設置代理服務器的IP和代理端口,對用戶是透明的)
正向代理分析圖: 外網 | modem | 路由器(dhcp,snat共享上網,上網行為控制,限速等) | | squid正向代理(共享上網,靜態頁面緩存加速,內網用戶四七層上網行為控制,限速等) | | |----------------------| 上網用戶一 上網用戶二 反向代理 從外部網絡訪問內部服務器,與正向方向相反,主要用於網站架構的緩存加速或CDN 反向代理分析圖: client | | 反向代理 (緩存加速,七層切分,負載均衡,會話保持等) | | web =================================================================== 正向代理實驗 公網 | | br0 172.16.13.250 squid 服務器 virbr1 192.168.100.1 | | | 內網用戶VM1 eth0(virbr1) 192.168.100.128
准備如圖所示的虛擬機及網絡配置 准備這個拓撲圖要注意的地方: 1,宿主機(squid服務器)需要能上外網,在這里就是指向公司的路由器 2,192.168.100.0網絡,我這里使用kvm的virbr1網段來模擬 3,內網用戶只要與squid服務器能ping通就行,不用指網關和DNS 4,內網用戶需要安裝圖形界面,並安裝firefox瀏覽器 5,squid服務器能上外網,但內網用戶不能上外網,我們的目地就是讓squid代理內網用戶上外網
第一步:在squid服務器上安裝squid # yum install squid -y 擴展:安裝完后,會有一份官方文件在下面的路徑下 /usr/share/doc/squid-3.5.20/squid.conf.documented 第二步:修改配置文件 # vim /etc/squid/squid.conf http_access allow all --把deny all改成allow all cache_dir ufs /var/spool/squid 100 16 256 --把緩存目錄這一句打開注釋 如果要簡單優化,則可以加上cache_mem參數,你多余的內存大小都可以指定給cache_mem 比如 cache_mem 5000M cache_dir ufs /var/spool/squid 5000 16 256 --這個100指的是此目錄可以存放的緩存空間大小,磁盤空間足夠,可以盡量調大 內存---》磁盤 cache_mem /var/spool/squid ---------------------------------------------------------
第三步: 啟動服務 # systemctl start squid # lsof -i:3128 --查看3128端口 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME squid 4937 squid 12u IPv4 36871 TCP *:squid (LISTEN) 第四步: 客戶端的測試 不用設置網關和DNS指向 主要是修改瀏覽器(具體步驟如下) --filefox配置 firefox瀏覽器右上角open menu--preferences--advanced--network--settings-- 手動填寫代理服務器的IP和代理端口
此處填寫就應該填寫172.16.13.250 端口3128 然后保存退出后就能成功上外網了
--IE配置 右鍵IE圖標--連接--局域網設置--為LAN使用代理服務器前打勾並填上代理服務器的內網IP及其代理端口 測試: 訪問已經訪問過的頁面是否能感覺到頁面加快 再次查看 du -s /var/spool/squid 發現增大,因為緩存了對象 查看相關日志 /var/log/squid/access.log --此日志可以看到所有被代理的內網用戶訪問的網址和時間等信息 # date -d "@1500620984" +'%F %T' ================================================================ 透明(transparent)代理實驗: 准備工作:先把上面的正向代理客戶端的瀏覽器設置去掉 第一步: 在squid服務器上打開路由轉發功能 # vim /etc/sysctl.conf --更改配置文件 net.ipv4.ip_forward = 1 # sysctl -p --用此命令讓其生效 第二步:修改配置文件 # vim /etc/squid/squid.conf http_port 3128 intercept --intercept打開支持透明代理 # systemctl restart squid --重啟服務 第三步:配置iptables client squid 公司路由器 virbr1 br0 192.168.100.128 192.168.100.1 172.16.13.250--> 172.16.13.254 公網IP | | | client網關指向192.168.100.1-- clientDNS指向114.114.114.114 ----------------------->外網DNS(8.8.8.8) 由上面的分析,需要在squid服務器上寫上一句snat,讓DNS能正常訪問外網 # iptables -F # iptables -F -t nat # iptables -F -t mangle # iptables -t nat -A POSTROUTING -p udp --dport 53 -o br0 -j SNAT --to-source 172.16.13.250 這樣的話,內網客戶端的DNS OK了,但是http的80端口的訪問如果也做一個SNAT的話,如下的規則: # iptables -t nat -A POSTROUTING -p tcp --dport 80 -o br0 -j SNAT --to-source 172.16.13.250 那么這就做的是完全的通過iptables來上外網;與squid無關 所以應該換成下面一句規則,把80端口的訪問都重定向到3128端口 # iptables -t nat -A PREROUTING -p tcp --dport 80 -i virbr1 -j REDIRECT --to-port 3128 還有443的端口問題,這里如果也重定向到3128,會出現訪問https網站報ssl錯誤。我們這里把443用iptables直接SNAT轉發出去(也就是說443與squid無關) # iptables -t nat -A POSTROUTING -p tcp --dport 443 -o br0 -j SNAT --to-source 172.16.13.250
第四步:測試驗證
內網用戶(也就是client端)用瀏覽器訪問網頁,就會發現能夠成功訪問 ================================================================================== 此處插入一點知識點: squid的acl(access control list)訪問控制(下面列舉一些常見的控制) acl denyip src 192.168.100.128/32 --拒絕內網的192.168.100.128/32上網 http_access deny denyip acl denyip src 192.168.100.128-192.168.100.132/255.255.255.255 http_access deny denyip acl vip arp 00:0C:29:79:0C:1A http_access allow vip acl baddsturl2 dst 220.11.22.33 --不能訪問這個外網IP的網站 http_access deny baddsturl2 acl baddsturl dstdomain -i www.163.com --不能訪問www.163.com和WWW.163.COM;-i參數定義大小寫都匹配; 但是可以訪問war.163.com或sports.163.com http_access deny baddsturl acl baddsturl dstdom_regex -i 163 --這是把163以下的所有域名都禁止 ,但直接使用IP仍然是可以訪問的 http_access deny baddsturl acl baddsturl dstdom_regex "/etc/squid/baddsturl" --如果網址太多,可以寫成一個文件,然后在這個文件里一行一個網站寫上你要禁止的 http_access deny baddsturl acl baddsturl3 url_regex -i baidu --拒絕訪問url里有baidu這個關鍵字的網站 http_access deny baddsturl3 acl badfile urlpath_regex -i \.mp3$ \.rmvb$ \.exe$ \.zip$ \.mp4$ \.avi$ \.rar$ http_access deny badfile --禁止下載帶有定義后綴名的文件 acl badipclient2 src 192.168.100.0/255.255.255.0 acl worktime time MTWHF 9:00-17:00 http_access deny badipclient2 worktime --拒絕192.168.100.0網段工作時間不能上網 acl badipclient3 src 192.168.100.128 acl conn5 maxconn 5 http_access deny badipclient3 conn5 --最大連接數為5 訪問控制案例
實現如下要求: 1,允許周一到周五12:00-14:00和17:30-21:00和雙休能上網,別的時間不能上網 2,禁止下載.exe .rar .mp3 .avi .rmvb .mp4后綴的文件 3,禁止訪問qq.com,mop.com,sina.com,163.com,youku.com 4,禁止訪問網址中包含某些關鍵字的網站:比如 sex news movie sport game stock 5, vip沒有任何限制 --把上面五點情況做成兩種需求: 1,上課時間不能上任何網站,休息時間可以上網,但受限, vip沒有任何限制 理論分析: http_access 允許 vip http_access 拒絕 限制 http_access 允許 休息時間 http_access deny all 實驗需求一:
# vim /etc/squid/squid.conf
acl lunchtime time MTWHF 12:00-14:00 acl dinnertime time MTWHF 17:30-21:00 acl weekend time SA 00:00-24:00 acl badfile urlpath_regex -i \.mp3$ \.rmvb$ \.exe$ \.zip$ \.mp4$ \.avi$ \.rar$ acl badweb dstdom_regex "/etc/squid/denywebsite" acl badword url_regex -i sex news movie sport game stock acl vip arp 00:0C:29:79:0C:1A http_access allow vip http_access deny badfile http_access deny badweb http_access deny badword http_access allow lunchtime http_access allow dinnertime http_access allow weekend http_access deny all
# vim /etc/squid/denywebsite qq sina mop 163 youkud
# systemctl restart squid
2,上課時間可以上網,但受限,休息時間可以無限制上網, vip沒有任何限制 理論分析: http_access 允許 vip http_access 允許 休息時間 http_access 拒絕 限制 http_access allow all 實驗需求二:
# vim /etc/squid/squid.conf
acl lunchtime time MTWHF 12:00-14:00 acl dinnertime time MTWHF 17:30-21:00 acl weekend time SA 00:00-24:00 acl badfile urlpath_regex -i \.mp3$ \.rmvb$ \.exe$ \.zip$ \.mp4$ \.avi$ \.rar$ acl badweb dstdom_regex "/etc/squid/denywebsite" acl badword url_regex -i sex news movie sport game stock acl vip arp 00:0C:29:79:0C:1A http_access allow vip http_access allow lunchtime http_access allow dinnertime http_access allow weekend http_access deny badfile http_access deny badweb http_access deny badword http_access allow all
========================================================================================================= 反向代理實驗: client 比喻→ 國外客戶 | | 反向代理 海外倉儲 | | web 國內公司
client | | 正向代理(靜態加速) | 因特網 | | 1個或多個反向代理(較近地理位置增強響應時間,靜態緩存加速,網站數據切分) cdn | 前端web | 中間件 | 數據庫 | 存儲 准備如下圖的虛擬機: client 172.16.25.2 比喻→ 要租房或買房的客戶 | | br0 172.16.25.1 squid 服務器 房產中介 virbr1 192.168.100.1 | | | 內網web服務器VM1 eth0(virbr1) 要出租或賣房的業主 192.168.100.128 --注意: 192.168.100.1為squid的一個內網IP 172.16.25.1為squid的外網IP(也就是說在這個架構里squid在最前端) 172.16.25.2 為外網客戶端 第一步: 在內網web服務器上安裝httpd,並做一個主頁用於測試 # yum install httpd* -y # echo "內網web" > /var/www/html/index.html # systemctl restart httpd 第二步: 在squid服務器上安裝,並進行配置 # yum install squid -y 用一個新的配置文件;如果是在上面的透明代理基礎上再做反向代理,先注釋掉前面所有的配置 # vim /etc/squid/squid.conf http_access allow all --ACL我這里直接允許所有(這一句前面的ACL配置我這里全刪除了) http_port 80 accel vhost vport --80 因為外網客戶只能訪問的是你的80端口,所以此處將其改為80
--accel 反向代理加速模式 --vhost 支持域名或主機名來表示代理節點 --vport 支持IP和端口來表示代理節點 cache_peer 192.168.100.128 parent 80 0 no-query originserver name=web --192.168.100.128 內網web服務器的IP --parent 上下關系,非平級關系 --80 代理內部web服務器的80端口 --0 沒有使用icp,表示就一台squid服務器 --no-query 不去查詢鄰居,與上面的0結合使用 --originserver 表示源實際服務器 --name=web 定義一個名字,讓后面的參數引用 cache_peer_domain web web.cluster.com --對web.cluster.com的請求會給web這台服務器(也就是上面定義的192.168.100.128);如果有多台web的話,可以多台web綁定同一個域名,還可以實現RR輪循調度 cache_peer_domain web 172.16.25.1 --光寫上面一條,客戶端只能通過web.cluster.com訪問,再加上這條,客戶端就可以使用172.16.25.1來訪問 cache_dir ufs /var/spool/squid 256 16 256 # systemctl restart squid --測試: 所以這里客戶端的DNS解析web.cluster.com應該得到172.16.25.1的結果 所以這里不做DNS的話,就直接在/etc/hosts里寫上 172.16.25.1 web.cluster.com 再使用http://web.cluster.com 就可以訪問到內部的web服務器了 可以使用curl -I http://web.cluster.com去查有沒有命中緩存 ====================================================================== 問題一: squid如何代理多個web? vim /etc/squid/squid.conf http_port 80 accel vhost vport cache_peer 192.168.100.128 parent 80 0 no-query originserver round-robin name=web1 cache_peer 192.168.100.129 parent 80 0 no-query originserver round-robin name=web2 cache_peer 192.168.100.130 parent 80 0 no-query originserver round-robin name=web3 cache_peer 192.168.100.131 parent 80 0 no-query originserver round-robin name=web4 cache_peer_domain web1 web2 www.aaa.com cache_peer_domain web3 web4 www.bbb.com ======================================================================
問題二: 如何配置下面的squid集群? 參考 http://www.ibm.com/developerworks/cn/linux/l-cn-squid 172.16.25.X client www.abc.com 通過dns技術(dns輪循或智能dns);通過負載均衡軟件(nginx,haproxy,lvs) 172.16.25.1 172.16.25.2 squid1 squid2 192.168.100.1 192.168.100.2 web1 web2 192.168.100.128 192.168.100.129 配置過程 第一步: 兩個web上安裝httpd,並建立兩個不同主面方便測試(注意這里所有的機器的時間一定要同步,特別是web1和web2;如果web1和web2的時間隔得太久,可能會造成客戶端訪問時,不先訪問緩存而是訪問后台web,也就是緩存失效了) 過程省略 第二步: 安裝並配置squid1 # yum install squid -y # vim /etc/squid/squid.conf http_access allow all cache_dir ufs /var/spool/squid 256 16 256 http_port 80 accel vhost vport icp_port 3130 icp_access allow all cache_peer 192.168.100.2 sibling 80 3130 cache_peer 192.168.100.128 parent 80 0 no-query originserver round-robin name=web1 cache_peer 192.168.100.129 parent 80 0 no-query originserver round-robin name=web2 cache_peer_domain web1 web2 www.abc.com # /etc/init.d/squid start 第三步: 安裝並配置squid2 把squid1的配置文件拷過來,只需要修改一個地方(就是sibling的IP) # yum install squid -y # vim /etc/squid/squid.conf cache_peer 192.168.100.1 sibling 80 3130 --把這個IP換成對方的IP 然后也啟動服務 # /etc/init.d/squid start 第四步: 在客戶端測試 # vim /etc/hosts --綁定IP地址與域名來模擬DNS(注意這里不能實現DNS輪循,所以手動綁定其中指定解析為squid1或squid2) 172.16.25.1 www.abc.com # vim /etc/hosts 172.16.25.2 www.abc.com ==================================================================================================== 擴展項目: (可自主進行搭建) 模擬cdn squid+dns-view實現 北京 成都 武漢 上海 廣州 (網站源在深圳)