SNMP

SNMP v1, v2c, v3에 응답하는 네트워크 장비(UPS, PDU, 스위치, 라우터, 항온항습기, 환경 센서)를 각 태그의 읽기 주기마다 에이전트를 통해 읽습니다. "SNMP 에이전트" 카드, 숫자나 표준 이름으로 쓰는 태그의 OID, 각 객체를 읽는 데이터 형식, 읽기와 쓰기, 에이전트의 객체를 찾는 탐색, 그리고 두 개의 완전한 예입니다.

Markdown으로 보기

SNMP 드라이버는 기계실의 장비를 그 SNMP 에이전트를 통해 읽고 씁니다. UPS, PDU, 스위치, 라우터, 항온항습기, 온도나 습도 센서입니다. 서버의 관리 컨트롤러를 읽는 Redfish 드라이버를 보완하며, 둘이 함께 기계실 전체를 다룹니다. 각 태그는 에이전트의 객체 하나를 upsBatteryStatus.0이나 ifHCInOctets.2 같은 OID로 읽고, 값은 다른 모든 태그의 값과 같은 곳에 도착합니다. Logic, 대시보드, 그리고 Process 시험대의 실행 기록입니다.

묻는 쪽은 스테이션입니다. 각 태그는 읽기 주기마다 SNMPv1, SNMPv2c, SNMPv3 중 하나로 읽히며, "장치" 카드의 읽기 주기 (ms)는 다른 모든 드라이버와 똑같이 작동하고 각 태그가 재정의할 수 있습니다. 장비가 스스로 보내는 것, 즉 트랩은 받지 않습니다. 알아 둘 한계를 보십시오.

이 드라이버의 장치는 에이전트 하나이며, 그 호스트의 UDP 포트 161로 연결합니다. 장치는 드라이버 아래에 놓이고 폴더로 정리할 수 있으며, 시리얼 회선도 브로커도 없는 다른 모든 드라이버와 마찬가지로 드라이버 → 폴더 → 장치 → 태그가 됩니다.

드라이버 페이지

Connector 구성 권한이 있으면, 페이지에는 이 드라이버 고유의 스캔 범위 카드가 있어 장치 검색이 탐색할 에이전트와 하위 트리를 담습니다(장치 검색을 보십시오). 그 아래에는 다른 모든 드라이버와 같은 장치 표(장치 표를 보십시오)가 있으며, 제목 오른쪽의 장치 추가로 늘립니다. 비어 있으면 "아직 장치가 없습니다."라고 표시합니다. 드라이버 막대에는 장치 검색이 있으며, 스캔 범위 카드가 다 채워질 때까지 회색입니다.

장치

연결

칸 의미 기본값
호스트 에이전트의 호스트 이름이나 IP 주소. 비어 있음
포트 에이전트가 응답하는 UDP 포트로, 1에서 65535. 칸이 비어 있으면 161이 회색으로 표시되고 에이전트에는 그 포트로 묻습니다. 161

새 장치에는 호스트가 없습니다. "호스트를 아직 입력하지 않음"으로 표시하며, 호스트가 생길 때까지 아무것도 보내지 않습니다. 머리글에 보이는 Base URI는 실행 시점의 주소이며, 버전, 적용 중인 SNMPv3 보안, 응답 제한 시간, 재시도 횟수를 담습니다. snmp://192.168.10.40:161?version=2c&timeoutMs=2000&retries=1 또는 snmp://192.168.10.2:161?version=3&security=authPriv&auth=sha256&priv=aes128&timeoutMs=2000&retries=1입니다. community, 사용자, 비밀번호는 결코 담지 않습니다.

"SNMP 에이전트" 카드

"연결" 카드 아래의 SNMP 에이전트 카드는 에이전트에 어떻게 묻는지를 보여 줍니다. 그려지는 칸은 버전과, SNMPv3에서는 보안 수준을 따릅니다.

