站長新書 站長開講 首頁 最新文章 站長著作及審校 FreeBSD 筆記 Linux 筆記 Windows 筆記 虛擬化筆記 網管人雜誌 遊山玩水 關於本站
站長新書 VMware vSphere ICM 團購開跑了!!

Squid-Web Proxy Server

前言

[Squid Web Proxy Cache] 為目前最多人使用的 Proxy Server,本篇實作為利用 [Squid] 來架設 Web Proxy Server,關於 Web Proxy 如何運作可參考站內文章 WebProxy 伺服器的原理與運作流程

Squid 支援功能如下:

實作環境

安裝及設定

步驟1.安裝 squid 套件

切換至 Ports Tree 路徑安裝 squid 套件

 #cd /usr/ports/www/squid                              //切換至安裝路徑
 #make install clean                                   //安裝套件並清除安裝過程中產生不必要檔案

步驟2.修改 squid 設定檔 (squid.conf)

安裝 squid 套件完成後系統會顯示訊息告知您相關設定,整理後要點大致如下:

瞭解上述設定要點之後我們著手進行修改 squid 設定檔 (squid.conf),下列僅簡列出基本設定部份,詳細設定檔內容請參考 [Squid configuration directives]

 #vi /usr/local/etc/squid/squid.conf                   //修改 squid 設定檔,內容如下
 http_port 3128                                        //接受 HTTP 要求時使用的 Port
 maximum_object_size 5120 KB                           //設定 Cache 網頁資料最大值 (超過 5MB 就不 Cache)
 acl QUERY urlpath_regex cgi-bin \? \.php \.asp \.cgi  //設定針對 CGI、PHP、ASP 檔案不作 Cache 
 no_cache deny QUERY                                   //設定定義名稱為 QUERY 的項目不作 Cache 
 cache_mem 32 MB                                       //設定存放在 RAM 裡面的 Cache 大小
 cache_dir ufs /usr/local/squid/cache 2048 16 256      //設定 Cache 在 HDD 裡面的大小 (最多使用 2GB、第一層目錄 16MB、第二層 256MB)
 cache_log /usr/local/squid/logs/cache.log             //記錄 Squid 的執行狀況 
 cache_access_log /usr/local/squid/logs/access.log     //記錄 Squid Client 的 HTTP 及 IGP Request
 cache_store_log /usr/local/squid/logs/store.log       //記錄 Squid Cache 哪些網頁資料
 acl all src 0.0.0.0/0.0.0.0                           //Access Control List Source IP 0.0.0.0 Name all
 acl localhost src 127.0.0.1/255.255.255.255           //Source IP 127.0.0.1 Name localhost
 acl lanuser src 192.168.1.0/24                        //Source IP Range 192.168.1.0 Name lanuser
 http_access allow localhost lanuser                   //允許定義名稱 Localhost 及 LanUser 能使用 Squid 服務
 http_access deny all                                  //禁止其它 IP 使用 squid 服務

步驟3.初始化 cache dir 目錄結構

修改完 Squid 設定檔後若您的 Squid 是第一次安裝的話則請在啟動 Squid Service 之前,必需先進行初始化 Cache Dir 目錄結構 (若是舊版升級的話就不用了,因為初始化會把 Cache 資料清空),請鍵入如下指令來進行初始化 Cache Dir 目錄結構,初始化完成後可至 /usr/local/squid/cache 查看會發現建立許多 Squid Cache 目錄結構 (為之後的 Cache 資料進行分類)

 #/usr/local/sbin/squid -z                             //初始化 Cache Dir 目錄結構
 2007/12/18 18:00:59| Creating Swap Directories

步驟4.啟動 squid 服務

在啟動 Squid 服務之前請修改 /etc/rc.conf 以便系統重新開機時能自動帶起 Suqid 服務

 #vi /etc/rc.conf
 squid_enable="YES"                                   //加入此行

在啟動 Squid 服務之前建議先確定 Squid 設定檔的語法是否正確 (沒任何訊息就代表設定檔語法都正確!!),以免造成不可預期的錯誤

 #/usr/local/sbin/squid -f /usr/local/etc/squid/squid.conf -k parse 

