회사에서 급히 SNMP v2 프로토콜로 장비를 제어할 일이 있어서, 간단한 샘플코드를 만들어 보았습니다. 당장 타겟 장비에 물려볼 수가 없는 환경이라 작성한 샘플 코드를 테스트를 할 수가 없었습니다. 우연히 회사 내부망에서 와이어샤크로 네트워크를 모니터링해보니 이름 모를 장비(?)와 제 컴퓨터가 SNMP 프로토콜로 통신하는 패킷이 보였습니다. 그래서 해당 장비(SNMP Agnet)에 아무 메시지나 전송하고 정의되지 않은 항목이라는 응답을 받아 보는 것으로 테스트를 진행했습니다.
먼저 Maven Dependency 를 아래와 같이 추가합니다.
<dependency>
<groupId>org.snmp4j</groupId>
<artifactId>snmp4j</artifactId>
<version>3.6.4</version>
</dependency>
샘플 코드는 간단히 다음과 같이 동작합니다.
@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);
}
콘솔 출력 결과는 다음과 같습니다.
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]
SNMP 패킷 구조에 대한 설명은 아래 사이트에 제일 잘 나오는 것 같습니다.
샘플 코드 실행 시 와이어샤크로 캡처한 패킷은 다음과 같습니다.
전체 패킷 목록
첫번째 요청 패킷에 대한 상세
두번째 응답 패킷에 대한 상세