鳥哥的 Linux 私房菜
第十七章、區網控制者: Proxy 伺服器
17.7 參考資料與延伸閱讀
- squid 官方網站:http://www.squid-cache.org/
- squid 說明文件計畫:http://squid-docs.sourceforge.net/, http://www.deckle.co.za/squid-users-guide/
- squid 的驗證流程:http://www.l-penguin.idv.tw/article/proxy-auth.htm
- 舊版的一些範例參考:http://linux.vbird.org/linux_server/0420squid/0420squid_vbird_ex
- squid 官網收集的登錄檔分析軟體:http://www.squid-cache.org/Scripts/
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
702 htcp_access deny all
698 htcp_access allow localhost
699 htcp_access deny all
##################################
##################################
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 服務
#/usr/local/etc/rc.d/squid stop
- 定期 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
/sbin/ipfw add 50000 fwd 192.168.1.10,3128 tcp from 192.168.1.0/24 to any 80IPFILTER (IPF)
rdr em0 0.0.0.0/0 port 80 -> 192.168.1.10/32 port 3128 tcp/udpPacket 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 SSG20 | Transparent Proxy with Bridge | LAN | |||
WAN Port | LAN Port | ext_if (bce0) | FreeBSD | int_if (bce1) | End User PCs |
61.60.59.58/32 | 192.168.1.1/32 | 192.168.1.10 | FreeBSD (PF、Squid) | 192.168.1.20 | 192.168.1.0/24 |
Gateway 61.60.59.254/32 | Gateway 192.168.1.1/32 | Gateway 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
##################################
沒有留言:
張貼留言