1. SNMP 프로토콜로 할 수 있는 것은?
SNMP(Simple Network Management Protocol) 프로토콜을 사용하면 네트워크 관리자가 중앙에서 다양한 네트워크 장치(라우터, 스위치, 서버, 프린터 등)를 효과적으로 모니터링하고 관리할 수 있습니다. 구체적으로 SNMP로 할 수 있는 주요 기능은 다음과 같습니다.
네트워크 장치 모니터링
장치의 상태(가동/비가동), 성능(CPU 사용률, 메모리 사용량, 트래픽 통계 등) 정보를 실시간으로 수집하여 이상 징후를 빠르게 감지할 수 있습니다.구성(설정) 관리
장치의 설정 정보(예: IP 주소, 라우팅 테이블, 방화벽 규칙 등)를 원격으로 변경 및 관리할 수 있습니다.장애 및 이벤트 관리
장애나 특정 이벤트 발생 시 자동으로 관리자에게 알림(Trap)을 전송하여 신속한 대응이 가능합니다.성능 데이터 수집 및 분석
트래픽, 패킷, 오류 수 등 성능 데이터를 주기적으로 수집해 네트워크 최적화에 활용할 수 있습니다.
주요 동작 방식
| 동작 방식 | 설명 |
|---|---|
| GET | 장치 상태/성능 정보 요청 |
| SET | 장치 설정 정보 변경 |
| GET-NEXT | MIB의 다음 정보 요청 |
| 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)