칸 표시 의미 기본값
SNMP 버전 항상 SNMPv1, SNMPv2c, SNMPv3 중 하나이며, 각각 아래에 한 줄이 나옵니다. SNMPv1: "SNMPv1에는 64비트 카운터가 없으며, 에이전트에 없는 객체가 있으면 요청 전체가 거부되어 드라이버가 그 객체를 빼고 다시 요청합니다." SNMPv2c: "SNMPv2c는 64비트 카운터를 읽으며, 에이전트에 없는 객체는 그 태그만 실패합니다. 대부분의 장비가 응답합니다." SNMPv3: "SNMPv3는 사용자로 인증하며, 보안 수준에 따라 메시지에 서명하고 암호화합니다." SNMPv2c
Community SNMPv1, SNMPv2c 에이전트가 응답하는 community로, 최대 255바이트. 입력을 숨기는 칸이며, 비어 있으면 public을 힌트로만 보여 주고 값으로 쓰지 않습니다. 아래에는 "에이전트는 받지 않는 community의 요청을 무시하므로, 잘못된 community는 응답하지 않는 에이전트처럼 보입니다." 비어 있음
SNMPv3 사용자 SNMPv3 에이전트가 가진 사용자로, 최대 32자. 비어 있음
보안 수준 SNMPv3 서명 및 암호화(authPriv): "모든 메시지를 인증 비밀번호로 서명하고 암호화 비밀번호로 암호화합니다." 서명만(authNoPriv): "모든 메시지를 인증 비밀번호로 서명하고 암호화하지 않은 채 보냅니다." 서명도 암호화도 없음(noAuthNoPriv): "사용자 이름만 보냅니다. 서명도 암호화도 하지 않습니다." 서명 및 암호화(authPriv)
인증 프로토콜 SNMPv3, 서명함 MD5, SHA-1, SHA-256, SHA-384, SHA-512. SHA-1
인증 비밀번호 SNMPv3, 서명함 메시지에 서명하는 비밀번호. 비어 있음
암호화 프로토콜 SNMPv3, authPriv DES, AES-128, AES-192, AES-256. AES-128
암호화 비밀번호 SNMPv3, authPriv 메시지를 암호화하는 비밀번호. 비어 있음
응답 제한 시간 (ms) 항상 100에서 60000: "요청을 다시 보내기 전에 에이전트의 응답을 기다리는 시간입니다." 2000
재시도 횟수 항상 0에서 5: "응답이 없는 요청을 다시 보내는 횟수입니다. 이를 넘으면 장치가 오프라인으로 간주됩니다." 1

두 비밀번호 아래에는 "각 비밀번호는 에이전트가 이 사용자에게 설정한 것이며 8자 이상입니다."가 나옵니다. 사용자, 보안 수준, 두 프로토콜은 장비 자체의 설정 페이지에서 에이전트가 그 사용자에게 설정해 둔 것입니다. 스테이션은 이를 에이전트에 물어볼 수 없습니다. MD5, SHA-1, DES를 고를 수 있는 것은 설치된 많은 장비가 그보다 새것을 받지 않기 때문입니다.

아직 입력하지 않은 자격 증명은 잘못이 아닙니다. 장치는 저장되고, 그것이 생길 때까지 드라이버는 에이전트에 아무것도 보내지 않으며, 카드 아래의 차분한 한 줄이 무엇이 빠졌는지 알려 줍니다. 다음 중 첫 번째 것입니다.

빠진 것 카드의 표시
community(SNMPv1, SNMPv2c) "에이전트가 응답하는 community를 입력하십시오. 그전까지 장치는 아무것도 보내지 않습니다."
사용자(SNMPv3) "SNMPv3 사용자를 입력하십시오. 그전까지 장치는 아무것도 보내지 않습니다."
인증 비밀번호(authNoPriv, authPriv) "인증 비밀번호를 입력하십시오. 그전까지 장치는 아무것도 보내지 않습니다."
암호화 비밀번호(authPriv) "암호화 비밀번호를 입력하십시오. 그전까지 장치는 아무것도 보내지 않습니다."

호스트는 있지만 자격 증명이 아직 빠진 장치는 연결되지 않으며, 그 마지막 오류가 에이전트가 기다리는 자격 증명을 알려 줍니다. 카드가 받을 수 없는 값은 저장되지 않으며, 카드가 그 이유를 빨간색으로 보여 줍니다.

입력한 것 카드의 표시
8자 미만의 인증 비밀번호 "인증 비밀번호는 8자 이상이어야 합니다."
8자 미만의 암호화 비밀번호 "암호화 비밀번호는 8자 이상이어야 합니다."
32자를 넘는 사용자, 또는 255바이트를 넘는 community "사용자는 최대 32자, community는 최대 255바이트입니다."
100에서 60000 범위를 벗어난 응답 제한 시간, 또는 0에서 5 범위를 벗어난 재시도 횟수 칸이 적용 중인 값으로 돌아가며 "100에서 60000 사이의 숫자를 입력하십시오." 또는 "0에서 5 사이의 숫자를 입력하십시오."라고 표시합니다.

저장도 카드와 같은 규칙을 지키며, 거부할 때는 작업 기록 줄이 그렇게 알립니다. "장치 'UPS room 1'에 드라이버가 사용할 수 없는 SNMP 설정이 있습니다. 장치를 열어 패널이 표시하는 필드를 고치십시오." community와 두 비밀번호는 다른 모든 장치 자격 증명과 같은 방식으로 보관됩니다(자격 증명과 인증서를 보십시오). 입력한 Windows 계정을 위해 저장 시 보호되고, 구성 내보내기에서는 봉인되며, Base URI, 진단 로그, 에이전트의 응답에는 결코 나오지 않습니다. 다른 Windows 계정에서 입력한 것은 비어 있는 상태로 돌아오고, 장치는 한 번도 입력되지 않은 것처럼 그것을 기다립니다.

