天天看點

Linux 筆記 - 第十九章 配置 Squid 正向代理和反向代理服務

一、簡介

Squid 是一個高性能的代理緩存伺服器,對應中文的烏賊,鱿魚的意思。Squid 支援 FTP,gopher 和 HTTP 協定。和一般的代理緩存軟體不同,Squid 用一個單獨的,非子產品化的,I/O 驅動的程序來處理所有的用戶端請求。

Squid 将資料元緩存在記憶體和硬碟中,同時也緩存 DNS 查詢的結果。Squid 支援 SSL,支援通路控制。由于使用了 ICP(輕量 Internet 緩存協定),Squid 能夠實作層疊的代理陣列,進而最大限度的節約帶寬。

Linux 筆記 - 第十九章 配置 Squid 正向代理和反向代理服務

Squid Cache(簡稱 Squid)是一個流行的代理伺服器和 Web 緩存伺服器軟體。Squid 可以做正向代理,也可以做反向代理。官方網站位址為:http://www.squid-cache.org/

1.1 正向代理

Linux 筆記 - 第十九章 配置 Squid 正向代理和反向代理服務

當 Squid 做正向代理時,Squid 後面是用戶端,用戶端想通路外部網絡資源,必須經過 Squid。正向代理按其用戶端配置方式不同,又可以分為标準(普通)代理模式和透明代理模式。

标準(普通)代理模式,是代理内部網絡使用者通路 internet 上伺服器的連接配接請求,用戶端必須指定代理伺服器,并将本來要直接發送到 internet 上伺服器的連接配接請求發送給代理伺服器處理。使用者在上網時必須在浏覽器等軟體中填寫代理伺服器的 IP 位址與端口号資訊,否則預設不使用代理。

透明代理模式,是相對于代理伺服器而言,用戶端不需要做任何和代理伺服器相關的設定和操作,對使用者而言,感覺不到代理伺服器的存在,是以稱之為透明代理。即把代理伺服器部署在核心的上網出口,當使用者上網浏覽頁面時,會交給代理伺服器向外請求,如果結合iptables,可以實作代理+網關+内容過濾+流量安全控制等完整的上網解決方案。

1.2 反向代理

Linux 筆記 - 第十九章 配置 Squid 正向代理和反向代理服務

反向代理(Reverse Proxy)方式是指以代理伺服器來接受 internet 上的連接配接請求,然後将請求轉發給内部網絡上的伺服器,并将從内部伺服器上得到的結果傳回給 internet 上請求連接配接的用戶端,此時代理伺服器對外就表現為一個伺服器。

綜上,正向代理是代理用戶端,為用戶端收發請求,使真實用戶端對伺服器不可見;而反向代理是代理伺服器端,為伺服器收發請求,使真實伺服器對用戶端不可見。

Linux 筆記 - 第十九章 配置 Squid 正向代理和反向代理服務

二、配置 Squid 正向代理

2.1 安裝 squid

可以使用源碼編譯安裝,或者使用 yum 直接安裝,如下:

[[email protected] ~]# yum install -y squid
[[email protected] ~]# squid -v
Squid Cache: Version 3.5.20
......      

使用 yum 安裝後,系統會自動生成 squid 使用者和使用者組,如下:

Linux 筆記 - 第十九章 配置 Squid 正向代理和反向代理服務

2.2 配置 squid

可以使用 squid 預設的配置檔案,因為預設的配置檔案其實就已經設定了正向代理,也可以修改預設的配置檔案,如下:

[[email protected] ~]# 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 并檢查配置檔案,如下:

[[email protected] ~]# systemctl start squid
[[email protected] ~]# squid -kcheck      

# squid -kcheck(可簡寫為 squid -kch)可以檢查配置檔案是否有錯,修改配置建檔案後,可以使用 # squid -kreconfigure(可簡寫為 # squid -krec)來重新加載配置檔案。

2.4 驗證代理

可以使用浏覽器設定代理的方式,也可以直接使用 curl 指令來測試,其中 -x 選項即 --proxy,添加代理伺服器位址和端口,如下:

Linux 筆記 - 第十九章 配置 Squid 正向代理和反向代理服務

顯示了百度首頁的 html 源碼,說明 squid 正向代理設定成功。

然後我們再來看 squid 對圖檔的緩存。如下:

Linux 筆記 - 第十九章 配置 Squid 正向代理和反向代理服務

其中 MISS 表示丢失,HIT 表示命中。當 cache server 第一次接收到對第一個新資源的請求時,就會産生一個 cache 丢失,而 cache 命中是在 cache server 每次從它的緩存裡滿足用戶端 HTTP 請求時發生。

我在 Windows 主控端上面使用代理通路百度,如下:

Linux 筆記 - 第十九章 配置 Squid 正向代理和反向代理服務

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,如下:

Linux 筆記 - 第十九章 配置 Squid 正向代理和反向代理服務

而 另一台 虛拟機 backupnode 的 IP 位址為 192.168.0.105,是以它使用代理伺服器通路百度時傳回 200 OK,如下:

Linux 筆記 - 第十九章 配置 Squid 正向代理和反向代理服務

2)禁止所有用戶端通路網址中包含 taobao 關鍵詞的網站

編輯 /etc/squid/squid.conf,添加如下設定:

acl deny_keyword url_regex -i taobao
http_access deny deny_keyword      

-i 表示不區分大小寫,可以看到通路的網址中包含 taobao 時,傳回 403 Forbidden,如果通路不帶 taobao,比如換成 baobao 時,可以正常通路,如下:

Linux 筆記 - 第十九章 配置 Squid 正向代理和反向代理服務

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。

Linux 筆記 - 第十九章 配置 Squid 正向代理和反向代理服務

可以正常通路 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 服務常用指令選項

[[email protected] 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。

轉載于:https://www.cnblogs.com/cnjavahome/p/11421468.html

繼續閱讀