SNMP4J | SNMP v2 Client Sample Code

회사에서 급히 SNMP v2 프로토콜로 장비를 제어할 일이 있어서, 간단한 샘플코드를 만들어 보았습니다. 당장 타겟 장비에 물려볼 수가 없는 환경이라 작성한 샘플 코드를 테스트를 할 수가 없었습니다. 우연히 회사 내부망에서 와이어샤크로 네트워크를 모니터링해보니 이름 모를 장비(?)와 제 컴퓨터가 SNMP 프로토콜로 통신하는 패킷이 보였습니다. 그래서 해당 장비(SNMP Agnet)에 아무 메시지나 전송하고 정의되지 않은 항목이라는 응답을 받아 보는 것으로 테스트를 진행했습니다.

Dependency

먼저 Maven Dependency 를 아래와 같이 추가합니다.

<dependency>
    <groupId>org.snmp4j</groupId>
    <artifactId>snmp4j</artifactId>
    <version>3.6.4</version>
</dependency>

Sample Code

샘플 코드는 간단히 다음과 같이 동작합니다.

  • 전송 계층으로는 UDP 를 사용합니다. (실제로 TCP 도 사용가능한 것 같습니다)
  • 포트는 기본 포트 161번 포트를 사용합니다.
  • SNMP 버전은 v2c 를 사용합니다.
  • ID ("1.3.6.1.4.1.47891.1") 에 대한 값을 Agent 에 요청한 후 수신한 응답을 출력합니다.
@Test
void snmpPrototype() throws IOException, ExecutionException, InterruptedException {
    SnmpBuilder snmpBuilder = new SnmpBuilder();
    Snmp snmp = snmpBuilder.udp().v2c().threads(2).build();

    Address targetAddress = GenericAddress.parse("udp:192.168.0.202/161");

    Target<Address> target = new CommunityTarget<>();
    target.setSecurityName(new OctetString("public"));
    target.setTimeout(500);
    target.setRetries(1);
    target.setAddress(targetAddress);
    target.setVersion(TargetBuilder.SnmpVersion.v2c.getVersion());

    List<VariableBinding> list = new ArrayList<>();
	// OID = Object Name, Variable = Object Value
    list.add(new VariableBinding(new OID("1.3.6.1.4.1.47891.1"))); 

    PDU pdu = new PDU();
    pdu.setType(PDU.GET);
    pdu.setRequestID(new Integer32(1));
    pdu.setVariableBindings(list);

    SnmpCompletableFuture snmpRequestFuture = SnmpCompletableFuture.send(snmp, target, pdu);
    List<VariableBinding> vbs = snmpRequestFuture.get().getAll();

    System.out.println("Received: " + snmpRequestFuture.getResponseEvent().getResponse());
    System.out.println("Payload:  " + vbs);
}

Output

콘솔 출력 결과는 다음과 같습니다.

Received: RESPONSE[requestID=1, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.4.1.47891.1 = noSuchObject]]
Payload:  [1.3.6.1.4.1.47891.1 = noSuchObject]

Packet Capture

SNMP 패킷 구조에 대한 설명은 아래 사이트에 제일 잘 나오는 것 같습니다.

샘플 코드 실행 시 와이어샤크로 캡처한 패킷은 다음과 같습니다.

  • 전체 패킷 목록

  • 첫번째 요청 패킷에 대한 상세

  • 두번째 응답 패킷에 대한 상세

Reference

좋은 웹페이지 즐겨찾기