태그 주소 지정

OID

이 드라이버의 태그는 에이전트의 객체 하나를 읽습니다. 태그의 "신호원" 카드에는 OID 칸이 있고, 그 아래에 "숫자로 쓴 OID(예: 1.3.6.1.2.1.1.3.0) 또는 인스턴스를 붙인 표준 이름(예: sysUpTime.0, ifInOctets.2, upsBatteryStatus.0)"이라는 힌트가 나옵니다. 태그를 어떤 형태로 쓰든 요청이 나르는 것은 숫자입니다.

쓰는 법 읽는 법
1.3.6.1.2.1.1.3.0, .1.3.6.1.2.1.1.3.0, iso.3.6.1.2.1.1.3.0 그 숫자이며, 패널은 이것을 sysUpTime.0이라고 부릅니다.
sysUpTime.0, sysUpTime, SNMPv2-MIB::sysUpTime.0(대소문자 구분 없음) 단일 값이며, 하나뿐인 인스턴스 .0은 생략할 수 있습니다.
ifInOctets.2 테이블의 열과 그 행의 인덱스(여기서는 인터페이스 2)이며, 인덱스는 항상 씁니다.
enterprises.318.1.1.1.2.2.1.0 가지와 그 아래의 숫자입니다. 장비 고유 MIB의 객체이며, 숫자로 표시됩니다.

칸 아래에는 읽기 전용으로, OID가 두 가지 형태로 나옵니다.

표시 보여 주는 것
MIB 이름 객체의 표준 이름과 인스턴스(ifInOctets.2). 그 아래에 MIB가 객체에 대해 말하는 것, 즉 MIB, 담는 값의 종류, 쓰기를 받는지를 IF-MIB · Counter32 · 읽기 전용이나 UPS-MIB · Integer32 · 쓰기 가능처럼 보여 줍니다. 드라이버가 이름을 모르는 객체에는 "표준 이름 없음"입니다.
숫자 OID 숫자로 쓴 OID이며, 모든 요청이 나르는 것입니다.

표준 이름이 없는 객체에는 "장비 고유 MIB의 객체입니다. MIB 파일을 읽지 않으므로 숫자로 표시됩니다."라는 줄이 더해집니다. 드라이버가 읽을 수 없는 OID의 태그는 저장되지 않으며, 태그 페이지가 그 이유를 보여 줍니다.

입력한 것 태그 페이지의 표시
OID 없음 "이 드라이버에는 OID이(가) 반드시 필요합니다."
드라이버가 모르는 이름 "이 이름은 드라이버가 아는 표준 MIB 객체가 아닙니다. OID를 숫자로 쓰십시오."
행이 없는 열(ifInOctets 등) "테이블 열에는 행의 인덱스가 필요합니다(예: ifInOctets.1)."
0이 아닌 인스턴스를 가진 단일 값(sysUpTime.1 등) "단일 값의 인스턴스는 .0 하나이며 생략할 수 있습니다."
가지만 있는 것(enterprises나 ifTable 등) "트리의 가지는 값을 가리키지 않습니다. 그 아래 객체의 숫자를 쓰십시오."
2를 넘는 첫 번째 수, 40 이상의 두 번째 수, 128개를 넘는 수, 4294967295를 넘는 수 "OID는 0, 1, 2 중 하나와 40 미만의 수로 시작하며, 4294967295 이하의 수를 최대 128개 가집니다."
OID가 아닌 그 밖의 것 "OID를 숫자(예: 1.3.6.1.2.1.1.3.0) 또는 인스턴스를 붙인 표준 이름(예: sysUpTime.0)으로 쓰십시오."

저장도 같은 규칙을 지킵니다. "태그 'Battery status'이(가) SNMP 드라이버가 읽을 수 있는 OID를 가리키지 않습니다. 태그를 열어 태그 패널이 표시하는 주소를 고치십시오." 읽기 전용 줄 신호원 주소 (버스)는 드라이버가 받는 숫자를 보여 줍니다. upsBatteryStatus.0으로 쓴 태그라면 1.3.6.1.2.1.33.1.2.1.0입니다.

드라이버가 아는 이름

드라이버는 이름을 붙일 가치가 있는 표준 MIB 객체의 표 하나를 가지고 있습니다. RFC를 바탕으로 쓴 것이라 어느 스테이션에서나 이름은 같은 뜻입니다. MIB 파일은 읽지 않습니다.

