Theme:

네트워크 스위치나 라우터는 소프트웨어를 직접 설치할 수 없는데, 이런 장비의 트래픽과 포트 상태를 Prometheus로 어떻게 모니터링할까요?

SNMP Exporter 는 Prometheus와 네트워크 장비 사이에서 프로토콜을 변환하는 중계 역할을 합니다. Prometheus가 HTTP로 SNMP Exporter에 요청하면, SNMP Exporter가 대상 장비에 SNMP 쿼리를 보내고 응답을 Prometheus 메트릭 포맷으로 변환하여 반환합니다.

SNMP Exporter의 동작 구조

일반적인 Exporter(Node Exporter 등)는 모니터링 대상에 직접 설치하지만, SNMP Exporter는 Prometheus 서버 측에 설치 하고, 대상 장비에는 SNMP 에이전트만 동작하면 됩니다.

PLAINTEXT
Prometheus ──(HTTP)──▶ SNMP Exporter ──(SNMP)──▶ 스위치/라우터
  :9090                  :9116                    SNMP Agent

Prometheus가 SNMP Exporter에 HTTP 요청을 보내면, SNMP Exporter가 대상 장비에 SNMP 쿼리를 보내고, 받은 응답을 Prometheus 메트릭 포맷으로 변환하여 반환합니다.


SNMP 패키지 설치

SNMP Exporter가 동작하는 서버에 SNMP 클라이언트 도구를 설치합니다. 연동 테스트(snmpwalk, snmpget)에 필요합니다.

SHELL
sudo yum install -y net-snmp net-snmp-utils

SNMP Exporter 설치

SHELL
cd /opt
wget https://github.com/prometheus/snmp_exporter/releases/download/v0.29.0/snmp_exporter-0.29.0.linux-amd64.tar.gz
tar -xzf snmp_exporter-0.29.0.linux-amd64.tar.gz

설치 후 디렉토리에 snmp_exporter 바이너리와 기본 설정 파일 snmp.yml이 포함됩니다. snmp.yml에는 if_mib 등 자주 사용하는 MIB 모듈의 기본 설정이 들어 있습니다.


systemd 서비스 등록

/etc/systemd/system/snmp_exporter.service를 생성합니다.

INI
[Unit]
Description=SNMP Exporter
After=network.target

[Service]
User=root
ExecStart=/opt/snmp_exporter-0.29.0.linux-amd64/snmp_exporter \
  --config.file=/opt/snmp_exporter-0.29.0.linux-amd64/snmp.yml
Restart=always

[Install]
WantedBy=multi-user.target
SHELL
sudo systemctl daemon-reload
sudo systemctl enable snmp_exporter
sudo systemctl start snmp_exporter

SNMP Exporter는 기본적으로 포트 9116 에서 대기합니다.


Prometheus 스크랩 설정

SNMP Exporter의 스크랩 설정은 다른 Exporter와 구조가 다릅니다. targets모니터링 대상 장비의 IP 를 넣고, relabel_configs로 실제 HTTP 요청은 SNMP Exporter에 보내도록 설정합니다.

YAML
scrape_configs:
  - job_name: 'snmp'
    scrape_interval: 120s
    scrape_timeout: 90s
    static_configs:
      - targets:
        - <스위치 IP>        # 모니터링 대상 장비
    metrics_path: /snmp
    params:
      auth: [public_v2]
      module: [if_mib]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: <SNMP Exporter IP>:9116
설정의미
metrics_path: /snmpSNMP Exporter의 SNMP 쿼리 엔드포인트
params.authsnmp.yml에 정의된 인증 프로필 이름
params.module수집할 MIB 모듈 (예: if_mib은 인터페이스 메트릭)
relabel_configstargets의 IP를 SNMP 쿼리 대상으로 설정하고, 실제 HTTP 요청은 SNMP Exporter로 보내도록 재라벨링

(참고) relabel_configs가 복잡해 보이지만 핵심은 단순합니다. Prometheus는 HTTP만 할 수 있으므로, "어떤 장비를 모니터링할지"와 "어디로 HTTP 요청을 보낼지"를 분리해야 합니다. __param_target이 SNMP 대상 장비, __address__가 HTTP 요청 대상(SNMP Exporter)입니다.

설정 반영 후 Prometheus Status > Targets 에서 상태를 확인합니다.

SHELL
sudo systemctl reload prometheus

트러블슈팅: 커뮤니티 값 불일치

SNMP v2c에서 가장 흔한 문제는 커뮤니티 문자열(community string) 불일치입니다.

증상

snmpwalk로 테스트했을 때 응답이 없습니다.

SHELL
snmpwalk -v2c -c public <스위치 IP> 1.3.6.1.2.1.1
# Timeout: No Response from <스위치 IP>

원인

SNMP Exporter의 snmp.yml 또는 스위치에 설정된 커뮤니티 값과, 테스트에 사용한 커뮤니티 값이 다릅니다. 스위치 기본 커뮤니티가 public이 아닌 다른 값(예: 장비 벤더가 설정한 커스텀 값)일 수 있습니다.

해결

  1. 스위치에 설정된 실제 커뮤니티 값을 확인합니다 (장비 관리 콘솔 또는 네트워크 관리자에게 문의)
  2. 해당 값으로 snmpwalk 테스트를 합니다
SHELL
snmpwalk -v2c -c <실제 커뮤니티 값> <스위치 IP> 1.3.6.1.2.1.1
  1. snmp.ymlauth 섹션에서 커뮤니티 값을 일치시킵니다

(참고) 커뮤니티 문자열은 사실상 평문 비밀번호입니다. 프로덕션 환경에서는 SNMP v3(인증 + 암호화)를 사용하는 것을 권장합니다. SNMP Exporter는 v3도 지원합니다.


주의할 점

relabel_configs 설정 오류

SNMP Exporter의 Prometheus 스크랩 설정은 일반 Exporter와 구조가 다릅니다. targets에 모니터링 대상 장비의 IP를 넣고, relabel_configs로 실제 HTTP 요청은 SNMP Exporter에 보내도록 설정해야 합니다. 이 구조를 이해하지 못하면 "Targets에 추가했는데 메트릭이 안 나온다"는 상황에 빠집니다.

커뮤니티 값 public 가정

많은 가이드에서 커뮤니티 값을 public으로 테스트하지만, 실제 장비에서는 벤더가 다른 값을 설정해두는 경우가 많습니다. snmpwalk로 먼저 테스트하고, 응답이 없으면 네트워크 관리자에게 실제 커뮤니티 값을 확인합니다.


정리

항목설명
동작 구조Prometheus → (HTTP) → SNMP Exporter → (SNMP) → 장비
설치 위치Prometheus 서버 측 (대상 장비에 설치 불필요)
기본 포트9116
Prometheus 설정 핵심relabel_configs로 대상 IP와 Exporter 주소를 분리
커뮤니티 값장비에 설정된 실제 값 사용 (기본값 public이 아닐 수 있음)
프로덕션 권장SNMP v3 (인증 + 암호화)
댓글 로딩 중...