Lionel Blog

The road is under your feet, the heart looks to the distance

1. SNMP 프로토콜로 할 수 있는 것은?

SNMP(Simple Network Management Protocol) 프로토콜을 사용하면 네트워크 관리자가 중앙에서 다양한 네트워크 장치(라우터, 스위치, 서버, 프린터 등)를 효과적으로 모니터링하고 관리할 수 있습니다. 구체적으로 SNMP로 할 수 있는 주요 기능은 다음과 같습니다.

  • 네트워크 장치 모니터링
    장치의 상태(가동/비가동), 성능(CPU 사용률, 메모리 사용량, 트래픽 통계 등) 정보를 실시간으로 수집하여 이상 징후를 빠르게 감지할 수 있습니다.

  • 구성(설정) 관리
    장치의 설정 정보(예: IP 주소, 라우팅 테이블, 방화벽 규칙 등)를 원격으로 변경 및 관리할 수 있습니다.

  • 장애 및 이벤트 관리
    장애나 특정 이벤트 발생 시 자동으로 관리자에게 알림(Trap)을 전송하여 신속한 대응이 가능합니다.

  • 성능 데이터 수집 및 분석
    트래픽, 패킷, 오류 수 등 성능 데이터를 주기적으로 수집해 네트워크 최적화에 활용할 수 있습니다.

주요 동작 방식

동작 방식설명
GET장치 상태/성능 정보 요청
SET장치 설정 정보 변경
GET-NEXTMIB의 다음 정보 요청
TRAP이벤트 발생 시 관리자에게 알림 전송

2. 가장 간단한 SNMP 통신 C 샘플코드

아래는 net-snmp 라이브러리를 이용해 SNMP GET 요청을 보내는 간단한 C 코드 예제입니다.


#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>

int main(int argc, char **argv) {
netsnmp_session session, *ss;
netsnmp_pdu *pdu, *response;
oid anOID[MAX_OID_LEN];
size_t anOID_len;
int status;

    init_snmp("snmpdemoapp");
    snmp_sess_init(&session);
    session.peername = strdup("127.0.0.1");
    session.version = SNMP_VERSION_2c;
    session.community = (u_char *)"public";
    session.community_len = strlen((char *)session.community);
    
    ss = snmp_open(&session);
    if (!ss) {
        snmp_perror("snmp_open");
        exit(1);
    }
    
    pdu = snmp_pdu_create(SNMP_MSG_GET);
    anOID_len = MAX_OID_LEN;
    if (!snmp_parse_oid(".1.3.6.1.2.1.1.1.0", anOID, &anOID_len)) {
        snmp_perror(".1.3.6.1.2.1.1.1.0");
        exit(1);
    }
    snmp_add_null_var(pdu, anOID, anOID_len);
    
    status = snmp_synch_response(ss, pdu, &response);
    if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR) {
        char buf[1024];
        snprint_value(buf, sizeof(buf), response->variables->name, response->variables->name_length, response->variables);
        printf("Result: %s\n", buf);
    } else {
        if (status == STAT_SUCCESS)
            fprintf(stderr, "Error in packet: %s\n", snmp_errstring(response->errstat));
        else
            snmp_sess_perror("snmp_synch_response", ss);
    }
    
    if (response)
        snmp_free_pdu(response);
    snmp_close(ss);
    return 0;
    }
  • 컴파일: gcc -o snmpdemo snmpdemo.c -lnetsnmp

3. 서버쪽 샘플 코드

아래는 SNMP 서버(에이전트) 역할을 하는 간단한 C 코드 예제입니다.


#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>

int handle_snmp_request(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info *reqinfo,
netsnmp_request_info *requests) {
switch (reqinfo->mode) {
case MODE_GET:
snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
(u_char *)"SNMP Agent Demo", strlen("SNMP Agent Demo"));
break;
default:
return SNMP_ERR_GENERR;
}
return SNMP_ERR_NOERROR;
}

int main(int argc, char **argv) {
netsnmp_agent_init();
init_agent("snmpdemoagent");

    oid system_desc_oid[] = {1,3,6,1,2,1,1,1,0};
    netsnmp_handler_registration *reginfo;
    reginfo = netsnmp_create_handler_registration(
        "systemDesc", handle_snmp_request,
        system_desc_oid, OID_LENGTH(system_desc_oid),
        HANDLER_CAN_RONLY
    );
    
    netsnmp_register_scalar(reginfo);
    
    snmp_log(LOG_INFO, "SNMP Agent 시작\n");
    init_snmp("snmpdemoagent");
    while(1) {
        agent_check_and_process(1);
    }
    
    snmp_shutdown("snmpdemoagent");
    return 0;
    }
  • 컴파일: gcc -o snmpagent snmpagent.c -lnetsnmp -lnetsnmpagent
  • 실행 시 기존 SNMP 데몬 충돌 주의 (예: sudo systemctl stop snmpd)