SNMP(Simple Network Management Protocol) 은 원래 네트워크 장비를 관리하기 위한 통신 규약입니다. 그런데, 이제는 네트워크 장비뿐만아니라 컴퓨터, 전자장비까지 확장해서 사용하고 있습니다. 리눅스 시스템에서도 SNMP를 사용할 수 있습니다.
이를 이용하면 SNMP 를 이용해서 중앙집중식으로 각각의 장비들의 자원, 자원사용량등을 장비에 거의 모든 것을 알 수 있고 가지고 올 수 있습니다. 저의 경우에는 Cacti 라는 시스템 자원 모니터링 시스템에서 원격 시스템의 자원 사용량을 가지고 오기 위해서 각 서버마다 SNMP를 사용합니다.
준비
이 문서는 다음과 같은 환경에서 작성되었습니다.
SNMP는 서버/클라언트 구조를 가지고 있습니다. 중앙 집중식으로 한 곳에서 정보를 모을 경우에는 중앙 서버를 제외하고 SNMP 데몬만 설치해주면 됩니다.
설치
설치는 Yum 을 이용해 다음과 같이 해주면 됩니다.
|
yum install net-snmp [ net-snmp-utils ] |
위에 뒷부분 ‘net-snmp-utils’ 는 SNMP 데몬하고는 아무런 관련이 없기 때문에 설치를 않해되 되지만 SNMP 데몬의 제대로 동작하는지를 테스트하기 위해서는 설치해주는 것이 좋습니다. ‘net-snmp-utils’ 는 말 그대로 SNMP를 다루기위한 여러가지 명령어들이 들어 있습니다.
설정
CentOS7 의 특징은 데몬이 실행될때에 옵션을 제공해 줄 수 있는데, 이를 위해서 ‘/etc/sysconfig’ 디렉토리에 데몬이름으로 파일을 가지게 됩니다. 그러면 데몬 실행 프로그램에서 이를 import 해서 사용하곤 하는데 SNMP 데몬도 이와 같습니다.
먼저 데몬 실행 옵션을 다음과 같이 설정 해줍니다.
|
OPTIONS="-LS1-5d -Lf /dev/null -p /var/run/snmpd.pid" |
위 옵션들은 다음과 같습니다.
- -Ls 는 로그 메시지 stderr, stdout 으로 내보내고 로그레벨을 정한다. 기본은 -Lsd 로 d 는 LOG_DEBUG 을 말한다. 로그의 수준은 0 ~ 7 까지 존재하는데 다음과 같다.
|
0 or ! for LOG_EMERG, 1 or a for LOG_ALERT, 2 or c for LOG_CRIT, 3 or e for LOG_ERR, 4 or w for LOG_WARNING, 5 or n for LOG_NOTICE, 6 or i for LOG_INFO, and 7 or d for LOG_DEBUG. |
이는 -LSwd 나 -LS4d 식으로 숫자와 알파벳으로 지정할 수 있다. -LSed / -LS3d 같은 예제이다. 또, -LS1-5d 처럼 로그레벨 수준을 어디서 어디까지로 정할 수도 있다. 위 예제에서는 데몬 메시지를 syslog 로 보내는데 로그 레벨 1~5까지를 보내라는 뜻이다.
- -Lf 는 지정한 파일로 로그 메시지를 보낸다. 위 예제에서는 /dev/null 임으로 로그 메시지를 삭제하는 효과를 보인다.
- -p 는 pid 파일을 지정해 준다.
다음으로 SNMP 자체 설정을 합니다. 아래의 예제는 시스템 자원을 읽기 전용으로만 설정하는 것입니다.
|
# sec.name source community com2sec readonly 192.168.96.0/20 Nrc65amr com2sec readonly 127.0.0.1 Nrc65amr # groupName securityModel securityName group MyROGroup v1 readonly group MyROGroup v2c readonly group MyROGroup usm readonly view all included .1 80 # group context sec.model sec.level prefix read write notif access MyROGroup "" any noauth exact all none none syslocation Unknown (edit /etc/snmp/snmpd.conf) syscontact Root <root@localhost> (configure /etc/snmp/snmp.local.conf) |
SNMP 설정은 ‘sec.name’ 별로 설정을 할 수 있습니다. sec.name 을 여러게 정의하면 group도 여러개 설정할 수 있고 이렇게 되면 access 도 여러개 설정할 수 있습니다. 주목할 것은 access 에서 뒷부분에 read, write, notif 가 보이는데, 위 예제가 시스템 자원을 읽기만 할 것이기 때문에 read 부분만 all 로 하고 나머지를 none 으로 한 것입니다.
마지막으로 systemd 에 snmpd 를 활성화 해주고 시작해 줍니다.
|
systemctl enable snmpd systemctl start snmpd |
로깅 변경
위 설정대로 하면 snmpd 로그가 /var/log/messages 에 저장이 됩니다. 하지만 /var/log/messages 는 커널 메시지도 저장되고 하는 중요한 것이여서 별도 파일에 저장하는 것이 좋습니다.
이를 위해서 snmpd 를 위한 별도의 로그 파일 설정을 해주는데, 먼저 /etc/sysconfig/snmpd 설정을 다음과같이 바꿔 줍니다.
|
OPTIONS="-Ls6 -Lf /dev/null -p /var/run/snmpd.pid" |
rsyslog 데몬에서 다음과 같이 설정해 줍니다.
|
*.info;mail.none;authpriv.none;cron.none;local6.none /var/log/messages local6.* /var/log/snmpd.log |
위에 예제에서 첫번째라인은 로그레벨 6 에 대해서는 /var/log/message 에서 제외하고 로그레벨6은 /var/log/snmpd.log 에 저장하도록 지정한 것입니다.
이렇게 해주고 데몬을 재시작 해줍니다.
|
systemctl restart snmpd systemctl restart rsyslog |
로그 로테이션도 설정해 줍니다.
|
--- /etc/logrotate.d/syslog.orig 2015-12-29 22:10:00.089000000 +0900 +++ /etc/logrotate.d/syslog 2015-12-29 22:10:44.926000000 +0900 @@ -3,6 +3,7 @@ /var/log/messages /var/log/secure /var/log/spooler +/var/log/snmpd.log { missingok sharedscripts |
만일 일일이 출력하고 싶지 않다면 /etc/snmp/snmpd.conf 파일에 다음과 같이 설정해 줍니다.
|
dontLogTCPWrappersConnects yes |
Firewalld 설정
CentOS 7 에서는 iptables 에서 firewalld 로 변경되었습니다. snmpd 를 위해 firewalld 를 설정해 줘야 합니다.
먼저 snmp 관련해서 방화벽 열기위한 정보를 xml 파일로 작성해 줍니다.
|
<?xml version="1.0" encoding="utf-8"?> <service> <short>SNMP</short> <description>SNMP protocol</description> <port protocol="udp" port="161"/> </service> |
그리고 다음과 같이 public zone 에 등록해줍니다.
|
firewall-cmd --reload firewall-cmd --zone=public --add-service snmp --permanent firewall-cmd --reload |