Server & OS

리눅스에서 mrtg 설정하기

페이지 정보

본문

전에 다니던 mmorpg 게임회사 에서 리눅스 서버를 사용하였다.

그 때 서버 상태를 모니터링 하기위해 mrtg를 사용했었는데 사용법에 관련하여

당시 썼었던 메뉴얼을 올려본다. mrtg를 사용하고 싶은 사람에게 많은 도움이 있었으면 한다.

-----------------------------------------------------------------------------------

 

MRTG 메뉴얼


1. 개요 & 설치
설치는 net-snmp-5.0.6-17.i386.rpm, net-snmp-devel-5.0.6-17.i386.rpm, net-snmp-
utils-5.0.6-17.i386.rpm를 먼저 설치하고 (혹시 snmp가 설치가 되어있지 않다면, 설치가 되어있어도 새로운 snmp를 설치하기 권장한다. 구 버전(ucd-snmp)는 지원하지 않는 기능이 많다) snmp는 기본적으로 perl이 설치되어 있어야 한다. redhat linux 9.0을 기준으로 보통 기본적으로 perl-5.8.0-88 이 설치되어 있다. snmp가 설치되었으면 mrtg-2.9.17-13을 설치한다. 혹 perl(CGI)에 대한 의존성 문제로 mrtg 가 설치 되지 않을 경우 perl-CGI-
-2.81-88.i386.rpm을 설치해준다. 하지만 net-snmp 버전을 깔고 나서 실행을 했을 때 community name을 찾지 못하는 문제가 있었다. 결국 이것의 해결책을 찾지 못하여 net-
snmp의 이전 버전인 ucd-snmp를 설치하기로 하였다. ucd-snmp를 설치하기 위해 필요한 rpm은 다음과 같다.

ucd-snmp-4.2.3-1.i386.rpm
ucd-snmp-devel-4.2.3-1.i386.rpm
ucd-snmp-utils-4.2.3-1.i386.rpm
openssl096b-0.9.6b-3.i386.rpm
db1-1.85-5.i386.rpm     

ucd-snmp를 설치하려고 하면 libcrypto.so.2 와 libdb.so.2 라이브러리가 없다고 나오면서 설치가 되지 않을 것이다. (libdb.so.2 메시지는 안나올 수 있다) openssl rpm 은 libcrypto
.so.2 라이브러리를 설치 하는 것이고 db1-1.85-5는 libdb.so.2 라이브러리를 설치하는 것이다. 먼저 이 두 rpm을 설치하고 그 다음에 ucd-snmp를 차례대로 설치한다. ucd-snmp를 설치하기 전에 기존에 깔려있던 net-snmp를 제거하고(제거 하지 않으면 설치도 되지 않는다), snmpd 데몬을 반드시 꺼주어야 한다. 꺼주지 않을 경우 ucd-snmp를 설치해도 전에 깔려있던 snmpd가 실행 될 수 있다. 이제 ucd-snmp를 설치하였다. 한 번 실행해보자.

# /etc/init.d/snmpd start
# snmpwalk localhost public system

까지 해서 주욱 무엇인가가 뜨면 성공적으로 설치가 된 것이다.

2. snmpd config
mrtg 서버의 구성방식은 하나의 웹서버에 mrtg를 설치하고 나머지 모니터링 할 서버들에는 snmpd 데몬을 뛰어 mrtg 서버에서 모두 처리하는 방식으로 한다. 이렇게 하기 위해서는
snmpd.conf에서 설정을 해주어야 한다. 그 설정은 다음과 같다.


* mrtg 가 설치되어 있는 서버의 snmpd.conf 설정
#      sec.name  source          community
com2sec local  localhost  public
com2sec local  CHINADEVEL8 public
----------------------------------------
-> 여기까지는 자기 자신의 snmpd 설정이다
com2sec mynetwork  10.0.0.11  public
com2sec mynetwork  10.0.0.12  public
com2sec mynetwork  10.0.0.13  public
com2sec mynetwork  10.0.0.14  public
com2sec mynetwork  10.0.0.15  public
com2sec mynetwork  10.0.0.16  public
com2sec mynetwork  10.0.0.17  public
----------------------------------------
-> 여기까지는 모니터링할 다른 머신의 ip 주소들이다.