MIB 이름을 붙이는 것
SNMPv2-MIB(RFC 3418) system 그룹: sysDescr, sysObjectID, sysUpTime, sysContact, sysName, sysLocation, sysServices.
IF-MIB(RFC 2863) ifNumber, 인터페이스 표(ifDescr, ifOperStatus, ifInOctets, ifOutErrors 등)와 64비트 카운터를 담은 그 확장(ifName, ifHCInOctets, ifHCOutOctets, ifHighSpeed, ifAlias).
UPS-MIB(RFC 1628) UPS의 식별, 배터리, 입력, 출력, 바이패스, 알람, 테스트, 제어, 설정: upsBatteryStatus, upsEstimatedChargeRemaining, upsOutputSource, upsOutputPercentLoad 등.
ENTITY-SENSOR-MIB(RFC 3433) 센서 표: entPhySensorType, entPhySensorScale, entPhySensorValue, entPhySensorOperStatus 등.
ENTITY-MIB(RFC 6933) 센서의 이름표가 되는 물리 엔터티의 이름, 설명, 클래스: entPhysicalName, entPhysicalDescr, entPhysicalClass.
HOST-RESOURCES-MIB(RFC 2790) 시스템(hrSystemUptime, hrSystemProcesses), 저장소 표(hrStorageUsed), 프로세서 표(hrProcessorLoad).

driver_capabilities는 모든 이름을 OID와 함께 나열합니다. 에이전트 도구를 보십시오.

데이터 형식과 접근

데이터 형식 목록에는 객체를 손실 없이 읽을 수 있는 형식만 나옵니다.

객체가 담는 것 가장 자연스럽게 읽는 형식 함께 고를 수 있는 형식
Integer32(열거형과 TruthValue 포함) Int32 Int64, Float, Double, String
Counter32, Gauge32, TimeTicks(100분의 1초 단위) UInt32 Int64, Double, String
Counter64 UInt64 Double, String
DisplayString String
바이트열, IP 주소, OID String: 바이트열은 16진수(00:1A:2B), 주소는 점으로 구분, OID는 점으로 구분
표준 이름이 없는 객체 Float Int32, UInt32, Int64, UInt64, Double, String: 읽을 때 에이전트의 응답이 정합니다

카운터는 16,777,216을 넘으면 반올림하는 Float로 고를 수 없고, Counter64는 절반을 넘는 카운트를 거부할 Int64로 고를 수 없습니다. Boolean은 결코 고를 수 없습니다. SNMP에는 참거짓 값이 없고, 그 TruthValue(1은 참, 2는 거짓)와 장비 고유의 0과 1은 같은 형식을 정반대의 두 가지로 읽게 되므로, 상태는 Int32로 읽습니다. OID가 바뀌면 새 객체가 읽을 수 없는 형식은 가장 자연스럽게 읽는 형식으로 바뀝니다. 읽을 수 없는 형식은 거부되며, 읽을 수 있는 형식이 표시됩니다. "ifHCOutOctets.2은(는) 다음 중 하나로 읽습니다: UInt64, Double, String."

MIB가 읽기 전용으로 선언한 표준 객체(카운터, sysUpTime, 상태)에는 읽기 전용만 고를 수 있으며, "접근" 칸에는 "읽기 전용: 이 값은 장치가 보고하는 값이며, 외부에서 설정하지 않습니다."가 나옵니다. MIB가 쓰기 가능으로 선언한 표준 객체(sysContact, sysName, sysLocation, ifAdminStatus, ifAlias, UPS-MIB의 테스트, 제어, 설정 객체)와 장비 고유 MIB의 객체에는 모든 접근을 고를 수 있습니다. 쓰기를 받는지는 에이전트 자신의 답입니다.

읽기

각 태그의 읽기 주기마다 스테이션은 GET을 보냅니다. 에이전트의 응답이 태그에 무엇을 보여 줄지 정합니다(값 변환 경로를 보십시오).

에이전트의 응답 읽기의 결과
값 태그 자신의 단계가 변환하기 전의, 태그 형식의 값. 숫자를 담은 텍스트(일부 장비가 쓰는 23.5)는 숫자 태그에서 읽힙니다.
태그 형식에 담을 수 없는 값(UInt32에 음수 등) 그 태그의 읽기 실패이며 이유가 붙습니다. 장치는 다른 태그를 계속 읽습니다.
noSuchObject, noSuchInstance, 또는 그 객체 하나의 오류 그 태그의 읽기 실패이며 에이전트의 응답 이름이 붙습니다. 장치는 다른 태그를 계속 읽습니다. 객체 하나가 없으면 요청 전체가 거부되는 SNMPv1에서는 드라이버가 그것을 빼고 다시 묻습니다.
모든 재시도 뒤에도 응답 제한 시간 안에 아무것도 없음 무응답입니다. 장치는 오프라인이 되었다가 다시 연결하며, 응답하지 않은 장치에 대한 태그의 방침이 표시를 정합니다. 원인에는 에이전트, 기다린 시간, 시도 횟수가 나오며, 받지 않는 community나 SNMPv3 사용자에 대해서도 에이전트가 침묵한다는 점이 덧붙습니다.
SNMPv3 보고(모르는 사용자, 잘못된 비밀번호나 프로토콜, 에이전트가 받지 않는 보안 수준), 또는 그 포트에서 기다리는 에이전트가 없다는 호스트의 응답 그 원인에 따른 연결 실패이며, 진단 로그와 장치의 마지막 오류에 나옵니다. 장치는 다시 연결합니다.

