iptables 명령은 리눅스 IPv4 방화벽을 설정하는 명령어이다. 1.1 시리즈 부터 리눅스 커널은 패킷 필터링을 포함하기 시작했다. 제 1세대는 BSD의 ipfw를 기본으로 했고 1994년 후반기에 알란 콕스(Alan Cox) 에 의해서 포트 됐다.
이것은 리눅스 2.0에서 Jos Vos와 다른이들에 의해서 개선됐고 커널의 필터링 규칙을 제어하는 사용자 툴로는 'ipfwadm'이 사용됐다.
1998년 중반에 리눅스 2.2를 위해 사용자 툴로 'ipchains'를 내놓았다. 마지막으로, 제 4세대 툴이 'iptables'이고 리눅스 2.4를 위해 1999년 중반에 커널을 재작성했다.
<리눅스매거진 편집부>
패킷 필터란? 네트워크를 통하는 모든 것은 패킷의 형태를 가지며, 패킷의 앞부분에는 패킷이 어디서 왔는지 어디로 향하는지, 어떤 프로토콜을 이용하는지 등과 같은 정보를 가지고 있다. 패킷 필터는 이렇게 지나가는 패킷의 헤더를 보고 패킷을 ‘DROP'(마치 전혀 전달되지 않는 것처럼 패킷을 거부) 하거나 ’ACCEPT‘(패킷이 지나가도록 내버려 둠)하는 등의 작업을 하는 프로그램을 말한다. iptables은 이런 패킷 필터링 기능을 설정하는데 사용할 수 있는 프로그램이다. 자신의 시스템에 설치돼 있는 iptables의 버전을 확인하는 방법은 아래명령을 통해 가능하다.
# iptables --version
iptables 1.2.4
커널은 3가지의 방화벽 체인(chain)을 기본적으로 가지고 패킷 필터링을 시작한다. 파이어월 체인 혹은 체인이라 부르는 이 3가지는 입력(Input), 출력(Output), 전달(Forward)이다. 입력체인은 들어오는 패킷을 조사하고 전달체인은 외부의 다른 시스템으로 전달될 패킷을 조사한다. 마지막으로 출력체인은 외부로 나가는 패킷을 조사한다.
■ 패킷검사방법
1. 패킷이 커널에 도착하면 그 패킷의 목적지를 확인한다. 이것을 '라우팅' 이라고 한다.
2. 패킷의 목적지가 이곳이면, 패킷은 전달돼 입력체인에 도달한다. 패킷이 입력체인을 통과하면 패킷을 기다리고 있던 프로세서가 받게 된다.
3. 그렇지 않고 커널이 포워딩 불능이나, 패킷을 어떻게 포워딩해야 하는가를 알지못하면, 그 패킷은 ‘DROP‘ 된다. 포워딩이 가능하게 돼있고 다른 곳이 목적지이면 패킷은 그림의 오른쪽 방향으로 전달돼 포워딩 체인으로 간다. 이 체인이 ’ ACCEPT‘ 하게 되면 이것은 포워딩 할 네트워크로 보내진다.
4. 마지막으로, 로컬에서 수행하던 프로그램은 네트워크 패킷을 전송할 수 있다.
이 패킷은 즉시 출력 체인에 보내지며 이 체인이 ‘ACCEPT’되면 이 패킷은 그 목적지가 어디든지 보내진다.
127.0.0.1 IP 주소로부터 오는 모든 ICMP 패킷을 무시하는 경우 사용되는 프로토콜은 ICMP이고 발신 주소는 127.0.0.1 이어야 한다. 그리고 패킷 필터의 목표는 드롭(DROP)이다. 테스트하는 프로그램은 ping이며 ping은 단순히 ICMP type 8로 반응요구를 보내며 이에 협조하는 대상 호스트는 ICMP 타입 0 (echo reply)를 보내어 응답하도록 돼 있다. 이제 iptables의 패킷필터를 통해 로컬호스트가 ping 명령에 반응하지 않도록 하겠다.
# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.2/0.2/0.2 ms
# iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP
; `INPUT' 체인에 127.0.0.1로부터 오고(`-s 127.0.0.1') ICMP(`-p
ICMP') 패킷에 대해 DROP로 점프하라는 (`-j DROP') 규칙을 추가(-A).
# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
■ 설정된 iptables 규칙의 삭제
지금 현재 입력돼 있는 chain이 하나밖에 없으므로 숫자를 지정하는 명령으로 삭제가 가능하며, 앞의 명령과 똑같이 하되 -A를 -D로 바꾸어 지우는 방법이 있다.
#iptables -D INPUT 1
#iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP
■ 체인 규칙 나열하기
설정돼 있는 체인의 규칙을 모두 볼 수 있다. 명령으로 -L을 사용해 가능하며 -v 옵
션과 같이 사용해 각 체인에 대한 패킷과 바이트 카운터 등의 자세한 정보를 함께
볼 수 있다.
pkts bytes target prot opt in out source
destination
■ 체인 비우기
하나의 체인 안의 모든 규칙을 비우는 것은 ‘-F’ 명령을 사용해 간단하게 할 수
있다. 체인을 지정하지 않으면 모든 체인의 규칙을 지울 수 있다.
# iptables -F INPUT
■ 출처와 목적지 지정
출처('-s', '--source', '--src')와 목적지('-d', '--destination', '--dst') IP 주소를 지정하는데 4가지 방법이 있다. 가장 보편적인 방법은 'www.linuzine.com', 'localhost'처럼 도메인 네임을 이용하는 것이다. 두번째 방법은 '127.0.0.1'과 같은 IP 주소를 이용하는 것이다.
세번째와 네번째 방법은 IP 주소의 그룹을 지정하는 것으로 '199.95.207.0/24' 또는 '199.95.207.0/255.255.255.0' 같은 형태이다. 이 둘은 모두 199.95.207.0
부터 199.95.207.255 사이의 모든 IP 주소를 지정한다. '/' 다음의 숫자는 IP 주
소의 어떤 부분이 의미 있는가를 나타낸다. '/32' 나 '/255.255.255.255' 가 기
본 값이다.(IP 주소의 모든 부분이 일치해야 한다.) 모든 IP 주소를 지정하는
데 '/0' 가 사용된다.
# iptables -A INPUT -s 0/0 -j DROP
많은 지시자들('-s'나 '-d' 같은)은 일치하지 않는 주소를 나타내기 위해 '!'('not'을 의미한다)로 시작하는 설정을 할 수 있다. 예로, '-s ! localhost' 는 localhost로부터 오는 패킷이 아닌 경우를 나타낸다.
■ 프로토콜 지정
프로토콜은 '-p' 지시자로 지정할 수 있다. 프로토콜을 숫자가 될 수 있고(IP의 프로토콜 번호를 알고 있다면) 'TCP', 'UDP', 'ICMP' 같은 이름이 될 수도 있다.
그리고 'tcp'는 'TCP'와 같은 역할을 한다. 프로토콜 이름 지정에도 '!'을 이용
할 수 있다. '-p ! TCP'
■ TCP 확장
TCP 확장은 '--protocol tcp' 가 지정되고 다른 적용이 지정되지 않으면 자동으로 적재된다. 이것은 다음과 같은 옵션을 제공한다.
--tcp-flags
뒤에 두개의 단어를 사용한다. 첫번째 것은 검사하고자 하는 지시자 리스트의 마스크이다. 두번째 단어는 지시자에게 어떤 것이 설정 될 것인지를 말해준다.
# iptables -A INPUT --protocol tcp --tcp-flags ALL SYN,ACK -j DROP
이것은 모든것이 검사돼야 함을 말한다. 그러나 SYN과 ACK만 설정된다.
--syn
'!' 옵션이 선행될 수 있다. 이것은 '--tcp-flags SYN,RST,ACK,SYN'의 약어이다.
--source-port,
'!' 옵션이 선행될 수 있다. 이후에 하나의 TCP 포트나 포트의 범위를 지정한다.
--sport
/etc/services 에 기록된 것과 같은 포트 이름이 사용될 수 도 있고 숫자로 나타낼 수도 있다. 범위는 두 개의 포트 이름을 '-'으로 연결해서 사용하거나 하나의 포트 뒤에 '-'를 사용하거나 하나의 포트 앞에 '-' 를 덧붙일 수 있다.
--destination-port, --dport
위의 내용과 같으나 목적지를 지정한다.
--tcp-option
'!' 나 숫자가 옵션에 선행될 수 있는데 숫자가 앞에 올 경우 그 숫자 와 TCP 옵션이 같은 경우의 패킷을 검사한다. TCP 옵션을 검사하려 할 때 완전한 TCP 헤더를 갖지 않는 것은 자동으로 드롭 된다.
■ iptables를 통한 포트관리
iptables는 테이블 형식으로 관리를 한다. 그리고 먼저 등록된 것이 효력을 발생하기 때문에 등록을 하는 순서가 중요하다. 모든 것을 거부하는 설정이 먼저 오게 되면 그 이후에 포트를 열어주는 설정이 와도 효과가 없다. 그러므로 허용하는 정책이 먼저 오고 나서 거부하는 정책이 와야 한다.
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 22:30 -j DROP
이렇게 하면 먼저 25번 포트로 들어오는 것을 허용하고 난 후에 다른 것을 막아내기 때문에 제대로 된 설정이 된다.
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
등록된 라인은 ssh를 사용하는 것을 허용하는 것이다. 출처(source)와 목적지 (destination)는 명시하지 않았기 때문에 전체포트와 IP가 대상이 된다. -dport 는 패킷이 대상으로 삼는 포트를 명시한 것이다 여기에서 22라고 표기한 것은 ssh서비스 포트이다. 그리고 마지막에 -j ACCEPT는 허용하도록 정책을 정하는 것이다.
따라서 여기로의 ssh서비스를 요청하는 패킷은 허용되도록 설정을 한 것이다.
■ 전체적인 설정
#!/bin/sh
# iptables 모듈 등록하기
modprobe iptable_filter
# ssh 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# httpd 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# pop3 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 109 -j ACCEPT
# pop2 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 110 -j ACCEPT
# imap 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 143 -j ACCEPT
# mysqld 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
# ftpd 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# ftp-data 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 20 -j ACCEPT
# ircd 열어주기
/usr/local/bin/iptables -A INPUT -p tcp --dport 6667 -j ACCEPT
/usr/local/bin/iptables -A INPUT -p udp --dport 6667 -j ACCEPT
# 전부 거절하기
/usr/local/bin/iptables -A INPUT -p tcp --dport 1:30000 -j DROP
/usr/local/bin/iptables -A INPUT -p icmp --icmp-type echo-request -j
DROP
이처럼 허용하는 서비스가 한정적이다. 우선 ssh, http, pop3, pop2, imap,
mysql, ftp, ircd를 위해서 서비스를 요청하는 패킷은 허용하고 나머지는 전부 거부하는 설정이다. 이 설정을 자세히 보면 tcp와 icmp를 대상으로 했다. 거절하는 줄인
/usr/local/bin/iptables -A INPUT -p tcp --dport 1:30000 -j DROP
이 라인에서 --dport 다음에 1:30000 으로 지정돼 있다. 이 부분은 서버를 경유해서 다른 곳으로 가고자하는 경우에 클라이언트 프로그램이 사용할 포트를 남겨주기 위함이다. 1번포트에서 30000번 포트까지는 완전히 tcp에 대해서 막는 것이다.
만약에 서버에서 나갈 이유가 없으면 전부 막으면 된다. 1:65535 로 설정하면 전체포트가 막힌다. iptables 설정은 조금만 공부를 하면 쉽게 습득이 가능하다. 그러므로 문서를 보는 것이 중요하다. 이 설정은 기본이므로 좀더 많은 것은 관련 문서를 이용하기를 바란다.
# 웹서버일경우 80으로 들어오는 요청과 1.1.1.1 에서들어오는 ssh 요청을
# 받아들인다.
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -s 1.1.1.1 --dport 22 -j ACCEPT
# 1초에 15번 이상의 HTTP 접근을 할경우 (DOS공격) 접근을 차단한다.
# 이기능을 사용하려면 커널컴파일 및 iptables 패치가 필요하다. (리눅스서버 보완관리 실무 P.298 참조)
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 -connlimit-mask 24 -j DROP
# 메일서버의 경우 동시에 5개이상 SMTP 접근자(스팸머)의 경우 5분동안
# 접근을 제한한다.
iptables -A INPUT -m recent --name spammer --rcheck --seconds 300 -j drop
iptables -A INPUT -p tcp --syn --dport 25 -m connlimit --connlimit-above 5 -m recent --name spammer --set -j DROP
# STRING 필터기능
# MSN 문자열이들어간 패킷 차단
iptables -A FORWARD -m string --string "messenger.msn.com" -j DROP
# 싸이월드로 접속차단
iptables -A FORWARD -p tcp --dport 80 -m string --string "Host: cyworld.nate.com" -j DROP
# 포트스캔을 차단한다.
iptables -A INPUT -m psd -j DROP
# 만약서버가 해킹당해 DOS공격지로 사용될때 적용시킴.
# DNS 쿼리이외에 UDP 패킷이 나가는 것을 방지
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p udp ! --dport 53 -m state --state NEW -j DROP
MRTG(Multi Router Traffic Grap her)는 펄(Perl)과 C 언어로 구성돼 있고, 유닉스와 NT에서 동작한다. 일, 주, 월, 년 간으로 트래픽 발생량을 그래프화해 보여주므로 시간대별 흐름을 파악하는데 좋은 분석 도구가 될 수 있다.
대체적으로 MRTG는 네트워크 장비인터페이스별 트래픽 분석, CPU나 메모리 사용률 분석, 모뎀별 포트 사용률 분석 등에 사용되고 있다. 그러나 트래픽 모니터링 뿐만 아니라, SNMP 값(MIB 값)을 이용해 다양한 모니터링이 가능하고 외부 프로그램을 사용할 수 있기 때문에 다양한 변형이 가능하며, MRTG가 생성하는 로그 값을 가공해 새 DB의 구축에도 응용할 수도 있다.
MRTG의 주요 기능
기본적으로 네트워크 장비가 SNMP를 지원한다면 MRTG를 사용할 수 있다. MRTG의 가장 큰 장점이라면 결과치의 흐름을 알 수 있기 때문에 사업 계획을 세우는 자료로 활용할 수 있고, 로그값을 가공해 여러 용도로 이용할 수 있는 것.
로그값을 가공하는 데는 여러 방법이 있겠지만, 필자는 주로 펄 언어를 사용했다. 그러나 PHP를 이용하면 복잡한 CGI 프로그램이 없어도 쉽게 웹 상에서 활용할 수 있을 것이다. 주로 활용되는 분야는 다음과 같다.
·장비의 특정 인터페이스에 대한 트래픽 모니터링
(그림 1)은 MRTG를 이용한 라우터에 관한 일간 그래프다. KT-IX와 155Mbps로 연결된 라우터의 1개 포트에 대한 트래픽을 보여주고 있다.
·CPU 사용률 모니터링
(그림 2)는 주간 그래프로, 라우터의 CPU 사용률을 보여주고 있다. 이를 통해 입출력이 같음을 알 수 있다.
·RAS 장비에 대한 포트 사용률 모니터링
(그림 3)은 가입자들이 014XY로 접속한 포트 수를 보여준다. 이 값은 RAS 장비에서 현재 접속한 사용자 수를 읽어와서 펄 언어로 작성된 프로그램을 이용해 가공한 후, MRTG를 이용한 그래프 작성법을 이용했다.
·특정 서버에 대한 세션 수 측정
(그림 4)는 일간 그래프로, 프록시 서버의 TCP 세션 수를 보여 준다. 사용된 OID는 ‘1.3.6.1.2.1.6. 9.0’.
MRTG 그래프는 이 로그 값을 기초로 해서 만들어진다. 형식은 unix time, current_in, current_out, max _in, max_out로 나타난다. 유닉스 시간은 1970년 1월 1일을 0으로 해서 1초마다 카운트한 값이다. 로그 시간을 보면 5분마다 쌓이는 것을 볼 수 있다. 각 레코드가 공백으로 구분돼 있기 때문에, C언어나 펄 언어 등을 이용해서 current_in 값을 배열로 저장해, 매일 특정 시간대의 평균 트래픽 등을 계산하는데 이용할 수 있다.
유닉스에서 MRTG 구축하기
MRTG는 소스 코드로 제공되기 때문에 다운로드 받은 후 컴파일하는 작업이 필요하다. 따라서 컴파일하기 위해서는 C 컴파일러가 설치돼 있어야 한다. 그외 유닉스에서 MRTG를 수행하는 데 필요한 프로그램으로써는 Perl, gd, libpng, zlib가 있어야 한다. 그리고 웹으로 공유하기 위해서는 웹 서버가 필요하다.
① GCC 설치하기
웹(http://gcc.gnu.org)에서 다운로드 받아서 인스톨하면 된다.
② Perl 설치하기
웹에서(www.perl.com) v5.005 이상을 다운로드 받아서 설치한다. 이미 설치가 돼 있는 경우, 버전 확인은 ‘perl -v’로 알 수 있다.
gzip -d stable.tar.gzip (stable이라는 이름에서 최신의 안정된 버전 이라는 뜻으로 추정) tar -xvf stable.tar mv ./stable*/ /usr/local/perl/ (프로그램은 주로 /usr/local/ 디렉토리로 이동시킨다) cd /usr/local/perl rm -f config.sh(기존에 설치된 config shell 파일을 지움) sh Configure (configure 파일 생성) make (소스 파일이므로 컴파일 함) make test make install(컴파일 후 인스톨 함)
③ 그래픽 생성용 라이버러리 만들기
MRTG가 생성하는 그래픽 파일의 형식이 PNG라고 위에서 언급했다. 이를 위해 gd 라이브러리가 필요하고, 이 gd 라이브러리는 2개의 라이브러리(zlib, libpng)가 설치돼 있어야 컴파일이 가능하다.
a. zlib(그래픽 파일을 압축함)
웹(www.info-zip.org/pub/infozip/zlib)에서 최신 버전을 다운받아 설치한다.
gzip -d zlib.tar.gz tar -xvf zlib.tar mv ./zlib*/ /usr/local/zlib/(program은 주로 /usr/local/ 디렉토리로 이동) cd /usr/local/zlib ./configure make make test make install
b. libpng(zlib의 그래픽 파일을 PNG 포맷으로 변형)
웹(www.libpng.org/pub/png)에서 다운로드 한다.
gzip -d libpng-1.0.8.tar.gz (stable 이라는 이름에서 최신의 안정된 버전을 말하는 것 같음) tar -xvf libpng-1.0.8.tar mv ./libpng*/ /usr/local/libpng/(program은 주로 /usr/local/ 디렉토리로 이동) cd /usr/local/libpng cp scripts/makefile.std makefile(scripts 디렉토리 밑에서 해당 OS에 맞는 makefile 선택해서 makefile로 복사함) make test make install
c. gd
웹(www.boutell.com/gd)에서 다운로드 한다.
gzip -d gd-1.8.3.tar.gz (stable 이라는 이름에서 최신의 안정된 버전을 말하는 것 같음) tar -xvf gd-1.8.3.tar mv ./gd*/ /usr/local/gd/ (program은 주로 /usr/local/ 디렉토리로 이동) cd /usr/local/gd make make install
④ MRTG 설치하기
웹(http://ee-staff.ethz.ch/~oetiker/webtools/ mrtg/pub/beta)에서 최신 버전을 다운로드 한다.
gzip -d mrtg-2.9.0pre21.tar.gz | tar -xvf (gzip과 tar를 한꺼번에 실행함) mv ./mrtg*/ /usr/local/mrtg/ cd /usr/local/mrtg ./configure --with-gd=/usr/local/src/gd --with-z=/usr/local/src/zlib --with-png=/usr/local/src/libpng(라이버러리들이 있는 위치를 지정해줌) make
MRTG가 이상없이 설치됐다면 run 디렉토리 밑에 mrtg, cfgmaker와 같은 실행 파일이 만들어지게 된다. run 디렉토리 밑에 있는 실행 파일들은 꼭 이 위치가 아니더라도 실행하는 데는 지장이 없다.
⑤ cfg 파일 생성
이제 cfgmaker를 이용해 mrtg.cfg 파일(꼭 이름이 mrtg.cfg일 필요는 없다. cfg 성격에 맞게, router.cfg, switch.cfg 등의 이름을 만들어 주면 된다)을 형식에 맞게 만들어서 실행하면 된다.
cfgmaker --global ‘WorkDir: /home/httpd/mrtg’ --global ‘Options[_]: bits,growright’ --output /home/httpd/mrtg/mrtg.cfg community at router.abc.xyz
WorkDir은 결과 파일이 만들어질 디렉토리를 말한다. 옵션은 여러 가지가 있는데, 비트를 선택하지 않으면 바이트가 기본값이 되고, growright는 그래프를 오른쪽에서 왼쪽 순서로 그리도록 한다.
Output은 mrtg.cfg 파일이 생성되는 경로를 지정하는 것이고, 마지막 줄은 실제 모니터링 하려고 하는 네트워크 장비를 적어 준다. 여기서 community는 장비마다 SNMP 값을 갖고 올 때 사용하는 고유값인데, 기본적으로 public을 사용한다. router.abc.zyz는 네트워크 장비의 IP 주소나 호스트명을 적으면 된다.
이렇게 실행하면 그 결과 값이 /home/httpd/mrtg 디렉토리 밑에 만들어진다. 처음 실행하면 경고 메시지가 뜨는데, 이는 비교할 수 있는 로그값이 없기 때문이므로 걱정하지 않아도 된다. 위의 명령을 2, 3번 정도 반복하면 정상적인 트래픽을 볼 수 있다.
⑦ 5분마다 MRTG 실행하기
위의 명령이 주기적으로 실행되게 하기 위해서는 crontab을 이용하면 된다. 만일 매 5분마다 실행하기 위해서는 crontab 파일에 다음 한 줄을 추가하면 된다(crontab 파일은 시스템마다 다른데, 우리 환경의 경우 /var/spool/cron/crontabs/root 파일을 이용한다).
0,5,10,15,20,25,30,35,40,45,50,55 * * * * [CODE]<mrtg-bin>/mrtg <path to mrtg-cfg>/mrtg.cfg[/CODE]
그리고 이를 적용하려면 ‘crontab root’ 하면 된다.
⑧ 아파치 서버 설치
마지막으로 html 파일들을 웹 브라우저를 통해 보기 위해서는 웹 서버를 구동해야 되는데, 유닉스 시스템에서 가장 많이 사용되어지는 아파치(Apache) 서버에 대해 간단히 설명하겠다(보다 자세한 것은 아파치 홈페이지를 참조하기 바란다). 먼저 웹(www.apache.org /dist)에서 최신 버전을 다운로드 받아 설치한다.
gzip -d apapche_1.3.12.tar.gz | tar -xvf mv ./apache*/ /usr/local/apache/ cd /usr/local/apache ./configure make make install conf/httpd.conf 파일 수정작업(기본적인 웹서버로 동작하기 위해 필요한 설정을 하는 곳) /usr/local/apache/bin/apachectl start(아파치를 실행)
윈도우 NT에서 MRTG 설치하기
윈도우 NT에서의 MRTG 설치는 간단하다. 윈도우 NT용 펄(perl) 프로그램과 MRTG를 다운로드 받아서 설치하면 된다.
① 펄 설치하기
웹에서(www.ActiveState.com)에서 ActivePerl 616을 다운 받아 설치한다. 설치 후에는 경로가 제대로 설정됐는지 [제어판] → [시스템] → [환경변수]에서 확인.
② MRTG 설치하기
MRTG도 마찬가지로 MRTG 사이트(http://ee-staff.ethz.ch/~oetiker/webtools/mrtg/pub/beta)에서 윈도우 NT용 최신버전을 다운로드 받아서 설치만 하면 된다(윈도우 NT용은 확장자가 .zip인 파일). 이전 버전에서는 MRTG 파일을 수정해야 됐지만, 이제는 그럴 필요가 없다. MRTG 설치가 끝나면 이제 실제 cfg 파일을 만든 후 MRTG가 제대로 동작하는지 확인하는 과정만 거치면 된다.
(IP주소가 10.10.10.1인 라우터인 경우 인터페이스별로 고유의 포트 번호를 가진 cfg 파일을 만들게 된다)
④ MRTG 실행하기
c:>perl mrtg mrtg.cfg
이렇게 실행하면 유닉스도 마찬가지지만 에러 메시지가 나타나는데, 2번 더 반복하면 더 이상 에러 메시지없이 정상 그래프를 출력하게 된다. 유닉스와 마찬가지로 5분마다 MRTG를 실행하기 위해서는 윈도우 NT의 AT 스케줄러를 이용하거나 MRTG 스태틱 업데이터(Static Updater) 서비스를 사용할 수도 있지만, 간단히 mrtg. cfg 파일에 ‘RunAsDamon: yes’를 추가하면 된다.
전용회선 가입자별로 MRTG 화면 보여주기
ISP나 그외 전용회선을 구축해 회선 임대를 하는 공공기관이나 학교 등에서는 해당 가입자별로 ID와 패스워드를 부여해 접속한 ID별로 MRTG 그래프를 볼 수 있도록 할 수 있다. 이때 이용되는 것은 펄 언어와 아파치 서버(물론 GCI를 처리하는 다른 언어도 사용 가능).
한 ISP와 전용회선으로 연결된 랜드라는 회사에 ID와 패스워드를 부여해 이 ID로 자기 회사의 전용회선 트래픽을 볼 수 있도록 ID 입력창→ 인증창→ MRTG 화면의 순서를 거치면 된다.
① ID와 패스워드 정하기
랜드 - ID: land, 패스워드: ld1234
② cfg 파일 생성
mrtg.cfg파일에 land 라는 이름으로 등록하자. 여기서 WorkDir은 /home/httpd/MRTG/ 설정.
home/httpd/land 디렉토리에 .htpasswd파일과 .htaccess파일을 생성해 아래와 같이 수정한다. 이 파일의 역할은 웹 상에서 이 디렉토리로 접근하려면 ID와 패스워드를 물어보는 역할을 한다.
mrtg# cat .htaccess AuthName MRTG (이 값은 시스템마다 다름) AuthType Basic AuthUserFile /home/httpd/land/.htpasswd ( 패스워드가 저장된 파일 지정) AuthGroupFile /dev/null [CODE]<Limit GET POST> require valid-user </Limit>[/CODE] mrtg# cat .htpasswd land:z5EPIRJHqBQV (암호화된 패스워드)
⑤ Symbolic Link 설정 단계
현재 MRTG 결과 파일들은 ‘/home/httpd/MRTG/’에 저장되어 있고, 외부에서 ID별로 접속할 때는 ‘/home/httpd/land/로 연결되도록 구성하고자 한다. 이 경우 실제 파일들이 있는 위치를 ‘ln’명령을 사용하여 symbolic link를 시킬 수 있다.
마지막으로 웹 상에서 ID(land)를 입력하고 ‘/home /httpd/land/land.html’ 창이 뜨도록 하면, 이 디렉토리에는 ‘.htaccess’파일이 있기 때문에 인증창이 뜨게 된다. 다시 말해 웹페이지에서 ID를 입력받도록 페이지를 만들고, CGI를 이용해 ID별로 해당 MRTG 그래프가 뜨도록 하면 된다. 필자는 CGI 프로그램을 펄을 이용해 작성해 봤다.
[CODE] $qs = $ENV{‘QUERY_STRING’}; # ‘fname&land’ 와 같은 형식으로 넘어오기 때문에, ‘&’를 기준으로 분리해 저장 @qs = split(/&/, $qs); foreach $i (0 .. $#qs) { # convert plus chars to spaces $qs[$i] =~ s/+/ /g; # convert the hx characters $qs[$i] =~ s/%(..)/pack(“c”, hex($1))/ge; # split each one into name and value ($name, $value) = split(/=/, $qs[$i],2); # $value변수에 ‘land’가 할당된다. # create the associative element $qs{$name} = $value; } # 실제 html 형식으로 출력하는 부분. print “Content-type: text/html”, “”; print “<HTML>”, “”; print “<HEAD><TITLE>$value MRTG 트래픽</TITLE></HEAD>”, “”; # mrtg.co.kr이라는 도메인을 운영할 경우 아래와 같이 사용 가능 print “\u8221”http://www.mrtg.co.kr/$value/$value.html\u8221”>”, “”; print “</HTML>”, “”; [/CODE] 이상으로 MRTG에 대한 기본적인 내용과 설치 방법, 그리고 몇 가지 응용 예를 살펴봤다. 이외에도 MRTG를 활용해 수 있는 일이 많다.
Interval: 5 (5분마다 반복) RunAsDamon: yes (운영체제로 하여금 매 5분마다 mrtg를 실행하도록 함)
3번 포트의 경우 기본적인 키워드만 사용한 경우로써, 10Mbps 이더넷 포트에 대한 트래픽을 보여준다.
MaxBytes는 125×대역폭(bit)를 의미하므로, 10Mbps인 경우 1250000가 된다. [CODE] Target[cat5500_3]: 3:public@10.10.10.1 MaxBytes[cat5500_3]: 1250000 Title[cat5500_3]: LC-Bridge (sample-device): ether0 PageTop[cat5500_3]: <H1>Traffic Analysis for ether0</H1> <TABLE> <TR><TD>System:</TD><TD>LC-Bridge inAndover</TD></TR> <TR><TD>Maintainer:</TD><TD>Administrator</TD></TR> <TR><TD>Interface:</TD><TD>ether0(3)</TD></TR> <TR><TD>IP:</TD><TD>sample-device(10.10.10.1)</TD></TR> <TR><TD>Max Speed:</TD> <TD>1250.0 kBytes/s (ethernetCsmacd)</TD></TR> </TABLE> [/CODE] 5번 포트의 경우 추가의 키워드를 적용했고, 웹 페이지에 나타나는 부분도 수정을 했음. 키워드에 관해서는 ‘doc/co nfig.txt’를 참조.
[CODE] Target[cat5500_5]: 5:public@10.10.10.1 MaxBytes[cat5500_5]: 1250000 Title[cat5500_5]: Catalyst 5500 Port 5번 PageTop[cat5500_5]: <H1> Catalyst 5500 Port 5번 트래픽 </H1> <TABLE> <TR><TD>Interface:</TD><TD>Ethernet 1/5</TD></TR> <TR><TD>IP:</TD><TD>10.10.1.1</TD></TR> <TR><TD>Max Speed:</TD> <TD>10.0 Mbit/s (ethernetCsmacd)</TD></TR> </TABLE> [/CODE] ### XScale YScale------------ XScale[cat5500_5]: 1.5 YScale[cat5500_5]: 1.5 WithPeak[cat5500_5]: ymw Unscaled[cat5500_5]: ymwd Options[cat5500_5]: growright, bits Colours[cat5500_5]: GREEN#00eb0c,BLUE#1000ff,DARK GREEN#006600,VIOLET#ff00ff YLegend[cat5500_5]: Bits per Second ShortLegend[cat5500_5]: b/s Legend1[cat5500_5]: Incoming Traffic in Bits per Second Legend2[cat5500_5]: Outgoing Traffic in Bits per Second Legend3[cat5500_5]: Maximal 5 Minute Incoming Traffic Legend4[cat5500_5]: Maximal 5 Minute Outgoing Traffic LegendI[cat5500_5]: In: LegendO[cat5500_5]: Out:
카탈리스트 5500의 CPU 사용률을 보기 위해서는 포트 번호 대신 특정 OID(Object ID = MIB값)가 필요하다. mrtg는 기본적으로 인력과 출력의 2개 값이 필요하므로, CPU 사용률과 같이 값이 하나인 경우에는 ‘&’를 기준으로 같은 OID를 적어 주면 된다.
Target[cat5500_cpu]:1.3.6.1.4.1.9.2.1.58.0&1.3.6.1.4.1.9.2.1.58.0:public@10.10.10.1 RouterUptime[cat5500_cpu]: public@10.10.10.1 MaxBytes[cat5500_cpu]: 100 Title[cat5500_cpu]: CPU LOAD PageTop[cat5500_cpu]:
CPU Load %
Unscaled[cat5500_cpu]: ymwd ShortLegend[cat5500_cpu]: % XSize[cat5500_cpu]: 380 YSize[cat5500_cpu]: 100 YLegend[cat5500_cpu]: CPU Utilization Legend1[cat5500_cpu]: CPU Utilization in % (Load) Legend2[cat5500_cpu]: CPU Utilization in % (Load) Legend3[cat5500_cpu]: Legend4[cat5500_cpu]: LegendI[cat5500_cpu]: LegendO[cat5500_cpu]: Usage Options[cat5500_cpu]: gauge
IPMP는 Solaris에서 기본으로 제공하는 기능으로서 Network Adapter에 대한 Single Point Failure로부터 보호되며 또한 동일한 IP link에 여러개의 Network Adapter가 연결되어 있으면 Throughput도 증가된다.
Feature NAFO IPMP =================================================================== Failure 감지 Physical Link IP Link Fail over time 20sec 이상 2~3 sec이내 Active상태 1개만 Active 모두 Active가능 Load Balance No Load Spreading ===================================================================
Feature Trunking IPMP =================================================================== Inbound Load Spreading Y Y (1) Uses Single IP address Y N Uses Single MAC address Y N Supports hot standby NIC N Y Supports built-in NICs N (4) Y Bundled with Solaris N (5) Y (S8 10/00) Supports Many Link Layers N Y Outbound Load Spreading Y Y Auto NIC Failover Y Y Basis for later SunCluster NIC failover N Y (3.next) Supports Solaris <= S8 Y N
(1)Future release will implement IEEE 802.3ad and which will support auto inbound load balancing for switches which support 802.3ad. Most switches using trunking implement MAC address hashing for load balancing so that inbound load from multiple clients will be evenly split across available ports. ====================================================================
- Failure Detection Network adapter가 fail되었을때 이를 감지하여 자동적으로 다른 Network adapter를 통하여 네트워크에 접속할수 있도록 전환해준다. 감지하는 방 법은 각 adapter에 Test IP를 부여하여 이를 이용하여 네트워크상에 있는 target과 ICMP request와 Reply에 의하여 판단한다.
- Outbound Load Spreading Outbound 되는 패켓에 대하여 여러개의 Network adapter에 분산되어 전달 된다. 그러나 한개 이상의 Client와 통신할때만 이루어진다.
- Repair Detection Fail된 Network dapter에 대하여 연속적으로 체크를 하며, Repair되었을때 는 자동적으로 Fail back할수 있다.(Failbacks를 enable했을때)
< IPMP를 구성하기위한 요구사항>
- Hardware지원 IPMP는 SPARC, Intel 환경 모두 지원하여, 다른종류의 Network adapter (즉,le, hme, ge, qfe등)들과도 같은 IPMP group에 구성될수 있다.
주의사항:IPMP구성시 "local-mac-address?"는 true로 해야한다.
- Software IPMP는 Solaris 8 Updated 2(H/W 10/00)에서부터 지원된다.
< IPMP 테스트 target선정방법> in.mpathd 해당 network adapter를 검증하기위해서 Target정하는데 있어서 자동적으로 정해지며 이는 임으로 구성할수 없다.
1) netstat -r에서 router를 찾아 target 등록
2) 위에서 router가 없으면 없으면 같은 link상에 있는 임의의 Host들을 Multicast packet을 보내(IPv4=224.0.0.1, IPv6=ff02::1)을 모든 host 들에게 보낸 응답자들중에서 선정한다. 만일 router나 host가 ICMP echo 에대하여 응답이 하나도 없으면 in.mpathd는 target을 찾을때까지 연속 적으로 Multicast을 보낼것이다.
3) 위와 같은 상황에서 router가 없으면 brocast 를 보내기 때문에 해당 네트워크상에 부하를 준다. 이를 회피하는 방법으로 infodoc 41422에 설명된바와 같이 임으로 해당 네크워크상의 호스트를 target으로 선정하여 IPMP를 구성한 host routing table에 등록해준다.
예) host0(10.1.1.1),host1(10.1.1.2) : 네트워크상의 시스템, host2(10.1.1.3): IPMP를 구성한 시스템
host2># route add host 10.1.1.1 10.1.1.1 host2># route add host 10.1.1.2 10.1.1.2 위와 같이 host2에 routing table에 등록을 해주면 in.mpathd는 등록된 router를 테스트 target시스템으로 등록을한다. ** 만일 동일 네트워크상에 계층적으로 LAN switch가 구성되어져 있다면, 가장 상위에 연결되어있는 시스템을 target으로 정한다면 해당 경로에 있는 switch도 점검이 가능하다.
< NIC의 Failure/Repair감지> in.mpathd는 이는 위에서 정한 target(host)들에 대하여 ICMP echo request /replies(PING-PONG)에 의해서 감지한다.
< IPMP Configuration >
Example) 192.9.200.1 v480 loghost ; 실제 시스템 IP 192.9.200.3 v480-test ; ce0 테스트 어드레스 192.9.200.4 v480-second-test ; ce1 테스트 어드레스
[ ] 다음과 같이 IPMP구성
# ifconfig ce0 group v480-group ; v480라는 그룹에 설정 # ifconfig ce1 group v480-group ; v480라는 그룹에 설정
[ ] 로지칼 인터페이스 생성 및 테스트 IP 어드레스 설정 테스트 IP 어 드레스는 각 NIC의 로지칼 인터페이스를 만들어 그에 할당 해 사용 합니다.
# ifconfig ce0 addif v480-test deprecated -failover netmask + boradcast + up (deprecated 파라미터는 애플리케이션에서 사용 못하게 함)
# ifconfig ce1 v480-second-test deprecated -failover netmask + broadcast + standby up 여기까지 하면 설정 완료 되고, ifconfig 로 설정을 확인
[ ] 다음은 영구적으로 사용하기 위해 파일에 등록
==== /etc/hostname.ce0 ==== v480 netmask + broadcast + group v480-group up addif v480-test deprecated -failover netmask + boradcast + up
==== /etc/hostname.ce1 ==== v480-second group v480-group deprecated -failover netmask + boradcast + standby up