容器 Docker Container 伺服器 網管軟體

無須大工程升級現有環境 老伺服器上新軟體照裝不誤

開源LibreNMS網管系統 用Docker就能輕鬆建置

2020-09-14
若想在舊伺服器上使用LibreNMS,但它支援的PHP版本至少必須為7.2.5,而舊伺服器上的PHP版本又頗為老舊,乍看之下似乎完全行不通。其實只要依照本文的指引,在原機上執行Docker再執行LibreNMS的Container,就不會對原先伺服器造成影響,又能換用新的網管軟體。

 

長久以來,筆者一直是Cacti的愛好者。但老實說,Cacti的1.x版讓人不太滿意,原因是與舊版的Plugins的相容性不佳、介面的操作方式與舊版有些許不同、初期的版本不太穩定。但舊版Cacti程式老舊又有難以解決的破圖問題,因此不得不找尋Cacti的替代品。在眾裡尋他千百度之後,終於選定LibreNMS做為新的網管軟體。

LibreNMS的速度快,介面美觀,操作方式簡單、靈活且具現代感,與Cacti相較,有如Web 1.0與Web 2.0的差異。但由於LibrenNMS支援的PHP版本最低為7.2.5,在筆者的舊伺服器上並不支援,要把伺服器上原先的PHP 5.5.9換成PHP 7是很大的工程。在做完功課和幾經測試後,最後決定在原機上先運行Docker再執行LibreNMS的Container,如此一來就不會對原先伺服器造成影響,又可以滿足筆者更換網管軟體的目標。

想要建構本次的實作環境,所需軟硬體如下:

HostOS:Ubuntu 14.04.6

PHP版本:5.5.9

docker-ce:18.06.3

Container:將安裝兩部Container,包括Web及MySQL。

LibreNMS:1.64.1

其餘部分:請見表1。

安裝注意事項

在架構的部分,由於Docker已經很成熟,不再多做說明。在此使用手動的方式安裝Docker相關套件,包含docker-ce及docker.io。資料庫的部分,有三種選擇:使用本機既有的資料庫、使用Docker安裝資料庫的Container、使用docker-compose同時安裝LibreNMS及資料庫的Container。三種組合筆者都試過,難度均不高。

考量到之後備份時的便利性,此次選擇同時安裝LibreNMS及資料庫,接下來的安裝過程均以此為例。其實,三種方法對於LibreNMS都屬於連線至其他伺服器,只是設定方式不同。

進行前置作業

由於使用apt安裝的Docker與手動安裝的docker-compose有版本匹配問題,因此選擇手動安裝Docker:

apt update wget -qO- https://get.docker.com/ | sh

接著,手動安裝docker-compose。docker-compose是用來定義多容器應用程式,本例要使用它一次把LibreNMS及資料庫的Container下載安裝完成。一般而言,下載及執行Container必須使用root權限,因此以下的範例均已事先切換為root的身分。

另外,可能會遇到docker-compose與docker api版本不符的問題。(以此例而言可使用apt安裝docker-ce排除,但為避免其他相依性問題,這裡選擇手動安裝Docker)

先下載docker-compose,在此使用curl,亦可使用wget取代curl,惟wget與curl指令略有所不同,請自行調整:

sudo curl -L  "https://github.com/ docker/compose/releases/download/ 1.26.2/docker-compose-$(uname -s)-$ (uname -m)" -o /usr/local/bin/ docker-compose

接著,給予docker-compose執行權限:

chmod +x /usr/local/bin/docker- compose

目前,在GitHub中有幾個docker-librenms專案可供試用,但經過測試後,在筆者的環境中只有以下範例的專案可以順利執行,將此專案複製回來:

cd /opt git clone https://github.com/ jarischaefer/docker-librenms

然後,要產生librenms的金鑰,在此需要等待Docker下載Image,將會花一點時間:

docker run --rm jarischaefer/ docker-librenms generate_key

隨後會得到類似以下的輸出,請先儲存備用(包含base64:的部分均須備份):

base64:Q+0NkaXoqXNHAJdjNuLC0z6XF yo0IDEhPvPwJCl7Uzc=

接下來,準備編輯docker-compose的設定檔:

cd docker-librenms/ vi docker-compose.yml

在此,僅列出需要修改或筆者認為需要說明的部分:

services:  

web:    

hostname: librenms    

#hostname的部分可依現況調整    

ports:      

- "1080:80"    

#ports的部分,1080代表要外對開放的Port 為1080,在Container內部則使用80 Port environment:    

- APP_KEY= base64:Q+0NkaXoqXNHAJd jNuLC0z6XFyo0IDEhPvPwJCl7Uzc= #APP_KEY則使用先前存放的Key,記得要連base64:一起貼上去,前後不須加雙引號      

- DB_HOST=db #DB_HOST的部分建議不需修改,若要修改就要將相關的部分一併修改      

- DB_NAME=librenms      

- DB_USER=librenms      

- DB_PASS=librenms      

#資料庫的名稱、帳號及密碼因我們僅在Container中使用,可不進行修改。若要 修改的話在MySQL的部分須一併進行修改      

- BASE_URL=http://192.168.36.135:1080#BASE_URL請自行修改為正確的IP,記得後面要加上:1080的Port      

- TZ=Asia/Taipei 

#時區的部分請務必一定要記得修改,若時區設定有誤,會影響Log的時間及流量圖的呈現。若此處未設定正確,後續需要進行調整時,會多花很多時間  

mysql:    

environment:    

- MYSQL_ROOT_PASSWORD=thisis mypassword       #這邊要設定MySQL的root password      

- MYSQL_USER=librenms      

- MYSQL_PASSWORD=librenms      

- MYSQL_DATABASE=librenms      

#以上三者是資料庫的名稱、帳號及密碼,若在Web的部分有調整,此處請一併調整      

- TZ=Asia/Taipei       #時區的部分記得一定要設定正確

設定完成存檔之後,就可以開始執行docker-compose了,指令如下:

docker-compose up -d

若有前述API版本不符問題,會有以下的輸出,若Server較新,則須更新docker-ce版本,或者將Client(docker-compose)降版:

ERROR: client and server don't have same version (client : 1.22, server: 1.18)

順利執行時,會有以下輸出:

Pulling mysql (mysql:5.6)... 5.6: Pulling from library/mysql

最後,將會輸出如下的內容:

Creating docker-librenms_mysql_1 ... done Creating docker-librenms_web_1   ... done

至此,已經建立兩個Container,分別是Web(LibreNMS)以及MySQL(Database)。

如圖1所示,可以使用「docker ps」指令來查看目前執行的情形。

從圖1中可看出目前名為docker-librenms_web_1和docker-librenms_mysql_1這兩個Container正在執行中(若之前沒有執行過此指令,需要一點時間下載Image)。

圖1  Container ID及名稱等資訊。

若想知道目前Container執行到哪個階段,可使用logs指令來查看:

docker logs docker-librenms_web_1 docker logs docker-librenms_mysql_1

docker-librenms_web_1和docker-librenms_mysql_1的名稱比較長不易輸入,也可以替換成docker ps看到的Container ID,如1d6dda40a99d及05cef3b45515。

從docker logs,可以看到Web已經在執行CRON的例行工作,而MySQL已經停留在如下的輸出,這代表兩者都正在執行之中:

2020-07-22 02:49:11 1 [Note] mysqld: ready for connections. Version: '5.6.49'  socket: '/var/run/mysqld/ mysqld.sock'  port: 3306 MySQL Community  Server (GPL)

先簡單講解一下目前運行的網路架構以利理解。目前的主機的IP是192.168.36.135,它上面運行Docker的IP是172.17.42.1,此Docker建立了一個邏輯的Bridge介面,其IP是172.18.0.1,因為有此Bridge介面存在,才能透過它在主機中直接與這兩部Container連線,相關架構如圖2所示。因此要登入Container的話,必須先登入Host主機,此例中為192.168.36.135。

圖2  系統架構圖。

一般而言,為了節省空間,Container通常不會包含以上常用的指令,例如ip或ipconfig,因此要取得Container的IP要透過docker指令,可以使用以下指令取得Container的IP:

docker inspect -f '{{range .Network Settings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id

在該指令中,最後一個參數使用Container的名稱或ID均可。