장치는 한 번에 요청 하나를 보냅니다. 읽기는 태그의 객체를 묻고, 같은 요청에서 새 응답이 없는 장치의 다른 태그들도 OID 32개까지 묻습니다. 요청이 너무 크다(tooBig)고 답하는 에이전트에는 그 뒤로 절반만 보냅니다. 이렇게 가져온 응답은 다른 태그의 읽기 주기의 절반보다 새로운 동안 그 태그 자신의 읽기에 쓰이므로, 태그 40개도 한 바퀴에 요청 한두 개로 끝납니다. SNMPv3 에이전트의 엔진은 연결마다 한 번 알아내며, 에이전트가 시간 창 밖이라고 보고한 요청은 에이전트 자신의 값으로 한 번 더 보냅니다.

쓰기

쓰는 접근의 태그는 장치의 대기열을 통해 SET을 보냅니다. 쓰기는 다른 모든 드라이버와 같은 경로를 지납니다. 쓰기 칸은 공학 값을 받고, 원시 값을 보내기 전에 변환 단계를 거꾸로 거칩니다(Connector를 보십시오). SET이 나르는 값의 종류는 에이전트가 그 객체에 마지막으로 답한 종류, 없으면 MIB가 선언한 종류, 그것도 없으면 지금 GET이 답하는 종류, 마지막으로 태그 자신의 형식입니다(Int32는 Integer32, UInt32는 Gauge32, String은 OCTET STRING). 그 종류에 담을 수 없는 값은 아무것도 보내기 전에 거부됩니다.

에이전트의 응답 쓰기의 보고
오류 없음 완료입니다. 장치가 가지고 있던 응답은 모두 버려지므로 다음 읽기는 다시 묻습니다.
오류 상태 "현장 장비가 쓰기를 거부했습니다: <reason>." 이유는 RFC 3416의 표기로 상태를 보여 줍니다. notWritable (17), wrongType (7), wrongValue (10), SNMPv1에서는 readOnly (4) 등입니다.
모든 재시도 뒤에도 응답 제한 시간 안에 아무것도 없음 "쓰기가 확인되지 않았습니다: 현장 장비가 제시간에 응답하지 않았습니다."

장치 검색

"스캔 범위" 카드

Connector 구성 권한이 있으면 드라이버 페이지에 스캔 범위 카드가 있으며, 그 아래에 "에이전트 하나의 표준 하위 트리를 탐색하고 찾은 것을 나열합니다. SNMPv3 에이전트는 장치를 통해 스캔하므로 그 장치를 스캔할 에이전트로 선택하십시오."라는 줄이 있습니다.

칸 의미 기본값
스캔할 에이전트 여기에 입력한 주소, 또는 이 드라이버의 장치를 이름으로. 장치의 에이전트는 저장된 그대로의 호스트, 포트, 버전, 설정, 자격 증명으로 읽으며, 아직 저장을 기다리는 장치의 편집은 먼저 저장합니다. SNMPv3 에이전트를 스캔하는 유일한 방법입니다. 여기에 입력한 주소
에이전트 주소 입력한 에이전트: 호스트 이름이나 IP 주소이며, 아래 포트와 다르면 콜론 뒤에 포트를 씁니다. 비어 있음
포트 입력한 에이전트: 1에서 65535. 161
SNMP 버전 입력한 에이전트: SNMPv1 또는 SNMPv2c. SNMPv2c
Community 입력한 에이전트: 에이전트가 응답하는 community이며, 입력을 숨기는 칸에 public이 힌트로 나옵니다. 아래에는 "이 스캔에만 사용합니다. 결과에서 추가한 장치는 이것을 자신의 community로 유지합니다." 비어 있음
하위 트리 각각 체크: 시스템(SNMPv2-MIB), 인터페이스(IF-MIB), 무정전 전원 장치(UPS-MIB), 센서(ENTITY-SENSOR-MIB), 호스트 자원(HOST-RESOURCES-MIB). 호스트 자원을 뺀 모두
추가로 탐색 "하위 트리 하나를 숫자나 표준 이름 아래로 더 지정합니다(예: enterprises.318). 장비 고유의 객체는 숫자로 돌아옵니다." 비어 있음