#      groupName      securityModel securityName
#group  notConfigGroup v1          notConfigUser
#group  notConfigGroup v2c          notConfigUser
group  MyRWGroup  v1  local
group  MyRWGroup  v2c local
group  MyRWGroup  usm local
group  MyROGroup  v1  mynetwork
group  MyROGroup  v2c mynetwork
group  MyROGroup  usm mynetwork

#      name          incl/excl    subtree        mask(optional)
#view    systemview    included      system
view    all included    .1  80

#      group          context sec.model sec.level prefix read  write  notif
#access  notConfigGroup ""      any      noauth    exact  systemview none none
access  MyROGroup  ""  any noauth  exact  all none    none
access  MyRWGroup  ""  any noauth  exact  all all none

* 모니터링할 서버의 snmpd.conf 설정
#      sec.name  source          community
com2sec local  localhost  public
com2sec local  CHINADEVEL1 public
com2sec mynetwork 10.0.0.18 public  -> mrtg 가 설치되어 있는 서버의 ip
그 외의 설정은 위의 설정과 같다.
설정을 마쳤으면 다시 snmpd를 재시작한다.

3. mrtg config
snmpd를 실행시켰으니 이제 mrtg를 실행시킬 차례이다. mrtg를 이용하여 여러 가지 분야에서 모니터링을 할 수 있다. 여기서는 CPU, MEMORY, DISK의 사용량 분석에 대한 설정을 알아보겠다.
 mrtg의 설정 파일은 처음 설치했을 때는 /etc/mrtg아래에 mrtg.cfg로 존재한다. 이 것은 가장 기본적인 설정파일이다. 이 것을 이용해 간단하게나마 mrtg를 실행해 볼 수 있다. mrtg의 실행파일은 /usr/bin/에 위치한다.
-> /usr/bin/mrtg /etc/mrtg/mrtg.cfg
다음과 같이 실행할 수 있다. 하지만 이 것으로는 우리가 원하는 결과를 얻을 수 없다. 우리가 원하는 것을 얻기 위한 설정파일 구성을 해보자.

- cfg 파일 분석
WorkDir
mrtg 실행 후 결과가 생성되는 웹페이지 구성파일들이 생성될 위치이다. 실행할 때 이 위치의 디렉토리가 존재하지 않으면 에러가 발생하므로 먼저 디렉토리를 생성하고 mrtg를 실행하도록 한다. 그리고 이 디렉토리의 권한은 반드시 웹서버 프로세스가 읽을 수 있는 권한이어야 한다. 그러기 위해서 mrtg user를 만들고 그 유저의 home 디렉토리(/home/mrtg)에서 작업하는 것이 여러모로 편리하다. 그러기 위해서는 httpd.conf에서 다음과 같이 수정한다.

<IfModule mod_userdir.c>
 UserDir public_html
</IfModule>

이렇게 해두면 각 계정 디렉토리 아래에 public_html 폴더를 만들면 그 아래에 웹페이지를 만들 수 있다. 접속은 http://IP/~계정 으로 할 수 있다. 이와 같은 방법을 사용할 때 Work
Dir는 /home/mrtg/public_html 에 위치하게 된다.

* Tip
물론 위와 같이 mrtg 계정으로 접속을 하는 방법도 있지만 이렇게 하면 DocumentRoot 디렉토리가 바뀔 수도 있으므로 여기서는 가상호스트를 사용하기로 한다. http://mrtg.x.com 이런 식으로 말이다. DNS 주소가 준비되어 있고 네임서버에 모든 준비가 되어 있다고 할 때의 httpd.conf에서 가상호스트를 위해 설정을 해주어야 적용이 된다.

- httpd.conf
현재 보안상의 이유로 http 포트를 80번에서 8088번으로 변경한 상태이고 DocumentRoot는 /home/web/webdata 이다. 설정파일의 맨 아래쪽으로 내려가보면 가상 호스트에 대한 설정을 하는 부분이 있다.


NameVirtualHost *
<VirtualHost *>
    ServerAdmin se@yondle.co.kr
    DocumentRoot /home/web/webdata
    ServerName devel8.alodchina.com
</VirtualHost>
<VirtualHost *>
    ServerAdmin se@yondle.co.kr
    DocumentRoot /home/mrtg/public_html
    ServerName mrtg.alodchina.com
    ErrorLog /home/mrtg/logs/error_log
    CustomLog /home/mrtg/logs/access_log combined
