SNMP proxy to Sub-Agent on LINUX server 實作

上次的 snmp 測試中,測試匯入了 RADIUS 相關的幾個 MIB 檔,並用 snmptranslate 確認過 snmpd 已經可以認得我們所新匯入的 OBJECT-TYPE 與 OID了;但是,如果使用 snmpwalk 去查詢相關 OID 的值時,卻會出現查詢不到的窘境。

那麼對於一個系統不認得的 OID 要怎麼辦呢?我們來示範一下用 proxy 的選項達到這個結果。今天的範例是,在原本的 AAA Server 上,除了原本系統的 snmpd 以外,另外啟動一個 AAA 的 snmp Agent,假設這個新的 Agent 所 Listening 的 port 為 1461,那麼,目前系統上就應該有在 listening 下面的這些 ports:
[root@KHXAAAS2 ~]# netstat -an |grep 161
udp 0 0 0.0.0.0:161 0.0.0.0:*
[root@KHXAAAS2 ~]# netstat -an |grep 162
udp 0 0 0.0.0.0:162 0.0.0.0:*
unix 2 [ ACC ] STREAM LISTENING 21620 /tmp/.font-unix/fs7100

[root@KHXAAAS2 ~]# netstat -an |grep 1461
udp 0 0 :::1461 :::*
其中 0 0.0.0.0:161 是系統 snmpd 所使用的,而 0 :::1461 是新 AAA Agent 所使用。