범위에 아직 빠진 것은 카드 아래에 빨간색으로 나오며, 다 채워질 때까지 장치 검색은 회색으로 남습니다.

범위 카드의 표시
주소가 없는 입력한 에이전트 "스캔할 SNMP 에이전트의 주소를 입력하십시오."
호스트가 아닌 주소의 입력한 에이전트 "'http://192.168.0.30'은(는) SNMP 에이전트의 주소가 아닙니다. 호스트 이름이나 IP 주소를 쓰고, 필요하면 포트를 붙이십시오(예: 192.168.0.30 또는 192.168.0.30:161)."
community가 없거나 255바이트를 넘는 입력한 에이전트 "에이전트가 응답하는 community를 입력하십시오(최대 255바이트)."
더 이상 없는 장치 "스캔하도록 선택한 SNMP 장치가 더 이상 없습니다. 스캔할 다른 에이전트를 선택하십시오."
호스트나 에이전트에 필요한 자격 증명이 없는 장치 "장치 'UPS room 1'에 아직 호스트나 에이전트에 필요한 자격 증명이 없습니다. 먼저 SNMP 카드를 완성하십시오."
OID가 아닌, 탐색할 하위 트리 "'vendor'은(는) 탐색할 수 있는 OID가 아닙니다. 숫자나 표준 이름 아래로 쓰십시오(예: enterprises.318)."
아무것도 체크하지 않고 아무것도 지정하지 않음 "하위 트리를 하나 이상 선택하거나 탐색할 하위 트리를 지정하십시오."

스캔할 장치에 저장할 수 없는 편집이 있으면 스캔은 시작되지 않습니다. "스캔할 장치의 편집을 저장하지 못해 장치 검색을 시작하지 않았습니다."

스캔이 제시하는 것

장치 검색은 먼저 에이전트에 이름(sysName.0)을 묻고, 이것으로 에이전트가 그 자격 증명에 응답한다는 것도 확인합니다. 그런 다음 체크한 각 하위 트리와 지정한 하위 트리를, SNMPv2c와 SNMPv3에서는 GETBULK로, SNMPv1에서는 GETNEXT로, 에이전트가 그 바깥을 답할 때까지 탐색합니다. 진행 줄은 읽은 수를 셉니다. "192.168.10.40:161의 SNMP 에이전트를 탐색하는 중: 객체 120개 발견." 스캔은 객체를 최대 2000개, 최대 60초 동안 탐색합니다. 거기서 끊기거나 도중에 에이전트가 침묵하면, 찾은 것을 남기고 그렇게 알립니다. "192.168.10.40:161의 탐색이 일찍 멈췄습니다(객체 2000개 발견). 스캔은 객체를 최대 2000개, 최대 60초 동안 탐색하며 에이전트가 응답하지 않으면 멈춥니다."

스캔은 에이전트마다 후보 하나를 제시합니다. 이름은 sysName(에이전트가 이름을 주지 않으면 장치 이름이나 호스트)이며, 읽을 때 쓴 버전, 제한 시간, 재시도 횟수를 가지고, 찾은 객체를 후보 태그로 가집니다.

찾은 객체 태그 이름 데이터 형식 접근
드라이버가 이름을 아는 단일 값 .0을 뺀 이름: sysUpTime 응답한 값을 가장 자연스럽게 읽는 형식 MIB가 쓰기 가능으로 선언하면 읽기와 쓰기, 그 밖에는 읽기 전용
드라이버가 이름을 아는 표의 열 이름과 행: ifInOctets.2 같음 같음
장비 고유 MIB의 객체 숫자: 1.3.6.1.4.1.318.1.1.1.2.2.1.0 같음 읽기 전용

어느 태그 형식에도 담을 수 없는 값은 빠집니다. 입력한 주소의 스캔에서 추가한 장치는 스캔이 쓴 community를 유지하며, 다른 장치 자격 증명과 같이 보호합니다. 장치의 스캔에서 추가한 장치는 그 장치의 자격 증명을 가집니다. 이 드라이버의 장치가 이미 에이전트를 읽고 있는 후보(스캔한 장치, 또는 같은 호스트와 포트의 다른 장치)는 이미 설정됨으로 표시됩니다. 그 카드에는 그 장치의 어느 태그도 아직 읽지 않는 객체만 나오며(이름으로 쓴 OID와 숫자로 쓴 OID는 같은 것으로 셉니다), 열기 앞의 태그로 추가가 체크한 것을 그 장치에 추가합니다. 스캔의 나머지 동작은 장치 검색에 있습니다.