鍵入如下指令來啟動 Squid Service

 #/usr/local/etc/rc.d/squid start
 Starting squid.

步驟5.測試 Squid 是否啟動成功

檢查 Squid Process 是否執行

 #ps ax |grep squid
 16954  ??  Is     0:00.00 /usr/local/sbin/squid -D

檢查 Squid 是否 Listen 設定的 HTTP Request Port

 #sockstat | grep 3128
 squid    squid      16956 11 tcp4   *:3128                *:*

檢查 Squid 是否作用了

 #telnet localhost 3128        //假設 Squid 為本機
 GET / [enter]                 //輸入 GET 及反斜線後在按下 Enter

當 Enter 按入後,若你看到一堆 HTML 的輸出,代表您的 Squid 服務成功運作了 Squid Client 可設定瀏覽器來使用 Web Proxy 了,關於如何設定瀏覽器使用 Web Proxy 可參考如下網路資源:

Squid 運作後續注意事項

 #/usr/local/etc/rc.d/squid reload          //squid 重新讀取設定檔 (方法一)
 #/usr/local/sbin/squid -k reconfigure      //squid 重新讀取設定檔 (方法二)
 #less /usr/local/squid/logs/cache.log      //可看到 Squid 目前執行狀況

因為 Squid 對硬碟讀寫很頻繁且會有一堆資料 Cache 在記憶體之中,因此建議您當 Proxy Server 需要重新開機或關機之前請先停止 Squid 服務

 #/usr/local/etc/rc.d/squid stop

Squid 相關 Logs (access.log、cache.log、store.log) 在不停運作中若不進行 Rotate Logs 除了 Logs 檔案本身會異常肥大之外也可能造成硬碟空間被佔滿,因此建議設定至排程內來定期將 Rotate Squid Logs

 0 3 * * * /usr/local/sbin/squid -k rotate   //定期於每天早上 3 點 Rotate Logs

Transparent Proxy with NAT Mode

為何要使用 [Transparent Proxy]? 當您設定好 Squid 但內部 User 端有一、二百台電腦難道需要一台一台去設定 User 端瀏覽器使用 Web Proxy? 所以這時便可透過 Transparent Proxy 機制來達成不須設定 User 端也能讓 User 端使用 Web Proxy。

步驟1.修改 squid 設定檔

新版本的 Squid (ex. squid-2.6.17) 將 Transparent Proxy 設定簡化了,簡單說就是把一些功能都整合到 http_port 的 option 內了,至於詳細內容您可參考官網 [Squid 2.6.STABLE8 release notes]

 #vi /usr/local/etc/squid/squid.conf         //修改 squid 設定檔
 http_port 3128                              //預設值
 http_port 3128 transparent                  //修改後,加上 transparent option

舊版本的 Squid (ex. squid-2.5.14_2) 其 Transparent Proxy 設定則為修改 Squid 設定檔並加上如下四行內容

 httpd_accel_host virtual
 httpd_accel_port 80
 httpd_accel_with_proxy on
 httpd_accel_uses_host_header on   

步驟2.修改 NAT 的 RDR 設定

再來就是修改 NAT 中 RDR (Redirect) 設定了,簡單說 LAN User 要對外存取 HTTP (80) 時就導 (Redirect) 到 Squid 主機的 Port 3128 出去。

以下列出在 FreeBSD 中常用的三種 NAT 其 RDR Rule (請自行依網路環境作調整),而此次實作的網路環境如下:

IPFIREWALL (IPFW)

 /sbin/ipfw add 50000 fwd 192.168.1.10,3128 tcp from 192.168.1.0/24 to any 80

IPFILTER (IPF)

 rdr em0 0.0.0.0/0 port 80 -> 192.168.1.10/32 port 3128 tcp/udp

Packet Filter (PF)

 int_if="em0"
 internal_net="192.168.1.0/24" 
 rdr on $int_if proto tcp from $internal_net to any port 80 -> $int_if port 3128