這裡我們先列一下關於 porxy 這個 option 的用法:
proxy [-Cn CONTEXTNAME] [SNMPCMD ARGS] HOST OID [REMOTEOID]
This token specifies that any incoming requests under OID should be proxied on to another HOST instead. If a CONTEXTNAME is specified, it assigns the proxied tree to a particular context name within the local agent. This is the proper way to query multiple agents through a single proxy. Assign each remote agent to a different context name. Then you can use "snmpwalk -n contextname1" to walk one remote proxied agent and "snmpwalk -n contextname2" to walk another, assuming you are using SNMPv3 to talk to the proxy (snmpv1 and snmpv2c context mappings aren't currently supported but might be in the future). Optionally, relocate the local OID tree to the new location at the REMOTEOID. To authenticate to HOST you should use the appropriate set of SNMPCMD ARGS. See the snmpcmd(1) manual page for details.
接下來我們編輯一下 snmp 的設定檔,將下面這一行加到檔案的最後就可以:(這一行便是要將 OID 為 1.3.6.1.2.1.67 以下的轉給 localhost:1461 也就是 AAA Agent 來處理啦 )
[root@KHXAAAS2 ~]# vi /etc/snmp/snmpd.conf
#前面這些設定就省略不列出來了...
proxy -v 2c -c public localhost:1461 .1.3.6.1.2.1.67
~
~
"/etc/snmp/snmpd.conf" 481L, 19481C written
存檔離開,再重啟 snmpd 之前我們先觀察一下目前 snmpwalk 的結果:
首先這是經由 snmpd:161 查詢 SNMPv2-MIB::sysDescr.0 的結果:
[root@KHXAAAS2 ~]# snmpwalk -v 2c -c public localhost .1.3.6.1.2.1.1.1
SNMPv2-MIB::sysDescr.0 = STRING: Linux KHXAAAS2 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:58:04 EST 2007 i686
接著這是經由 snmpd:161 查詢 RADIUS-AUTH-SERVER-MIB::radiusAuthServIdent.0 的結果:
[root@KHXAAAS2 ~]# snmpwalk -v 2c -c public localhost .1.3.6.1.2.1.67.1.1.1.1.1.0
RADIUS-AUTH-SERVER-MIB::radiusAuthServIdent.0 = No Such Object available on this agent at this OID
很明顯的目前透過 snmpd 的 161 port 是查詢不到 RADIUS-AUTH-SERVER-MIB::radiusAuthServIdent.0 的內容的;
接下來我們再試一下經由 AAA Agent:1461 查詢 RADIUS-AUTH-SERVER-MIB::radiusAuthServIdent.0 的結果:
[root@KHXAAAS2 ~]# snmpwalk -v 2c -c public localhost:1461 .1.3.6.1.2.1.67.1.1.1.1.1.0
RADIUS-AUTH-SERVER-MIB::radiusAuthServIdent.0 = STRING: Alcatel-Lucent 8950 AAA PolicyServer, Version 6.0.1
所以目前的狀況就是,分開以 port 161 和 1461 只可以分別查詢到不同 OID 的值;

接著我們重啟一下 snmpd 服務,讓剛剛的 proxy 設定讀進去:
[root@KHXAAAS2 ~]# service snmpd restart
Stopping snmpd: [ OK ]
Starting snmpd: [ OK ]
好了,讓我們再試一次吧:
[root@KHXAAAS2 ~]# snmpwalk -v 2c -c public localhost .1.3.6.1.2.1.67.1.1.1.1.1.0
RADIUS-AUTH-SERVER-MIB::radiusAuthServIdent.0 = STRING: Alcatel-Lucent 8950 AAA PolicyServer, Version 6.0.1
[root@KHXAAAS2 ~]# snmpwalk -v 2c -c public localhost:1461 .1.3.6.1.2.1.67.1.1.1.1.1.0
RADIUS-AUTH-SERVER-MIB::radiusAuthServIdent.0 = STRING: Alcatel-Lucent 8950 AAA PolicyServer, Version 6.0.1
很明顯的,在加上這一行之後,直接查詢 snmpd:161 已經可以看到跟查詢 AAA Agent:1461 相同的結果囉~

這裡有兩篇 snmpd 相關 command 的詳細使用說明可以參考喔:
http://pwet.fr/man/linux/formats/snmp/snmpd_conf
http://pwet.fr/man/linux/commandes/snmpcmd
(詳全文...)

SNMP 匯入新 MIB on LINUX server

這次我們要測試的機器仍然是 RHEL ES4U6 的環境,已經裝好相關的 net-snmp (net-snmp-5.1.2-11.EL4.11) 程式,下面列出測試要匯入的為 RADIUS 相關的幾個 MIB 檔:
RADIUS-AUTH-SERVER-MIB.txt
RADIUS-AUTH-CLIENT-MIB.txt
RADIUS-ACC-SERVER-MIB.txt
RADIUS-ACC-CLIENT-MIB.txt
RADIUS-DYNAUTH-SERVER-MIB.txt
RADIUS-DYNAUTH-CLIENT-MIB.txt
先用 snmptranslate 來確認一下 snmpd 是否可以認得我們要匯入的 OBJECT-TYPE 與 OID:
[root@KHXAAAS2 mibs]# snmptranslate -On -IR radiusAuthServMIBCompliance
Unknown object identifier: radiusAuthServMIBCompliance
[root@KHXAAAS2 mibs]# snmptranslate -Td .1.3.6.1.2.1.67.1.1.2.1.1
SNMPv2-SMI::mib-2.67.1.1.2.1.1
mib-2 OBJECT-TYPE
-- FROM SNMPv2-SMI, RFC1213-MIB
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) 67 1 1 2 1 1 }
看起來目前是翻譯不出我們所要查 RADIUS 相關的 OBJECT-TYPE 與 OID,好了,接下來就是這次的工作囉:

首先,我們將 RADIUS 這幾個 MIB 檔複製到 /usr/share/snmp/mibs 底下:
[root@KHXAAAS2 ~] mkdir -p $HOME/.snmp
[root@KHXAAAS2 ~] cp -p /tmp/RADIUS* /usr/share/snmp/mibs/
接著就是告訴 snmpd 去 load 這些 MIB:

有兩種方式,暫時測試可用第一種方法,只對目前的 session 有效:
[root@KHXAAAS2 ~] export MIBS=+MY-MIB
或者是第二種方法:
[root@KHXAAAS2 ~] echo "mibs +RADIUS-AUTH-SERVER-MIB" >> $HOME/.snmp/snmp.conf
[root@KHXAAAS2 ~] echo "mibs +RADIUS-AUTH-CLIENT-MIB" >> $HOME/.snmp/snmp.conf
[root@KHXAAAS2 ~] echo "mibs +RADIUS-ACC-SERVER-MIB" >> $HOME/.snmp/snmp.conf
[root@KHXAAAS2 ~] echo "mibs +RADIUS-ACC-CLIENT-MIB" >> $HOME/.snmp/snmp.conf
[root@KHXAAAS2 ~] echo "mibs +RADIUS-DYNAUTH-SERVER-MIB" >> $HOME/.snmp/snmp.conf
[root@KHXAAAS2 ~] echo "mibs +RADIUS-DYNAUTH-CLIENT-MIB" >> $HOME/.snmp/snmp.conf
or
[root@KHXAAAS2 ~] echo "mibs +ALL" >> $HOME/.snmp/snmp.conf
也是可以,用 ALL 會把所有可用的 MIB 都 LOAD 進來,當然包括剛剛的幾個測試 MIB 檔,不過速度上會比較慢喔。(注意喔,如果是用
echo "mibs +RADIUS-DYNAUTH-CLIENT-MIB" 的方式,要記得把後面的 .txt 去掉喔~)