장치 자신의 페이지도 드라이버 페이지 없이 같은 일을 합니다. 태그 카드 머리의 태그 검색은 그 장치의 설정과 자격 증명으로 에이전트를 순회하며, 표준 하위 트리와 태그가 이미 읽는 제조사 가지(그 아래 태그가 있으면 enterprises.318)를 따라가고, 아직 태그가 없는 객체만 제시합니다(장치의 태그 검색 참고).

예: SNMPv2c의 UPS

네트워크 카드가 달린 UPS가 192.168.10.40에서 SNMPv2c로 응답하며, 그 카드에 읽기용 community가 설정되어 있습니다. 배터리를 읽습니다.

  1. 드라이버 페이지에서 장치 추가를 누르고, 이름을 UPS room 1로 하여 호스트에 192.168.10.40을 입력하고 포트는 161 그대로 둡니다.
  2. SNMP 에이전트 카드에서 SNMPv2c를 그대로 두고, Community에 카드의 읽기용 community를 입력하고, 응답 제한 시간 (ms)은 2000, 재시도 횟수는 1 그대로 둡니다. community를 요구하던 줄이 사라집니다.
  3. 태그 추가로 Battery status, OID upsBatteryStatus.0, 데이터 형식 Int32를 만듭니다. 칸 아래에서 MIB 이름은 upsBatteryStatus.0이고 UPS-MIB · Integer32 · 읽기 전용이 나오며, 숫자 OID는 1.3.6.1.2.1.33.1.2.1.0, 접근은 읽기 전용 그대로입니다. 값은 1 unknown, 2 batteryNormal, 3 batteryLow, 4 batteryDepleted 중 하나입니다.
  4. 태그 추가로 Battery charge, OID upsEstimatedChargeRemaining.0, 데이터 형식 Int32, 단위 %를 만듭니다.
  5. UPS가 보고한다면 태그 추가로 Minutes remaining, OID upsEstimatedMinutesRemaining.0, 데이터 형식 Int32, 단위 min을 만듭니다.

Base URI는 snmp://192.168.10.40:161?version=2c&timeoutMs=2000&retries=1입니다. 에이전트는 도구로 같은 일을 합니다.

device_upsert name="UPS room 1" driver=Snmp host=192.168.10.40 snmpVersion=V2c snmpCommunity="<the UPS card's read community>"
tag_upsert device="UPS room 1" name="Battery status" address=upsBatteryStatus.0 opcUaType=Int32
tag_upsert device="UPS room 1" name="Battery charge" address=upsEstimatedChargeRemaining.0 opcUaType=Int32 unit=%
tag_upsert device="UPS room 1" name="Minutes remaining" address=upsEstimatedMinutesRemaining.0 opcUaType=Int32 unit=min

예: SNMPv3의 스위치 인터페이스 카운터

192.168.10.2의 관리형 스위치가 사용자 scada에 대해 SNMPv3로 응답하며, 스위치에는 SHA-256 인증과 AES-128 암호화가 설정되어 있습니다. 포트 2의 트래픽과 상태를 읽습니다.

  1. 장치 추가를 누르고, 이름을 Core switch, 호스트를 192.168.10.2, 포트를 161로 합니다.
  2. SNMP 에이전트 카드에서 SNMPv3를 고르고, SNMPv3 사용자에 scada를 입력하고, 서명 및 암호화(authPriv)를 그대로 두고, 인증 프로토콜에서 SHA-256을 골라 그 비밀번호를 입력하고, 암호화 프로토콜은 AES-128 그대로 두고 그 비밀번호를 입력합니다. 둘 다 스위치가 scada에 설정해 둔 것이며 8자 이상입니다.
  3. 태그 추가로 Port 2 in, OID ifHCInOctets.2를 만듭니다. 데이터 형식은 64비트 카운터를 읽는 형식인 UInt64가 되며, 목록에는 UInt64, Double, String만 나옵니다. 단위는 B입니다.
  4. 태그 추가로 Port 2 out, OID ifHCOutOctets.2, UInt64, 단위 B를 만듭니다.
  5. 태그 추가로 Port 2 state, OID ifOperStatus.2, 데이터 형식 Int32를 만듭니다. 1 up, 2 down, 3 testing, 7 lowerLayerDown입니다.

.2는 스위치의 인터페이스 인덱스로, ifName.2가 이름을 알려 주는 것입니다. 인터페이스 하위 트리를 스캔하면 모든 인터페이스가 인덱스와 함께 나열됩니다. Base URI는 snmp://192.168.10.2:161?version=3&security=authPriv&auth=sha256&priv=aes128&timeoutMs=2000&retries=1입니다. 도구에서는 객체가 읽을 수 없는 opcUaType(ifHCOutOctets.2에 Int32 등)은 읽을 수 있는 형식을 알려 주며 거부됩니다.

