2012年1月19日 星期四

SQUID 3.1Cent OS 6.2


鳥哥的 Linux 私房菜
第十七章、區網控制者: Proxy 伺服器

17.7 參考資料與延伸閱讀


squid Proxy 實戰應用剖析

不自量力 の Weithenn: Squid-Web Proxy Server

#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


 
574 acl all src 0.0.0.0/0.0.0.0
578 acl localhost src 10.0.0.0/8     # RFC1918 possible internal networ          k
579 acl localhost src 172.16.0.0/12  # RFC1918 possible internal networ          k
580 acl localhost src 163.17.209.0/24        # RFC1918 possible interna          l network
639 http_access allow localhost
679 icp_access allow  localhost
 
 701 htcp_access allow localnet
 702 htcp_access deny all

698 htcp_access allow localhost
699 htcp_access deny all

################################## 
#Default:
httpd_accel_host classb.wcjs.tcc.edu.tw
httpd_accel_port 80


#Default:
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
##################################
575 #acl dropit dstdomain "/etc/squid/dropfile.txt"
 576 #擋網站
 577 acl deny_web dstdomain "/etc/squid/deny_web.txt"
 578 #擋特定網頁
 579 acl deny_page url_regex "/etc/squid/deny_page.txt"
 580 #擋特定資訊(字串)
 581 acl deny_word  urlpath_regex  "/etc/squid/deny_word.txt"

 575 ######################################################
 576 #acl dropit dstdomain "/etc/squid/dropfile.txt"
 577 #  deny web site
 578 acl deny_web dstdomain "/etc/squid/deny_web.txt"
 579 #  deny web page
 580 acl deny_page url_regex "/etc/squid/deny_page.txt"
 581 #  deny string
 582 acl deny_word  urlpath_regex  "/etc/squid/deny_word.txt"
 583 #######################################################
##################################

步驟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 運作後續注意事項

  • 若您修改 Squid 設定檔內容之後又不想重新啟動 Squid 服務可以鍵入下列指令 (請依個人喜好擇一即可)
 #/usr/local/etc/rc.d/squid reload          //squid 重新讀取設定檔 (方法一)
 #/usr/local/sbin/squid -k reconfigure      //squid 重新讀取設定檔 (方法二)
  • 如何查看 Squid 執行狀況
 #less /usr/local/squid/logs/cache.log      //可看到 Squid 目前執行狀況
  • 系統重新啟動或關機前,應先停止 Squid 服務
因為 Squid 對硬碟讀寫很頻繁且會有一堆資料 Cache 在記憶體之中,因此建議您當 Proxy Server 需要重新開機或關機之前請先停止 Squid 服務
 #/usr/local/etc/rc.d/squid stop
  • 定期 Rotate Squid Logs
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 (請自行依網路環境作調整),而此次實作的網路環境如下:
  • Squid IP Address: 192.168.1.10
  • Squid 網卡代號: em0
  • Lan User 網段: 192.168.1.0/24
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


##################################
chown squid:squid /cache1
chown squid:squid /cache2 
/etc/rc.d/init.d/squid restart
##################################

沒有留言:

張貼留言