好了,先看一下 MIBDIR 的目錄下有些什麼囉:
[root@KHXAAAS2 mibs]# pwd
/usr/share/snmp/mibs
[root@KHXAAAS2 mibs]# ls -alrt
total 1740
-rw-r--r-- 1 root root 38034 Jul 19 2007 SNMPv2-TC.txt
-rw-r--r-- 1 root root 8924 Jul 19 2007 SNMPv2-SMI.txt
-rw-r--r-- 1 root root 29305 Jul 19 2007 SNMPv2-MIB.txt
-rw-r--r-- 1 root root 8263 Jul 19 2007 SNMPv2-CONF.txt
-rw-r--r-- 1 root root 9106 Jul 19 2007 SNMP-PROXY-MIB.txt
-rw-r--r-- 1 root root 1174 Jul 19 2007 RFC-1215.txt
-rw-r--r-- 1 root root 79667 Jul 19 2007 RFC1213-MIB.txt
-rw-r--r-- 1 root root 3067 Jul 19 2007 RFC1155-SMI.txt
-rw-r--r-- 1 root root 71691 Jul 19 2007 IF-MIB.txt
-rw-r--r-- 1 root root 5066 Jul 19 2007 IF-INVERTED-STACK-MIB.txt
-rw-r--r-- 1 root root 84492 Jul 19 2007 EtherLike-MIB.txt
-rw-r--r-- 1 root root 4076 Jul 19 2007 UDP-MIB.txt
-rw-r--r-- 1 root root 10765 Jul 19 2007 TCP-MIB.txt
-rw-r--r-- 1 root root 2205 Jul 19 2007 SNMP-USM-AES-MIB.txt
-rw-r--r-- 1 root root 147822 Jul 19 2007 RMON-MIB.txt
-rw-r--r-- 1 root root 24723 Jul 19 2007 NOTIFICATION-LOG-MIB.txt
-rw-r--r-- 1 root root 4400 Jul 19 2007 IPV6-UDP-MIB.txt
-rw-r--r-- 1 root root 2367 Jul 19 2007 IPV6-TC.txt
-rw-r--r-- 1 root root 7257 Jul 19 2007 IPV6-TCP-MIB.txt
-rw-r--r-- 1 root root 48703 Jul 19 2007 IPV6-MIB.txt
-rw-r--r-- 1 root root 15936 Jul 19 2007 IPV6-ICMP-MIB.txt
-rw-r--r-- 1 root root 23499 Jul 19 2007 IP-MIB.txt
-rw-r--r-- 1 root root 26781 Jul 19 2007 IP-FORWARD-MIB.txt
-rw-r--r-- 1 root root 12517 Jul 19 2007 INET-ADDRESS-MIB.txt
-rw-r--r-- 1 root root 4660 Jul 19 2007 HCNUM-TC.txt
-rw-r--r-- 1 root root 64311 Jul 19 2007 DISMAN-SCRIPT-MIB.txt
-rw-r--r-- 1 root root 24613 Jul 19 2007 DISMAN-SCHEDULE-MIB.txt
-rw-r--r-- 1 root root 17455 Jul 19 2007 AGENTX-MIB.txt
-rw-r--r-- 1 root root 35242 Jul 19 2007 UCD-SNMP-MIB.txt
-rw-r--r-- 1 root root 8118 Jul 19 2007 UCD-IPFWACC-MIB.txt
-rw-r--r-- 1 root root 2163 Jul 19 2007 UCD-DEMO-MIB.txt
-rw-r--r-- 1 root root 22769 Jul 19 2007 SNMP-TARGET-MIB.txt
-rw-r--r-- 1 root root 4628 Jul 19 2007 SMUX-MIB.txt
-rw-r--r-- 1 root root 4318 Jul 19 2007 NET-SNMP-TC.txt
-rw-r--r-- 1 root root 2036 Jul 19 2007 NET-SNMP-MIB.txt
-rw-r--r-- 1 root root 6741 Jul 19 2007 NET-SNMP-EXAMPLES-MIB.txt
-rw-r--r-- 1 root root 15650 Jul 19 2007 NET-SNMP-AGENT-MIB.txt
-rw-r--r-- 1 root root 4299 Jul 19 2007 IANA-LANGUAGE-MIB.txt
-rw-r--r-- 1 root root 20126 Jul 19 2007 IANAifType-MIB.txt
-rw-r--r-- 1 root root 4743 Jul 19 2007 IANA-ADDRESS-FAMILY-NUMBERS-MIB.txt
-rw-r--r-- 1 root root 10583 Jul 19 2007 HOST-RESOURCES-TYPES.txt
-rw-r--r-- 1 root root 52544 Jul 19 2007 HOST-RESOURCES-MIB.txt
-rw-r--r-- 1 root root 3010 Jul 19 2007 UCD-DLMOD-MIB.txt
-rw-r--r-- 1 root root 3198 Jul 19 2007 UCD-DISKIO-MIB.txt
-rw-r--r-- 1 root root 34162 Jul 19 2007 SNMP-VIEW-BASED-ACM-MIB.txt
-rw-r--r-- 1 root root 5775 Jul 19 2007 SNMPv2-TM.txt
-rw-r--r-- 1 root root 39201 Jul 19 2007 SNMP-USER-BASED-SM-MIB.txt
-rw-r--r-- 1 root root 20014 Jul 19 2007 SNMP-NOTIFICATION-MIB.txt
-rw-r--r-- 1 root root 5496 Jul 19 2007 SNMP-MPD-MIB.txt
-rw-r--r-- 1 root root 22342 Jul 19 2007 SNMP-FRAMEWORK-MIB.txt
-rw-r--r-- 1 root root 15490 Jul 19 2007 SNMP-COMMUNITY-MIB.txt
-rw-r--r-- 1 root root 5931 Jul 19 2007 LM-SENSORS-MIB.txt
-rw-r--r-- 1 root root 68177 Jul 19 2007 DISMAN-EVENT-MIB.txt
drwxr-xr-x 4 root root 4096 Jun 12 04:28 ..
-rw-rw---- 1 root root 28446 Aug 29 00:32 RADIUS-AUTH-SERVER-MIB.txt
-rw-rw---- 1 root root 26373 Aug 29 00:32 RADIUS-AUTH-CLIENT-MIB.txt
-rw-rw---- 1 root root 26281 Aug 29 00:32 RADIUS-ACC-SERVER-MIB.txt
-rw-rw---- 1 root root 23747 Aug 29 00:32 RADIUS-ACC-CLIENT-MIB.txt
-rw-rw---- 1 root root 29247 Aug 29 00:32 RADIUS-DYNAUTH-SERVER-MIB.txt
-rw-rw---- 1 root root 31892 Aug 29 00:32 RADIUS-DYNAUTH-CLIENT-MIB.txt
drwxr-xr-x 2 root root 4096 Oct 2 10:16 .
-rw-r--r-- 1 root root 2058 Oct 2 10:16 .index
不用重起 snmpd 的服務,我們直接再查詢一次試試看:

