若想在舊伺服器上使用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)。
若想知道目前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。
一般而言,為了節省空間,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〕。
設定完成後,記得先登出系統再登入,以驗證密碼已經修改成功。
接著要調整一下語系的設定,平常筆者在管理設備時大多使用英文介面,但LibreNMS的繁體中文化實在做得太好了,不使用的話對於作(譯)者會有點不好意思,因此在此把語系設定為繁體中文。同樣點選「admin」,再點選「My Settings」,往下找到「Preferences」部分,在「Language」的下拉式選單,可以找到繁體中文,選擇後會直接生效,管理介面變成繁體中文顯示,如圖4所示。
在LibreNMS新增設備
在此示範如何新增一部Synology的AP,先點選上方選單中的「裝置」,再點選下拉選單內「新增裝置」,如圖5所示。
接著,在「Hostname or IP」欄位內輸入192.168.200.254,在「Community」欄位中輸入設備的Snmp Community,亦即「bravo」,如圖6所示。
這時候要稍做等待,LibreNMS會想盡辦法把能抓的資訊都抓出來。可以點選「裝置」後再點選「所有裝置」,結果如圖7所示,可以發現這是一部Synology的RT1900ac設備,版本為DSM 5.2-8017。
此時點選192.168.200.254這個IP,或者點選「裝置」、「所有裝置」、「Storage」來找到這一台裝置,再點選其IP,可以看到其詳細資訊,如圖8所示,除了基本的流量圖之外,也包含了版本、名稱、開機時間、序號、Processor數量、記憶體、儲存裝置、溫度還有各項感應器的資訊(例如風扇狀態),相信已經可以滿足大部分管理者的需求。
如果需要獲得更進一步的資訊的話,則點選概觀旁的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所示。
自行設定群組
在此案例中,其實這是一台AP,而非NAS,為便於管理,可以自行建立群組,先點選「裝置」,再點選「群組管理」,接著點選「新增裝置群組」。
在名稱的部分輸入AP,在類型部分選擇「靜態」,接著在「選擇裝置」部分可使用下拉式選單選擇「192.168.200.254」。
如此設定之後,就能夠透過「裝置」裡面的「裝置群組」來管理相似的設備,相關操作如圖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所示。
「寄送郵件方式」,預設為「mail」,將之修改為「SMTP」,就可以進行細部的調整。若有其他郵件伺服器,例如Gmail,可以透過其轉發郵件。也可以搭配曾經介紹過的ssmtp等方式把郵件透過其他伺服器寄出去,可以設定的部分如圖12所示。
結語
LibreNMS的功能強大,但安裝過程比較繁瑣,又只能搭配新的PHP 7使用,因此在推廣上比較有點困難。幸好,目前有Docker幫忙處理這些繁雜的瑣事。另外,以筆者而言,手邊的舊機器很多,一時沒有辦法將作業系統升版(有相容性、穩定性及成本的考量),還好Docker幫忙排除了這些問題,只要能跑Docker的舊機器,一樣可以安裝新的網管軟體。LibreNMS的功能太多,包含告警規則的設定,與其他網管軟體(例如Nagios、Graylog、NfSen、Oxidized、PeeringDB、Smokeping),也可以跟其他報表軟體結合。
<本文作者:丁光立,在ISP工作多年。對於Cisco設備較熟悉,除此之外也研究Linux,這幾年慢慢把觸角伸到資安的領域,並會在自己的blog(http://tiserle.blogspot.com/)分享一些實務上的經驗和測試心得。>