在上一篇拙作裡面, 筆者大略的展示了 OpenNMS SNMP 的效果, 還不錯吧? 筆者用這招 "拍" 死很多案子不順利牽拖網路硬體的廠商 (廠商: 原來我在你心中只是一隻蒼蠅...) .心動不如行動, 行動不如叫別人動... 啊, 別這樣啦, 還是請貴官動個手做看看, 這樣底下的工程師才不會在 m01 上面 po 文罵長官豬頭.
回到正題, 這次我們的目標是:
讓 OpenNMS 可以透過 SNMP 收集 Windows 的資料
此招有四個步驟, 如下:
- 在 Windows 2003 Server 上面安裝 SNMP Service
- 在 Windows 2003 Server 上面 "設定" SNMP Service
- 在 Windows 2003 Server 上面安裝 SNMP Informant
- 設定 OpenNMS 來搜刮 (Collect) Windows SNMP 的資料
以下就對每個步驟詳細說明囉.
1. 在 Windows 2003 Server 上面安裝 SNMP Service
執行 "新增或移除程式": "開始" --> "控制台" --> "新增或移除程式"
(1). 按 "新增/移除 Windows 元件"
(2). 點選 "Management and Monitoring Tools" (註: 不是勾選)
(3). 按 "詳細資料"
(4). 勾選 "Simple Network Management Protocol (SNMP) 與 "WMI SNMP 提供者"
(5). 按 "確定"
(6). 按 "下一步"
接下來就是 Windows 安裝程式的 "標準作業程序": 遇到到 "下一步" 就果決的按下去, 看到螢幕上有逐漸長(ㄓㄤˇ)長(ㄔㄤˊ)的藍色光條, 就喝著咖啡兩眼無神的盯著, 直到安裝完畢!!
2. 在 Windows 2003 Server 上面 "設定" SNMP Service
安裝完了, 可得要設定一下, 否則~ 小心!! 駭客就在你身邊~
請: 開始功能表 --> 控制台 --> 系統管理工具 --> 服務
(1). 找到 SNMP Service, 並用滑鼠雙擊打開內容
(2). 切換頁籤到 "代理程式"
(3). 填入聯絡人與位置 (非必填)
(4). 勾選全部的服務 ("實體" 與 "資料連結及子網路" 預設沒有勾選)
(5). 請繼續看下一張圖片 ...
重點來了, SNMP 可以提供很多 "敏感" 的資料, 我們總不會允許任意電腦來查詢 SNMP 資料吧?
(6). 切換到 "安全性" 頁籤
(7). 按 "新增" 以增加群體名稱 (Community Name), 這時候會出現 "SNMP 服務設定" 畫面
(8). 群體權利選擇 "唯讀", 群體名稱隨便取一個 (目前先取 MYSNMP 好了, 這相當於是 SNMP 與 NMS 之間的通關密語)
(9). 按 "新增", 回到 "安全性的頁面"
(10). 點選 "可從所有主機接受 SNMP 封包" (註: 這是不良示範!! 在 Production 環境應該只允許 "從下列主機接受 SNMP 封包", 並新增 OpenNMS 的主機就好, 以免駭客猜到我們簡單的通關密語, 並進一步取得 SNMP 資料)
(11). 按 "確定", 即可完成 SNMP 的設定
3. 在 Windows 2003 Server 上面安裝 SNMP Informant
安裝並設定好 Windows SNMP Service 其實就可以運作了, 不過 Windows 所附的 SNMP Service 功能實在有點陽春 ... 幸好有佛心的 SNMP Informant 提供免費的 Standard 版本給大家使用, 那就不客氣的來用囉 ^^
(註: 這個可以略過不裝直接跳到步驟4, 不會影響運作)
(1). 瀏覽 SNMP Informat 的官網 http://www.wtcs.org/informant
(2). 點 Download
(3). 在 Choose the file 選項選擇 "SNMP Informat-STD v1.6 (current production release)
(4). 按 "Download Now", 即可開始下載 informant-std-1.6.zip
打開剛剛下載的zip檔案 (推薦用7-zip, 另一個 Open Source 的佳作), 請先閱讀 "Installation and Configuration Guide.pdf" ..... 啊, 你沒有閱讀!! Bad Admin, 去牆邊罰站 10 分鐘 (典故來自於 qmail 的安裝指引).
開玩笑的 ^^ 請執行 "informant-std-16.exe, 接下來就又是 Windows 安裝程式的標準作業程序了 ^^
OK!! Windows 2003 Server 端的作業到此結束, 下台一鞠躬... 啊~ 這樣還不行啦~ OpenNMS 也是要設定一下的, 請各位長官再耐心一下下囉 ^^
4. 設定 OpenNMS 來搜刮 (Collect) Windows SNMP 的資料
OpenNMS 預設會以 public 的群體名稱 (Community Name) 來偵測 Node 是否有提供 SNMP 服務, 有些設備 (例如事務機, 網路設備) 的 SNMP 群體名稱 (Community Name) 也是 public, 因此大家有時候會發現, 即使沒有設定 OpenNMS 的 SNMP, 有的 Node 也會 "自動" 奉上他的 SNMP 資料. 當然這是很不安全的作法, 時機壞壞, 有開方便之門的話, 請務必上個密碼鎖.
好啦, 開始設定我們的 OpenNMS 囉.
OpenNMS Web Console 的主功能表 "Admin" --> "Configure SNMP Community Names by IP"
因為我們只設定 1 台目標主機, 因此只需要填寫 "First IP Address", 以及 "Community String" 即可. 請填上我們剛剛設定的那台 Windows 2003 Server 的 IP, 以及 "MYSNMP" 後按 "Submit"
由於 OpenNMS 的 Capd 預設每 24 小時才重新掃描一次, 請大家回去睡覺等明天.... 啊, 等等!! 這樣不就每改一次設定就要睡覺一次? 呵呵, 當然不是這樣囉!! OpenNMS 雖然 Open, 但是並不笨~ 我們可以用 OpenNMS 提供的 Rescan 功能強迫 OpenNMS 的 Capd 立即掃描該 Node 的服務是否有改變. 所以, 請找到該 Node (主功能表的 Node List) 後, 點 "Rescan"
點完後會出現確認的畫面, 請按 "Rescan" 按鈕 (為何這裡特地要再確認一次? ~"~ 筆者到現在還努力思考箇中原因~)
確認後會回到 Node 的畫面, 但是.... Rescan 前跟 Rescan 後的畫面好像沒什麼改變耶? OpenNMS 還沒回神嗎? 呵呵, 請大家稍安勿躁, 注意一下 Recent Events 裡面多出了一個黃色的 Warning "A Services scan has been forced on this node", 原來~ Rescan 已經在進行中, 只是需要一點時間, 所以請大家去喝杯咖啡 (到現在為止總共喝幾杯了?) 後, 再回來看結果.
等掃描完畢之後, 畫面上看起來就不一樣了, 多了一個 "SNMP Attributes" (如果設定都對的話), 其中的 Name 就是電腦名稱 (Computer Name), "Location" = SNMP 設定時我們填寫的 "位置", "Contact" 則是我們在設定 SNMP 時所填寫的 "聯絡人"
Ok, 設定完畢!! 過幾個小時候, 就可以從 Resource Graphs 看到上一篇文章所展示的資源歷史圖表. 祝大家設定順利囉!!
大家: (舉手) 為什麼 Location 與 Contact 都是亂碼!? 你不是在 Windows SNMP Service 設定的時候敲了中文字嗎?
筆者: 因為 Windows SNMP Service 回應給 OpenNMS 的 Location/Contact 資料是 Big5 編碼, OpenNMS 不認得.
大家: 你吹牛~ (參考7-11的廣告)
筆者: .....=_=|||
好吧, 證明一下, 下圖是 Wireshark (Open Source 的 Network Sniffer) 所抓到的 SNMP 封包, 這是 OpenNMS 對我們的 Windows Server 進行查詢 (getBulkRequest) 後, Windows SNMP Service 回應 (get-response) 給 OpenNMS 的自白書. 筆者特別標示出這個封包裡面的一些資料:
b1 60 a6 db a4 76 ab f5 ...
以繁體中文的 Big5 編碼來解析這些16進位, 我們會發現 (請用內碼輸入法)
b1 60 = 常
a6 db = 自
a4 76 = 己
ab f5 = 挖
....
以此類推
由於 OpenNMS 收到這些資料後, 以為是 Unicode 編碼, "警察廣播電台" 聽成 "警察伯伯變態" (註: 我的6歲女兒真的這樣問我), 就直接塞到 PostgreSQL 裡面, 於是就變成大家在畫面上所看到的亂碼了, 了沒?
大家: (將信將疑) 那怎樣才可以避免?
筆者: (斬釘截鐵) 打英文!
大家: .... (丟紙杯~)