2019-01-18 SNMPTRAP發消息到Slack實例

Snmpd是服務端的,snmp是客戶端的,snmp-mib-downloader用來更新本地mib庫的軟件,snmp trap是snmp的一部分,用於對特定事件向服務器發送報警。
基本概念不多說了,今天主要講一下操作實例。要達成的目標是收到SNMP TRAP的特定消息後,發消息到Slack頻道通知。
服務器:Ubuntu 18.04 設備:華爲OLT MA5800X7
服務器側:
1、SNMP和SNMPTrap的安裝。
1.1 慣例,服務器上先更新軟件再安裝。

axing@84:~$ sudo apt update
axing@84:~$ sudo apt upgrade
axing@84:~$ sudo apt install snmpd snmp snmp-mibs-downloader snmptrapd

1.2 安裝完成,看下snmp服務狀態正常, 看到“Active: active (running)”

axing@84:~$ sudo service snmpd status
#或者sudo systemctl status snmpd
● snmpd.service - LSB: SNMP agents
   Loaded: loaded (/etc/init.d/snmpd; bad; vendor preset: enabled)
   Active: active (running) since Thu 2019-01-10 15:12:24 GMT; 1h 9min ago
     Docs: man:systemd-sysv-generator(8)
   CGroup: /system.slice/snmpd.service
           └─2152 /usr/sbin/snmpd -Lsd -Lf /dev/null -u snmp -g snmp -I -smux mt
Jan 10 15:12:23 Docker_LD8 systemd[1]: Starting LSB: SNMP agents...
Jan 10 15:12:24 Docker_LD8 snmpd[2144]:  * Starting SNMP services:
Jan 10 15:12:24 Docker_LD8 snmpd[2150]: Created directory: /var/lib/snmp/mib_ind
Jan 10 15:12:24 Docker_LD8 snmpd[2150]: /etc/snmp/snmpd.conf: line 145: Warning:
Jan 10 15:12:24 Docker_LD8 snmpd[2150]: /etc/snmp/snmpd.conf: line 147: Warning:

可以用snmpwalk看下本機信息,返回類似以下信息說明正常。

axing@Docker_LD8:~$ snmpwalk -v 2c -c public localhost 1.3.6.1.2.1.1.1
iso.3.6.1.2.1.1.1.0 = STRING: "Linux Docker_LD8 4.4.0-141-generic #167-Ubuntu SMP Wed Dec 5 10:40:15 UTC 2018 x86_64”

1.3 對服務器snmp和snmpd的配置文件進行修改優化
1.3.1 先改 etc/snmp/snmpd.conf 文件

axing@84:~$ sudo vim /etc/snmp/snmpd.conf
#找到下面兩行,註釋掉,添加第三句,這樣就可獲取更多的節點信息。
…
#view   systemonly  included   .1.3.6.1.2.1.1
#view   systemonly  included   .1.3.6.1.2.1.25.1
view   systemonly  included   .1
…
#修改通訊密碼
#Full access from the local host
#rocommunity public  localhost
#Default access to basic system info
 rocommunity password  default    -V systemonly
#rocommunity6 is for IPv6
 rocommunity6 password  default   -V systemonly
...

改完重啓服務,跑一下snmpwalk看看swap大小

axing@84:~$sudo service snmpd restart
axing@84:~$sudo snmpwalk -v 2c -c password localhost .1.3.6.1.4.1.2021.4.3.0
iso.3.6.1.4.1.2021.4.3.0 = INTEGER: 1003516
axing@84:~$sudo free -m
              total        used        free      shared  buff/cache   available
Mem:            991         218         195          23         578         562
Swap:           979          27         952

覺得這樣不夠直觀,再改下snmp.conf文件

axing@84:~$sudo vim snmp.conf
...
#mibs:
mibdirs +/usr/share/mibs
mibdirs +/usr/share/mibs/iana
mibdirs +/usr/share/mibs/ietf
mibs +ALL
#註釋掉: mibs, 增加mibs存放目錄,默認snmp-mibs-downloader 安裝了在/usr/share/mibs下面會有兩個文件夾iana和ietf

重啓服務,再運行一下snmpwalk,現在就翻譯過來了

axing@84:~$ sudo service snmpd restart
axing@84:~$ sudo snmpwalk -v 2c -c public localhost .1.3.6.1.4.1.2021.4.3.0
UCD-SNMP-MIB::memTotalSwap.0 = INTEGER: 1003516 kB

另外,爲提高snmp安全性,最好修改下snmp community密碼

目前爲止,snmp只允許本機訪問,要想允許遠程主機訪問,還有一些要改下:修改/etc/snmp/snmpd.conf,
按照下面修改。

#  Listen for connections from the local system only
#agentAddress  udp:127.0.0.1:161
#  Listen for connections on all interfaces (both IPv4 *and* IPv6)
agentAddress udp:161,udp6:[::1]:161

重啓服務
我們可以對比下修改前後偵聽端口的變化

Before
axing@84:~$ sudo netstat -antup | grep 161
udp        0      0 127.0.0.1:161           0.0.0.0:*                           6177/snmpd
After
axing@84:~$ sudo netstat -antup | grep 161
udp        0      0 0.0.0.0:161             0.0.0.0:*                           6284/snmpd
udp6       0      0 ::1:161                 :::*                                6284/snmpd

