一、簡介
Squid 是一個高性能的代理緩存服務器,對應中文的烏賊,魷魚的意思。Squid 支持 FTP,gopher 和 HTTP 協議。和一般的代理緩存軟件不同,Squid 用一個單獨的,非模塊化的,I/O 驅動的進程來處理所有的客戶端請求。
Squid 將數據元緩存在內存和硬盤中,同時也緩存 DNS 查詢的結果。Squid 支持 SSL,支持訪問控制。由於使用了 ICP(輕量 Internet 緩存協議),Squid 能夠實現層疊的代理陣列,從而最大限度的節約帶寬。
Squid Cache(簡稱 Squid)是一個流行的代理服務器和 Web 緩存服務器軟件。Squid 可以做正向代理,也可以做反向代理。官方網站地址為:http://www.squid-cache.org/
1.1 正向代理
當 Squid 做正向代理時,Squid 后面是客戶端,客戶端想訪問外部網絡資源,必須經過 Squid。正向代理按其客戶端配置方式不同,又可以分為標准(普通)代理模式和透明代理模式。
標准(普通)代理模式,是代理內部網絡用戶訪問 internet 上服務器的連接請求,客戶端必須指定代理服務器,並將本來要直接發送到 internet 上服務器的連接請求發送給代理服務器處理。用戶在上網時必須在瀏覽器等軟件中填寫代理服務器的 IP 地址與端口號信息,否則默認不使用代理。
透明代理模式,是相對於代理服務器而言,客戶端不需要做任何和代理服務器相關的設置和操作,對用戶而言,感覺不到代理服務器的存在,所以稱之為透明代理。即把代理服務器部署在核心的上網出口,當用戶上網瀏覽頁面時,會交給代理服務器向外請求,如果結合iptables,可以實現代理+網關+內容過濾+流量安全控制等完整的上網解決方案。
1.2 反向代理
反向代理(Reverse Proxy)方式是指以代理服務器來接受 internet 上的連接請求,然后將請求轉發給內部網絡上的服務器,並將從內部服務器上得到的結果返回給 internet 上請求連接的客戶端,此時代理服務器對外就表現為一個服務器。
綜上,正向代理是代理客戶端,為客戶端收發請求,使真實客戶端對服務器不可見;而反向代理是代理服務器端,為服務器收發請求,使真實服務器對客戶端不可見。
二、配置 Squid 正向代理
2.1 安裝 squid
可以使用源碼編譯安裝,或者使用 yum 直接安裝,如下:
[root@masternode ~]# yum install -y squid [root@masternode ~]# squid -v Squid Cache: Version 3.5.20 ......
使用 yum 安裝后,系統會自動生成 squid 用戶和用戶組,如下:
2.2 配置 squid
可以使用 squid 默認的配置文件,因為默認的配置文件其實就已經設置了正向代理,也可以修改默認的配置文件,如下:
[root@masternode ~]# vim /etc/squid/squid.conf # 默認對外端口為3128 http_port 3128 cache_effective_user squid cache_effective_group squid # 內網控制,按需修改 acl manager proto cache_object 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 8080 # 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 # 拒絕443以外的端口訪問 http_access deny CONNECT !SSL_ports # 允許內網 http_access allow localnet http_access allow localhost http_access allow all # 設置緩存文件位置、cache目錄容量(單位M)、一級緩存目錄數量、二級緩存目錄數量 cache_dir ufs /var/spool/squid 128 16 256 cache_mem 128 MB coredump_dir /var/spool/squid 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
其中 http_port 設置監聽的端口號,cache_mem 設置內存緩沖區的大小,cache_dir 設置硬盤緩存區的大小,cache_effective_user 設置緩存的有效用戶,cache_effective_group 設置緩存的有效用戶組。
2.3 啟動 squid
啟動 squid 並檢查配置文件,如下:
[root@masternode ~]# systemctl start squid
[root@masternode ~]# squid -kcheck
# squid -kcheck(可簡寫為 squid -kch)可以檢查配置文件是否有錯,修改配置建文件后,可以使用 # squid -kreconfigure(可簡寫為 # squid -krec)來重新加載配置文件。
2.4 驗證代理
可以使用瀏覽器設置代理的方式,也可以直接使用 curl 命令來測試,其中 -x 選項即 --proxy,添加代理服務器地址和端口,如下:
顯示了百度首頁的 html 源碼,說明 squid 正向代理設置成功。
然后我們再來看 squid 對圖片的緩存。如下:
其中 MISS 表示丟失,HIT 表示命中。當 cache server 第一次接收到對第一個新資源的請求時,就會產生一個 cache 丟失,而 cache 命中是在 cache server 每次從它的緩存里滿足客戶端 HTTP 請求時發生。
我在 Windows 宿主機上面使用代理訪問百度,如下:
2.5 ACL 訪問控制
1)只允許 IP 地址為 192.168.0.105 的客戶端使用服務器上的 squid 服務程序提供的代理服務,禁止其余所有的主機代理請求
編輯 /etc/squid/squid.conf,添加如下設置:
acl client src 192.168.0.105
http_access allow client
http_access deny all
由於虛擬機網絡使用了橋接模式,今天啟動 squid 服務器之后,發現 IP 地址變成了 192.168.0.107,所以代理服務器的地址就要變成這個新的地址。
宿主機的 IP 地址為 192.168.0.101,使用代理服務器訪問百度時,返回 403 Forbidden,如下:
而 另一台 虛擬機 backupnode 的 IP 地址為 192.168.0.105,所以它使用代理服務器訪問百度時返回 200 OK,如下:
2)禁止所有客戶端訪問網址中包含 taobao 關鍵詞的網站
編輯 /etc/squid/squid.conf,添加如下設置:
acl deny_keyword url_regex -i taobao
http_access deny deny_keyword
-i 表示不區分大小寫,可以看到訪問的網址中包含 taobao 時,返回 403 Forbidden,如果訪問不帶 taobao,比如換成 baobao 時,可以正常訪問,如下:
3)禁止所有客戶端訪問某個特定的網站
如上面所示,編輯 /etc/squid/squid.conf,添加如下設置:
acl deny_url url_regex http://www.youku.com
http_access deny deny_url
4)禁止下載帶有某些后綴的文件,比如 .rar 和 .avi
編輯 /etc/squid/squid.conf,添加如下設置:
acl badfile urlpath_regex -i \.rar$ \.avi$
http_access deny badfile
如有有人使用迅雷等 P2P 下載軟件來下載資源的話,就只能使用專業級的應用防火牆來禁止了。
三、配置 Squid 反向代理
網站頁面是由靜態資源和動態資源一起組成的,其中靜態資源包括網站架構 CSS/js 文件、大量的圖片、視頻等數據,這些數據相對於動態資源來說更加穩定,一般不會經常發生改變。但是隨着建站技術的更新換代,外加人們不斷提升的審美能力,這些靜態資源占據的網站空間也越來越多。如果能夠把這些靜態資源從網站頁面中抽離出去,然后在全國各地部署靜態資源的緩存節點,這樣不僅可以提升用戶訪問網站的速度,而且網站源服務器也會因為這些緩存節點的存在而降低負載。
方向代理是 Squid 服務程序的一種重要模式,其原理是把一部分原本向網站源服務器發起的用戶請求交給 Squid 服務器緩存節點來處理。但是這種技術的弊端也很明顯,如果有心懷不軌的人將自己的域名和服務器反向代理到某個知名的網站上面,從理論上來講,當用戶訪問到這個域名時,也會看到與那個知名網站一樣的內容(有些詐騙網站就是這樣騙取用戶信任的)。因此,當前許多網站都默認禁止了反向代理功能。開啟了 CDN(內容分發網絡)服務的網站也可以避免這種竊取行為。如果訪問開啟了防護功能的網站,一般會提示 500 錯誤。
將端口號 "http_port 3128" 修改為 "http_port 80 accel vhost vport",此時正向解析會被暫停,它不能與反向代理服務同時使用,然后再增加你要代理的后端真實服務器的信息。
編輯 /etc/squid/squid.conf,添加如下設置:
# 默認對外端口為3128 #http_port 3128 # 配置反向代理 http_port 80 accel vhost vport cache_peer 14.215.177.38 parent 80 0 originserver name=baidu cache_peer 61.151.166.146 parent 80 0 originserver name=qq cache_peer_domain baidu www.baidu.com cache_peer_domain qq www.qq.com
可以看到我們分別設置代理了后面的真實服務器, baidu 和 qq。
可以正常訪問 baidu(返回 200,正常) 和 qq(返回 302,要求瀏覽器重定向到 https。解釋一下:當客戶端訪問 http://www.qq.com 時,先經過了 squid 反向代理服務器,由於 squid 反向代理了 www.qq.com,於是將請求轉發給 61.151.166.146,真實服務器檢測到該請求為 http 請求,返回 302 響應碼,要求臨時重定向到 https://www.qq.com)。
由於沒有配置反向代理 sina 和 sohu,所以上述請求都返回 500 錯誤。
四、Squid 服務常用命令選項
[root@masternode squid]# squid -h Usage: squid [-cdhvzCFNRVYX] [-n name] [-s | -l facility] [-f config-file] [-[au] port] [-k signal] -a port Specify HTTP port number (default: 3128). -d level Write debugging to stderr also. -f file Use given config-file instead of /etc/squid/squid.conf -h Print help message. -k reconfigure|rotate|shutdown|restart|interrupt|kill|debug|check|parse Parse configuration file, then send signal to running copy (except -k parse) and exit. -n name Specify service name to use for service operations default is: squid. -s | -l facility Enable logging to syslog. -u port Specify ICP port number (default: 3130), disable with 0. -v Print version. -z Create missing swap directories and then exit. -C Do not catch fatal signals. -D OBSOLETE. Scheduled for removal. -F Don't serve any requests until store is rebuilt. -N No daemon mode. -R Do not set REUSEADDR on port. -S Double-check swap during rebuild. -X Force full debugging. -Y Only return UDP_HIT or UDP_MISS_NOFETCH during fast reload.
雖然命令有很多,但是常用的選項就是上面提到的 squid -k check,squid -k reconfigure 和 squid -k parse,這些命令均可以簡寫成:
# squid -kche(或 squid -k che),表示檢查 squid.conf 配置文件是否有語法或配置錯誤。
# squid -krec(或 squid -k rec),表示當 squid.conf 進行過配置更改后,可以使用該命令進行 squid 配置重載,而不用重啟 squid 服務,相當於熱加載。
# squid -kpar(或 squid -k par),表示如果 squid.conf 有語法或配置錯誤,這里會返回提示你,如果沒有返回,嘗試啟動 squid。