接著,進行資料庫的設定。先登入MySQL的Container:

docker exec -it docker-librenms_ mysql_1 bash

首先要建立資料庫,在docker-compose.yml中,此次設定的root密碼是thisismypassword,因此相關指令如下:

mysql --host=127.0.0.1 --user=root -pthisismypassword -e "create database librenms;"

接下來,設定密碼及資料庫權限:

mysql --host=127.0.0.1 --user=root -pthisis mypassword -e "GRANT ALL PRIVILEGES ON librenms.* TO 'librenms'@'%' IDENTIFIED  BY 'librenms';"

再次提醒,如果在docker-compose.yml檔中有修改librenms資料庫相關帳號密碼,這邊也要一併調整。設定完成後,離開MySQL的Container。緊接著,在Web的Container進行資料庫的設定:

docker exec docker-librenms_web_1 setup_ database

如果看到以下的輸出,代表資料庫設定完成:

Database seeding completed successfully.

最後,建立管理者帳號並設定密碼:

docker exec docker-librenms_web_1  create_admin

若看到以下訊息,代表帳號已經建立了:

User admin added successfully Created user admin with password admin and e-mail address test@example.com

然後可用瀏覽器開啟網頁「http://192.168. 36.135:1080/」,並且使用預設的帳號admin及密碼admin登入LibreNMS。至此,LibreNMS的安裝均已完成。

LibreNMS基本操作示範

因為篇幅有限,在此僅做一些基本的操作示範。

不管在外網或內網使用,登入的第一件事,就是修改密碼。先點選右上角的「admin」,再點選「My Settings」。

接著,如圖3所示,在「Current Password」輸入admin,並且在「New Password」以及「Verify New Password」的部分輸入新密碼,最後再點選〔Change Password〕。

圖3  修改管理者密碼。

設定完成後,記得先登出系統再登入,以驗證密碼已經修改成功。

接著要調整一下語系的設定,平常筆者在管理設備時大多使用英文介面,但LibreNMS的繁體中文化實在做得太好了,不使用的話對於作(譯)者會有點不好意思,因此在此把語系設定為繁體中文。同樣點選「admin」,再點選「My Settings」,往下找到「Preferences」部分,在「Language」的下拉式選單,可以找到繁體中文,選擇後會直接生效,管理介面變成繁體中文顯示,如圖4所示。

圖4  設定顯示語言。

在LibreNMS新增設備

在此示範如何新增一部Synology的AP,先點選上方選單中的「裝置」,再點選下拉選單內「新增裝置」,如圖5所示。

圖5  新增裝置。

接著,在「Hostname or IP」欄位內輸入192.168.200.254,在「Community」欄位中輸入設備的Snmp Community,亦即「bravo」,如圖6所示。

圖6  輸入IP及Snmp Community。

這時候要稍做等待,LibreNMS會想盡辦法把能抓的資訊都抓出來。可以點選「裝置」後再點選「所有裝置」,結果如圖7所示,可以發現這是一部Synology的RT1900ac設備,版本為DSM 5.2-8017。

圖7  LibreNMS自動抓取相關資訊。

此時點選192.168.200.254這個IP,或者點選「裝置」、「所有裝置」、「Storage」來找到這一台裝置,再點選其IP,可以看到其詳細資訊,如圖8所示,除了基本的流量圖之外,也包含了版本、名稱、開機時間、序號、Processor數量、記憶體、儲存裝置、溫度還有各項感應器的資訊(例如風扇狀態),相信已經可以滿足大部分管理者的需求。

圖8  顯示Synology裝置的相關資訊。

如果需要獲得更進一步的資訊的話,則點選概觀旁的Graphs、健康情況、連接埠、Logs等等連結,它能提供更豐富的資訊。

新增SNMP MIB檔

有一些設備是LibreNMS無法找出其詳細資料,可能是裝備太新或者太少人使用,又或者如果覺得LibreNMS抓出來的資訊太少,希望能得到更多資訊,此時就必須自行上傳MIB檔。

在此以Synology的MIB檔為例,將之下載後解壓縮,再上傳至Host主機192.168.36.135上。

然後,將它複製到「/opt/librenms/mibs」目錄中,相關指令為:

