MRTG 能做什麼
MRTG 是一套適用範圍廣泛的流量統計工具,與一般Server的流量分析不同,後者是對 Server 產生的 log 檔進行分析。而 MRTG 則需以 SNMP 或 外掛程式的方式來收集資料,產生即時統計圖。
進一步的比較,Server 的流量分析程式,因為資料內容資訊量較大,比較耗費系統資源,因此通常無法提供即時的統計結果,而是設定成一天執行一次(一般狀況而言)。MRTG 僅只統計2~4個量,資訊相對較為簡略,所以系統資源負荷輕,可以提供即時統計,一般是設定成五分鐘執行一次。
MRTG 在Linux平台上,已經利用來做以下各式各樣的統計(反觀Windows平台,因為Microsoft並未開放系統,資訊整合困難,開發的人也不多):
- 系統資源負荷量統計,例如:磁碟空間、CPU用量、記憶體用量......等等
- Server流量統計,例如:Mail、News、DNS、Web、BBS、IRC、MUD......等等
- 網路設備流量統計,例如:防火牆、Router、Switch、撥接終端機、ATM交換機......等等
- 另類統計,例如:Modem流量、Login人數、雷神之槌連線遊戲人數......等等
以 MRTG 的機制來說,它會以 SNMP 通訊協定去詢問 Router,然後將傳回來的數值畫成統計圖。或者去執行一支外掛程式,該程式將要統計的數值傳回來,然後 MRTG 只負責將它畫成統計圖。上面所提各種場合的應用,除了 Router、Switch 之外都是利用外掛程式的方式,來達成目的。
在此我將不詳敘如何撰寫外掛程式,而把重點放在安裝與 Router 流量統計的建立。如果您不是很熟悉 Router 或者不太了解網路機制無法獨立偵錯,請不要貿然在對外提供服務的機器上安裝測試。
MRTG 哪裡來
您可以到 http://www.mrtg.org 取得最新版本,該站台上也有討論群組及FAQ等諸多技術文件可供參考,所下載的壓縮檔解開後,也附有與網站內容相同的網頁文件。您也可以直接在這裡取得我改版的中文版本,此版本同時也附有我修改過的範例組態檔。
執行 MRTG 需要先安裝 Perl ,Windows版的 Perl 已經支援 windows 2000,您可以在 http://www.activestate.com/ 找到,該套裝是直接以 windows installer 打包成 Msi 檔案,所以安裝時,還必須到微軟公司取得最新版的 windows installer,這支程式雖然已經隨著 Office 2000 發行,但是Office 2000 所附的版本無法安裝 Perl。請您按這裡取得上述兩個套件。注意:這個版本不支援 Win 9x,如果您要在 Win 9x上面執行 MRTG ,請另行從 Active Perl 官方網站 http://www.activestate.com/ 下載。
從市網中心下載的 MRTG,解壓縮後內含三個 ZIP檔,分別是 MRTG-2.8.12 主程式、95MRTGscheduler 是一支排程程式,以VB撰寫的,很可惜只能在 Win9x上面執行、fiveminute 則是DOS批次檔,也是用來排程功能與 95MRTGscheduler 相同,但可以在Win 9x、NT、2000裡執行。
設定SNMP(Simple Network Management Protocol)
MRTG 統計 Router 流量時,是透過 SNMP來取得資訊,由 MRTG 送出 SNMP 查詢要求給 Router,這時候我們稱此工作站叫做 SNMP Agent,而把 Router 稱為 SNMP Server 。SNMP 查詢要求是使用 TCP 161 Port,SNMP Server 收到要求後會將要求的資訊以 UDP 1024 以後的 Port 傳送回 SNMP Agent。
由於每一種 Router所支援的功能不同,而且即使是相同功能,也可能是用不同機制開發完成的。因此要讓 SNMP通訊協定來應付所有 Router的需求,必須設計的相當有彈性才行。這個彈性就是 MIB 模組,MIB 模組是 Router上所提供功能的定義集合,已盡量涵蓋所有 Router 功能,不足部分仍可由開發 Router的廠商自行來制定,以 Cisco公司來說,甚至是讓不同型號的 Router 都有自己專用的一組 MIB 模組。當然 MIB 模組也涵蓋非 Router 的其他各種網管機制,例如:防火牆、Radius、Novell、各種 Server ......等等。MIB 模組將 Router 的功能以 tree 架構來分類,每項功能都有一個功能名稱和一個 OID 號碼,與 DNS 和 IP 的關係一樣,功能名稱是給人看的,OID 號碼則是給機器辨識用的,有些 OID 可以用來讀取狀態,有些則只用來當分類項目用,另外還有少數的 OID 可以設定指定的值。想知道 Router 的 MIB 資訊,可以查看購買 Router 時廠商所附的文件光碟,如果已經找不到該光碟,您也可以直接從該公司網頁查詢。有一個站台已經將各廠商所支援的 MIB 表列出來(只有大的分類項,沒有詳細內容),您也可以參考看看,網址是 http://www.ibr.cs.tu-bs.de/cgi-bin/sbrowser.cgi。
要讓 MRTG 能夠讀取流量資訊,首先必須把 Router 上的 SNMP Server 功能打開,如果您要監測學校對外流量,由於學校端是以 Router 連上 ATU-R,所以只要監測 Router 就可以了,不要去管 ATU-R(ATU-R是中華電信租給學校的設備,除非中華電信同意,否則不能在上面做任何調整,以免觸犯法律)。
其實學校對外流量已經由市網中心監測了,所以在學校端另行監測沒有什麼用處。如果利用 MRTG 來監測各單位的流量,如:電腦教室、各處室......等等,相信對學校來說,更為有用。
- 首先 Telnet 到 Router 上,進入 enable 指令層。
- 進入 config 指令層,並以 snmp ? 來查看詳細指令語法。這裡是以 Cisco Router 當範例,如果您購買的 Router 品牌不一樣,從這個步驟以後,都會不太一樣,請自行依照 Router 說明來操作。
- 我們看到說明裡面,community 是用來將 SNMP Enable。如果還是不知道下一步的做法,可以用 snmp community ? 來查看進一步的說明。
community string 就是 SNMP 的連線密碼,一般是設成 public,如果您不希望別人也來監測您的 Router 的MIB,可以將此字串改為您自定的密碼。當然待會兒設定 MRTG 時,也要修改。
我們將此密碼設定為 RO,也就是允許知道密碼的人,可以來讀取 Router 上的 MIB 狀態。如果是設定成 RW,那就是允許可以設定或重置 Router 狀態,由於 MRTG 只需要讀取,所以只設 RO 就夠用了。
如果您覺得這樣還不夠安全,還可以指定 ACL Rule,通常是用編號來表示。ACL 主要功能為過濾來源 IP,只有特定 IP 的 SNMP 要求,Router 才會回應,其餘的 IP 來源不予理會。設定方法這裡就不詳述,請自行參考說明設定。
- 設定好了以後,先以 exit 退回到 enable 指令層,然後以 sh run 來查看設定是否成功,檢查沒有問題後,以 copy run start 將設定值備份到 flash ROM 上面,以免停電重開機後,設定值遺失。
安裝 Perl 和 MRTG
假設您已經安裝過 Webalizer NT版,應該對解壓縮、安裝、設定PATH路徑.....等工作很熟悉了,這裡就簡單以文字來說明。
首先是安裝 Windows Installer,直接在解開的 InstMsi.exe 上面按兩下執行。安裝完畢後,以同樣方法把 ActivePerl-5.6.0.613 裝起來。
Perl 在安裝時,會自動增加 PATH 環境變數的設定,同時會自動設定應用程式的相關性,並將 IIS 或 PWS Server上的 CGI 設定也一起設好,這些工作都不需要我們操心。(如果您抓到的是舊版本,那可就累了。)
MRTG 主程式解開後,放在 c:/mrtg 目錄中,其中 run 目錄裡面所擺放的,就是 mrtg 幾支主要程式與相關組態檔。由於這些程式都是 Perl 程式,執行方式是在命令列下指令:
C:/>perl mrtg mrtg.cfg
或者將該檔案改名為 mrtg.pl 就可以直接在 Windows 裡面點兩下執行。其餘程式也是如此。
修改 MRTG 主程式
現在我們先來修改 MRTG 主程式,使它可以在 Windows 下面執行。先探討一下在 Windows 環境寫 Perl 程式的問題。
Perl 只接受 UNIX 的純文字格式,所以換行符號與 Windows 系統不同。在 UNIX 下面按 Enter 換行會產生內碼為 0A 的字元(也就是寫程式時的 /n 字元),但是在 Windows 下面按 Enter 則會產生 0A 和 0D 兩個字元(也就是寫程式時的 /n/r 字串)。由於這個緣故,寫 Perl 程式時,可千萬不能按 Enter。另外寫 Perl 程式時,不要用記事本來寫,因為它不知道 0A 也是換行的意思,通常我們會用 WordPad來寫,以下就是兩者的比較。
當然如果您有更好的工具,例如:UtraEdit。拿來寫 Perl 程式是最好用的了。
通常寫 Perl 程式時的第一行要指定 Perl 的所在路徑,但在 Windows 下面,這項工作已經由 PATH 環境變數代勞了,所以第一行只要寫 #!Perl 就可以了。當然如果不去改它,也是可以執行,不過比較容易造成誤解就是了。
MRTG 主程式要修改主要是中文顯示的問題,和以下這一個變數設定:
$main::OS = 'UNIX';
#$main::OS = 'NT';
#$main::OS = 'VMS';改為
#$main::OS = 'UNIX';
$main::OS = 'NT';
#$main::OS = 'VMS';如果您的主程式是我修改過的版本,那麼就不需要自己改了,我已經將它改為中文版了,可以直接使用。
設定 MRTG 組態
MRTG 的使用流程是這樣:首先執行 cfgmaker 來送出 SNMP 封包,偵測 Router 上所支援的 OID 號碼,並建立組態檔。這項工作可以使用以下指令來完成:
c:/mrtg/run>perl cfgmaker [email protected] > mrtg.cfg
以上指令是用來建立 163.21.236.254 這個 Router 的組態,使用 public 來當 SNMP community string,建立好的組態則是放在 mrtg.cfg 組態檔中(記得前面改 Router 時,曾經設定過 community string 嗎?如果您不是設 public,這裡可別照著做)。
如果是在 Linux 的平台上,這個步驟應該可以很容易就完成。但是在 Windows 平台上你可能會遇到程式執行過久(感覺很像程式當掉),或是做出完全空白的組態檔,以 Netxray 來監看封包可以找出原因,如下圖:
我們可以發現,當 163.21.236.71 (SNMP Agent) 從 163.21.236.254 (SNMP Server) 取得 OID 號碼後,找到一個路由介面 IP 是 163.21.158.254 ,接著 Windows 對該 IP 進行反查,向 DNS Server 163.21.236.4 查詢(圖上反白的那一行),反查成功後,SNMP Agent 繼續詢問 SNMP Server,結果得到第二個路由介面 IP 是 163.21.234.254 ,一樣對此 IP 進行反查,結果查不到,於是 Windows 繼續以 NetBios Name 進行「廣播找人」,但也查不到.......最後什麼組態也做不出來。
由於在 Linux 上執行 cfgmaker 時,不會去反查 IP,所以一切都很順利。在 Windows 上就沒那麼幸運了。解決方法是什麼呢?其實很簡單,只要為 Router 上的每一個 IP 都做好 DNS 紀錄就可以了。
如果你有 Linux 的機器已經裝好 Perl,也可以拷貝 cfgmaker 到 Linux 上,利用 Linux 來做組態檔,然後再將做好的組態檔拷貝回 Windows,這樣也可以。
否則還有第三個方法,就是手動來建立組態檔。在市網中心所提供的 MRTG 套件中,內含有我修改過的範例組態檔 mrtg.cfg,我們就以此檔案為例,來了解一下組態檔參數的意義。以下就是該檔案內容(前面已經說過,使用 WordPad 來編輯,記得千萬不要按 Enter):
WorkDir: e:/Inetpub/wwwroot/mrg
以上這一行是設定 MRTG 流量統計圖的擺放位置,當然要擺放在網頁所在的目錄裡
######################################################################
# Description: Cisco Internetwork Operating System Software IOS (tm) C2600 Software (C2600-IS56I-M), Version 12.0(2a), RELEASE SOFTWARE (fc1) Copyright (c) 1986-1999 by cisco Systems, Inc. Compiled Fri 01-Jan-99 16:32 by phanguye
# Contact:
# System Name: Router
# Location:
#.....................................................................以上是 Router 上的 SNMP Server 訊息,其實都是註解行,如果覺得討厭可以直接將它移除。
Target[g_point]: 1:[email protected]這是定義資料來源,前面說過資料來源有兩類:如果是以 OID : Community string 來定義,則來源由 SNMP Server 提供﹔如果要由外掛程式提供資料,則會定義成
Target[上線人數]: `perl myfinger.pl`注意:中括弧裡面是定義做出來的網頁的檔名,在這裡會做出 g_point.html 的統計網頁。
MaxBytes[g_point]: 1250000
這是定義流量的最大值,用來計算目前流量的百分比。如果只設定一筆,就表示流入流出的頻寬相同。
Title[g_point]: 本校總流量統計
網頁的抬頭。
Options[g_point]: growright,bits
定義統計圖的方向(由左至右)以及統計的單位(以 bits 來計算,而不是 bytes)
PageTop[g_point]: <H1>本校總流量統計(Ethernet0/0)</H1>
網頁顯示時第一行的內容
#---------------------------------------------------------------
Target[a_point]: 6:[email protected]這裡的 OID 號碼是 6,這並不是完整的 OID。完整的 OID 應該是 1.3.6.1.2.1.2.1.6,在 MIB 裡的定義是 IF-MIB!ifDescr,也就是指定 Router 上面的介面編號,要注意的是該編號是浮動式的,每次 Enable 或 Disable 一個介面,該編號都會有異動。所以當MRTG 執行後,會產生 mrtg.ok 檔案,此檔案會紀錄目前哪一個編號對應到哪一個介面,當發生錯誤時,必須要自行核對此檔案,然後手動去修改介面編號的正確值。
MaxBytes1[a_point]: 187500
MaxBytes2[a_point]: 48000以上也是在定義最大流量,以方便計算百分比。分開寫成兩行是因為流入與流出頻寬不同, MaxBytes1 是流入的上限量,而 MaxBytes2 則是流出的上限量。
Title[a_point]: 本校對市網中心流量統計
Options[a_point]: growright,bits
PageTop[a_point]: <H1>本校對市網中心流量統計(Ethernet0/1)</H1>
#---------------------------------------------------------------關於組態設定更詳細的資訊,可以在 MRTG 的 doc/config.html 找到。許多微調選項在 Windows 環境裡面並不能使用,請自行參考測試。
建立 MRTG 統計網頁
使用 indexmaker 來建立目錄網頁,使用下列指令:
c:/mrtg/run>perl indexmaker -o e:/inetpub/wwwroot/mrtg/default.htm mrtg.cfg
更詳細的說明請直接打 c:/mrtg/run>perl indexmaker 查詢。
在建立目錄網頁之前,必須先修改 indexmaker 主程式,請將
$title = '臺北市教育網路中心流量分析';
改為貴校名稱。
關於 95MRTGscheduler
由於 Windows 環境裡的排程設計的不夠理想,只能排定每日一次,無法設定成五分鐘執行一次,因此 MRTG 的排程工作,必須要用變通方法。
這支程式是以 VB 所撰寫的排程程式,必須要常駐在記憶體裡面執行,而且因為開發時的 VB 版本較舊,所以只能給 Win 9x 的作業系統執行。如果您的 MRTG 剛好也是在 Win 98 上面執行,那麼請您把它裝起來吧!
這個設定介面非常一目了然,所以我就不再詳細說明。如果您裝了這支程式,以後的步驟您都不需要再去理會。
有一個細節要特別注意,當您設定好以上三個路徑後,千萬不要再去搬移,否則這支程式會執行不起來,出現系統錯誤訊息,而且重新安裝也沒用。當然是有辦法補救,我用的辦法是直接以 Regedit 去修改系統登錄檔,將該三個機碼的值,檔名去除,只留下路徑。這樣可以將該程式救回來。修改系統登錄有很高的風險,請務必照圖操作。
機碼的位置在 /HKEY_CURRENT_USER/Software/VB and VBA Program Settings/MRTGScheduler/Parameters
執行排程批次檔
在 Win NT(包括 Win 2000) 中,MRTG 排程只好使用 NT 系統提供的 at 指令(auto task,在 Resource kit 裡面,請自行安裝)。請將 fiveminute.zip 解開到 c:/mrtg 目錄中,總共有六支批次檔,現在逐一說明其功能:
- mrtgkick.bat 是最底層的批次檔,主要是執行 mrtg 主程式
@echo off
c:/perl/bin/perl c:/mrtg/run/mrtg c:/mrtg/run/mrtg.cfg
exit
- A.bat、B.bat、C.bat 這三支批次檔是為了避免連續呼叫 mrtgkick.bat 造成 Recursive(遞迴,也就是說前一個執行實體尚未執行完畢,還未釋放系統資源,下一個執行實體又建立,而資源被使用中無法取得,造成死結),因此這三支批次檔內容都相同。
@echo off
start c:/mrtg/mrtgkick.bat
exit
- 2.bat 的內容只有一行,主要是參數傳遞方式設定 at 自動排程,第一個參數(%1)是執行時間,第二個參數(%2)是執行的程式內容。
at %1 /every:m,t,w,th,f,s,su "%2"
注意:/every:m,t,w,th,f,s,su 中 m 是指 monday,其餘依此類推。也就是說每週的星期一到星期日都要執行,換句話說就是每天執行的意思。
- 3a.bat 是最上層的批次檔,也是將來要做排程設定的對象。這支批次檔是呼叫 2.bat 並且傳入兩個參數,參考上面的說明,我們可以了解其實就是按時去輪流執行 A.bat、B.bat、C.bat 三支批次檔,輪流執行的原因是為了避免造成 Recursive。
call 2.bat 0:00 C:/mrtg/A.BAT
call 2.bat 0:05 C:/mrtg/B.BAT
call 2.bat 0:10 C:/mrtg/C.BAT
call 2.bat 0:15 C:/mrtg/A.BAT
call 2.bat 0:20 C:/mrtg/B.BAT
call 2.bat 0:25 C:/mrtg/C.BAT
..........瞭解了排程的原理以後,現在我們就將它執行起來:
c:/mrtg>3a
這支批次檔只要執行一次就可以了。它會在 at 清單上建立 288 個執行項目,也就是每天每小時的五分、十分、十五分、二十分.........各執行一次 MRTG。
我完成 MRTG 流量統計了
現在讓我們來欣賞一下成果吧!在畫面最右邊,已經可以看到流量跑出來了!
下一步是什麼?
學會安裝和使用 MRTG,並不是這個主題的結束,而僅僅是開始。前面提過透過外掛程式的方式,可以做到特殊應用系統的即時統計,如果您需要這方面的資料,可以參考 c:/mrtg/contrib 目錄裡面的文件與原始程式碼。
我在這裡要再提醒大家一次,那裡面的原始碼是為 UNIX 或特定系統開發的,在 Winodws 上面不可直接拿來執行。
至於 Windows 下面,MRTG 可以拿來做哪些應用,這個主題留待下回分解。