Transparent Proxy with Bridge Mode

為何要使用 [Transparent Proxy]? 當您設定好 Squid 但內部 User 端有一、二百台電腦難道需要一台一台去設定 User 端瀏覽器使用 Web Proxy? 所以這時便可透過 Transparent Proxy 機制來達成不須設定 User 端也能讓 User 端使用 Web Proxy。

因為此次的 Proxy 角色僅為監控使用者上網行為其擺放位置介於防火牆 (Firewall) 與使用者之間,因此將 Proxy 設定為 Transparent Proxy with Bridge Mode,其網路環境如下:

Juniper SSG20Transparent Proxy with Bridge LAN
WAN Port LAN Port ext_if (bce0)FreeBSD int_if (bce1)End User PCs
61.60.59.58/32192.168.1.1/32192.168.1.10FreeBSD (PF、Squid)192.168.1.20192.168.1.0/24
Gateway 61.60.59.254/32Gateway 192.168.1.1/32Gateway 192.168.1.20/32

步驟1.修改 squid 設定檔

新版本的 Squid (ex. squid-2.6.17) 將 Transparent Proxy 設定簡化了,簡單說就是把一些功能都整合到 http_port 的 option 內了,至於詳細內容您可參考官網 [Squid 2.6.STABLE8 release notes]

 #vi /usr/local/etc/squid/squid.conf         //修改 squid 設定檔
 http_port 3128                              //預設值
 http_port 192.168.1.20:3128 transparent     //修改後,指定 int_if 網卡 IP 並加上 transparent option

步驟2.允許 IP 轉送封包

修改 sysctl.conf 設定檔加入允許 IP 轉送封包功能選項

 #vi /etc/sysctl.conf
 net.inet.ip.forwarding=1                    //加入此行

步驟3.設定網卡為橋接模式 (Bridge Mode)

設定網路卡為橋接模式 (Bridge Mode),因為二張網卡位於同一個 IP 網段內因此與 End User 相連接的網卡其遮罩值必須為 255.255.255.255。

 #vi /etc/rc.conf
 defaultrouter="192.168.1.1"                                                   //設定 Gateway IP
 cloned_interfaces="bridge0"                                                   //設定網卡啟用橋接模式
 ifconfig_bridge0="addm bce0 addm bce1 up"                                     //設定橋接網卡代號
 ifconfig_bce0="inet 192.168.1.10  netmask 255.255.255.0"   #Juniper SSG20     //連接至 Juniper SSG20 LAN Port 的網卡
 ifconfig_bce1="inet 192.168.1.20  netmask 255.255.255.255" #End User          //連接至使用者郡組的網卡 (請注意遮罩設定!!)

步驟4.修改 PF Rules 設定

修改 PF Rules 中 RDR (Redirect) 設定,簡單說 End User PCs 要對外存取 HTTP (80) 時就導引 (Redirect) 到 Squid 主機的 Port 3128 出去,由於此台 Proxy 僅為監控用途因此對於其它流量一律 Pass All。

 #vi /etc/pf.conf
 ext_if="bce0"
 int_if="bce1"
 rdr on $int_if inet proto tcp from any to any port www -> $int_if port 3128
 pass in all
 pass out all

補充:如何快速分析 access.log

如果您不想安裝分析 Squid Log (access.log) 套件而想快速分析使用者行為的話您可利用下列簡單的指令來達成,預設的 access.log 內容如下

 #cat access.log
 1248857041.100    286 192.168.1.88 TCP_MISS/200 872 GET http://tw.msn.com - DIRECT/207.46.59.170 text/html
 1248857041.416    313 192.168.1.88 TCP_MISS/200 792 GET http://0932.jp/ - DIRECT/65.55.15.241 text/html
 1248857151.228    337 192.168.1.88 TCP_MISS/200 2265 GET http://1-2-c.com/ - DIRECT/67.220.225.40 text/html