如果使用ufw防火牆的話,別忘記開放161/162端口。
現在就可以遠程獲取主機snmp信息了。
snmpwalk -v2c -c password xx.xxx.xx.xx HUAWEI-XPON-TRAP-MIB::hwXponOntInitiativeDownAlarmTrap
2、 SNMPTRAPD配置
要啓用SNMPTRAPD,修改配置文件/etc/snmp/snmptrap.conf,添加一句制定community字串

vim /etc/snmp/snmptrapd.conf
authCommunity log,execute,net public
#這裏的參數,log表示記錄日誌,execute表示傳遞給特定處理程序,比如python腳本,net允許把trap傳遞給其他服務器。
#public是密碼,隨便改

在要監控的設備上配置snmp trap,不同設備的配置大同小異,主要是服務器地址和通訊字串,比如我配置華爲OLT,配置看起來是這樣的:

snmp-agent community read cipher "password"
snmp-agent target-host trap-hostname "ax-84" address xx.xxx.xxx.xx udp-port 162 trap-paramsname "trapname"
snmp-agent target-host trap-paramsname "trapname" v2c securityname cipher "password"

改完新開一個窗口,重啓snmp trap服務,可以看到服務器開始接收trap信息

axing@84:~$ sudo snmptrapd -d -f -Lo
2019-01-18 16:23:16 <UNKNOWN> [UDP: [10.111.108.2]:58058->[46.102.170.84]:162]:
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (2186314094) 253 days, 1:05:40.94  SNMPv2-MIB::snmpTrapOID.0 = OID: HUAWEI-XPON-TRAP-MIB::hwXponProfOntPortStatusTrap  HUAWEI-SNMP-NOTIFICATION-MIB::hwTrapSN.0 = INTEGER: 0   HUAWEI-SNMP-NOTIFICATION-MIB::hwTrapLevel.0 = INTEGER: warning(4)   HUAWEI-SNMP-NOTIFICATION-MIB::hwSpecificTrapType.0 = INTEGER: maintain(3)   HUAWEI-DEVICE-MIB::hwSysIpAddr.0 = IpAddress: 10.111.108.2  HUAWEI-SNMP-NOTIFICATION-MIB::hwTrapID.0 = INTEGER: 400 HUAWEI-LINE-COMMON-MIB::hwReservedValue.0 = INTEGER: 0  HUAWEI-XPON-TRAP-MIB::hwXponTrapOperType.0 = INTEGER: modify(2) IF-MIB::ifIndex.4194312960 = INTEGER: -100654336    HUAWEI-XPON-MIB::hwXponDeviceOntIndex.4194312960.3 = INTEGER: 3 HUAWEI-XPON-MIB::hwXponOntUniPhyType.4194312960.3.eth.4 = INTEGER: eth(47)  HUAWEI-XPON-MIB::hwXponOntUniPhyIndex.4194312960.3.eth.4 = INTEGER: 4   HUAWEI-XPON-TRAP-MIB::hwXponDeviceOntPortRunStatus.0 = INTEGER: 1
^C2019-01-18 16:23:17 NET-SNMP version 5.7.3 Stopped.
Stopping snmptrapd

Sending 24 bytes to Local IPC: /var/agentx/master
0000: 01 02 00 00  08 00 00 00  00 00 00 00  F6 3D A4 49    .............=.I
0016: 04 00 00 00  05 00 00 00                              ........

3、配置輸出信息到slack
首先你要知道slack的LACK_INCOMING_WEB_HOOK, 通常你需要有slack頻道管理員權限或向管理員申請,得到類似以下鏈接:

SLACK_INCOMING_WEB_HOOK = "https://hooks.slack.com/services/T03MQU5DA/B1HJ8Ndf19A/bZr5UEanVdL3wROtWTssmgC"

然後修改snmptrapd.conf文件,主要改下面幾個參數

#服務器地址
snmpTrapAddr udp:xx.xxx.xxx.xx:161
#通訊字串
authCommunity log,execute trapname
authCommunity log,execute password

ignoreAuthFailure yes

#收到trap後如何處理,下面這句的意思是收到HUAWEI-XPON-TRAP-MIB::hwGponProfOntDiscoveryAlarmTrap的告警後,去執行 /usr/local/bin/snmphandler_general.py 程序,參數HUAWEI-XPON-TRAP-MIB::hwGponProfOntDiscoveryAlarmTrap
traphandle HUAWEI-XPON-TRAP-MIB::hwGponProfOntDiscoveryAlarmTrap /usr/local/bin/snmphandler_general.py HUAWEI-XPON-TRAP-MIB::hwGponProfOntDiscoveryAlarmTrap

在python腳本里引用以下內容,具體python腳本就不寫了

SLACK_INCOMING_WEB_HOOK = "https://hooks.slack.com/services/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mgC"
SLACK_INCOMING_USER = "snmp-bot"
SLACK_INCOMING_CHANNEL = "#snmptrap"
...
def post_to_slack(text):
    payload = {
        "text": text,
        "username": SLACK_INCOMING_USER,
        "channel": SLACK_INCOMING_CHANNEL,
    }
    req = requests.post(SLACK_INCOMING_WEB_HOOK, json.dumps(payload), headers={'content-type': 'application/json'}) #request to post the message
...
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章