device_upsert name="Core switch" driver=Snmp host=192.168.10.2 snmpVersion=V3 username=scada password="<authentication password>" snmpSecurityLevel=AuthPriv snmpAuthProtocol=Sha256 snmpPrivacyProtocol=Aes128 snmpPrivacyPassword="<privacy password>"
tag_upsert device="Core switch" name="Port 2 in" address=ifHCInOctets.2 opcUaType=UInt64 unit=B
tag_upsert device="Core switch" name="Port 2 out" address=ifHCOutOctets.2 opcUaType=UInt64 unit=B
tag_upsert device="Core switch" name="Port 2 state" address=ifOperStatus.2 opcUaType=Int32

에이전트 도구

driver_capabilities는 이 드라이버를 snmp 아래에서 설명합니다. 버전과 각 버전이 받는 자격 증명, 보안 수준과 프로토콜, 응답 제한 시간과 재시도 횟수, OID를 쓰는 법, 값의 종류별 형식, 드라이버가 아는 모든 이름(MIB, OID, 쓰기를 받는지), 읽기와 쓰기의 동작, 장치 검색, 위의 두 예입니다. device_upsert driver=Snmp는 host, port(기본값 161), snmpVersion(V1, 기본값인 V2c, V3), SNMPv1과 SNMPv2c에서는 snmpCommunity(''로 지움), SNMPv3에서는 username(사용자), password(그 인증 비밀번호이며 8자 이상), snmpSecurityLevel(기본값인 AuthPriv, AuthNoPriv, NoAuthNoPriv), snmpAuthProtocol(Md5, 기본값인 Sha1, Sha256, Sha384, Sha512), snmpPrivacyProtocol(Des, 기본값인 Aes128, Aes192, Aes256), snmpPrivacyPassword를 받고, 여기에 responseTimeoutMs(100에서 60000, 기본값 2000)와 snmpRetries(0에서 5, 기본값 1)를 받습니다. SNMPv3 장치의 community나 community 장치의 SNMPv3 칸은 거부됩니다. 도구가 돌려주는 장치는 snmp를 가집니다. 버전, hasCommunity, 적용 중인 보안 수준과 프로토콜, hasPrivacyPassword, 제한 시간, 재시도 횟수, 그리고 아직 기다리는 자격 증명인 missingCredential입니다. 비밀은 결코 돌려주지 않습니다. tag_upsert는 OID를 address로 받으며, opcUaType의 기본값은 객체를 가장 자연스럽게 읽는 형식입니다. wireQuantity와 eipPath는 거부됩니다. device_discover driver=Snmp는 target(호스트이며, 161이 아니면 port도)을 snmpVersion(V1이나 V2c), snmpCommunity와 함께 탐색하거나, 이 드라이버의 장치 이름인 snmpDevice를 탐색합니다. SNMPv3 에이전트를 스캔하는 유일한 방법은 후자입니다. snmpSubtrees는 표준 하위 트리(System, Interfaces, Ups, Sensors, HostResources를 쉼표로 구분)를 고르고, snmpSubtree는 하나를 더합니다. 도구는 스캔의 community를 유지하지 않습니다. 스캔이 찾은 것에서 만드는 장치는 device_upsert에서 그것을 다시 받으며, 설정된 장치에 빠진 태그는 tag_upsert로 추가합니다. 다른 도구는 에이전트 도구에 있습니다.

알아 둘 한계

  • 무슨 일이 생겼을 때 장비가 스스로 보내는 트랩과 인폼은 받지 않습니다. 모든 값은 읽기 주기마다 읽으므로, 잔량이 줄어든 배터리는 그 상태를 다음에 읽을 때 드러납니다.
  • MIB 파일은 가져오지 않습니다. 드라이버가 아는 이름은 내장한 표준 MIB의 것입니다. enterprises 아래에 있는 장비 고유 MIB의 객체는 숫자로 쓰고 숫자로 표시하며, 그 뜻은 제조사 문서에서 확인합니다.
  • 스테이션은 SNMP 에이전트가 아닙니다. 스테이션 자체를 SNMP로 읽을 수는 없습니다.
  • 스캔은 그 사용자와 비밀번호를 가진 장치를 통해서만 SNMPv3 에이전트에 닿으며, community나 사용자를 스스로 시도하지 않습니다.
  • 스캔은 객체를 최대 2000개, 최대 60초 동안 탐색합니다. 큰 스위치에서는 필요 없는 하위 트리의 체크를 풀거나, 필요한 하위 트리를 지정하십시오.
  • Boolean 태그는 없습니다. TruthValue나 장비 고유의 켜짐과 꺼짐은 Int32로 읽습니다.