利用 cat 指令將 access.log 內容全部輸出後配合 awk 指令取出要的欄位值 (Time、Client IP、URL) 後將結果存入到家目錄下名為 111 的檔案內

 #cat access.log | awk '{print$1 " " $3 " " $7}' > ~/111
 1248857041.100 286 192.168.1.88 http://tw.msn.com
 1248857041.416 313 192.168.1.88 http://0932.jp
 1248857151.228 337 192.168.1.88 http://1-2-c.com

最後透過下列 Perl 指令將 TimeStamp 時間轉換成 Localtime 後存入到名為 222 的檔案內

 #perl -p -e 's/^\d+\.\d+/localtime $&/e' < 111 > 222
 Wed Jul 29 16:44:01 2009 192.168.1.88 http://tw.msn.com
 Wed Jul 29 16:44:01 2009 192.168.1.88 http://0932.jp
 Wed Jul 29 16:45:51 2009 192.168.1.88 http://1-2-c.com

經過上述二道步驟後可簡單把 access.log 內容轉換成具有時間及 Client IP 及所連結的網址。

參考

[Squid 2.5 Quick Start Guide]

[苗栗縣大湖鄉大南國民小學全球資訊網路 (FreeBSD) 架站日誌 Proxy-Server (Squid) 代理伺服器]

[FreeBSD Proxy Server 之 安裝 與 設定]

[IPNAT+Ipfilter+Squid Transparent Proxy 超級防火牆]

[YI-Jer Shou & Chung-Kie Tung Squid Proxy Server 介紹]

[Squid 2.6.STABLE8 release notes]

[Transparent proxying with squid and pf]

[OpenBSD PF & 之橋接模式﹝Bridge Mode﹞+ Squid with Transparent proxying]

[pf transparent proxy squid nat - The FreeBSD Forums]

[Configuring transparent proxy - GrahamstownSchoolWiki]

Me FAQ

Q1.檢查 squid 設定檔時顯示訊息 ACL name 'QUERY' not defined!?

Error Meaage:

修改好 Squid 設定檔後執行檢查設定檔的指令後顯示說找不到定義的 ACL 名稱 QUERY

 #squid -f /usr/local/etc/squid/squid.conf -k parse
 2007/12/18 13:55:54| ACL name 'QUERY' not defined!
 FATAL: Bungled squid.conf line 2446: no_cache deny QUERY
 Squid Cache (Version 2.6.STABLE17): Terminated abnormally.

Ans:

原因為 Squid 設定檔內關於 ACL 名稱 QUERY 定義順序顛倒了,修改後再度檢查設定檔內容就沒問題了。

 acl QUERY urlpath_regex cgi-bin \? \.php \.asp \.cgi
 no_cache deny QUERY                                  //此行要放在 ACL 下面

Q2.無法使用 Transparent Proxy 功能?

Error Meaage:

修改好 Squid 設定檔後執行檢查設定檔的指令後顯示說找不到定義的 Transparent Proxy 名稱

 #/usr/local/sbin/squid -k parse
 2007/12/18 14:43:06| parseConfigFile: line 3170 unrecognized: 'httpd_accel_host virtual'
 2007/12/18 14:43:06| parseConfigFile: line 3171 unrecognized: 'httpd_accel_port 80'
 2007/12/18 14:43:06| parseConfigFile: line 3172 unrecognized: 'httpd_accel_with_proxy on'
 2007/12/18 14:43:06| parseConfigFile: line 3173 unrecognized: 'httpd_accel_uses_host_header on  '

Ans:

新版本的 Squid (ex. squid-2.6.17) 將 Transparent Proxy 設定簡化了,簡單說就是把一些功能都整合到 http_port 的 option 內了,至於詳細內容您可參考官網 [Squid 2.6.STABLE8 release notes]

 #vi /usr/local/etc/squid/squid.conf         //修改 squid 設定檔
 http_port 3128                              //預設值
 http_port 3128 transparent                  //修改後,加上 transparent option
Go To Oddmuse OrgGo To FreeBSD OrgCreative Commons 2.5 Taiwansitestates.com