docker cp /home/klting/Synology_MIB_ File/ docker-librenms_web_1:/opt/ librenms/mibs

可以將整個目標上傳,當然也可以上傳單獨一個檔案。此時,可透過以下指令確認是否有成功複製:

docker exec -it docker-librenms_web_1 ls /opt/librenms/mibs | grep Synology

當然,也可以登入web的Container進行檢查:

docker exec -it docker-librenms_ web_1 bash ls /opt/librenms/mibs/ | grep Synology

之後新增設備時,LibreNMS就可增加比對的來源,增加取得的資訊。若有針對某設備更新MIB檔的話,記得在該裝置右上方點選齒輪圖示,再點擊「Rediscover device」,讓LibreNMS重新再做一次掃描,如圖9所示。

圖9  重新掃描設備。

自行設定群組

在此案例中,其實這是一台AP,而非NAS,為便於管理,可以自行建立群組,先點選「裝置」,再點選「群組管理」,接著點選「新增裝置群組」。

在名稱的部分輸入AP,在類型部分選擇「靜態」,接著在「選擇裝置」部分可使用下拉式選單選擇「192.168.200.254」。

如此設定之後,就能夠透過「裝置」裡面的「裝置群組」來管理相似的設備,相關操作如圖10所示。

圖10  建立裝置群組。

使用LibreNMS網段掃描功能

剛建置完成LibreNMS時,可能需要大批新增設備,此時可以使用LibreNMS的Auto Discovery功能。

先登入Web的Container,之後再切換至「/opt/librenms」目錄:

docker exec -it docker-librenms_ web_1 bash cd /opt/librenms

接著,編輯config.php檔。在檔案的最下方新增如下的設定(此為SNMP V1及V2的設定):

$config['snmp']['community'][] = "public"; $config['snmp']['community'][] =  "private"; $config['nets'][] = '192.168.36.0/24'; $config['nets'][] = '192.168.200.0/24';

這代表用community public及private去掃192.168.36.0/24及192.168.200.0/24這兩個網段,若有community public及private可以讀取的設備就會被加入網管系統中。

緊接著,執行掃描程式:

./snmp-scan.py

之後就會出現掃描結果,可以發現它掃了508個IP(兩個Class C的網段),有22部已經加入的設備、14部新設備,還有44部是使用這兩組Community無法讀取的設備:

Scanned 508 IPs: 22 known devices, added 14 devices, failed to add 46 devices Runtime: 149.22 seconds

此時,再回到LibreNMS的裝置頁面中,就可以看到這些新增的設備,建議將之重新編列群組以利後續管理。

進行LibreNMS告警設定

接下來,將設定郵件的通知,先點選右上角「admin」旁邊的齒輪圖示,再點選「全域設定」選項,然後點選「警報」裡面的「電子郵件設定」進行調整,如圖11所示。

圖11  設定電子郵件。

「寄送郵件方式」,預設為「mail」,將之修改為「SMTP」,就可以進行細部的調整。若有其他郵件伺服器,例如Gmail,可以透過其轉發郵件。也可以搭配曾經介紹過的ssmtp等方式把郵件透過其他伺服器寄出去,可以設定的部分如圖12所示。

圖12  進行SMTP細部調整。

結語

LibreNMS的功能強大,但安裝過程比較繁瑣,又只能搭配新的PHP 7使用,因此在推廣上比較有點困難。幸好,目前有Docker幫忙處理這些繁雜的瑣事。另外,以筆者而言,手邊的舊機器很多,一時沒有辦法將作業系統升版(有相容性、穩定性及成本的考量),還好Docker幫忙排除了這些問題,只要能跑Docker的舊機器,一樣可以安裝新的網管軟體。LibreNMS的功能太多,包含告警規則的設定,與其他網管軟體(例如Nagios、Graylog、NfSen、Oxidized、PeeringDB、Smokeping),也可以跟其他報表軟體結合。

<本文作者:丁光立,在ISP工作多年。對於Cisco設備較熟悉,除此之外也研究Linux,這幾年慢慢把觸角伸到資安的領域,並會在自己的blog(http://tiserle.blogspot.com/)分享一些實務上的經驗和測試心得。>

 


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!