IT/기초 지식

[네트워크/Linux] SNMP와 snmpget, snmpwalk 명령어

개발자 두더지 2020. 10. 22. 17:28
728x90

SNMP란?


 SNMP(Simple Network Management Protocol)이란 DARPA 모델에 준거한 IP네트워크 상에 연결된 기기종을 네트워크 경유로 감시, 제약하기 위한 통신프로토콜이다.

매니저와 에이전트

 SNMP를 통한 네트워크 관리는 매니저와 관리대상 기계에 상주하는 에이전트와의 사이의 UDP통신에 의해 실현된다.

 SNMP 매니저는 풀링에 의해 상시 정보를 취득하고 있다. 5분 간격으로 정기적으로 정보를 얻는 것이 가능해 상시 감독을 하고 있는 것과 같은 결과를 얻게 된다. 여기서 "풀링"이란 SNMP GetRequest와 SNMPGetResponse를 정기적으로 실행하는 것이다. 풀링에는 포트 161가 사용된다.

 그리고 SNMP트랩은 에이전트쪽에서 액션이 일어났을 때나 이벤트가 발생하였을 때 포트162를 사용하여 감시한다.

 한편 SNMP 에이전트는 네트워크의 기계에는 많이 설치되어 있으므로,  초기설정만으로 사용할 수 있게 되는 경우가 많다. 네트워크 기계뿐만 아니라, Windows머신에도 SNMP 에이전트가 있으므로 간단히 기동할 수 있다.

 매니저로부터의 리퀘스트에대해 에이전트는 response를 돌려준다. 또한 기계가 재부팅 등 특별한 사정이 발생했을 때는 에이전트로부터 매니저에게 trap을 보낸다.

MIB란?

  MIB(Management Information Base)는 SNMP에 대응하는 네트워크 기계에 존재하는데 이러한 네트워크 기계에 대한 관리 정보의 데이터 베이스이다. MIB의 구성은 트리 구성으로 root로부터 노드의 숫자를 순서대로 붙여 각각의 MIB정보를 임의로 식별할 수 있다.

 매니저로부터의 리퀘스트에 대해 에이전트는 MIB내의 정보를 돌려준다. 반대로 말하자면, MIB에 정의된 정보만 매니터자 직접 취득하는 것은 불가능하다.

OID란?

 MIB에 저장되어있는 각각의 관리정보를 오브젝트(Object)라고 부른다. OID(Obejct IDentifier)이란 하나 하나의 객체를 구분하기 위한 식별자로 "객체 식별자"라고 부르기도 한다. 앞서 말했듯 MIB에서는 객체를 트리 구성으로 관리하고 있다.

root
|
+-(0)
+-(1)iso -+-(1)
+-(2)     +-(2)
+- .      +-(3)org -+-(1)
+- .      +-(4)     +-(2)
          +- .      +-(3)
          +- .      +-(4)
                    +-(5)
                    +-(6)dod -+-(1)internet-+-(1)
                    +-(7)     +-(2)         +-(2)mgmt-+-(1)mib-2-+-(1)system-+-(1)sysDescr
                    +- .      +- .          +-(3)     +-(2)      +-(2)       +-(2)sysObjectID
                    +- .      +- .          +- .      +- .       +- .        +-(3)sysUpTime
                                            +- .      +- .       +- .        +-(4)sysContact
                                                                             +-(5)sysName
                                                                             +-(6)sysLocation
                                                                             +-(7)sysServices

 OID는 예를 들어 ".1.3.6.1.2.1.1"와 같이 점(.)으로 구분된 숫자로써 표시된다. 점으로 구분된 각 숫자는 객체의 트리 구성의 가지에 대응 한다. 예를 들어 ".1.3.6.1.2.1.1"는 sysDescr, 즉 기계에 대한 설명 문자열을 의미한다. 

 또한, 실제로 매니저가 에이전에 대해 리퀘스트를 발행할 때 OID를 지정하는 경우, 객체의 뒤에 인덱스 번호를 지정할 필요가 있다. 기계에 하나 밖에 존재하지 않는 객체의 경우는 인덱스는 0이 된다. 예를 들어 sysDescr는 기계에 하나밖에 존재하지 않기 때문에 ".1.3.6.1.2.1.1.0"으로 지정한다. 네트워크 인터페이스의 수만 다른 정보가 존재하는 듯한 객체의 경우 등은 각각의 정보를 취득하기 위해 1개 이상의 인덱스를 지정할 필요가 있다.

커뮤니티명

 커뮤니티명은 매니저와 에이전트 간의 연락으로 패스워드와 같은 역할을 한다. 즉 매니저로부터 에이전트에 리퀘스트를 발행할 때, 올바른 커뮤니티명을 지정하지 않으면 에이전트쪽에서는 올바르지 않은 접근이라고 판단한다.

 

 

snmp get 명령어


snmp get명령어는 하나의 MIB를 읽어들일 때에 사용한다. snmp get의 문법은 다음과 같다.

명령어구문
snmpget -v2c -c <커뮤니티명> <IP> <OID>

 

 