[root@KHXAAAS2 mibs]# snmptranslate -On -IR radiusAuthServMIBCompliance
.1.3.6.1.2.1.67.1.1.2.1.1
[root@KHXAAAS2 mibs]# snmptranslate -Td .1.3.6.1.2.1.67.1.1.2.1.1
RADIUS-AUTH-SERVER-MIB::radiusAuthServMIBCompliance
radiusAuthServMIBCompliance MODULE-COMPLIANCE
-- FROM RADIUS-AUTH-SERVER-MIB
DESCRIPTION "The compliance statement for authentication
servers implementing the RADIUS Authentication
Server MIB. Implementation of this module is for
IPv4-only entities, or for backwards compatibility
use with entities that support both IPv4 and
IPv6."
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) radiusMIB(67) radiusAuthentication(1) radiusAuthServMIB(1) radiusAuthServMIBConformance(2) radiusAuthServMIBCompliances(1) 1 }
果然就可以查詢的到 RADIUS 的 OBJECT-TYPE 與 OID 囉...

參考資料:Net-SNMP FAQ How do I add a MIB
(詳全文...)

SNMP on LINUX server 實作(二)--補遺

回到公司測試另外一台機器時才發現,噫?這台機器上怎麼沒有 snmpwalk 之類的指令可以用呢?同樣是 RHEL ES4U6 啊,其實這個問題很簡單,只是因為這一台機器當初安裝只選了部分安裝,所以關於 snmp 的部分僅安裝了 net-snmp 的 package,卻沒有安裝相關的 utility 罷了。

先看一下目前系統上關於 snmp 的指令有哪些:
[root@KHXAAAS2 ~]# ls -al /usr/sbin/snmp*
-rwxr-xr-x 1 root root 25180 Jul 19 2007 /usr/sbin/snmpd
-rwxr-xr-x 1 root root 21700 Jul 19 2007 /usr/sbin/snmptrapd
[root@KHXAAAS2 ~]# ls -al /usr/bin/snmp*
ls: /usr/bin/snmp*: No such file or directory
可以看得出目前只有兩個 snmp daemon 而已,其餘相關的指令都不存在。
再檢查一下目前所安裝的 rpm:
[root@KHXAAAS2 ~]# rpm -qa|grep net-snmp
net-snmp-libs-5.1.2-11.EL4.11
net-snmp-5.1.2-11.EL4.11
[root@KHXAAAS2 ~]#
果然沒有看到 net-snmp-utils-5.1.2-11.EL4.11 的影子啊...

到 Google 上搜尋一下或者直接到 RPM Search 去抓一個回來用吧...



這裡列出這個 RPM 檔的 Requires :
perl(Net::SMTP)
libnetsnmp.so.5
perl(Getopt::Std)
libc.so.6(GLIBC_2.0)
rpmlib(PayloadFilesHavePrefix) <= 4.0-1 /usr/bin/perl libcrypto.so.4 libc.so.6(GLIBC_2.3) libelf.so.1 libm.so.6 rpmlib(CompressedFileNames) <= 3.0.4-1 libc.so.6(GLIBC_2.1) net-snmp = 5.1.2 perl(File::Copy) perl(Data::Dumper) perl(IO::File) perl(Term::ReadLine) libc.so.6
下面是這個 RPM 檔中的可用指令部分:(Content of RPM :)
/usr/bin/encode_keychange
/usr/bin/fixproc
/usr/bin/ipf-mod.pl
/usr/bin/snmpbulkget
/usr/bin/snmpbulkwalk
/usr/bin/snmpconf
/usr/bin/snmpdelta
/usr/bin/snmpdf
/usr/bin/snmpget
/usr/bin/snmpgetnext
/usr/bin/snmpinform
/usr/bin/snmpnetstat
/usr/bin/snmpset
/usr/bin/snmpstatus
/usr/bin/snmptable
/usr/bin/snmptest
/usr/bin/snmptranslate
/usr/bin/snmptrap
/usr/bin/snmpusm
/usr/bin/snmpvacm
/usr/bin/snmpwalk
/usr/bin/traptoemail