</VirtualHost>

가상호스트 설정이 두개 있는데 위는 원래 웹서버의 DocumentRoot를 위한 설정이고 아래 것은 가상호스트를 위한 설정이다. 위의 원래 웹서버에 대한 설정을 안해 줄 경우 가상호스트의 DocumentRoot로 인식해버린다.

Target
Target에서 지정해주는 것은 대상 머신의 IP주소나, 도메인 주소, 대상포트 번호, lable 이름, community name 등이 있다. 한마디로 mrtg를 통해서 모니터링할 대상장비의 설정이라 할 수 있다. mrtg의 실행 결과 생성되는 웹페이지의 파일들이 이 target의 이름으로 생성된다.

Target[yondle.co.kr]: 2:public@yondle.co.kr:
이라고 되어 있을 때 2라는 것은 대상장비의 포트 번호로 라우터나 스위치의 모니터링 대상 포트 번호이다. 여기서 public은 community name 이다.

* CPU 사용량 분석 cfg

LoadMIBs: /usr/local/share/snmp/mibs/UCD-SNMP-MIB.txt
* snmp의 mibs 중 UCD-SNMP-MIB.txt를 로드한다.
Target[yondle.co.kr]:ssCpuRawUser.0&ssCpuRawIdle.0:public@xxx.xxx.xxx.xxx
* target을 정해준다.
  ssCpuRawUser.0 는 사용자프로세스가 차지하고 있는 cpu사용량의 MIB객체 지정
  ssCpuRawIdle.0 는 cpu의 idle time 값의 MIB 객체 지정
Options[yondle.co.kr]:growright, nopercent
* growhigh는 오른쪽부터 그래프 생성 / nopercent는 그래프에서 퍼센트를 나타내지 않음
MaxBytes[yondle.co.kr]:100
* cpu의 전체 사용량을 100으로 설정
Title[yondle.co.kr]:CPU 사용률 모니터링
* 생성되는 웹파일의 <title></title>에 들어갈 제목
RouterUptime[yondle.co.kr]:public@xxx.xxx.xxx.xxx
* 동일한 라우터를 사용하여 동일한 분석을 여러개 동시에 분석할 경우 community name    과 address를 여러 번 반복해서 사용하지 않게 하기 위한 설정이다.
Unscaled[yondle.co.kr]:ymwd
* y,m,w,d 4개의 그래프에서 Y축 그래프가 maxbytes에저 지정한 수치에 미치지 못하는
  부분을 생략하여 표현하도록 하기 위한 설정
YLegend[yondle.co.kr]:CPU Utilization
* Y축 그래프의 설명을 나타낸다.
Legend1[yondle.co.kr]:User CPU in % (Load)
Legend2[yondle.co.kr]:Idle CPU in % (Load)
Legend3[yondle.co.kr]:
Legend4[yondle.co.kr]:
* 결과 웹페이지의 하단에 표시되는 그래프의 색깔에 대한 설명을 붙인다.
LegendI[yondle.co.kr]: User
* 4개의 그래프 각각의 하단에 INPUT 표시에 대한 설명
LegendO[yondle.co.kr]: Idle
* OUTPUT에 대한 설명
PageTop[yondle.co.kr]:
* 여기에는 mrtg 실행으로 생성되는 웹페이지 상단에 나타날 내요을 적으면 된다.

* MEMORY 사용량 분석 cfg

LoadMIBs: /usr/local/share/snmp/mibs/UCD-SNMP-MIB.txt
Target[joyon.memory]:1.3.6.1.4.1.2021.4.4.0&.1.3.6.1.4.1.2021.4.6.0:
public@xxx.xxx.xxx.xxx
Options[joyon.memory]:growright, gauge, absolute, nopercent
#SetEnv[yondle.co.kr]:
MRTG_INT_IP="xxx.xxx.xxx.xxx" MRTG_INT_DESCR="eth0"
MaxBytes[joyon.memory]:2100000
Title[joyon.memory]:Memory 사용률 모니터링
YLegend[joyon.memory]:Available Memory
ShortLegend[joyon.memory]: 
Kilo[joyon.memory]: 1024
KMG[joyon.memory]: ,M,G,T,P
Legend1[joyon.memory]:swap free
Legend2[joyon.memory]:real free
LegendI[joyon.memory]: swap
LegendO[joyon.memory]: real
PageTop[joyon.memory]:

* DISK 사용량 분석 cfg

LoadMIBs: /usr/local/share/snmp/mibs/UCD-SNMP-MIB.txt
Target[joyon.disk]:dskPercent.1&dskPercent.2:public@xxx.xxx.xxx.xxx
Options[joyon.disk]:growright, gauge, nopercent
#SetEnv[yondle.co.kr]:
 MRTG_INT_IP="xxx.xxx.xxx.xxx" MRTG_INT_DESCR="eth0"
RouterUptime[joyon.disk]:public@xxx.xxx.xxx.xxx
MaxBytes[joyon.disk]:100
Title[joyon.disk]:DISK 사용률 모니터링
Unscaled[joyon.disk]:ymwd
ShortLegend[joyon.disk]:%
YLegend[joyon.disk]:Disk Utilization
Legend1[joyon.disk]:Root Disk
Legend2[joyon.disk]:/home Disk
Legend3[joyon.disk]:
Legend4[joyon.disk]:
LegendI[joyon.disk]:Root disk
LegendO[joyon.disk]:/home disk
PageTop[joyon.disk]:

4. mrtg의 실행
이제 config 파일들이 모두 만들어져 있으므로 원하는 cfg 파일로 실행시키기만 하면 된다. 처음 실행을 시키면 워닝이 뜨게 되는데 이것은 비교할 대상을 찾지 못해 나오는 경고 이므로 3번 정도 실행시켜 주면 경고가 뜨지 않게 된다. 보통 mrtg는 5분 마다 한 번 실행을 한다. 그렇게 하기 위해서는 crontab에 등록시켜 주어야 한다. crontab은 /etc 아래에 있다.
파일을 열고 그 곳에 다음과 같이 입력한다.

*5/ * * * * root /usr/bin/mrtg /home/mrtg/cfg/mrtg.161.cfg

* mrtg 주의할 점
mrtg를 실행 시켰을 때 setting locale failed 라는 perl 경고가 뜰 때가 있다. 이럴때는 먼저 #locale 명령으로 확인을 해보자. 그리고 다음과 같은 명령을 해준다.
#export LC_ALL="C"
#export LANG="C"

* iptable 세팅
위에서 보면 다른 머신과 snmp 연결할 때 내부 IP를 이용해서 하고 있다. 현재 iptable로 snmp의 포트를 막아 놓았기 때문에 외부 IP로는 통신을 할 수 없기 때문이다. 그러므로 내부 IP로 연결이 되지 않는 곳의 머신의 snmp 값을 받아오려면 iptable에서 snmp 포트를 허용하는 설정을 해주어야 한다. 그 설정은 다음과 같다.
/etc/sysconfig/iptables 파일을 열으면 iptable 에 대한 세팅이 적혀있다. 그 곳에서
-A RH-Lokkit-0-50-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
라고 되어있는 행 바로 직전에 다음을 입력한다.(순서대로 하지 않으면 제대로 작동안될 수 있다.)
-A RH-Lokkit-0-50-INPUT -p udp -m udp -s 218.1.74.0/255.255.255.0 --dport 161 -j ACCEPT
snmp는 udp를 사용하며 포트는 161번 포트를 사용한다. 위의 것은 218.1.74.* 에 해당하는 IP에서 요청하는 것만 받아들인다는 뜻이다. 위와 같이 적어주는 것은 처음에 서버가 뜰 때 가동되는 스크립트에 추가해주는 것이다. 다음으로 루트에서 다음과 같은 명령을 실행한다.
#/sbin/iptables -I RH-Lokkit-0-50-INPUT 6 -p udp -m udp -s 218.1.74.0/255.255.255.0 --dport 161 -j ACCEPT
이 것은 현재 동작중인 룰을 바꾸어 주는 것이다. 즉 재부팅이 필요 없다. 이제 재대로 추가가 되었는지 확인해보자
#/sbin/iptables -L
이라고 했을 때 snmp에 대한 것이 보이면 성공한 것이다.

관련자료

Today's proverb
그대는 신선한 공기와 나무와 풀과 개울이 존재하는 산속에 와 있다. 그 한가운데 앉아서 신이 창조한 세계를 누리도록 하라. (바바하리다스)