snmpwalk명령어


 snmpwalk 명령어를 사용하면 각종 서브 트리의 MIB를 확인할 수 있다. snmpwalk 명령어로 서브 트리 아래의 모든 MIB를 한번에 읽어들이는 것도 가능하다. 

명령어 구문
snmpwalk -v [snmp_version] -c [community_name] [host] [oid]

ex)
snmpwalk -v 2c -c public localhost .1.3.6.1.4.1.2021.9.1.2.1

 구글링해본 결과 snmpwalk쪽을 더 선호하는 듯하다. 그 이유는 아래와 같이 snmpget의 경우 지정한 OID가 존재하지 않으면 어떠한 값도 돌려주지 않는 모양이다.

[root@localhost ~]# snmpget -v 2c -c public localhost .1.3.6.1.2.1.1.5
SNMPv2-MIB::sysName = No Such Instance currently exists at this OID
[root@localhost ~]# 
[root@localhost ~]# snmpget -v 2c -c public localhost .1.3.6.1.2.1.1.5.0
SNMPv2-MIB::sysName.0 = STRING: sso.test.co.jp
[root@localhost ~]# 
[root@localhost ~]# snmpwalk -v 2c -c public localhost .1.3.6.1.2.1.1.5
SNMPv2-MIB::sysName.0 = STRING: sso.test.co.jp

 

 

사용예


전부 출력하고 싶을 때

OID없이 실행하면 모두 출력해줄 것 같지만 그렇지 않다. "."을 붙어 root 아래 전부를 원한다고 인식시켜줘야한다.

[root@localhost ~]# snmpwalk -v 2c -c public localhost | wc -l
4455
[root@localhost ~]# snmpwalk -v 2c -c public localhost .1 | wc -l
5994
[root@localhost ~]# snmpwalk -v 2c -c public localhost . | wc -l
5989

MIB

snmpwalk가 사용하는 MIB에 대해서는 /usr/share/snmp/mibs/ 아래에 존재한다.

 확장자대로 단순 텍스트 파일이므로 상세한 것은 내요을 보면 된다. 

[root@localhost ~]# ls -l /usr/share/snmp/mibs/
total 1816
-rw-r--r-- 1 root root  17455 May 12  2016 AGENTX-MIB.txt
-rw-r--r-- 1 root root  50948 May 12  2016 BRIDGE-MIB.txt
-rw-r--r-- 1 root root   6331 Nov  7 05:09 COROSYNC-MIB.txt
-rw-r--r-- 1 root root  68104 May 12  2016 DISMAN-EVENT-MIB.txt
-rw-r--r-- 1 root root  24613 May 12  2016 DISMAN-SCHEDULE-MIB.txt
※이하생략

OID가 아닌 MIB로 적혀있는 항목명

OID가 아닌 MIB로 적혀있는 항목명이라도 얻을 수 있다.

[root@localhost ~]# snmpwalk -v 2c -c public localhost IP-MIB::ipAdEntAddr
IP-MIB::ipAdEntAddr.127.0.0.1 = IpAddress: 127.0.0.1
IP-MIB::ipAdEntAddr.172.16.1.130 = IpAddress: 172.16.1.130

OID는 알지말 항목명을 모르는 경우

OID로 얻으면 항목명이 표시되지만 snmptranslate를 사용하는 방법도 있다.

[root@localhost ~]# snmpwalk -v 2c -c public localhost .1.3.6.1.2.1.25.2.3.1.5.1
HOST-RESOURCES-MIB::hrStorageSize.1 = INTEGER: 2049252
[root@localhost ~]# 
[root@localhost ~]# snmptranslate .1.3.6.1.2.1.25.2.3.1.5.1
HOST-RESOURCES-MIB::hrStorageSize.1

항목의 상세정보를 알고 싶은 경우

snmptranslate -Td [oid]를 사용하면 된다.

[root@localhost ~]# snmptranslate -Td HOST-RESOURCES-MIB::hrStorageUsed
HOST-RESOURCES-MIB::hrStorageUsed
hrStorageUsed OBJECT-TYPE
  -- FROM       HOST-RESOURCES-MIB
  SYNTAX        Integer32 (0..2147483647)
  MAX-ACCESS    read-only
  STATUS        current
  DESCRIPTION   "The amount of the storage represented by this entry
        that is allocated, in units of
        hrStorageAllocationUnits."
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) host(25) hrStorage(2) hrStorageTable(3) hrStorageEntry(1) 6 }

참고자료

qiita.com/hana_shin/items/856529cdab1b46668fc2#5-snmpget%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9

qiita.com/gzock/items/0794898cd3ed68350e9b

qiita.com/Tocyuki/items/9aaae3de2858b2bfed7d

contents.patrolclarice.jp/2018/12/19/snmpwalk%E3%82%92%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%97%E3%81%A6%E3%80%81snmp%E7%9B%A3%E8%A6%96%E3%82%92%E5%AE%9F%E6%96%BD%E3%81%97%E3%82%88%E3%81%86/

ash.jp/net/snmp.htm

728x90