抓到了 net-snmp-utils-5.1.2-11.EL4.11.i386.rpm 之後直接 ftp 到待測機器上吧,這次開個目錄 /rpm 專門擺放 RPM packages 好了:
[root@KHXAAAS2 ~]# cd /rpm
[root@KHXAAAS2 rpm]# ls -al
total 184
drwxr-xr-x 2 root root 4096 Sep 24 18:15 .
drwxr-xr-x 27 root root 4096 Sep 24 18:15 ..
-rw-r--r-- 1 root root 162078 Sep 24 18:15 net-snmp-utils-5.1.2-11.EL4.11.i386.rpm
接下來就直接安裝吧:
[root@KHXAAAS2 rpm]# rpm -Uvh net-snmp-utils-5.1.2-11.EL4.11.i386.rpm
warning: net-snmp-utils-5.1.2-11.EL4.11.i386.rpm: V3 DSA signature: NOKEY, key ID 1d1e034b
Preparing... ########################################### [100%]
1:net-snmp-utils ########################################### [100%]
好了,這時我們再檢查一次 snmp 相關的指令吧:
[root@KHXAAAS2 rpm]# ls -al /usr/sbin/snmp*
-rwxr-xr-x 1 root root 25180 Jul 19 2007 /usr/sbin/snmpd
-rwxr-xr-x 1 root root 21700 Jul 19 2007 /usr/sbin/snmptrapd
[root@KHXAAAS2 rpm]# ls -al /usr/bin/snmp*
-rwxr-xr-x 1 root root 6820 May 3 2007 /usr/bin/snmpbulkget
-rwxr-xr-x 1 root root 8560 May 3 2007 /usr/bin/snmpbulkwalk
-rwxr-xr-x 1 root root 21177 May 3 2007 /usr/bin/snmpconf
-rwxr-xr-x 1 root root 15076 May 3 2007 /usr/bin/snmpdelta
-rwxr-xr-x 1 root root 8804 May 3 2007 /usr/bin/snmpdf
-rwxr-xr-x 1 root root 6504 May 3 2007 /usr/bin/snmpget
-rwxr-xr-x 1 root root 6368 May 3 2007 /usr/bin/snmpgetnext
lrwxrwxrwx 1 root root 8 Sep 24 18:16 /usr/bin/snmpinform -> snmptrap
-rwxr-xr-x 1 root root 42948 May 3 2007 /usr/bin/snmpnetstat
-rwxr-xr-x 1 root root 7960 May 3 2007 /usr/bin/snmpset
-rwxr-xr-x 1 root root 10556 May 3 2007 /usr/bin/snmpstatus
-rwxr-xr-x 1 root root 18148 May 3 2007 /usr/bin/snmptable
-rwxr-xr-x 1 root root 11516 May 3 2007 /usr/bin/snmptest
-rwxr-xr-x 1 root root 10912 May 3 2007 /usr/bin/snmptranslate
-rwxr-xr-x 1 root root 9272 May 3 2007 /usr/bin/snmptrap
-rwxr-xr-x 1 root root 17612 May 3 2007 /usr/bin/snmpusm
-rwxr-xr-x 1 root root 15916 May 3 2007 /usr/bin/snmpvacm
-rwxr-xr-x 1 root root 8352 May 3 2007 /usr/bin/snmpwalk
[root@KHXAAAS2 rpm]#
果然多了不少有用的指令囉~

[root@KHXAAAS2 rpm]# rpm -qa|grep net-snmp
net-snmp-libs-5.1.2-11.EL4.11
net-snmp-5.1.2-11.EL4.11
net-snmp-utils-5.1.2-11.EL4.11

各個指令的詳細說明可以參考 Net-SNMP 官方網站的教學:
http://net-snmp.sourceforge.net/wiki/index.php/Tutorials
(詳全文...)