2장-리눅스 Server 구축 및 실무 운영
2. 리눅스 Server 구축 및 실무 운영
이 단원에서는 리눅스 운영체제를 이용하여 실무에서 주로 사용되어지는 시스템 구축 기술과
운영 기술에 대해 다루도록 하겠습니다.
이 단원에서 소개되는 기술의 부분은 실무 구축 기술에 중점을 두고 있으며, 이론적인 접근은
최소화하고 있습니다. 이론적인 자세한 설명은 각 분야별 전문 서적을 참고하시길 바랍니다.
2.1. DNS ( Domain Name System )
DNS(Domain Name System) 는 인터넷의 접근 기준이 되는 IP Address를 특정 String 형식의
이름으로 Mapping 을 시켜주는 거대한 분산 Name Date Base 라 볼수 있다.
실제 1970년대까지는 주로 hosts 란 파일에 주요 인터넷 주소를 적어두고 배포하는 형식의
DNS 방식을 채택하였지만, hosts 파일의 크기가 거대해지자 많은 트래픽과 이름 충돌과 같은
여러가지 문제가 발생하기에 이른다.
1983년 Paul Mockapetris가 RFC882, RFC883(현재는 RFC1034로 대체됨)에 새로운 명명 체제에
대한 구현을 공식 발표하며, 크게 네임스페이스의 계층 구조, 분산 데이터베이스, Email
라우팅 개선을 주안점으로 현재의 DNS 가 탄생하게 된다.
이제 본격적으로 DNS 설정에 대해 알아보도록 하자
2.1.1 DNS 작동 원리
설정에 앞서 DNS 가 어떻게 작동하는지 그 원리에 대해 간단히 알아보자.
예를 들어 여러분의 웹 브라우저로 특정 사이트에 접속을 한다는 가정을 해보도록 하자.
[ DNS 작동 원리도 – 그림 1 ]
1. 웹 브라우저는 로컬 PC 의 DNS 클라이언트에 설정된 DNS 서버로 브라우저를 접속한
도메인에 매핑된 IP를 찾는다.
2. 로컬 DNS 서버는 먼저 자신의 DNS DB(/etc/named.conf) 에 해당 도메인이 있는지를 찾는다.
3. 해당 도메인이 없을 경우 자신의 캐쉬에 등록된 정보가 있는지 확인한다.
4. 해당 도메인이 지금까지 로컬 DNS 서버에서 요청된적이 없다면 자기 상위의 Root DNS
서버에 해당 도메인의 정보를 묻게 된다.
5. 해당 도메인이 실제 존재하는 도메인이면 Root DNS 서버는 해당 도메인의 실제 권한을
가지고 있는 DNS 서버의 주소를 가르쳐 주게 된다.
6. 그럼 해당 도메인의 실제 권한을 가지고 있는 DNS 서버에서 해당 도메인의 IP 주소를
확인 할수 있게 된다.
이런 과정의 절차는 다소 복잡할 수 있지만 사용자에게는 매우 투명하게 처리 되어진다.
실제 각 과정마다 문제 발생의 요인이 있고, 이런 과정에 대해 이해를 하지 못할 경우
DNS 서버를 운영 중 문제가 발생하게 되면 문제 추적에 어려움을 겪게 될 것이다.
DNS 서비스의 경우는 굳이 서비스를 하기 위해서 자체적으로 DNS 서버를 구축하여 운영하지
않아도 된다. 그룹 내에 DNS 시스템이 있는 경우라면 해당 DNS 서버에 DNS 서비스를 통합하여
운영하는 것이 효율적이다. 실제 각 서버별로 도메인이 각기 다르다고 하면, 각 서버마다
DNS 서버를 구축하는 경우가 있는데 이런 경우 도메인 관리에 많은 불편함과 번거로운이 생기기
마련이다.
이상적인 방식은 DNS 전용 서비스용 서버를 이중화 하여 그룹내의 모든 도메인을 일괄적으로
관리하는 방법이 가장 효율적이라 할 수 있을 것이다.
이상적인 DNS 서버를 구축하기 위한 설정과 실제 도메인을 취득하여 DNS를 추가, 관리하는
방법에 대해 알아보도록 하자.
2.1.2 BIND (Berkeley Internet Name Daemon) 설치
먼저 Redhat Linux Package 에 들어 있는 bind 프로그램을 설치 하도록 하자.
# rpm -Uvh ./cd1/RedHat/RPMS/bind-9.2.1-16.i386.rpm
# rpm -Uvh ./cd1/RedHat/RPMS/bind-utils-9.2.1-16.i386.rpm
# rpm -Uvh ./cd2/RedHat/RPMS/bind-devel-9.2.1-16.i386.rpm
위와 같은 절차로 설치는 간단히 완료할 수 있다.
그럼 아래와 같은 DNS 설정에 필요한 파일들이 설치가 될것이다.
* /etc/rndc.conf
bind8에서 bind 9으로 변천과정에서 추가된 설정으로 DNS 관련 보안 인증키를 생성하고
이 인증키를 이용하여 DNS 의 여러가지 보안을 강화함.
* /etc/named.conf
네임서버 셋팅시 가장 중심이 되는 설정 파일로 각 도메인에 대한 ip변환값을
나타내는 zone file의 이름과 위치를 정의한다.
* /etc/resolv.conf
자기 system에 적용될 DNS를 설정한다.
/etc/host.conf
hosts file dns 대한 설정과 DNS 와 관련된 몇가지 설정을 정의 한다.
/etc/hosts
자기 system에서만 적용되는 mini DNS 설정
/var/named/named.ca
중요한 DNS 들의 ip를 적용시켜 ip 검색시 보다 더 빨리 찾을수 있도록 함.
(손댈 필요 없음)
/var/named/named.local
ip address 로 도메인을 찾을수 있도록 함
/var/named/named.zone
named.conf 에 정의된 도메인의 정보를 정의한 설정 파일 , 이곳에서
실질적으로 도메인이 ip address로 변환되어진다.
/var/named/named.rev
대표 도메인에 대한 reverse mapping 정보를 기록한다.
위에서 간단히 설명한 9개의 파일로 네임서버는 가동되어 진다.
허나 실질적으로 설정하는 파일은 5가지 정도이다.
2.1.3 DNS 기본 설정
– /etc/rndc.conf
bind 9 를 설치하면 rndc-confgen 이라는 명령어가 설치가 된다. 이 명령어를 이용해서 rndc.conf
를 생성을 하도록 한다. rndc-confgen 명령을 이용하면 key 값을 random 하게 생성해 준다.
[root@arhfw root]# rndc-confgen > /etc/rndc.conf
생성된 rndc.conf 파일을 열어 rndc-key를 임의의 키명으로 수정하도록 한다.
[root@arhfw root]# vi /etc/rndc.conf
—————————————————————————–
# Start of rndc.conf
#key “rndc-key” {
key “clx-key” {
algorithm hmac-md5;
secret “J4WAGsHt1kzy4SbouN5iAQ==”;
};
options {
# default-key “rndc-key”;
default-key “clx-key”;
default-server 127.0.0.1;
default-port 953;
};
—————————————————————————–
위와 같이 rndc 설정이 완료되면 named.conf 설정으로 넘어가도록 하자.
– /etc/named.conf
named.conf 설정 파일은 DNS 설정 파일 중 가장 중요한 파일로 실제 도메인의 INDEX 정보를
저장하는 곳으로 DNS 서버의 동작의 시작 역활을 하는 파일이다.
[root@arhfw root]# vi /etc/named.conf
—————————————————————————-
options {
version “unknown”;
directory “/var/named”;
allow-transfer { 192.168.133.9; };
allow-recursion { 192.168.133.0/24; localhost; };
// allow-query { 192.168.133.0/24; localhost; };
// forworders { 192.168.133.9;192.168.133.1 };
};
logging {
category lame-servers { null; };
category unmatched { null; };
category network { null; };
category notify { null; };
};
key “clx-key” {
algorithm hmac-md5;
secret “LHE+QD1pUWzE2d1JE4OPNA==”;
};
controls {
inet 127.0.0.1 allow { localhost; } keys { clx-key; };
};
zone “.” IN {
type hint;
file “named.ca”;
};
zone “localhost” IN {
type master;
file “localhost.zone”;
allow-update { none; };
};
zone “0.0.127.in-addr.arpa” IN {
type master;
file “named.local”;
allow-update { none; };
};
zone “133.168.192.in-addr.arpa” IN {
type master;
file “clunix.rev”;
};
zone “clunix.org” IN {
type master;
file “clunix.zone”;
allow-update { none; };
};
———————————————————————————-
이제 위의 named.conf 파일 설정에 대한 의미에 대해 하나씩 알아보도록 하자.
위의 설정은 실제 실무에서 흔히 사용되는 기본 named.conf 설정으로 위 설정 파일을
기준으로 해서 각자의 DNS 설정 파일의 변동 부분을 적용시키면 될것이다.
———————————————————————————
options {
version “unknown”;
———————————————————————————
# dig @clunix.org txt chaos version.bind. | grep version
; <<>> DiG 9.2.1 <<>> @clunix.org txt chaos version.bind.
;version.bind. CH TXT
version.bind. 0 CH TXT “9.2.1”
dig 명령을 이용하여 아래와 같이 해당 DNS 서버의 버전을 알 수 있다. 이는 실제 DNS
서버의 버전을 알아되어 해당 버전의 버그등을 이용하여 해킹 공격을 시도할 수 있다.
그렇기에 최대한 시스템의 주요 어플리케이션의 버전은 외부에서 알 수 없게 해주는 것
이 바람직하다. options 설정에 version “unknown”; 구문을 추가하여 DNS 서버 정보를
숨겨 버릴 수 있다.
# dig @clunix.org txt chaos version.bind. | grep version
; <<>> DiG 9.2.1 <<>> @clunix.org txt chaos version.bind.
;version.bind. CH TXT
version.bind. 0 CH TXT “unknown”
——————————————————————————–
directory “/var/named”;
——————————————————————————–
각 도메인의 정의된 zone file, rev file 등이 존재하는 디렉토리 경로를 지정하는
설정이다.
——————————————————————————–
allow-transfer { 192.168.133.9; };
——————————————————————————–
allow-transfer문은 Primary 네임서버에서의 Zone transfer를 허용할 호스트를 지정
하는 설정이다. Bind DNS 서버에서 기본적으로 모든 호스트에 zone transfer 등을
허용하고 있다. 그래서 Nslookup 의 ls 기능을 이용하면 해당 도메인의모든 Zone
정보를 확인 할 수 있다. 위 설정에서 실제 허용이 필요한 호스트만을열어주도록
한다. Zone transfer 가 필요한 호스트로는 대표적으로 Secondary 네임서버가 있다.
만일 아무런 곳에도 열어주고 싶지 않은 경우는 allow-transfer { none; }; 설정으로
DNS 보안을 강화하도록 한다.
——————————————————————————–
allow-recursion { 192.168.133.0/24; localhost; };
——————————————————————————–
allow-recursion 설정은 실제 해당 시스템의 named.conf 에 정의된 도메인 이외의
다른 도메인을 캐싱 서버와 같이 이용하여 Query를 하는 경우 이에 대한 허가 대역
을 정하는 설정이다.
즉 이 DNS 서버를 외부 도메인에 대한 DNS 서버로 사용할 수 있는 클라이언트 대역
이라고 보면 된다.
——————————————————————————–
allow-query { 192.168.133.0/24; localhost; };
——————————————————————————–
allow-query 문은 해당 DNS 서버를 통해 DNS 질의를 할수 있는 호스트 대역을 지정하는
보안 설정이다. 이 구문에서 허가하는 네트워크 대역에서만 이 DNS 서버를 통해 DNS
query를 보낼 수 있다. 하지만 이 설정의 경우 주의해야 할점이 있다. 이 시스템에서
사용하는 Domain 이 외부에서 범용적으로 인식을 해야 하는 도메인의 DNS 서버라고
하면 위 설정을 해서는 안 된다. 만일 대 외 홍보 홈페이지 등에 사용되는 도메인이
라고 하면 실제 해당 도메인을 192.168.133.0 의 C-Class 대역에서만 인식을 할 것이다.
위 설정은 해당 도메인을 사용하는 대역이 제한적인경우에만 사용을 해야 할것이다.
——————————————————————————–
forworders { 192.168.133.9;192.168.133.1 };
}
——————————————————————————–
이 설정은 실제 이 서버에 도메인 질의가 들어오면 192.168.133.9 서버에서 질의를
보내버린다. 192.168.133.9 서버에서 응답이 없으면 다시 192.168.133.1 으로 보내
버리고 그곳에서도 응답이 없는 경우는 원래대로 root server 로 질의하게 된다.
Option 설정에 이 설정이 들어가면 모든 도메인 질의에 대해 forward 를 시키므로
특정 도메인에 한해 이런 기능을 추가 하고 싶을때는 해당 도메인의 zone block에
위 설정을 추가하면 된다.
——————————————————————————–
controls {
inet 127.0.0.1 allow { localhost; } keys { clx-key; };
};
——————————————————————————–
inet 는 귀를 귀울일 주소를 지정한다. 모든 곳은 * 문자를 이용한다.
port 는 귀를 귀울일 포트를 지정한다. rndc 의 경우 953 번 포트를 기본으로 사
용을 한다.
allow 는 tcp wrapper 와 비슷하게 생각하면 된다. 즉 allow 에 지정된 호스트로
부터의 요청만 허락을 한다는 의미이다. 모든 곳을 지정할 경우에는 any 로 지정하며,
어느곳도 허락하고 싶지 않다면 none 으로 지정을 하면 된다.
keys 는 allow 에 지정이 되어 있지 않더라도 지정된 key 와 동일할 경우 허락을
한다.
———————————————————————————
key “clx-key” {
algorithm hmac-md5;
secret “LHE+QD1pUWzE2d1JE4OPNA==”;
};
———————————————————————————
key 설정은 rndc-keygen 으로 생성한 /etc/rndc.conf 안에 있는 키를 복사해서 붙여넣기
를 하면 된다. 여기서 생성된 키를 이용하여 여러가지 DNS 인증 체계를 구성할 수 있다.
———————————————————————————
logging {
category lame-servers { null; };
category unmatched { null; };
category network { null; };
category notify { null; };
};
———————————————————————————-
category lame-servers { null; };
두 도메인 사이의 권한 부여가 되어져 있지 않는 상태에서 해당 도메인의 Zone 설정에
NS 지정이 되어져 있으면 이에 Lame Server 란 메세지를 담은 로그가 발생하게 된다.
이런 형태의 로그를 로그파일에 생성하지 않겠다는 의미이다.
category unmatched { null; };
DNS 설정 시 지정된 형태로 설정이 되지 않은 정보가 있는 경우 로그에 이에 대한 정보
가 남게 된다. 실제 서비스에 영향을 주지 않는 로그임으로 이 역시 로그에 남기지 않도
록 한다.
category network { null; };
네트워크 작동에 대한 로그를 남기지 않는다.
category notify { null; };
NOTIFY protocol 에 관련된 메세지를 남기지 않는다.
———————————————————————————-
zone “.” IN {
type hint;
file “named.ca”;
};
zone “localhost” IN {
type master;
file “localhost.zone”;
allow-update { none; };
};
zone “0.0.127.in-addr.arpa” IN {
type master;
file “named.local”;
allow-update { none; };
};
———————————————————————————
위 설정은 각 도메인에 대한 zone block 설정에 대한 기본 설정이다. . zone block 은 캐쉬
네임서버, 로컬호스트, 로컬 네트워크의 inverse domain, 각 도메인, name server가 위치하는
네트워크에 대한 inverse domain, 세컨더리 도메인, primary 네임서버가 위치하는 네트워크에
대한inverse domain, 7 가지에 대해서 설정을 한다.
만약 네임서버가 secondary 의 역할을 하지 않는다면 가장 마지막의 secondary domain 과
primary 네임서버가 위치하는 네트워크에 대한 inverse domain 은 설정할 필요가 없다.
위 설정은 캐시 네임서버와 로컬 호스트에 관련된 기본 설정 이다.
이 부분은 꼭 존재를 해야 하며, /etc/named.conf 에 기본 설정 그대로 사용을 하면 된다.
————————————————————————————
zone “clunix.org” IN {
type master;
file “clunix.zone”;
allow-update { none; };
};
————————————————————————————
위 설정은 primary 도메인에 대한 zone block 설정 부분이다. 이 서버에서 DNS 서버
역활을 할 도메인이 추가 될 경우 위 zone block 설정과 같은 형태로 zone 설정을 추가하면
된다.
zone block 설정은 다음과 같은 형식을 갖추고 있다.
zone “ORIGIN” IN {
type master;
file /path/filename;
allow-update { none; };
};
위 설정을 분석하면 현재 이 DNS 서버는 clunix.org 의 도메인에 대해 primary DNS 역활을
수행하고 있으면 clunix.org 에 대한 구체적인 정보는 /var/named/clunix.zone 파일안에
담겨져 있다. 는 의미를 가지고 있는 것이다.
————————————————————————————-
zone “133.168.192.in-addr.arpa” IN {
type master;
file “clunix.rev”;
};
————————————————————————————-
위 설정은 inverse domain에 대한 설정 부분으로 설정 형식은 다음과 같다.
기본적인 형식은 primary 도메인 설정 방식과 동일하다.
zone “ORIGIN” IN {
type master;
file /path/filename;
allow-update { none; };
};
다른점은 ORIGIN 의 표기법인데, inverse domain 의 ORIGIN 은 네트워크대역.in-addr.arpa 로 설
정을 한다. 네트워크 대역은 꺼꾸로 표현한다는 것을 주의한다. 예를들어 C class 의 1.2.3.0 네
트워크에 대한 inverse domain 을 설정한다면, 3.2.1-in-addr.arpa 가 된다는 것이다. 각 클래스
별 예제를 참고하도록 한다.
A class 10.0.0.0 => 10.in-addr.arpa
B class 172.1.0.0 => 1.172.in-addr.arpa
C class 192.168.1.0 => 1.168.192.in-addr.arpa
– /var/named/<domain>.zone
zone 파일을 설정하기 전에 다음의 2 가지 사항은 꼭 명심하도록 한다.
* 띄어쓰기는 TAB 을 이용해서 하도록 한다.
* 모든 공백라인은 “;” 문자를 이용하여 주석 처리를 하도록 한다.
zone 파일의 정의는 named.conf 의 zone block 의 file 옵션값에 의해 정의 된다. 아래는 앞에
서의 named.conf 에서 clunix.org 의 zone block 에 정의한 clunix.zone 파일에 대한 설정이다.
[root@arhfw root]# vi /var/named/clunix.zone
————————————————————————————–
$TTL 86400
@ IN SOA ns.clunix.org. root.ns.clunix.org. (
1997092700 ; Serial
28800 ; Refresh
900 ; Retry
360000 ; Expire
3600 ) ; Minimum
IN NS ns.clunix.org.
IN MX 10 arhfw
IN A 192.168.133.254
;
ns IN A 192.168.133.254
;
arhfw IN CNAME ns
arhdev IN A 192.168.133.9
arh01 IN A 192.168.133.1
arh02 IN A 192.168.133.2
arh03 IN A 192.168.133.3
arh04 IN A 192.168.133.4
arh05 IN A 192.168.133.5
arh06 IN A 192.168.133.6
arh07 IN A 192.168.133.7
arh08 IN A 192.168.133.8
————————————————————————————-
위 zone 설정의 요소별 주요 사항에 대해서 살펴보도록 하겠다.
@ 는 /etc/named.conf 의 <ORIGIN> 에 해당하는 별칭이다.
즉 여기서는 @ = clunix.org 가 될것이다.
Serial 는 네임서버의 우선 순위를 나타내는 것으로 primary/Secondary 네임 서버간의
데이터 전송 시 Primary 의 Serial 이 Secondary 의 Serial 에 비해 빨라야 Secondary
에서 Primary 의 DNS Zone 변경 데이터를 가져 가게 된다.
refresh 는 Primary 서버로 부터 Zone 데이터를 가져온 후 다시 업데이트가 일어나는
시간 주기이다.
retry 는 Primary 서버에 접속 시도가 실패 했을 경우 재 접속을 하는 시간 주기다.
expire 는 Primary 로 부터 받은 데이터 정보를 무효화 시키는 시간 주기이다.
만일 refresh 시간이 expire 시간 보다 길게 설정하면 실제 Secondary 서버에서 해당
도메인의 정보를 가지고 있지 않는 상태의 기간이 존재하게 됨으로 항상 refresh 시간
을 expire 시간 보다 짧게 지정해야 할것이다.
minimum 는 캐싱 업데이트 ttl 시간으로 이 DNS 서버를 통해 특정 도메인을 질의 했을
경우 일정 시간동안 캐쉬에 저장하게 되는데 여기서 캐싱 시간을 지정하게 된다.
IN NS ns.clunix.org.
위 설정은 해당 도메인의 NS 를 정의하는 부분이다. 여기서 ns.clunix.org. 라고 정의
되는데 이 NS 는 internic 과 같은 최 상의 DNS DB에 등록된 도메인 정보에 의존된다.
IN MX 10 arhfw
위 설정은 해당 도메인( clunix.org )의 MX 레코드(메일서버) 값을 정의하는 곳의로
clunix.org 도메인의 메일서버는 arhfw.clunix.org 서버이다는 의미이다.
여기서 zone 파일의 호스트 명명 규칙 중 알아야 하는 부분이 있는데 실제 zone
파일에서 완벽한 도메인을 표기할때는 제일 마지막에 Dot(.)을 항상 붙여 주어야
한다.
만일 clunix.org 라는 도메인을 zone 파일에서 표기할때는 clunix.org. 이라고 표시를
해야 하는 것이다. 만일 Dot(.) 표시가 없을 경우에는 표식 뒤에 항상 @ 이 붙는다고
생각하면 된다. zone 파일에서 @은 named.conf 에 정의된 ORIGIN 이라고 앞에 설명한 적
이 있다. 즉 zone 설정에서 clunix.org 라고 하면 이는 clunix.org.@ 을 말하는 것이고,
이는 즉 clunix.org.clunix.org 라고 읽어들이게 되는 것이다.
IN A 192.168.133.254
위 설정은 실제 clunix.org 도메인의 IP Address 를 지정하는 것이다.
ns IN A 192.168.133.254
위 설정은 ns.clunix.org 가 192.168.133.254 의 IP 를 가지고 있다는 의미이다.
즉 A 레코드는 해당 도메인, 호스트의 IP 를 정의하는 설정이다.
arhfw IN CNAME ns
CNAME 설정은 도메인 Alias 설정으로 arhfw.clunix.org 는 ns.clunix.org 와 같은 IP
를 가지고 있다는 의미이다.
– /var/named/<domain>.rev
[root@arhdev root]# cat /var/named/clunix.rev
——————————————————————————-
$TTL 86400
@ IN SOA ns.clunix.org. root.ns.clunix.org. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS ns.clunix.org.
IN MX 10 arhfw.clunix.org.
9 IN PTR arhdev.clunix.org.
1 IN PTR arh01.clunix.org.
2 IN PTR arh02.clunix.org.
3 IN PTR arh03.clunix.org.
4 IN PTR arh04.clunix.org.
5 IN PTR arh05.clunix.org.
6 IN PTR arh06.clunix.org.
7 IN PTR arh07.clunix.org.
8 IN PTR arh08.clunix.org.
254 IN PTR ns.clunix.org.
254 IN PTR arhfw.clunix.org.
——————————————————————————
상위 설정 부분은 zone file 설정과 동일하고 실제 레코드 설정 부분에서 PTR 설정에
대해서만 알아보도록 하자.
254 IN PTR arhfw.clunix.org.
위 설정은 /etc/named.conf 에서 inverse domain 설정 부분에서inverse domain 은
reverse mapping 을 위해 설정을 하며 reverse mapping 이란 IP 주소로 도메인 이름을
찾는 것을 의미한다.
위의 PTR 레코드 설정은 192.168.133.254 IP 는 arhfw.clunix.org 란 도메인에 해당
한다는 의미 이다.
– /etc/resolv.conf
[root@arhfw named]# vi /etc/resolv.conf
—————————————————————————–
search clunix.org
nameserver 192.168.133.254
nameserver 192.168.133.9
—————————————————————————–
resolv.conf 는 설정 시스템에서의 DNS 쿼리를 받아올 DNS 서버 정보를 지정하는 설정
이다. 즉 이 시스템이 DNS 서버이든 아니든 간에 이 설정이 되어져 있어야 이 서버에서
도메인을 인식할 수 있는 상태가 된다.
만일 로컬 시스템이 DNS 서버 역활을 하는 경우에는 nameserver 를 자기 자신으로 지정하
면 될것이다. 로컬 시스템이 DNS 서버 기능이 없을 경우는 ISP 의 DNS 사용하던가 아니면,
자사의 DNS 서버를 이곳에 지정해 두면 된다.
설정 형식을 살펴 보면,
search 에는 로컬 DNS 서버의 domain name 을 적어 준다.
그럼 clunix.org 의 sub domain 의 경우 쿼리를 날릴때 sub domain의 host name 명으로도
전체 도메인을 표기하는 역활을 하게 된다.
[root@arhfw root]# nslookup arhfw
—————————————————————————–
Server: 192.168.133.254
Address: 192.168.133.254#53
arhfw.clunix.org canonical name = ns.clunix.org.
Name: ns.clunix.org
Address: 192.168.133.254
—————————————————————————–
nameserver 는 실제 DNS 서버 주소를 적는 곳이다.
첫번째 nameserver 가 1차 네임서버 가 될것이다. 두번째 nameserver 설정이 2차
네임서버가 된다.
– /etc/host.conf
[root@arhfw root]# vi /etc/host.conf
—————————————————————————–
order hosts,bind
multi on
nospoof on
alert on
—————————————————————————–
/etc/host.conf 파일은 실제 DNS 작동과는 크게 상관은 없으나 DNS 방식의 정책을
정의 하는 역할을 한다.
order 는 domain query 를 hosts file 과 bind 중 어느곳에 먼저 하는 지를 정의한다.
multi 는 hosts file 에 동일한 도메인에 다른 IP 가 여러개 생성되는 것을 의미한다.
nospoof 는 실제 시스템에 접속하는 IP 와 Domain 이 일치 하는지를 점검하는 설정이다.
alert 는 spoofing 등으로 IP 를 속여서 들어오는 신호가 있을때 로그에 남기게 하는
설정이다.
nospoof 와 alert 는 보안과 관련이 있으니 상황에 따라 적절히 사용하길 바랍니다.
실제 성능과 보안은 반 비례하는 경우가 많기 때문이다.
– config file security
이제 기본적인 DNS 셋팅이 완료되었다. 이 정도의 기본 설정만 있으면 DNS 서버로써의
역할을 할 수 있다. 설정이 완료된 후 간단한 설정 파일 자체에 대한 보안 처리를 해
두는 것이 좋을 것이다.
[root@arhfw root]# chown named. /etc/named.conf
[root@arhfw root]# chmod 644 /var/named/clunix.
[root@arhfw root]# chmod 644 /var/named/clunix.*
[root@arhfw root]# chown named. /var/named/clunix.*
[root@arhfw root]# /etc/rc.d/init.d/named restart
2.1.4 Primary, Secondary DNS 서버 구축 하기
이 곳에서는 실무에서 흔히 사용되는 Primary, Secondary DNS 설정방법에 대해 알아
보도록 하자. 실무에서 Internic 과 같은 기관을 통해 Domain 을 신청 하게 되면
신청 도메인에 대한 1차 nameserver 와 2차 nameserver 를 지정하는 곳 있다.
이는 실제 1차 nameserver 에 이상이 생겼을때 이곳에 등록된 2차 nameserver 에서
해당 도메인에 대한 IP 정보를 얻을 수 있게 해주는 것이다.
이때 해당 도메인에 대한 DNS 서버를 관리할때 앞에서 다룬 DNS 설정은 Primary DNS
(1차 DNS)에서만 해준다. Secondary DNS 서버는 1차 DNS 서버의 설정을 일정 주기에
맞추어 계속 자동 업데이트 시키는 방법으로 관리하게 된다.
이때 사용되어지는 Primary DNS 서버와 Secondary DNS 서버의 설정 방법에 대해 알아
보도록 한다. 기본적인 설정 형태는 앞에서 다룬 설정 방식과 동일하다.
여기서는 기본 설정과 상이한 부분에 대해서만 언급하겠다.
– Primary DNS 서버 설정
위 기본 설정에서 Primary DNS 서버가 되기 위한 설정 변경 부분이다.
[root@arhfw root]# vi /etc/named.conf
——————————————————————————
zone “133.168.192.in-addr.arpa” IN {
type master;
file “clunix.rev”;
// allow-update { none; }; -> 이부분이 아래와 같이 //
allow-update { 192.168.133.9; };
};
zone “clunix.org” IN {
type master;
file “clunix.zone”;
// allow-update { none; }; -> 이부분이 아래와 같이 //
allow-update { 192.168.133.9; };
};
——————————————————————————
기본 설정과 다른 부분은 allow-update 부분에 2차 DNS 서버의 주소를 포함 시켜 주어
야 2차 DNS 에서 자동으로 1차 DNS 서버에 설정된 Domain 의 해당 Zone 파일을 자동으로
업데이트 시킬 수 있다.
– Secondary DNS 서버 설정
Secondary DNS 서버 역시 기본 설정 형태는 기본과 동일 하다. 단 /etc/named.conf 에
해당 도메인의 reverse mapping 설정과 zone 설정 부분에서 type 을 slave 로 주어야
하고 masters 부분에 1차 DNS 서버 주소를 적어 주어야 한다.
[root@arhdev named]# vi /etc/named.conf
——————————————————————————
zone “133.168.192.in-addr.arpa” IN {
type slave;
file “clunix.rev.bak”;
masters { 192.168.133.254; };
};
zone “clunix.org” IN {
type slave;
file “clunix.zone.bak”;
masters {192.168.133.254; };
};
——————————————————————————
그런 후 named 데몬을 재 시작 하면 /var/named 밑에 자동으로 clunix.rev.bak file과
clunix.zone.bak file 이 생성이 될것이다.
[root@arhdev named]# cat /var/named/clunix.zone.bak
——————————————————————————
$ORIGIN .
$TTL 86400 ; 1 day
clunix.org IN SOA ns.clunix.org. root.ns.clunix.org. (
1997092700 ; serial
28800 ; refresh (8 hours)
900 ; retry (15 minutes)
360000 ; expire (4 days 4 hours)
3600 ; minimum (1 hour)
)
NS ns.clunix.org.
A 192.168.133.254
MX 10 arhfw.clunix.org.
$ORIGIN clunix.org.
arh01 A 192.168.133.1
arh02 A 192.168.133.2
arh03 A 192.168.133.3
arh04 A 192.168.133.4
arh05 A 192.168.133.5
arh06 A 192.168.133.6
arh07 A 192.168.133.7
arh08 A 192.168.133.8
arhdev A 192.168.133.9
arhfw CNAME ns
ns A 192.168.133.254
——————————————————————————
이제 Primary 1차 DNS 서버에서 해당 도메인의 Zone file 에 설정 변동이 있어나면
refresh 에 정의된 8시간에 맞추어 8시간이 지나면 자동으로 변동 사항이 적용될것
이다. 만일 이 주기를 단축하고 싶다면 각 zone file 의 refresh 값을 단축 시켜 주
거나 Primary 서버의 serial 값을 올려주고 각 named 데몬을 재시작 하면 바로 적용
된다.
이제 내부 인프라의 각 PC 의 DNS 클라이언트 설정을 다음과 같이 한다.
1차 DNS 서버 : 192.168.133.254
2차 DNS 서버 : 192.168.133.9
만일 리눅스 클라이언트라면 앞에서 언급했듯이 /etc/resolv.conf 에 아래와 같이
설정하면 된다.
[root@arh01 root]# cat /etc/resolv.conf
——————————————————————————
search clunix.org
nameserver 192.168.133.254
nameserver 192.168.133.9
——————————————————————————
이제 간단히 Nslookup 을 이용하여 Domain 을 Query 해 보도록 하자
[root@arh01 root]# nslookup -sil clunix.org
——————————————————————————
Server: 192.168.133.254
Address: 192.168.133.254#53
Name: clunix.org
Address: 192.168.133.254
——————————————————————————
이제 Primary 1차 DNS ( 192.168.133.254 )의 네임 서비스를 중지 해 보자
[root@arhfw root]# /etc/rc.d/init.d/named stop
다시 Nslookup 으로 Domain query 를 해보자.
[root@arh01 root]# nslookup -sil clunix.org
——————————————————————————
Server: 192.168.133.9
Address: 192.168.133.9#53
Name: clunix.org
Address: 192.168.133.254
——————————————————————————
위와 같이 1차 DNS 서버에 이상이 있으면 바로 2차 DNS 서버에서 해당 도메인이 정보
를 가져 오게 되어져 있다. 이로써 보다 안정하고, 관리적으로 효율적인 Name Service
를 할 수 있을 것이다.
2.1.5 MX 레코드를 이용한 메일 서버 관리하기
이 단원에서는 도메인 네임 설정에서 메일 서버 설정에 관련된 MX 레코드 값에 대해
구체적으로 알아보다.
clunix.org 란 도메인으로 웹서비스를 운영하여 홈페이지등에 이용할 수도 있지만 해당
도메인에 @가 붙는 메일 서비스를 이용할 수도 있을 것이다.
webmaster@clunix.org 와 같은 메일 서비스를 하기 위해서 1차적으로 설정이 들어가는
부분은 당연 DNS 설정일 것이다. 실제 DNS 서버와 웹서버와 메일서버를 하나의 시스템
에서 사용한다면 위의 기본 Zone 설정에 정의된 MX 레코드 설정만으로 충분할 것이다.
하지만 복잡하고, 대형 메일 서비스 형태의 시스템을 구축 시에는 위의 기본 설정으론
아주 제한적인 서비스 밖에 할 수 없을 것이다.
DNS 서버의 MX 레코드를 잘 이용하면 메일 시스템을 다른 서비스 시스템과 분리를 하거나
여러대의 Mail Queing 서버를 두어 보다 안정적인 메일 서비스등을 할 수 있을 것이다.
그리고 Spam Filter 시스템이나 SMTP 부하 분산 시스템등을 간단히 구성할 수 있다.
그럼 MX 레코드에 대해 보다 상세히 알아 보도록 하자.
MX 레코드는 특정 도메인으로 수신되는 메일을 다른 호스트로 라우팅 시켜주는 역활을
한다. 아래의 zone 파일을 대상으로 설명을 해보도록 하겠다.
———————————————————————————
$TTL 86400
@ IN SOA ns.clunix.org. root.ns.clunix.org. (
1997092700 ; Serial
28800 ; Refresh
900 ; Retry
360000 ; Expire
3600 ) ; Minimum
IN NS ns.clunix.org.
IN MX 10 arhfw
IN A 192.168.133.254
;
ns IN A 192.168.133.254
;
arhfw IN CNAME ns
arhdev IN A 192.168.133.9
arh01 IN A 192.168.133.1
———————————————————————————
일단 위 설정으로 보면 @clunix.org 형태로 오는 메일은 arhfw.clunix.org 에 해당하는
192.168.133.254 서버로 메일을 라우팅 하게 된다.
192.168.133.254 의 MTA 메일 프로그램에서 해당 도메인에 대한 메일 인증 권한이 있으면
이 서버의 MailBox 에 메일이 쌓이게 될것이다.
이때 이와 같이 @clunix.org 형태로 오는 메일을 arhfw.clunix.org 로 라우팅 시켜 주는
역활을 하는 설정이 바로 ” IN MX 10 arhfw ” 이다.
이 MX 레코드 부분을 이용하여 @clunix.org 에 해당하는 메일을 arhdev 에서 처리하길
원한다면 위 MX 레코드 부분을 arhfw 에서 arhdev 로 변경을 해주면 될것이다.
위와 같이 처리 하면 실제 DNS 서버와 Mail 서버가 분리 되는 것이다.
다음은 조금 복잡한 MX 레코드 구조이다.
———————————————————————————
$TTL 86400
@ IN SOA ns.clunix.org. root.ns.clunix.org. (
1997092700 ; Serial
28800 ; Refresh
900 ; Retry
360000 ; Expire
3600 ) ; Minimum
IN NS ns.clunix.org.
clunix.org. IN MX 10 arhdev
IN MX 20 arh01
IN MX 20 arh02
IN A 192.168.133.254
;
ns IN A 192.168.133.254
;
arhfw IN CNAME ns
arhdev IN A 192.168.133.9
arh01 IN A 192.168.133.1
arh02 IN A 192.168.133.2
———————————————————————————-
위 경우는 @clunix.org 형태로 오는 메일은 먼저 로컬 호스트가 clunix.org 에 대한 메일
처리 권한이 있는지를 확인한다.
그런 후 없을 경우 arhdev 로 배달을 시도한다. 만일 arhdev 서버가 정상적으로 수신을
하지 못하는 상태라고 하면, arh01, arh02 중 하나로 배달을 하게 된다.
이것은 MX 레코드의 값이 낮은 순위로 메일 배달의 우선 순위가 정해지기 때문에다.
arh01, arh02 중 메일을 수신 받은 시스템은 해당 시스템의 mail queue time 동안 해당
메일을 큐잉에 넣어 두고 일정 시간을 주기적으로 arhdev 쪽으로 메일을 다시 보내게 된다.
위 구성에서 혼돈하기 쉬운 부분이 MX 값이 10 인 arhdev 가 다운 되었을 경우 메일이
arh01 혹은 arh02로 가서 처리 된다고 혼돈을 하게 되는데, arh01, arh02 는 단순 Queue
의 역활만을 하는 것이다. 물런 arh01, arh02에서 clunix.org 에 대한 메일 수신 권한
이 주어진 경우라면 정상적으로 메일을 수신하게 될것이다. 하지만 이 경우는 실제 3대
시스템에 대한 계정 동기화 및 메일 박스 동기화, 서비스 IP 단일화등의 여러가지 문제
가 있을 것이다. 이런 부분은 실제 대용량 메일 서버 시스템을 구축할때 사용되는 클러스터
기술 부분에서 다루도록 하겠다.
DNS의 MX 레코드 부분에서는 실제 메일 서버의 문제가 발생했을 경우 누락되는 메일이
최소화 될수 있는 구조를 만들어 주는것만으로 충분히 그 역활을 다하는 것일 거다.
2.1.6 DNS 서버를 이용한 부하분산 시스템 구축 하기
특정 서비스에 대해 한대의 서버로 처리 하기 힘든 과다한 서비스 요청이 올 경우
리눅스의 LVS(Linux Virtual Server)나 L4 Switch 와 같은 고가 하드웨어를 이용하여
부하를 분산 시켜 주는 방법으로 문제를 해결 할 수 있을 것이다. 하지만 DNS 에서도
이와 유사한 효과를 줄 수 있다. 부하분산의 작업 스케줄링 방식 중 Round Robin이란
스케줄링 방식이 있는데 DNS 서버에서 이 스케줄링 방식으로 부하분산과 동일한 효과
를 줄 수 있는 것이다. 단 DNS 의 경우 실제 서비스 노드의 활성 상태를 체크하는 기능이
없기 때문에 가용성 자체는 보장하지 못한다. 하지만 추가 비용 없이 간단히 로드밸랜스
효과를 낼 수 있는 장점과 이 후 초 대형 서비스 대상의 시스템 구축 시 LVS 나
L4 Switch 등의 기술과 같이 이용하여 LVS 와 L4의 서비스 확장의 제한 문제를 해결하
는데 사용될 수 있다.
아래 zone file을 대상으로 살펴 보도록 하자.
———————————————————————————-
$TTL 86400
@ IN SOA ns.clunix.org. root.ns.clunix.org. (
1997092702 ; Serial
28800 ; Refresh
900 ; Retry
360000 ; Expire
3600 ) ; Minimum
IN NS ns.clunix.org.
IN MX 10 arhfw
IN A 192.168.133.254
;
ns IN A 192.168.133.254
;
www 180 IN A 192.168.133.1
www 180 IN A 192.168.133.2
www 180 IN A 192.168.133.3
————————————————————————————
위와 같이 하나의 호스트명에 여러개의 IP 주소를 주었을 경우 네임 서버는 해당 도메인에
대해 요청되는 순서에 따라 192.168.133.1, 192.168.133.2, 192.168.133.3 주소를 차례로
풀이해서 응답하게 된다.
[root@arhfw named]# nslookup -sil www.clunix.org
———————————————————————————–
Server: 192.168.133.254
Address: 192.168.133.254#53
Name: www.clunix.org
Address: 192.168.133.1
Name: www.clunix.org
Address: 192.168.133.2
Name: www.clunix.org
Address: 192.168.133.3
[root@arhfw named]# nslookup -sil www.clunix.org
———————————————————————————–
Server: 192.168.133.254
Address: 192.168.133.254#53
Name: www.clunix.org
Address: 192.168.133.3
Name: www.clunix.org
Address: 192.168.133.1
Name: www.clunix.org
Address: 192.168.133.2
[root@arhfw named]# nslookup -sil www.clunix.org
———————————————————————————-
Server: 192.168.133.254
Address: 192.168.133.254#53
Name: www.clunix.org
Address: 192.168.133.2
Name: www.clunix.org
Address: 192.168.133.3
Name: www.clunix.org
Address: 192.168.133.1
이와 같이 DNS 라운드 로빈 방식으로 처리 할때는 실제 클라이언트 DNS 의 캐싱에 초기
질의 시 얻은 IP 주소가 남아 있어 두번째 부터는 계속 초기 IP 로 넘어가게 되어 있다.
그렇기 때문에 이런 부분의 캐싱 문제를 최소화 하기 위해 각 호스트 뒤에 TTL 값을 짧게
정의해 두는 것이 좋다. 위 설정에서는 6분으로 하여 6분 뒤에는 해당 도메인의 캐싱을
비우고 다시 해당 도메인의 DNS 서버에서 정보를 얻게 되는 것이다.
2.1.7 대형 인프라 환경의 DNS 서버 구축
실제 대 기업이나 학교 네트워크 인프라와 같이 대형 인프라 환경에서 효율적인 DNS 서버
의 구축 설계에 대해 알아 보도록 하자.
아래는 실제 대형 인프라에서 흔히 사용되는 DNS 구조이다.
[ 대형 네트워크 인프라 대상 DNS 구성도 – 그림 2 ]
실제 대형 네트워크 인프라에서는 외부로 서비스할 DNS 에 대한 Primary 1차 DNS 와
Secondary 2차 DNS 가 존재해야 하며, 내부의 여러 Subnet 의 각 클라이언트들이 외부의
다른 도메인들을 확인할 캐싱 DNS 서버가 필요하게 된다.
뿐만아니라 내부에서만 사용되어지는 도메인이 있을 경우 해당 도메인을 처리해줄 DNS
서버 역시 필요할 것이다.
하나의 가상의 인프라를 대상으로 실제 실무적인 기반의 DNS 시스템 환경을 구축해
보도록 하자.
– 인프라의 Domain 요구 환경
어느 도시에 큰 대학교과 하나 설립되었다고 가정하자. 이 대학교의 정보화 서비스를 위해
전체적인 인프라를 효율적이고, 안정적으로 관리 할 수 있는 네임 서비스가 필요하다.
이 대학교에서 필요한 네임서비스는 다음과 같다.
외부 용 서비스 도메인 : domain.ac.kr
외부 대상 서비스 : 대학교 웹서비스, 전교생 대상의 메일서비스, 각 학부별 웹서비스
내부 대상 서비스 : 각 학부 내부의 전산 환경에서만 허용이 되어 지는 서비스
2.1.8 DNS 관련 Tool ( Nslookup )
네임 서버를 운영하고 관리 하는데 있어 내부적으로 발생하는 문제에 대해 해결을 하기 위해
서는 실제 해당 도메인에 대한 정보를 관리자 입장에서의 확인을 할수 있는 도구가 필요하다.
흔히 사용하는 도구로 Nslookup 과 dig 가 있다.
– nslookup
nslookup 은 실제 UNIX, LINUX, Windows 등에서 대표적으로 사용되어지는 Name resolver tool
로서 대상 도메인 DNS 서버에 대한 다양한 정보를 확인 점검할 수 있는 도구이다.
위의 DNS 설정 단계에서도 설정 확인을 위해 nslookup 명령을 많이 사용하였다.
여기서는 보다 구체적인 사용방법에 대해 알아 보도록 하자.
nslookup은 기본적으로 입력된 도메인의 A 레코드를 검색하고, IP 주소에 대해서는 PTR 레코드
를 검색하게 된다. set type= 설정으로 A 레코드 이외의 다양한 레코드 또한 검색할 수 있고,
set type= 에 A, ANY, HINFO, MX, NS, PTR, SOA, TXT 등의 정보를 넣어 해당 정보를 검
색할 수 있다.
아래의 예제를 통해 다양한 Nslookup 의 기능에 대해 살펴 보도록 하자.
[root@arhdev root]# nslookup
> server domain.com
————————————————————————————–
Default server: domain.com
Address: xxx.xxx.xxx.xxx#53
————————————————————————————-
nslookup command 를 실행하면 nslookup interactive mode 상태로 들어 간다.
> snu.ac.kr
————————————————————————————-
Default server: domain.com
Address: xxx.xxx.xxx.xxx#53
Name: snu.ac.kr
Address: 147.46.10.48
————————————————————————————-
query 대상의 도메인을 입력하면 해당 도메인의 A 레코드에 해당하는 IP 값이 출력된다.
> set type=MX
> snu.ac.kr
————————————————————————————
Default server: domain.com
Address: xxx.xxx.xxx.xxx#53
snu.ac.kr mail exchanger = 0 smtp.snu.ac.kr.
smtp.snu.ac.kr internet address = 147.46.100.22
————————————————————————————
query type 을 MX ( Mail Exchage )로 변경하여 대상 도메인의 메일 서버 정보를 확인한다.
> set type=NS
> snu.ac.kr
———————————————————————————–
Default server: domain.com
Address: xxx.xxx.xxx.xxx#53
snu.ac.kr nameserver = erccw1.snu.ac.kr.
snu.ac.kr nameserver = hektor.snu.ac.kr.
snu.ac.kr nameserver = ercc.snu.ac.kr.
———————————————————————————–
query type 을 NS 로 변경하여 대상 도메인의 name server 정보를 파악한다. 위 도메인의
경우는 1차, 2차, 3차 네임서버를 상위 도메인 기관에 등록해 둔 상태이다.
> set type=any
> snu.ac.kr
———————————————————————————–
Default server: domain.com
Address: xxx.xxx.xxx.xxx#53
snu.ac.kr mail exchanger = 0 smtp.snu.ac.kr.
Name: snu.ac.kr
Address: 147.46.10.48
snu.ac.kr nameserver = ercc.snu.ac.kr.
snu.ac.kr nameserver = erccw1.snu.ac.kr.
snu.ac.kr nameserver = hektor.snu.ac.kr.
Authoritative answers can be found from:
snu.ac.kr nameserver = erccw1.snu.ac.kr.
snu.ac.kr nameserver = hektor.snu.ac.kr.
snu.ac.kr nameserver = ercc.snu.ac.kr.
smtp.snu.ac.kr internet address = 147.46.100.22
————————————————————————————
query type 를 any 하여 해당 도메인이 모든 정보를 한번에 확인할 수도 있다.
위와 달리 non-interactive 방식으로 nslookup 을 사용할 수도 있다.
[root@arhdev root]# nslookup -type=MX snu.ac.kr
————————————————————————————
Server: 192.168.133.9
Address: 192.168.133.9#53
Non-authoritative answer:
snu.ac.kr mail exchanger = 0 smtp.snu.ac.kr.
Authoritative answers can be found from:
snu.ac.kr nameserver = ercc.snu.ac.kr.
snu.ac.kr nameserver = erccw1.snu.ac.kr.
snu.ac.kr nameserver = hektor.snu.ac.kr.
smtp.snu.ac.kr internet address = 147.46.100.22
ercc.snu.ac.kr internet address = 147.46.80.1
[root@arhdev root]# nslookup -type=NS snu.ac.kr
————————————————————————————
Server: 192.168.133.9
Address: 192.168.133.9#53
Non-authoritative answer:
snu.ac.kr nameserver = ercc.snu.ac.kr.
snu.ac.kr nameserver = erccw1.snu.ac.kr.
snu.ac.kr nameserver = hektor.snu.ac.kr.
Authoritative answers can be found from:
ercc.snu.ac.kr internet address = 147.46.80.1
[root@arhdev root]# nslookup -type=any snu.ac.kr
———————————————————————————–
Server: 192.168.133.9
Address: 192.168.133.9#53
Non-authoritative answer:
snu.ac.kr mail exchanger = 0 smtp.snu.ac.kr.
Name: snu.ac.kr
Address: 147.46.10.48
snu.ac.kr nameserver = erccw1.snu.ac.kr.
snu.ac.kr nameserver = hektor.snu.ac.kr.
snu.ac.kr nameserver = ercc.snu.ac.kr.
Authoritative answers can be found from:
snu.ac.kr nameserver = erccw1.snu.ac.kr.
snu.ac.kr nameserver = hektor.snu.ac.kr.
snu.ac.kr nameserver = ercc.snu.ac.kr.
smtp.snu.ac.kr internet address = 147.46.100.22
ercc.snu.ac.kr internet address = 147.46.80.1
[root@arhdev root]# nslookup -type=any snu.ac.kr ns.korea.com
———————————————————————————-
Server: ns.korea.com
Address: 211.109.2.36#53
Name: snu.ac.kr
Address: 147.46.10.48
snu.ac.kr mail exchanger = 0 smtp.snu.ac.kr.
snu.ac.kr nameserver = ercc.snu.ac.kr.
snu.ac.kr nameserver = erccw1.snu.ac.kr.
snu.ac.kr nameserver = hektor.snu.ac.kr.
snu.ac.kr
origin = ercc.snu.ac.kr
mail addr = habae.snu.ac.kr
serial = 2005042201
refresh = 3600
retry = 1800
expire = 604800
minimum = 86400
위와 같이 실제 nslookup을 이용하면 도메인에 대한 상세한 정보를 확인 하여 쉽게 네임
서비스 구성을 파악할 수 있다. 관리자의 경우 네임 서비스의 정보를 확인 하기 위해
당연히 nslookup 과 같은 툴을 사용하겠지만, 위 정보보다 더 세밀한 정보 역시 DNS 설정
에서 보안적인 부분을 확실히 해 놓지 않을 경우 아무나 정보 확인이 가능하다.
그렇기에 앞의 설정에서 보안에 관련된 설정 부분을 상황에 맞게 처리 해야 할것이다.
2.2. FTP Server
특정 시스템에서 다른 시스템으로 파일을 전송하는 것은 거의 모든 네트워크에서 일상적
으로 일어나는 작업이다.
인터넷과 같은 TCP/IP 네트워크에서 파일을 전송하기 위한 다양한 방법들이 있지만, 가장
일반적인 방법 중에 하나인 FTP(File Transfer Protocol)에 대해 알아 보도록 하자.
리눅스에서 사용할 수 있는 FTP 서버 프로그램은 여러개가 존재한다.
흔히 이전의 Redhat LINUX 계열 배포판에 기본 채택되어 배포단 Wu-ftpd 와 보다 FTP 서비스
비중이 큰 대형 파일 서비스 서버에 주로 사용되어지는 Proftpd. 그리고 보안적인 이슈 강화
로 많이 사용되어지는 vs-ftpd 등이 있다.
여기서는 대형 FTP 시스템 구축에 적합한 Proftpd의 설정에 대해 알아보도록 할것이다.
proftpd 는 다른 ftpd 에 비해 다양한 기능을 제공하고 있기에 여러명이 사용하는 대형 FTP
서버에 주로 사용되어진다.
2.2.1 Proftpd 로 FTP Server 구축 하기
proftpd 는 http://www.proftpd.org 에서 다운 받을 수 있다.
– Proftpd 설치 하기
설치는 RPM 으로 설치해도 되고 Source 로 설치 해도 된다.
여기서는 대용량 FTP 서버에 적합한 구조로 Source 방식으로 설치를 하도록 하겠다.
먼저 다운 받은 Source 를 /usr/local/src 밑에 풀어 놓는다.
[root@arhfw src]# tar xjvf proftpd-1.2.10kr2.tar.bz2
[root@arhfw src]# cd proftpd-1.2.10kr2
[root@arhfw proftpd-1.2.10kr2]#
./configure –prefix=/usr \\
–sysconfdir=/etc/proftpd \\
–mandir=/usr/man \\
–localstatedir=/var/run \\
–enable-autoshadow \\
–enable-auth-pam \\
–enable-cap \\
–enable-sendfile \\
–enable-ipv6 \\
–enable-buffer-size=8192 \\
–enable-pool-size=4096 \\
–with-modules=mod_ratio:mod_readme:mod_wrap:mod_tls:mod_ifsession:mod_delay
[root@arhfw proftpd-1.2.10kr2]# make && make install
make 과정 중에 다음과 같은 에러가 발생하는 경우가 있다.
————————————————————————————-
In file included from /usr/include/openssl/ssl.h:179,
from mod_tls.c:40:
/usr/include/openssl/kssl.h:72:18: krb5.h: 그런 파일이나 디렉토리가 없음
In file included from /usr/include/openssl/ssl.h:179,
from mod_tls.c:40:
/usr/include/openssl/kssl.h:134: parse error before “krb5_enctype”
/usr/include/openssl/kssl.h:136: parse error before ‘*’ token
/usr/include/openssl/kssl.h:137: parse error before ‘}’ token
/usr/include/openssl/kssl.h:149: parse error before “kssl_ctx_setstring”
/usr/include/openssl/kssl.h:149: parse error before ‘*’ token
————————————————————————————-
이는 OS 패키지 구성 중에 krb5.h head file 이 설치가 안되었거나 경로를 찾지 못해서 발생
하는 문제이다.
proftpd 에서는 Make.rules 파일에 INCLUDE 란 부분에서 경로를 추가 시켜 줄 수 있다.
[root@arhfw proftpd-1.2.10kr2]# vi Make.rules
————————————————————————————–
.
INCLUDES=-I.. -I$(top_srcdir)/include -I/usr/kerberos/include
.
————————————————————————————–
위와 같이 -I/usr/kerberos/include 구문을 추가 한 후에 make 를 다시 실행하면 정상적으로
컴파일이 되어질것이다.
– Proftpd 설정하기
설치가 무사히 완료되면 /etc/proftpd/proftpd.conf 설정을 통해 FTP 시스템을 구축할 수
있을 것이다.
[root@arhfw proftpd-1.2.10kr2]# vi /etc/proftpd/proftpd.conf
————————————————————————————–
ServerName “Pro-FTP Server”
ServerType standalone
#ServerType inetd
# Server Type 의 경우는 standalone 과 inetd 두가지 방식이 지원된다.
# inetd 방식은 xinetd 데몬에서 proftpd 데몬을 제어하는 방식으로 평소에는 proftpd 서비스
# 를 하지 않고 있다가 사용자가 FTP 접속을 하게 되면 xinetd 데몬에 자동으로 proftpd 를
# 시작 시켜 주는 방식이다. 소규모 FTP 사이트 구축 시에 유용한 방식이나 대규모 사이트
# 구축 시에는 standalone 방식으로 운영하는 것이 안정적일 것이다.
DefaultServer on
ServerAdmin root@syszone.co.kr
UseReverseDNS off
IdentLookups off
ServerIdent On “ProFTPd Account Server ready .. ”
# Server 에 접속했을 경우 보내주는 Defualt 메세지를 설정한다. Off 로 지정
# 하였을 경우 Proftpd Server Ready ServerName 이 출력된다.
DefaultRoot ~ !wheel
# User login 을 했을시에 user 들이 자신의 홈상위 디렉토리들을 마음대로 돌
# 아다니지 못하게 chroot() 를 설정한다. group 별로 설정을 하게 되며 “!”는
# 제외하라는 의미를 가지게 된다.
Port 21
# ServerType이 standalone이면 이 항목의 주석을 풀어 줘야 한다. inetd로 작
# 동을 시킬시에는 /etc/services에서 port를 지정한다.
RootLogin off
# root login 을 허락할지의 여부를 지정한다. PAM modules를 사용한다면 먼저
# /etc/proftpd/ftpusers에서 root를 삭제해야 한다.
# Global section은 proftpd의 전체적인 설정에 모두 적용시킨다.
<Global>
Umask 022
# Umask 는 FTP 를 통해 파일이나 디렉토리를 생성했을때 생성되는 파일의 권한을 지정하는
# 설정이다. 파일의 경우는 666 – Umask = 644 퍼미션이 주어지고, 디렉토리의 경우는
# 777 – Umask = 755 퍼미션이 주어진다.
AuthPAMAuthoritative on
# ftpusers file을 이용하여 PAM 인증을 하기를 원하면 이 지시자의 값을 on
# 으로 한다. default 값은 off 이다.
# UpTime 10
# DownTime 23
# service를 시작하고 마칠 시간을 24시간 표기법으로 지정을 한다. 이 설정
# 은 Korea User Group 의 time limit 패치가 적용이 되어 있어야 사용이 가
# 능하다.
TimesGMT off
# Server 의 Ftpd 시간을 지역시간으로 고정한다. on 으로 했을 경우 GMT 시
# 간을 표시 하기 때문에 한국의 경우 9시간의 오차가 발생한다.
DenyFilter \\*.*/
# 1.2.1 이하 버젼에서의 버그를 위한 설정
</Global>
TransferRate RETR,STOR 102400
# 회선의 Bandwidth를 특정 속도로 제한을 한다. 단위는 Byte per Sec 이다.
# 다운로드와 업로드를 16KB/s (128Kb/s) 로 제한
MaxClients 10
# 최대 접속 인원수를 지정한다.
MaxClientsPerHost 3 “Sorry, %m connection allow per one host”
# 하나의 호스트로 부터 동시에 접근할 수 있는 수를 지정한다. 아래의 기본
# 설정으로는 하나의 호스트에서 한번의 접근만 허용한다.
MaxHostsPerUser 1 “Sorry, %m hosts allow per one user”
# 하나의 계정 ID 로 동시에 접근할 수 있는 호스트 수를 지정 한다. 아래의
# 기본 설정으로는 하나의 계정 하나 호스트에서만 접근만 허용한다. 하나의
# 계정에 하나의 접근만을 허락하려면 위의 MaxClientsPerHost의 값과
TimeoutIdle 900
TimeoutNoTransfer 900
TimeoutLogin 300
# 접속 대기시간을 설정한다. user 가 접속후 아무 작동도 안할때 일정 시간후
# 에 접속이 종료되게 한다
DeferWelcome off
# DeferWelcome 는 client가 인증을 하기 전에 servername을 display하는 것을
# 방지한다.
DisplayLogin /etc/proftpd/welcome.msg
DisplayFirstChdir .message
# ‘welcome.msg 는 login 시에 보여지고, ‘message’ 는 각 하위 디렉토리에 접
# 속 했을때 보여지게 된다.
MaxInstances 30
# DoS(Denial Of Service) 공격을 막기 위해, 자식 process 의 maximun number
# 를 30 으로 설정한다. 만약 30이상의 접속을 허락할 필요가 있다면 간단하게
# 이 치수를 증가 시키도록 한다. 이것은 오직 standalone mode 에서만 가능하
# 다. inetd mode 에서는 service 당 maximun number를 제한 하는 것을 허락하
# 는 inetd server에서 설정을 해야 한다.(xinetd 역시 마찬가지 이다)
User nobody
Group nobody
# Proftpd 가 구동될 서버의 유저/그룹 권한을 설정한다.
<Directory /*>
AllowOverwrite on
AllowRetrieveRestart on
AllowStoreRestart on
</Directory>
# 일반적으로 file들을 overwrite를 가능하게 한다.
ListOptions “+a -l”
# ls 에 -l 옵션을 기본적으로 추가하고, -a 옵션은 사용하지 못하도록 할 경우
# ListOptions “” strict
# 항상 옵션 없이 ls 결과를 보여줄 경우
# ListOptions “-a”
# ls 의 결과에 -a 옵션을 추가할 경우
#<IfModule mod_tls.c>
# # TLS 를 활성화 한다.
# TLSEngine on
#
# # TLS 가 가능한 클라이언트만 접속을 허용
# #TLSRequired on
#
# TLSProtocol TLSv1
# TLSRSACertificateFile /usr/share/ssl/certs/server.crt
# TLSRSACertificateKeyFile /usr/share/ssl/certs/server.key
#</IfModule>
#
# TLS/SSL 설정
# 이 설정은 각 가상 호스트 별로도 가능하다. 이 설정을 사용하기 위해서는 안
# 녕의 openssl 에서 제공하는 make_ssl_cert 명령을 수행하여 key 파일을 생성
# 해야 접속이 가능하니 주의하도록 한다.
# 이 아래 설정은 Anonymous FTP 기능을 사용할 경우 적용된다. 만일 해당 기능
이 필요 없을 경우는 모두 주석으로 처리한다.
<Anonymous ~ftp>
User ftp
Group ftp
# /etc/shells 에 등록되어 있는 shell 이 지정되어 있는 유저들만 로그인이
# 가능하게 한다. ftp user 의 shell 이 보통 /bin/false 로 지정이 되어 있
# 으므로 이 값을 off 로 해준다.
RequireValidShell off
# 익명 접근시의 패스워드 체크정도 여부를 결정을 한다. AnonPassType 지시
# 자는 Korean User Group 의 독자적인 패치이다.
# none -> 아무런 체크를 하지 않는다.
# trivial -> 패스워드에 @ 문자가 존재하는지만 체크한다.
# complete-email -> 패스워드가 완전한 형태의 이메일 주소형식을 가지는지
# 체크한다.
AnonPassType none
# 익명 접근시 사용하지 못하게 할 패스워드를 정규표현식으로 설정한다. 이
# 지시자는 Korean User Group 의 독자적인 패치이다.
#
#AnonRejectPasswords ^(IEUser|mozilla|username|test)@?
# 익명 접근을 할때 특정 password를 지정할수 있다. 단 위의 User 지시자의
# name이 passwd file에 등록이 되어져 있어야 한다. 이 지시자가 on일 경우
# 이메일 주소로 login을 할수 없다.
#
# 이 지시자가 설정되면, AnonPassType 이 무시된다.
#
# AnonRequirePassword on
# 링크된 실 경로 출력 여부
# ShowSymlinks off
# User name “ftp”로 anonymous login을 할수 있도록 한다
UserAlias anonymous ftp
<Limit LOGIN>
Order allow,deny
Allow from 192.168.133.
Deny from all
</Limit>
# Anonymous ftp 접근 가능 네트워크 대역을 지정하는 설정이다.
# Anonymous ftp 를 내부 인프라나 특정 호스트에서만 허용하고자 할때 주로 사용된다.
DisplayLogin welcome.msg
DisplayFirstChdir .message
MaxClients 10
MaxClientsPerHost 3 “Sorry, %m connection allow per one host”
HideUser root
# 소유권이 root인 file이나 directory들을 보여주지 않는다
HideGroup root
# 그룹권한이 root인 file이나 directory들을 보여주지 않는다
<Directory *>
<Limit WRITE>
DenyAll
</Limit>
</Directory>
# anonymous 계정으로 접근할수 있는 디렉토리별로의 허가권 설정..
# 일단은 모든 디렉토리에 쓰기 권한은 주지 않는설정이다.
<Directory upload>
<Limit READ>
DenyAll
</Limit>
# ~ftp/upload 폴더에 파일 다운로드 권한을 모두 막는 설정
<Limit STOR MKD>
Order allow,deny
Allow from 192.168.133.
Deny from all
</Limit>
# 192.168.133.0/24 네트워크 대역(관리대역)에서 파일을 업로드 시킬 수 있도록 설정
</Directory>
<Directory pub>
<Limit READ>
AllowALL
</Limit>
# ~ftp/pub 디렉토리에 파일 다운로드 권한을 모두 열어 준다.
<Limit STOR MKD>
Order allow,deny
Allow from 192.168.133.
Deny from all
# 관리네트워크대역을 제외한 나머지 네트워크 대역에서는 파일 업로드를 모두 막는다.
</Limit>
</Directory>
</Anonymous>
————————————————————————————-
설정이 완료되면 Anonymous ftp 설정에 맞게 ftp 디렉토리를 생성한다.
[root@arhfw root]# mkdir /data/ftp
[root@arhfw root]# mkdir /data/ftp/pub
[root@arhfw root]# mkdir /data/ftp/upload
[root@arhfw root]# chown -R ftp. /data/ftp/
/etc/passwd 에서 ftp 의 홈디렉토리를 변경해 준다.
ftp:x:14:50:FTP User:/data/ftp:/sbin/nologin
이제 proftpd 데몬을 편리하게 관리 할 수 있는 initscripts 를 만든다.
이 scripts 는 /etc/rc.d/init.d 에 위치하면 된다.
[root@arhfw root]# vi /etc/rc.d/init.d/proftpd
————————————————————————————–
#!/bin/sh
#
# Startup script for ProFTPd
#
# chkconfig: 345 85 15
# description: ProFTPD is an enhanced FTP server with \\
# a focus toward simplicity, security, and ease of configuration. \\
# It features a very Apache-like configuration syntax, \\
# and a highly customizable server infrastructure, \\
# including support for multiple ‘virtual’ FTP servers, \\
# anonymous FTP, and permission-based directory visibility.
# processname: proftpd
# pidfile: /var/run/proftpd.pid
# config: /etc/proftpd/proftpd.conf
#
# By: JoungKyun Kim <http://proftpd.oops.org>
# $Id: proftpd.init.d,v 1.3 2001/11/10 10:17:41 flood Exp $
# Source function library.
. /etc/rc.d/init.d/functions
RETVAL=0
FTPSHUT=/usr/sbin/ftpshut
SHUTMSG=/etc/shutmsg
LOCKFILE=/var/lock/subsys/proftpd-standalone
CONF=/etc/proftpd/proftpd.conf
# ServerType Check
CHK=$(cat ${CONF} | grep -i “^[[:space:]]*ServerType” | sed ‘s/.*\\(standalone\\|inetd\\).*/\\1/gI’)
[ ${CHK} = “inetd” ] && {
CHKLANG=$(echo $LANG | sed ‘s/^\\(ko\\).*/\\1/g’)
if [ “${CHKLANG}” = “ko” ] ;then
echo
echo “proftpd.conf 의 ServerType 이 inetd mode 로 설정이 되어 있습니다.”
echo “ServerType 이 inetd mode 일 경우 이 스크립트나 proftpd binary 를”
echo “사용하지 않습니다. ServerType 이 inetd mode 일 경우 inetd.conf 에”
echo “proftpd 설정을 하시고 inetd 를 재시작 해 주시는 것으로 proftpd 를”
echo “구동할 수 있습니다.”
else
echo
echo “ServerType Directive is appointed inetd mode in your proftpd.conf.”
echo “So, you start proftpd to use inetd. ServerType standalone doesn’t use”
echo “proftpd init script”
fi
exit 1
}
# See how we were called.
case “$1” in
start)
echo -n “Starting ProFTPd : ”
[ -f ${SHUTMSG} ] && rm -f ${SHUTMSG}
daemon proftpd
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch ${LOCKFILE}
;;
stop)
echo -n “Shutting down ProFTPd : ”
[ -f ${SHUTMSG} ] && rm -f ${SHUTMSG}
killproc proftpd
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f ${LOCKFILE}
;;
status)
status proftpd
RETVAL=$?
;;
restart)
$0 stop
$0 start
RETVAL=$?
;;
reload)
echo -n “Reload ProFTPd : ”
killproc proftpd -HUP
RETVAL=$?
echo
;;
suspend)
if [ -f $FTPSHUT ]; then
if [ $# -gt 1 ]; then
shift
echo “ProFTPd : suspending with ‘$*'”
$FTPSHUT $*
RETVAL=$?
else
echo “ProFTPd : suspending NOW”
$FTPSHUT now “Maintanance in progress”
RETVAL=$?
fi
else
echo “ProFTPd : no way to suspend”
fi
;;
resume)
if [ -f ${SHUTMSG} ]; then
echo “ProFTPd : allowing sessions again”
rm -f ${SHUTMSG}
else
echo “ProFTPd : was not suspended”
fi
;;
*)
echo -n “Usage: $0 {start|stop|restart|status|reload|resume”
if [ “$FTPSHUT” = “” ]; then
echo “}”
else
echo “|suspend}”
echo “suspend accepts additional arguments which are passed to ftpshut(8)”
fi
exit 1
esac
if [ $# -gt 1 ]; then
shift
$0 $*
fi
exit $RETVAL
~
————————————————————————————-
init scripts 파일에 실행 권한을 준다.
[root@arhfw root]# chmod 750 /etc/rc.d/init.d/proftpd
이제 proftpd 데몬을 실행 시켜 본다.
[root@arhfw root]# /etc/rc.d/init.d/proftpd start
Starting ProFTPd : [ OK ]
FTP 서비스가 정상적으로 작동하는지 확인해 보도록 하자.
[root@arhdev root]# ncftp -u alang arhfw.clunix.org
————————————————————————————-
NcFTP 3.1.5 (Oct 13, 2002) by Mike Gleason (ncftp@ncftp.com).
Connecting to 192.168.133.254…
ProFTPd Account Server ready ..
Logging in…
Password requested by 192.168.133.254 for user “alang”.
Password required for alang.
Password:
User alang logged in.
Logged in to arhfw.clunix.org.
ncftp / >
————————————————————————————-
사용자 계정을 이용하여 사용자 홈디렉토리로 접근하는 방법이다.
[root@arhdev root]# ncftp arhfw.clunix.org
————————————————————————————-
NcFTP 3.1.5 (Oct 13, 2002) by Mike Gleason (ncftp@ncftp.com).
Connecting to 192.168.133.254…
ProFTPd Account Server ready ..
Logging in…
Anonymous access granted, restrictions apply.
Logged in to arhfw.clunix.org.
ncftp / >
————————————————————————————-
Anonymous ftp 디렉토리에 접근한 방법이다.
실무에서 주로 사용하는 설정을 중심으로 Proftpd 에 대해 알아 보았다.
이밖에 여러 기능이 더 존재하고 있으니 더 자세한 내용에 대해서 알아보고자 할 경우는
http://www.proftpd.org 를 참고하길 바란다.
2.3. MAIL Server
리눅스 운영체제에서 사용할 수 있는 많은 서비스중에서 대표적인 서버스 중에 하나로 메일
서비스를 꼽을 수 있다. 이 장에서는 리눅스에서 가장 대중적으로 사용되어 지는 Sendmail
과 대규모 메일 발송에 탁월한 성능을 가지고 있는 Qmail 에 대해 그 구축법과 사용법에 대해
알아 보도록 하겠다.
구체적인 구축에 들어가기 앞서 먼저 메일시스템의 작동 원리에 대해 이해를 해야 할 것이다.
메일서버란 인터넷에서 E-Mail을 주고 받는 기능을 수행하는 서버를 말하며, E-Mail은 크게
두 종류의 프로그램과 프로토콜에 의해 전달된다.
여기서 두 종류의 프로그램이란MUA(Mail User Agent)와 MTA(Mail Transfer Agent)를 말한다.
MUA로는사용자가 직접 메일을 작성하거나 보낼 때 사용하는 넷스케이프 메신저, MS Outlook
유도라 등의 프로그램이 있고, MTA는 실제로 메일을 전송해주는 Sendmail,Qmail등의 프로그램
이 있다.
아래의 그림과 같이 Sendmail이 설치된 메일서버는 SMTP(Simple Mail Transfer
Protocol) 프로토콜을 사용하여 메일을 전송하고, 호스트로부터 받은 메일을 클라이언트로
전달할 때는 POP3 또는 IMAP등의 프로토콜을 사용합니다.
[ 메일 작동 구성도 – 그림 ]
예를 들어 mail@clunix.org 이라는 메일주소를 가진 사람이 다른 서버에 계정을 가진
webmaster@yahoo.co.kr이라는 친구에게 메일을 보낸다고 가정하면, 아래와 같은 과정을 거쳐
메일이 전달되게 될것이다.
1. mail@clunix.org 이라는 사람이 Outlook 이나 넷스케이프 메신저와 같은 MUA
프로그램에서 보낸 메일은 먼저 SMTP 프로토콜을 통해 arhfw.clunix.org 메일서버에
전달됩니다.
2. arhfw.clunix.org에서 대기하고 있던 MTA데몬(Sendmail, qmail)은 메일을 메일큐
디렉토리(/var/spool/mqueue)에 임시 저장한 후 SMTP 프로토콜을 통해 다시 yahoo.co.kr
메일서버로 전송하고 큐디렉토리에 저장했던 메일을 삭제합니다.
yahoo.co.kr에서는 sendmail 데몬이 대기하고 있다가 arhfw.clunix.org 메일서버가
보내온 메일의 도착지가 자신의 것인지 확인 한 후 맞으면 메일박스(/var/mail
디렉토리)에 webmaster라는 파일로 저장합니다.
3. webmaster@yahoo.co.kr의 사용자는 마이크로소프트 아웃룩이나 유도라와 같은 MUA를
통해 메일을 확인하며, 이때에는 POP3나 IMAP등의 프로토콜을 통해 메일이 전송됩니다.
이와 같은 메일이 전달되어 지는 과정 중에 어느 하나라도 문제가 발생하면 정상적인
메일 송수신이 되지 않을 것이다. 관리자는 이런 메일 작동의 원리를 알고 있어야 실제
문제 발생 시 막연히 “메일이 안된다” 가 아닌 어느 지점에 문제로 인해 메일이 안된다
라는 인식을 할수 있게 된다.
2.3.1 Sendmail 로 Mail Server 구축하기
– Sendmail 설치 및 기본 설정
Sendmail은 메일서버로 가장 많이 사용되고 있는 MTA프로그램으로 공식사이트는
http://www.sendmail.org입니다. 대부분의 리눅스 배포판에 기본적으로 설치가 되어
있으므로 자신의 시스템에 맞는 환경설정을 한 후 사용하시면 됩니다.
패키지는 다음 사이트에서 다운 받을 수 있다.
Sendmail 공식 미러사이트 – ftp://ftp.sendmail.org
Sendmail 미러사이트 – http://www.sendmail.org/mirrors.html
국내 미러사이트 : ftp://ftp.linux.co.kr/server/sendmail
여기서는 Redhat Linux 배포판에서 기본 제공해 주는 RPM 패키지를 이용하여 구축 하여
보도록 하겠다.
[root@arhfw updates]# rpm -Uvh sendmail-8.12.8-9.90.i386.rpm
[root@arhfw updates]# rpm -Uvh sendmail-cf-8.12.8-9.90.i386.rpm
[root@arhfw updates]# rpm -Uvh sendmail-doc-8.12.8-9.90.i386.rpm
Sendmail을 실행하기전에 /etc/services 파일을 열고 smpt 프로토콜에 주석처리가
되어 있는지 확인한 후 Sendmail 서버를 실행합니다.
[root@arhfw root]# cat /etc/services | grep smtp
——————————————————————————-
smtp 25/tcp mail
smtp 25/udp mail
smtps 465/tcp # SMTP over SSL (TLS)
[root@arhfw root]# /etc/rc.d/init.d/sendmail restart
——————————————————————————–
Shutting down sendmail: [ OK ]
Shutting down sm-client: [ OK ]
Starting sendmail: [ OK ]
Starting sm-client: [ OK ]
Sendmail 서버가 정상적으로 실행되었는지 확인하기 위해 telnet을 사용해 25번 포트(smpt)로
접속해봅니다. 아래와 같은 메시지가 출력되면 Sendmail이 정상적으로 실행된 것입니다.
[root@arhfw root]# telnet localhost 25
——————————————————————————–
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
220 arhfw.clunix.org ESMTP Sendmail 8.12.8/8.12.8; Wed, 27 Apr 2005 13:47:18 +0900
만약 레드헷 버젼이 7.1 이상부터는 relay 보안 기능이 강화 되어서 초기 셋팅상태에서는
내부 사용자 끼리만 메일을 보내고 받을수 있다. 원격지에서는 이 서버를 통해서 메일을
주고 받을수가 없다. 일단..새로 sendmail.cf 파일을 만들어야 한다.
이를 확인 하기 위해서는 telnet 으로 25번 포트에 접근을 해보면 되는데 이때는 로컬
시스템에서 확인하는 것이 아니라 원격 호스트에서 확인을 해야 한다. 로컬은 기본 설정
에서 이미 허가가 되어져 있으니 위의 테스트결과 처럼 정상적으로 접속이 되어질 것이다.
[root@arhdev root]# telnet arhfw.clunix.org 25
——————————————————————————
Trying 192.168.133.254…
telnet: connect to address 192.168.133.254: Connection refused
위와 같이 원격 시스템에서는 arhfw 서버에 접근을 할 수 없기 때문에 메일을 보낼 수 없다.
정상적인 메일 서비스를 위해서는 위 부분의 제한을 제거해 주어야 한다.
[root@arhfw root]# cd /etc/mail
[root@arhfw mail]# vi sendmail.mc
——————————————————————————–
.
.
아래 부분을 찾는다
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA’)
해당 서버의 외부 통신 IP로 메일을 Detect 할 수 있게 아래와 같은 설정을 추가한다.
DAEMON_OPTIONS(`Port=smtp,Addr=192.168.133.254, Name=MTA’)
.
.
——————————————————————————–
[root@arhfw mail]# m4 sendmail.mc > sendmail.cf
m4 를 이용하여 sendmail.mc 설정 파일을 토대로 sendmail.cf 파일을 재생성하도록 한다.
[root@arhfw mail]# /etc/rc.d/init.d/sendmail restart
새로운 설정을 적용하기 위해 sendmail 재시작한다.
이제 다시 외부 호스트에서 25번 port 테스트를 해보도록 하자.
[root@arhdev root]# telnet arhfw.clunix.org 25
——————————————————————————–
Trying 192.168.133.254…
Connected to arhfw.clunix.org.
Escape character is ‘^]’.
220 arhfw.clunix.org ESMTP Sendmail 8.12.8/8.12.8; Wed, 27 Apr 2005 14:01:57 +0900
위와 같이 정상적으로 접속이 되면 일단 메일을 주고 받을 준비가 되어진것이다.
이제 구체적인 메일 설정을 해 보도록 하자.
– Sendmail.cf 설정
Sendmail에서 가장 중요하고도 어려운 부분이 sendmail.cf 파일의 설정입니다.
O’Reilly사에서 Sendmail에 대한 전문서적이 나올 정도로 방대하고 다양한 기능을 가지고
있으며 사용법도 매우 다양합니다. Sendmail을 사용하기 위해 기본적으로 알아야 할 설정
파일들에 대해 살펴보겠습니다.
[root@arhdev root]# vi /etc/mail/sendmail.cf
Sendmail의 가장 중요한 설정파일로 /etc 또는 /etc/mail 디렉토리에 자동으로 설치되어
있습니다. 여기서는 주요 항목에 대해서만 설명하도록 하겠습니다.
Fw/etc/mail/local-host-names
메일을 수신할 호스트 이름을 명시한 파일의 위치를 설정합니다.
FR-o /etc/mail/relay-domains
relay-domains파일에는 Relay를 허용할 호스트의 이름을 설정합니다. 주석으로 처리하면
모든 IP에 대해서 Relay가 허용되므로 스팸메일과 같은 문제가 발생할 수도 있으므로
주의하시기 바랍니다.
DnMAILER-DAEMON
Sendmail 서버가 에러메시지를 보내야 할 경우 보낸 사람의 이름을 결정합니다. 잘못된
메일이 되돌아 온 경우 FROM : Mail Delivery Subsystem
<MAILER-DAEMON>과 같은 메시지를 보신적이 있을 것입니다.
Kaccess hash /etc/mail/access
Relay를 허용하거나 거부할 특정 IP와 도메인을 설정하는 파일입니다.
relay-domains보다 사용이 편리하므로 많이 사용됩니다.
O MaxMessageSize=2000000
메일의 최대 크기를 결정합니다. 주석을 제거하면 설정한 크기(Byte단위)보다 큰 메일은
전송할 수 없게 됩니다. 지금 써준 2000000은 2메가로 제한한 메일 용량입니다.
O QueueDirectory=/var/spool/mqueue
큐 디렉토리를 설정합니다.
O Timeout.queuereturn=5d
메일을 보내려는 호스트에 문제가 생기면 메일은 큐 디렉토리에 저장됩니다. Sendmail
서버는 쌓인 메일을 상대방 호스트에 보내기 위해 주기적으로 접속을 시도하며, 일정한
기간이 지나면 메일을 다시 발송한 사람에게 되돌려 보냅니다. Sendmail이 메일을 보내려고
시도하는 기간을 설정하는 옵션으로 5d는 5일을 의미합니다.
O Timeout.queuewarn=4h
큐 디렉토리에 쌓인 메일이 지정한 시간안에 전송되지 못할 경우 메일을 보낸 사람에게 경고
메일을 보냅니다. 기본값은 4h로 4시간안에 전송되지 못하면 보낸 사람에게 경고의 메일을
보냅니다.
Mlocal,
P=/usr/bin/procmail, F=lsDFMAw5u:/|@qSPfhn9,
S=EnvFromL/HdrFromL, R=EnvToL/HdrToL,
T=DNS/RFC822/X-Unix,
A=procmail -Y -a $h -d $u
사용자계정에 대문자가 있는 경우에도 메일을 받을 수 있도록 설정하려면 Mlocal로
시작하는 부분을 찾아 F= 부분에 ‘u’를 추가합니다.
– access 설정
[root@arhfw mail]# vi access
————————————————————————————-
localhost.localdomain RELAY
localhost RELAY
127.0.0.1 RELAY
192.168.133. RELAY
spam.com REJECT
————————————————————————————
스팸메일을 방지하기 위해 Relay를 허용할 호스트의 IP와 도메인을 설정하는 매우 중요한
파일입니다
위의 localhost 나 192.168.133.0/24 IP 대역에서 Relay를 허용하나 spam.com 에서 오는
모든 메일은 Relay를 거부 한다는 뜻이다.
이와 같이 허용이나 거부 대역을 지정후 access.db 파일을 갱신시켜주면 바로 적용이된다.
[root@arhfw mail]# makemap hash /etc/mail/access < /etc/mail/access
– local-host-names 설정
[root@arhfw mail]# vi local-host-names
————————————————————————————-
clunix.org
————————————————————————————-
메일을 수신할 호스트의 이름을 입력하는 파일로, Sendmail 8.9.x 버전이하에서 사용되었던
sendmail.cw 파일의 명칭이 Sendmail 8.10.x 버전부터는 local-host-names로 변경되었습니다.
Sendmail 서버는 이곳에 적힌 호스트의 이름으로 메일이 들어오면 더 이상다른 서버로 메일을
보내지 않고 자신의 메일박스에 저장합니다.
아래와 같이 메일서버의호스트이름을 입력하거나 여러 개의 가상호스트를 사용한다면 모두
입력해야 합니다.
– aliases 설정
[root@arhfw mail]# vi /etc/aliases
————————————————————————————-
# Basic system aliases — these MUST be present.
mailer-daemon: postmaster
postmaster: root
.
.
mailing: user1, user2, user3
mailing2: :include:/etc/mail/mailing_users
————————————————————————————-
특정 사용자에게 온 메일을 다른 사람에게 보내주거나, 메일링리스트를 작성해야 하는 경우에
사용되는 파일로 보안에 주의하여 사용해야 합니다.
aliases 파일을 열어보면 시스템 계정들이 아래와 같이 root로 alias되어 있습니다.
또한 특정 사용자를 다른 사용자로 alias 시킬 수도 있습니다.
위와 같이 설정을 하고 설정을 적용 시켜 주는 newaliases 명령을 실행시키면 된다.
[root@arhfw mail]# newaliases
/etc/aliases: 65 aliases, longest 32 bytes, 691 bytes total
위 설정에서는 mailing@clunix.org 로 메일을 보내면 user1, user2, user3 계정에게 메일이
전송되게 된다. mailing2@clunix.org 로 메일을 보내면 /etc/mail/mailing_users 파일에 저장
된 계정 리스트 모두에게 메일이 전송되어 진다.
[root@arhfw mail]# cat mailing_users
————————————————————————————-
user1
user2
user3
– virtusertable 설정
[root@arhfw mail]# vi virtusertable
————————————————————————————-
webmaster@clunix.org alang
webmaster@sysmng.com user1
webmaster@manpa.co.kr user2
————————————————————————————-
virtusertables 설정은 동일 시스템에 여러개의 도메인이 메일 서비스를 받고 있을 경우
webmaster 나 admin 과 같은 도메인 별로 중복되어 사용되어지는 계정이 있을 경우 가상
계정으로 만들어 가상계정으로 들어오는 메일을 실제 시스템 계정으로 포워딩 시켜 주는
설정이다.
위와 같은 형태로 설정을 하고 난 후 virtusertable.db 파일을 생성해 주어야 한다.
[root@arhfw mail]# makemap hash /etc/mail/virtusertable < /etc/mail/virtusertable
그럼 실제 webmaster@clunix.org 로 메일을 보내면 alang@clunix.org 로 메일이 전송되게
된다.
– sendmail monitoring 하기
[root@arhfw mail]# mailstats
Statistics from Wed Jan 23 04:02:04 1980
M msgsfr bytes_from msgsto bytes_to msgsrej msgsdis Mailer
5 361145 14357435K 89312 3671483K 16983 0 esmtp
8 236772 11571389K 661786 20775066K 8687 0 local
=============================================================
T 597917 25928824K 751098 24446549K 25670 0
– sendmail mail queue monitoring 하기
[root@ns /root]# mailq
Mail Queue (5 requests)
–Q-ID– –Size– —–Q-Time—– ————Sender/Recipient————
LAA21970 2375 Sat Jul 21 11:40 MAILER-DAEMON
8BITMIME (Deferred: Connection refused by web.kdlp.org.)
<www@web.kdlp.org>
QAA29807 11059 Fri Jul 20 16:58 MAILER-DAEMON
8BITMIME (Deferred: Connection refused by tmail.simmani.com.)
<IDCGUYS_20010720164215677-@tmail.simmani.com
KAA01947 7550 Fri Jul 20 10:29 MAILER-DAEMON
8BITMIME (Deferred: Connection refused by web.kdlp.org.)
<www@web.kdlp.org>
OAA05202 3153 Wed Jul 18 14:43 MAILER-DAEMON
8BITMIME (Deferred: Connection refused by web.kdlp.org.)
<www@web.kdlp.org>
PAA19364* (no control file)
– sendmail 통해 송수신 메일 용량 제한 하기
송신 메일 크기 제한은 sendmail.cf 의 MaxMessageSize 를 찾아서 허용할 크기의 용량을
정의 하면 된다. 용량단위는 Byte 이며 5MByte 크기의 데이터를 메일로 송신 하고 싶을
경우는 MaxMessageSize=5024000 라고 설정하면 된다.
수신 메일 크기 제한은 Mlocal 설정 부분을 찾는다.
Mlocal, P=/usr/bin/procmail, F=lsDFMAw5:/|@qSPfhn9, S=EnvFromL/HdrFromL,
R=EnvToL/HdrToL, T=DNS/RFC822/X-Unix,
이곳에서 M=5024000 와 같은 설정을 추가해 준다.
Mlocal, P=/usr/bin/procmail, F=lsDFMAw5:/|@qSPfhn9, S=EnvFromL/HdrFromL,
R=EnvToL/HdrToL, M=5024000, T=DNS/RFC822/X-Unix,
그런 후 sendmail 을 재 시작해 주면 바로 적용된다.
2.3.2 Post Office Protocol(POP) 서버 구축하기
– POP3의 작동 원리
Post Office Protocol의 약자인 POP은 각 SMTP 로 부터 보내진 메일이 저장된 메일서버
의 저장 박스에 있는 메일 데이터를 MUA에서 수신하도록 서비스를 해주는 프로그램이다.
여기에서는 UWIMAP 에서 지원하는 POP3 구축과 Qpopper로 구축하는 방법에 대해 알아
볼것이다. POP 방식은 IMAP의 POP3 나 Qpopper 의 POP3 중 하나만을 선정하여 사용을 해야
할것이다. 두개를 동시에 쓰면 POP3 의 Service Port 인 110 번 Port 를 두개의 프로그램
에서 서로 점유할려는 충돌이 발생할것이다.
– IMAP/POP3 설치 하기
Sendmail을 통해 메일을 메일 서버의 메일 박스에 보관하는 부분까지는 위 단계 설정으로
완료가 되었다. 하지만 메일 서버의 보관된 메일을 사용자 MUA를 통해 사용자 PC로 가져
오기 위해서는 POP3 나 IMAP 같은 프로그램이 필요 하게 된다.
여기서는 IMAP 과 POP3를 설치하는 방법에 대해 알아 보도록 하자.
– IMAP 설치 및 설정 하기
해당 사이트에서 Imap source 를 다운 받는다.
ftp://ftp.cac.washington.edu
적절한 경로에 Source 를 옮겨 놓고 압축을 푼다.
[root@arhfw apmj]# tar xzvf imap-2004.tar.Z
압축이 풀린 Imap 디렉토리를 /usr/local/imap 디렉토리로 옮긴다.
[root@arhfw apmj]# mv imap-2004 /usr/local/imap
[root@arhfw apmj]# cd /usr/local/imap
[root@arhfw imap]# make slx SSLTYPE=none
컴파일이 완료되면생성된 imapd 와 ipop3d 실행 파일을 /usr/sbin 으로 옮겨 놓는다.
[root@arhfw imap]# cp imapd/imapd /usr/sbin
[root@arhfw imap]# cp ipopd/ipop3d /usr/sbin
imapd, ipop3d 데몬을 xinetd 데몬에서 제어 가능하도록 설정한다.
[root@arhfw imap]# vi /etc/xinetd.d/imapd
————————————————————————————-
service imap
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/sbin/imapd
log_on_success += DURATION USERID
log_on_failure += USERID
nice = -2
}
————————————————————————————–
[root@arhfw imap]# vi /etc/xinetd.d/ipop3d
————————————————————————————–
service pop3
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/sbin/ipop3d
log_on_success += USERID
log_on_failure += USERID
nice = -2
}
————————————————————————————–
imap 관련 라이브러리와 헤더 파일을 옮겨서 다른 프로그램에서 Imap이 호환되게 처리 한다
[root@arhfw imap]# cp c-client/c-client.a /usr/lib
[root@arhfw imap]# cp c-client/mail.h /usr/local/include
[root@arhfw imap]# cp c-client/rfc822.h /usr/local/include
[root@arhfw imap]# cp c-client/linkage.h /usr/local/include
xinetd 데몬을 재시작 한다.
[root@arhfw imap]# /etc/rc.d/init.d/xinetd restart
정상적으로 작동하는지 확인 한다.
– IPOP3 확인하기
[root@arhfw xinetd.d]# telnet localhost 110
————————————————————————————-
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
+OK POP3 localhost.localdomain 2004.87 server ready
user <mail account> -> 메일 계정을 입력한다.
+OK User name accepted, password please
pass <passowrd> -> 패스워드를 입력한다.
+OK Mailbox open, 4 messages -> 메일이 4통 보관되어 있다는 의미
list -> 보관된 메일 리스트 확인
+OK Mailbox scan listing follows
1 758
2 547
3 766
4 767
.
retr 1 -> 1번 메일 확인
+OK 758 octets
Return-Path: <root@arhdev.clunix.org>
Received: from arhdev.clunix.org (arhdev.clunix.org [192.168.133.9])
by arhfw.clunix.org (8.12.8/8.12.8) with ESMTP id j3R5J4pa006011
for <alang@clunix.org>; Wed, 27 Apr 2005 14:19:04 +0900
Received: from arhdev.clunix.org (localhost.localdomain [127.0.0.1])
by arhdev.clunix.org (8.12.8/8.12.8) with ESMTP id j3R5N5Fg026088;
Wed, 27 Apr 2005 14:23:05 +0900
Received: (from root@localhost)
by arhdev.clunix.org (8.12.8/8.12.8/Submit) id j3R5N5Yc026086;
Wed, 27 Apr 2005 14:23:05 +0900
Date: Wed, 27 Apr 2005 14:23:05 +0900
From: root <root@arhdev.clunix.org>
Message-Id: <200504270523.j3R5N5Yc026086@arhdev.clunix.org>
To: alang@clunix.org
Subject: test
Cc: .@arhdev.clunix.org
Status: O
test
————————————————————————————
– IMAP 확인하기
[root@arhfw xinetd.d]# telnet localhost 143
————————————————————————————
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
* OK [CAPABILITY IMAP4REV1 LITERAL+ SASL-IR LOGIN-REFERRALS AUTH=LOGIN] localhost.localdomain IMAP4rev1 2004.350 at Wed, 27 Apr 2005 17:12:25 +0900 (KST)
위와 같이 접속이 완료되면 정상적으로 동작을 하는 것이다.
– QPOPPER 설치 하기
Qpopper는 Qualcomm 사의 Eudora 부서에서 개발하여 무료로 배포하고 있으며 UNIX계열의
POP3 서버로 가장 흔히 사용하는 프로그램이다. 일반 배포판에서 기본 지원하고 있는
POP3 프로그램에 비해 대형 서비스에 안정스럽다고 알려져 있다.
설치에 앞서 먼저 ftp://ftp.eudora.com/eudora/servers/unix/popper/ 에서 qpopper
최신 버전을 다운 받는다.
[root@arhfw src]# tar xzvf qpopper4.0.7.tar.gz
[root@arhfw src]# cd qpopper4.0.7
[root@arhfw qpopper4.0.7]# ./configure \\
–enable-specialauth \\
–enable-servermode \\
–enable-apop=/etc/pop.bin \\
–with-popuid=bin
configure 옵션에 대해 간단히 설명하겠다.
–enable-apop=path : APOP은 POP3의 확장 버전으로 보안이 강화된 버전이다.
이전에 POP3 에서는 사용자가 암호를 서버로 보낼때 비암호화 방식으로 전달을 했는데
APOP 에서는 이를 암호화 시켜 준다.
–with-popuid=user : 이 옵션의 위의 apop 와 항상 함께 사용되어져야 하는 옵션으로
실제 apop 기능을 실행하는 사용자의 의미이다.
–enable-servermode : 서버에 부하가 많이 걸리는 환경에서 효율적으로 POP3 서비스를
할수 있게 해주는 기능이다.
–enable-specialauth : POP 인증 패스워드를 Shadow 패스워드로 사용하기 위한 옵션이다.
[root@arhfw qpopper4.0.7]# make
정상적으로 컴파일이 완료되면 popper 과 popauth 란 두개의 실행 파일이 생성이 될을것
이다. popper 은 POP3 서버 데몬의 실행 파일이고 popauth 는 APOP 계정을 관리하는
프로그램이다. 이 두개의 실행 파일을 /usr/bin 에 옮기고 아래와 같이 퍼미션을 조정한다.
[root@arhfw qpopper4.0.7]# cd popper/
[root@arhfw popper]# cp popper /usr/bin
[root@arhfw popper]# cp popauth /usr/bin
[root@arhfw popper]# chmod 755 /usr/bin/popper
[root@arhfw popper]# chmod 4755 /usr/bin/popauth
[root@arhfw popper]# chown root. /usr/bin/popper
[root@arhfw popper]# chown bin.root /usr/bin/popauth
만일 popper 의 man page 를 사용할 필요가 있을 경우는 man 관련 페이지를 기본
man page 경로에 옮겨 둔다.
[root@arhfw qpopper4.0.7]# cd man
[root@arhfw man]# chown root. *
[root@arhfw man]# chmod 644 *
[root@arhfw man]# cp *.8 /usr/man/man8/
– Qpopper 설정하기
Qpopper 은 xinetd 데몬에 의해 가동된다.
먼저 Qpopper 에 대한 xinetd 설정을 한다.
( 주의 : 위의 IMAP/POP3 서비스가 enable 되어 있을 경우 충돌이 나므로 IMAP/POP3
의 xinetd 설정의 disable 설정을 yes 로 해두길 바란다. )
[root@arhfw root]# vi /etc/xinetd.d/qpop3d
——————————————————————————–
service pop3
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/popper
log_on_success += USERID
log_on_failure += USERID
nice = -2
}
———————————————————————————
xinetd 데몬을 재시작한다.
[root@arhfw root]# /etc/rc.d/init.d/xinetd restart
Qpopper 실행이 정상적으로 동작하는지 확인한다.
[root@arhfw root]# telnet localhost 110
———————————————————————————
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
+OK Qpopper (version 4.0.7) at arhfw.clunix.org starting.
위와 같이 접속이 되어지면 정상적이 동작이 확인 되는 것이다.
2.3.3 Qmail 로 Mail Server 구축하기
큐메일은 기존의 sendmail 을 대체하는 메일 전송 에이전트( MTA )로써 보다 안정하고
빠른 속도로 많이 알려져 있다. 하지만 어려운 설치 과정과 많은 설정파일때문에 일부
관리자들만이 사용하고 있다. 이런 큐메일에 몇가지 프로그램을 같이 사용하여 웹호스
팅용 메일 서버 패키지로 사용하고자 한다. 기존의 sendmail 에서 할수 없었던 많은
기능을 발휘할수 있을것이다.
– 주요 기능
* 무한정(?) 도메인과 pop 메일 아이디를 발급할수 있다.
* 한개의 시스템 계정생성으로 모든 버츄얼 도메인,pop 계정을 만들수 있다.
( 불필요한 유저 생성을 막을수 있다. – 보안적인 측면에 유리 )
* 각 도메인 마다 메일 계정, 메일링 리스트의 한계를 설정할수 있다.
* 웹인터페이스로 메일 추가,삭제,메일링 및 각 도메인에 대한 메일 관리가 가능하다.
* 유저별 quota 설정이 가능하다.
* 각 도메인 관리자가 자기 도메인의 메일 계정 추가 삭제가 가능하다.
* 가상 메일 없이도 도메인 마다 똑같은 사용자 계정을 만들수 있다.
위의 내용은 웹호스팅용 메일 시스템으로 아주 유리한 기능들이다. 이밖에 다양한
기능들이 많이 있다.
– 필요한 프로그램
qmail-1.03.tar.gz
qmail-1.03.qmail_local.patch
qmail-1.03.errno.patch
qmail-0.0.0.0.patch
sendmail-flagf.patch
ucspi-tcp-0.88.tar.gz
ucspi-tcp-0.88.errno.patch
daemontools-0.76.tar.gz
autorespond-2.0.2.tar.gz
qmailadmin-1.2.1.tar.gz
vpopmail-5.4.0.tar.gz
ezmlm-0.53.tar.gz
ezmlm-idx-0.40.tar.gz
qmail , ucspi-tcp , daemontools : http://qmail.org
vpopmail, qmailadmin, autoresponder : http://inter7.com
ezmlm , ezmlm-idx : http://www.ezmlm.org
– qmail 설치 하기
qmail 컴파일 설치
위 프로그램들을 모두 /usr/local/src/qmail 디렉토리 및에 옮겨두고 tar 를 푼다.
그리고 qmail 이 설치될 디렉토리를 만든다. 그런뒤 qmail103.patch 파일을
qmail-1.03 디렉토리 안에 둔다.
[root@arhdev qmail]# tar xzvf qmail-1.03.tar.gz
[root@arhdev qmail]# cd qmail-1.03
[root@arhdev qmail-1.03]# patch -p1 < ../qmail-1.03.errno.patch
[root@arhdev qmail-1.03]# patch -p1 < ../qmail-1.03.qmail_local.patch
[root@arhdev qmail-1.03]# cp ../sendmail-flagf.patch .
[root@arhdev qmail-1.03]# patch -p0 < sendmail-flagf.patch
[root@arhdev qmail-1.03]# mkdir /var/qmail
INSTALL.ids 파일을 편집한다.(qmail 에 필요한 계정과 그룹들이다. 해당 OS에 맞추어
편집한다.)
[root@arhdev qmail-1.03]# vi INSTALL.ids
—————————————————–
groupadd nofiles
useradd -g nofiles -d /var/qmail/alias alias
useradd -g nofiles -d /var/qmail qmaild
useradd -g nofiles -d /var/qmail qmaill
useradd -g nofiles -d /var/qmail qmailp
groupadd qmail
useradd -g qmail -d /var/qmail qmailq
useradd -g qmail -d /var/qmail qmailr
useradd -g qmail -d /var/qmail qmails
—————————————————–
INSTALL.ids 를 실행하여 qmail 운영에 필요한 계정과 그룹을 생성한다.
[root@arhdev qmail-1.03]# sh INSTALL.ids
qmail 관련 계정,그룹이 생성되었는지 확인한다.
[root@arhdev qmail-1.03]# cat /etc/passwd
qmail을 컴파일 한다.
[root@arhdev qmail-1.03]# make
[root@arhdev qmail-1.03]# make setup check
참고로 상황에 따라 아래와 같은 에러가 나타날 수 있다. 그 해결 방법이다.
문제 1-
qmail-1.03 make 시 발생하는 make: *** [spawn.o] 오류 1
해결법 :
vi qmail-1.03/conf-spawn
——————————————————–
1000
위의 1000 을 509 로 변경
——————————————————–
문제 2-
/usr/include/openssl/kssl.h:157: parse error before ‘*’ token
/usr/include/openssl/kssl.h:159: parse error before “kssl_ctx_setkey”
/usr/include/openssl/kssl.h:159: parse error before ‘*’ token
/usr/include/openssl/kssl.h:161: parse error before “context”
/usr/include/openssl/kssl.h:162: parse error before “kssl_build_principal_2”
/usr/include/openssl/kssl.h:162: parse error before “context”
/usr/include/openssl/kssl.h:165: parse error before “kssl_validate_times”
/usr/include/openssl/kssl.h:165: parse error before “atime”
/usr/include/openssl/kssl.h:167: parse error before “kssl_check_authent”
/usr/include/openssl/kssl.h:167: parse error before ‘*’ token
/usr/include/openssl/kssl.h:169: parse error before “enctype”
In file included from tls.h:4,
from qmail-remote.c:53:
/usr/include/openssl/ssl.h:909: parse error before “KSSL_CTX”
/usr/include/openssl/ssl.h:931: parse error before ‘}’ token
qmail-remote.c: In function `quit’:
qmail-remote.c:263: dereferencing pointer to incomplete type
qmail-remote.c: In function `main’:
qmail-remote.c:655: warning: return type of `main’ is not `int’
make: *** [qmail-remote.o] 오류 1
해결법 :
——————————————————————————–
qmail-1.03/conf-cc 파일 수정
cc -O2 -DTLS=20021228 -I/usr/local/ssl/include
행을
cc -O2 -DTLS=20021228 -I/usr/local/ssl/include -I/usr/kerberos/include
로..
——————————————————————————-
기본 /var/qmail/control 및의 설정 파일의 설정을 위해 다음을 실행한다.
[root@arhdev qmail-1.03]# ./config
만일 여기서 정상적으로 실행되지 않으면 직접적으로 설정을 실행하는 방법을
사용한다. ( 단 DNS 에 문제가 있을수도 있다. )
[root@arhdev qmail-1.03]# ./config-fast clunix.co.kr -> << Domain >>
qmail 을 위한 몇가지 부수적은 프로그램을 설치한다.
– uscpi-tcp 설치 하기
[root@arhdev qmail]# tar xzvf ucspi-tcp-0.88.tar.gz
[root@arhdev qmail]# cd ucspi-tcp-0.88
[root@arhdev ucspi-tcp-0.88]# patch -p1 < ../ucspi-tcp-0.88.errno.patch
[root@arhdev ucspi-tcp-0.88]# make
[root@arhdev ucspi-tcp-0.88]# make setup check
– daemontools 설치 하기
[root@arhdev qmail]# mkdir -p package
[root@arhdev qmail]# chmod 1755 package
[root@arhdev qmail]# cd package/
[root@arhdev package]# cp ../daemontools-0.76.* .
[root@arhdev package]# tar xzvf daemontools-0.76.tar.gz
[root@arhdev package]# cd admin/daemontools-0.76/
[root@arhdev daemontools-0.76]# patch -p1 < ../../daemontools-0.76.errno.patch
[root@arhdev daemontools-0.76]# package/install
– autorespond
[root@arhdev daemontools-0.76]# cd ../../..
[root@arhdev qmail]# tar xzvf autorespond-2.0.2.tar.gz
[root@arhdev qmail]# cd autorespond-2.0.2
[root@arhdev autorespond-2.0.2]# make
[root@arhdev autorespond-2.0.2]# cp autorespond /usr/local/bin
모두 이상없이 설치가 되었다면 다시 qmail 을 위해 파일을 만든다.
[root@arhdev qmail]# vi /var/qmail/rc
—————————————————————-
#!/bin/sh
exec env – PATH=”/var/qmail/bin:$PATH” \\
qmail-start ./Maildir/
—————————————————————-
[root@arhdev qmail]# chmod a+x /var/qmail/rc
다음은 큐메일 데몬을 위한 디렉토리와 파일들을 생성.
mkdir -p /var/qmail/supervise/qmail-send/log
mkdir -p /var/qmail/supervise/qmail-smtpd/log
chmod +t /var/qmail/supervise/qmail-send
chmod +t /var/qmail/supervise/qmail-smtpd
/var/qmail/supervise/qmail-send/run 의 내용
——————————————
#!/bin/sh
exec /var/qmail/rc
/var/qmail/supervise/qmail-send/log/run 의 내용
———————————————-
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail
/var/qmail/supervise/qmail-smtpd/run 의 내용
——————————————-
#!/bin/sh
Q_UID=`id -u qmaild`
Q_GID=`id -g qmaild`
exec /usr/local/bin/softlimit -m 2000000 \\
/usr/local/bin/tcpserver -vRHl 0 -x /etc/tcp.smtp.cdb \\
-u $Q_UID -g $Q_GID 0 25 /var/qmail/bin/qmail-smtpd 2>&1
——————————————–
/var/qmail/supervise/qmail-smtpd/log/run 의 내용
———————————————–
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill \\
/usr/local/bin/multilog t /var/log/qmail/smtpd
이렇게 편집한 파일들에 실행 권한을 준다.
chmod 755 /var/qmail/supervise/qmail-send/run
chmod 755 /var/qmail/supervise/qmail-send/log/run
chmod 755 /var/qmail/supervise/qmail-smtpd/run
chmod 755 /var/qmail/supervise/qmail-smtpd/log/run
다음은 qmail-smtpd 를 위한 로그 디렉토리 만들기
mkdir -p /var/log/qmail/smtpd
chown qmaill /var/log/qmail /var/log/qmail/smtpd
다음 파일에는 qmail smtp 데몬이 메일을 중계할 주소를 적어주는 것이다.
192.168.133.167 은 당연히 설치할 서버의 주소로바꿔야 한다.
그외 메일을 중계 해줄 서버의 주소가 있다면 같은 형식으로 추가한다.
vi /etc/tcp.smtp
——————————————
127.0.0.1:allow,RELAYCLIENT=””
192.168.133.167:allow,RELAYCLIENT=””
——————————————
후에 이 파일에 변경이 있는 경우 다음의 qmail 부트 스크립트를 이용해 다음과
같이 한다.
/etc/rc.d/init.d/qmail cdb
혹은 tcprules 를 이용한 적용 방법으로 아래 command 를 실행한다.
tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
– Aliases 설정
만약 주 도메인의 메일 계정들도 모두 vpopmail 로 관리할 것이 아니라면
(필자는 주 도메인의 메일 계정들도 모두 vpopmail로 관리할것을 권장한다.)
몇가지 알리아스를 설정해 준다. 여기서 silver 는 root, postmaster 등으로 오는
메일을 받을 일반계정이다.
cd ~alias
echo clunix > .qmail-mailer-daemon
echo clunix > .qmail-postmaster
echo clunix > .qmail-root
chmod 644 .qmail-root .qmail-postmaster .qmail-mailer-daemon
– qmail 부트 파일
다음은 qmail 데몬의 부트 스크립트이다. /etc/rc.d/init.d/qmail 로 만들어준다.
/etc/rc.d/init.d/qmail
———————————————————————————–
#!/bin/sh
# For Red Hat chkconfig
# chkconfig: – 80 30
# description: the qmail MTA
PATH=/var/qmail/bin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbin
export PATH
case “$1” in
start)
echo “Starting qmail”
if [ -e /service/qmail-send ] ; then
if svok /service/qmail-send ; then
svc -u /service/qmail-send
else
echo qmail-send supervise not running
fi
else
ln -s /var/qmail/supervise/qmail-send /service/
fi
if [ -e /service/qmail-smtpd ] ; then
if svok /service/qmail-smtpd ; then
svc -u /service/qmail-smtpd
else
echo qmail-smtpd supervise not running
fi
else
ln -s /var/qmail/supervise/qmail-smtpd /service/
fi
if [ -d /var/lock/subsys ]; then
touch /var/lock/subsys/qmail
fi
;;
stop)
echo “Stopping qmail…”
echo ” qmail-smtpd”
svc -dx /service/qmail-smtpd /service/qmail-smtpd/log
rm -f /service/qmail-smtpd
echo ” qmail-send”
svc -dx /service/qmail-send /service/qmail-send/log
rm -f /service/qmail-send
if [ -f /var/lock/subsys/qmail ]; then
rm /var/lock/subsys/qmail
fi
;;
stat)
svstat /service/qmail-send
svstat /service/qmail-send/log
svstat /service/qmail-smtpd
svstat /service/qmail-smtpd/log
qmail-qstat
;;
doqueue|alrm|flush)
echo “Flushing timeout table and sending ALRM signal to qmail-send.”
/var/qmail/bin/qmail-tcpok
svc -a /service/qmail-send
;;
queue)
qmail-qstat
qmail-qread
;;
reload|hup)
echo “Sending HUP signal to qmail-send.”
svc -h /service/qmail-send
;;
pause)
echo “Pausing qmail-send”
svc -p /service/qmail-send
echo “Pausing qmail-smtpd”
svc -p /service/qmail-smtpd
;;
cont)
echo “Continuing qmail-send”
svc -c /service/qmail-send
echo “Continuing qmail-smtpd”
svc -c /service/qmail-smtpd
;;
restart)
echo “Restarting qmail:”
echo “* Stopping qmail-smtpd.”
svc -d /service/qmail-smtpd
echo “* Sending qmail-send SIGTERM and restarting.”
svc -t /service/qmail-send
echo “* Restarting qmail-smtpd.”
svc -u /service/qmail-smtpd
;;
cdb)
tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
chmod 644 /etc/tcp.smtp.cdb
echo “Reloaded /etc/tcp.smtp.”
;;
help)
cat <<HELP
stop — stops mail service (smtp connections refused, nothing goes out)
start — starts mail service (smtp connection accepted, mail can go out)
pause — temporarily stops mail service (connections accepted, nothing leaves)
cont — continues paused mail service
stat — displays status of mail service
cdb — rebuild the tcpserver cdb file for smtp
restart — stops and restarts smtp, sends qmail-send a TERM & restarts it
doqueue — schedules queued messages for immediate delivery
reload — sends qmail-send HUP, rereading locals and virtualdomains
queue — shows status of queue
alrm — same as doqueue
flush — same as doqueue
hup — same as reload
HELP
;;
*)
echo “Usage: $0 {start|stop|restart|doqueue|flush|reload|stat|pause|cont|cdb|queue|help}”
exit 1
;;
esac
exit 0
————————————————————————————–
실행 퍼미션을 준다.
chmod 755 /etc/rc.d/init.d/qmail
ntsysv 실행시키면 qmail 이라는 새로운 항목이 보일것이다.
리부팅 할때 qmail 데몬이 실행되도록 체크해준다.
– vpopmail 설치
vpopmail 은 가상 도메인 추가, 설정, pop 유저 설정과 pop3 데몬등의 기능을 한다.
컴파일과 설치
설치 하기 전에 vpopmail 이 사용할 유저와 그룹을 만든다.
groupadd vchkpw
useradd -g vchkpw vpopmail
vpopmail 을 설치하자.
[root@arhdev alias]# cd /usr/local/src/qmail/
[root@arhdev qmail]# tar xzvf vpopmail-5.4.6.tar.gz
[root@arhdev qmail]# cd vpopmail-5.4.6
MySQL 사용하지 않을 경우
설치시 몇가지 옵션이 있는데 자세한것은 vpopmail faq 를 읽어보도록.
보통 다음 옵션만 주고 컴파일 하면 된다.
./configure –enable-default-domain=clunix.co.kr
make
make install-strip
MySQL을 사용 할 경우
MySQL db를 사용하려 한다면, 컴파일 하기전에 먼저 vmysql.h 를 열어서
sql 서버를 억세스할수 있는 user와 암호등을 설정해 주어야 한다.
테이블을 생성/삭제 할수 있는 사용자 이여야하므로 보통 root 나 해당 유저로
설정해 준다.
./configure –enable-default-domain=clunix.co.kr –enable-mysql=y \\
–enable-sqlincdir=/usr/local/mysql/include/mysql \\
–enable-sqllibdir=/usr/local/mysql/lib/mysql
make
make install-strip
이때 –enable-large-site=n|y 옵션을 사용할수도 있는데 이것은, 디폴트로 vpopmail
은 모든도메인, 유저 정보를 한개의 테이블에서 관리한다. 만약 각각의 도메인에
많은 메일유저가있다면 y 로 설정하면, vpopmail은 도메인별로 테이블을 생성,유저
정보를 관리한다.
참고 :
vpopmail 5.4.x 이상 버전은 –enable-default-domain 컴파일 옵션이 없어지고
~vpopmail/etc/defaultdomain 파일을 사용하도록 되었다.
이 파일에 직접 default domain 이름을 넣어주면 된다.
vpopmail 5.0 이상 버전은 –enable-large-site 옵션이 –enable-many-domains 으로
바뀌었다. 즉, 각 도메인별로 테이블을 생성관리 할것이라면 –enable-many-domains=n
옵션을 사용한다.
만약 sql 헤더파일이나 라이브러리를 찾지 못한다며 컴파일에 실패한다면,
–enable-sqlincdir= sql 헤더파일 경로. –enable-sqllibdir= sql 라이브러리
경로 등을 ./configure 할때 추가 해준다.
위의 예에서 clunix.co.kr 는 주 서버의 도메인 이름이다. 이것을 설정하면 주서버의
메일 계정도 모두 가상 도메인의 메일 계정과 동일하게 관리 할수 있다.
(이렇게 하는 것을 권장한다)
이 문서의 설정은 아래와 같이 했다.
./configure –enable-roaming-users=y \\
–enable-tcprules-prog=/usr/local/bin/tcprules \\
–enable-relay-clear-minutes=15 \\
–enable-auth-logging=y \\
–enable-logging=e
make
make install-strip
설치가 되었다면 ~vpopmail 안에는
bin
doc
domains
etc
include
lib
users
등의 디렉토리과 필요한 바이너리들이 생겼을 것이다.
chmod 777 ~vpopmail/etc
echo “127.0.0.1:allow,RELAYCLIENT=\\”\\”” > ~vpopmail/etc/tcp.smtp
echo “192.168.133.167:allow,RELAYCLIENT=\\”\\”” >> ~vpopmail/etc/tcp.smtp
이제 기본 릴레이 파일을 만들었다면 다음 명령을 한번 실행해 준다.
~vpopmail/bin/clearopensmtp
마지막으로 crontab을 하나 설정해야 하는데, 이것은 cron에 의해 주기적으로 실행되어
릴레이가 허용된 IP 주소중 pop 인증 시간이 한시간 이상된 것이 있으면 지워준다.
vpopmail 컴파일시 별다른 옵션을 주지 않았다면 기본적으로 릴레이 허용 시간은
한시간이며 이것은 –enable-relay-clear-minutes= 옵션으로 바꿔줄수 있다.
# crontab -e
40 * * * * /home/vpopmail/bin/clearopensmtp
qmail-smtpd 시동 스크립트는 vpopmail이 조절하는 cdb 파일을 참고하도록,
다음과 같이 바꾼다.
/var/qmail/supervise/qmail-smtpd/run 의 내용
————————————————————————
#!/bin/sh
Q_UID=`id -u vpopmail`
Q_GID=`id -g vpopmail`
exec /usr/local/bin/softlimit -m 2000000 \\
/usr/local/bin/tcpserver -vRHl 0 \\
-x /home/vpopmail/etc/tcp.smtp.cdb \\
-u $Q_UID -g $Q_GID 0 25 /var/qmail/bin/qmail-smtpd 2>&1
————————————————————————
– pop3 데몬 시동 파일
vpopmail 의 pop3 시동 파일을 만들자. 적당한 곳에 디렉토리를 만들고 run 파일을 만든다.
mkdir /var/qmail/supervise/vpop
/var/qmail/supervise/vpop/run 파일의 내용
————————————————————————
#!/bin/sh
VPOP_UID=`id -u vpopmail`
VPOP_GID=`id -g vpopmail`
exec /usr/local/bin/softlimit -m 2500000 \\
tcpserver -vRHl 0 -u $VPOP_UID -g $VPOP_GID 0 110 \\
/var/qmail/bin/qmail-popup arhdev.clunix.co.kr \\
/home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir 2>&1
————————————————————————
chmod 755 /var/qmail/supervise/vpop/run
ln -s /var/qmail/supervise/vpop /service
5초 이내로 daemontool에 의해 pop 데몬이 구동될 것이다.
위와 같이 pop3 데몬을 daemontool/tcpserver로 운영하거나 다음과 같이 inetd 또는
xinetd 모드로 운영할수도 있다.
xinetd 모드로 운영할때 /etc/xinetd.d/ 아래 아래와 같은 파일을 하나 만들어 둔다.
vi /etc/xinetd.d/vpop3
———————————————————————-
service pop3
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
server = /var/qmail/bin/qmail-popup
server_args = babo.org /home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir
log_type = FILE /var/log/xinetd.log
log_on_success = HOST
log_on_failure = HOST RECORD
}
———————————————————————-
그런 후
/etc/rc.d/init.d/xinetd restart
/etc/rc.d/init.d/xinetd restart
– 도메인, 메일 계정 추가하기
~vpopmail/bin 디렉토리 안에 가상 도메인 관리를 위한 바이너리들이 있는데
다음과 같은 기능을한다.
표 1. 각 바이너리들의 용도
vadddomain :
가상 도메인을 추가한다. postmaster 암호를 물어보는데 이것은 다음에
설치할 qmailadmin 웹 인터페이스에서 로그인 할때 물어볼 암호이다.
형식은 [ vadddomain 도메인명 ]
vdeldomain :
가상 도메인과 모든 유저를 삭제한다. vdeldomain 도메인명
vadduser :
pop 메일 유저 계정을 만든다. [ vadduser alang@clunix.co.kr ]
vdeluser :
pop 메일 유저 삭제. [ vdeluser alang@clunix.co.kr ]
vpasswd :
메일 유저의 암호 바꾸기 [ vpasswd alang@clunix.co.kr ]
vsetuserquota :
각 유저 별로 quota 설정을 할수 있다. [ vsetuserquota alang@clunix.co.kr 51200 ]
(단위는 byte 이다).
vpopbull :
서버에 설정되어 있는 모든 유저들에게 한번에 메일을 보낼때 유용하게 사용할수
있다.
이제 도메인을 추가하자. 위에서 주 도메인도 vpopmail에서 관리하기로 했다면
주 도메인과 메일 계정들도 추가해야 한다.
만약 주 도메인이 clunix.co.kr 이고, 추가할 가상 도메인이 arhdev.org,
arhdev.co.kr 라고 한다면 다음과 같이 한다
(추가하기 전에 가상 도메인들의 DNS MX 레코드의 IP주소가 주 서버로 되어있는지
확인 해보자).
vadddomain clunix.co.kr
vadddomain tru64unix.co.kr
재대로 설정파일이 변경이 되었는지 확인해 보자.
cat /var/qmail/control/locals
————————————————
localhost
주 도메인도 vpopmail이 관리하기로 했다면 /var/qmail/control/locals 파일의
내용은 localhost 만이 있어야 정상이다. 다른것이 있으면 지운다.
cat /var/qmail/control/virtualdomains
———————————————–
clunix.co.kr:clunix.co.kr
tru64unix.co.kr:tru64unix.co.kr
cat /var/qmail/users/assign
———————————————–
+clunix.co.kr-:clunix.co.kr:515:510:/home/vpopmail/domains/clunix.co.kr:-::
+tru64unix.co.kr-:tru64unix.co.kr:515:510:~vpopmail/domains/tru64unix.co.kr:-::
– 메일 계정 생성
cd ~vpopmail/bin
./vadduser clunix@clunix.co.kr
– 기존 POP 사용자 변환
cd ~vpopmail/bin
./vconvert -e -c 도메인명
– sendmail 에서 qmail 로의 전환
모든 설정이 확실히 되었다고 생각이 들면 sendmail을 죽이고 qmail로 전환한다.
/etc/rc.d/init.d/sendmail stop : sendmail 죽인다.
이제 기존의 sendmail 바이너리를 qmail 의 것으로 바꾼다.
mv /usr/lib/sendmail /usr/lib/sendmail.old
mv /usr/sbin/sendmail /usr/sbin/sendmail.old
ln -s /var/qmail/bin/sendmail /usr/lib
ln -s /var/qmail/bin/sendmail /usr/sbin
– qmail 가동 하기
ln -s /var/qmail/supervise/qmail-send /service/
ln -s /var/qmail/supervise/qmail-smtpd /service/
/etc/rc.d/init.d/qmail start : qmail 가동
이렇게 /service 디렉토리에 링크를 한번 걸어주면 링크가 존재하는 한 즉,
재부팅 한다해도 daemontools에 의해서 자동으로 서비스가 시작된다.
– Daemon Tool 로 서버 제어 방법
daemontools은 상당히 편리한 서비스 관리 도구로 tcpserver와 함께 xinetd를 완전히
대체할 수 있다.
// 종료 방법
cd /service/qmail-send
rm -f /service/qmail-send
svc -dx . log
cd /service/qmail-smtpd
rm -f /service/qmail-smtpd
svc -dx . log
cd /service/vpop
rm -f /service/vpop
svc -dx .
// stat 보기
svstat /service/vpop/
// qmail 큐에 있는 메일을 강제로 배달하기
svc -a /service/qmail-send
// 서버 잠시 중지 시키기
svc -p /service/qmail-send
svc -p /service/qmail-smtpd
svc -p /service/vpop
// 다시 진행 시키기
svc -c /service/qmail-send
svc -c /service/qmail-smtpd
svc -c /service/vpop
이로써 MS 의 아웃룩이나 Netscape 의 메일메신져 에서 메일을 받아보실수가 있다.
여기서 주의 할것.
주 도메인 이외의 도메인 pop3 메일 계정 사용자들은 메일 클라이언트의
유저 이름을 my_id@babo2.com 과 같이 아이디@도메인명 으로 모두 써주어야
pop 로긴이 가능하다.
– qmailadmin 설치
qmailadmin 설치시에는 vpopmail 을 mysql 사용 안함으로 설치 하세요.
/usr/local/src/qmail 가서
tar xzvf ezmlm-0.53.tar.gz
tar xzvf ezmlm-idx-0.42.tar.gz
mv -f ezmlm-idx-0.42/* ezmlm-0.53/
cd ezmlm-0.53
patch < idx.patch
make
// make 중에 <<./makelang : 허가 거부>> 와 같은 에러가 발생 하면
// chmod +x makelang 으로 makelang 파일에 실행 권한을 준다.
make man
make setup
ezmlm 은 /usr/local/bin/ezmlm/ 에 설치될 것이다.
– qmailadmin 설치
tar xvzf qmailadmin-1.21.tar.gz
cd qmailadmin-1.21
./configure 에 몇가지 옵션이 있다. 서버의 설정이 디폴트와 다른 경우 설정해 주자.
–enable-cgibindir : qmailadmin 이 설치될 디렉토리이다.
웹서버가 사용중인 cgi-bin 디렉토리를 적어준다.
디폴트는 /usr/local/apache/cgi-bin 이다.
–with-htmllibdir : qmailadmin 의 html 템플레이트 파일 (당연히 이 파일들은
후에 입맛에 맞게 수정할수 있다.)들이 저장될 장소이다.
그냥 디폴트로 나두어도 된다. (/usr/local/share/qmailadmin)
–enable-cgipath : 사용중인 웹서버의 cgi path가 /cgi-bin/ 이 아닌 경우
설정해준다. 디폴트는 /cgi-bin/qmailadmin 이다.
make
make install-strip
설치가 잘 되었는지 브라우저로 접속해본다.
http://localhost/cgi-bin/qmailadmin
– qmailadmin 설치 팁..
만일 특정 멀티도메인으로 qmailamdin 을 설치하고자 할때의 예제이다.
여기서 전 vpopmail 계정에 qmailadmin 까지 합쳐서 관리하고자 한다.
그리고 mail.domain.com 이란 도메인으로 접속하고자 한다.
먼저 소스를 풀고 ..그 소스 디렉토리로 이동한다. 그런뒤…
# ./configure –enable-cgibindir=/usr/local/apache/cgi-bin \\
–with-htmllibdir=/home/vpopmail/www \\
–enable-htmldir=/home/vpopmail/www \\
–enable-cgipath=/cgi-bin/qmailadmin \\
# make
# make install-strip
그런뒤 apache 의 httpd.conf 설정에서
ScriptAlias /cgi-bin/ “/usr/local/apache/cgi-bin/”
설정의 주석을 제거하고 난뒤 /usr/local/apache/cgi-bin/qmailadmin 파일 생성을
확인한다.
그런뒤 웹페이지에서 http://mail.domain.com/cgi-bin/qmailadmin 로 접속하자..무사히 페이>
지가
뜨면 성공~~
이제 원하는 도메인과 postmaster의 암호를 넣으면 로그인해서 여러가지 설정을
편안하게 할수있다.
– qmail 운영, 관리 하기
도메인 추가후
qmail 과 vpopmail 이 돌아가고 있는 상태에서 vadddomain 으로 도메인을 추가했다면
/etc/rc.d/init.d/qmail reload 또는 kill -HUP 시그날을 qmail-send 에게 보내서
/var/qmail/user 설정 파일을 다시 읽도록 해야 한다.
알리아스와 포워드 계정
알리아스와 포워드 계정은 거의 비슷한 기능을 하는데 다른점은 알리아스는 이 서버
에 존재하는 메일 계정에 다른 이름을 여러게 설정하는 것이고, 포워드 계정은 도착
한 메일을 설정해 놓은 다른도메인의 메일 계정(들)로 보내는 것이다.
다음 설정 과정을 보면 이해가 쉬울것이다.
qmailadmin 에서는 쉽게 설정 할수 있겠고, 만약 qmailadmin 을 설치하지 않은 경우
다음과 같이 한다.
# 알리아스
silver 라는 팝 메일 계정이 존재하고, webmaster 라는 알리아스를 만드는 경우.
해당 도메인 디렉토리(~vpopmail/domains/도메인/)에 다음과 같은 내용의
.qmail-webmaster 파일을 만든다.
/home/vpopmail/domains/도메인/silver/Maildir/
이제 webmaster 로 오는 메일은 silver 가 받을 것이다.
# 포워드
silver 로 오는 메일을 babo@kldp.org 라는 다른 도메인으로 포워딩 해줄때.
해당 도메인 디렉토리(~vpopmail/domains/도메인/)에 다음과 같은 내용의
.qmail-alang 파일을 만든다.
&alang@kobis.net
이제 이 도메인의 alang 으로 오는 메일들은 alang@kobis.net 로 보내질 것이다.
# 각 도메인마다 메일 계정, 메일링 리스트 수 한계 정하기
이것은 웹 호스팅 업체에서 qmailadmin 으로 각 유저들에게 사용중인 도메인의
메일 설정을 직접 하게 해줄때 매우 유용하게 쓰일수 있을것이다.
각 도메인마다 메일,메일링 리스트의 설정 한계를 줄수 있는데, 이것은
~vpopmail/domains/도메인/ 에 .qmailadmin-limits 파일을 만들어 주면 된다.
형식은 다음과같다.
maxpopaccounts X
maxaliases X
maxforwards X
maxmailinglists X
maxautoresponders X
X 는 해당 도메인이 사용할수 있는 최대한의 수를 넣어주면 되겠다.
# bounce 되는 메일에 메세지 넣기
해당 도메인으로 수신되는 메세지가 바운스 되는 경우가 있는데 보통, 팝 유저의
쿼타 용량이한도를 넘었거나, 유저가 존재하지 않을 경우이다.
다음과 같은 파일을 만들어 각 가상 도메인의 디렉토리에 넣어 놓으면 바운스 되는
메일들에포함되어 되돌려 지며 당신은 센스있는 관리자가 된다 🙂
.over-quota.msg 에는 메일 유저의 쿼타 용량이 초과 되었으므로 메일 수신을 할수
없다는메세지를.
.no-user.msg 에는 우리 도메인엔 그런 메일 계정 없지롱 하는 내용의 메세지를
넣어 두면 된다.
이 파일들이 없다면 vpopmail은 바운스되는 메일에 뻣뻣한 영문 메세지 만을 포함
시킨다.
– ezmlm 으로 대용량 메일링 보내기
메일링 테스트를 해보도록 하자.
먼저 ~ezmlm/bin 로 간다.
그런뒤 메일링 리스트의 메일링 대표 아이디를 생성한다.
./ezmlm-make [대표도메인디렉토리/대표아이디]
[대표도메인디렉토리/.qmail-대표아이디]
[대표아이디 domain]
예)
$ ./ezmlm-make /home/vpopmail/domains/clunix.co.kr/mailling \\
/home/vpopmail/domains/clunix.co.kr/.qmail-mailling mailling clunix.co.kr
그 다음으로 메일링 리스트의 리스트를 작성한다.
$ ./ezmlm-sub /home/vpopmail/domains/clunix.co.kr/mailling alang@clunix.co.kr
위와 같은 식으로 계속 추가 하면 된다.
추가된 리스트 확인은 ezmlm-list 명령어로 가능하다.
$ ./ezmlm-list /home/vpopmail/domains/clunix.co.kr/mailling
자 이제 메일링을 보내 보도록 하자.
mail -v mailling@clunix.co.kr
메일링이 재대로 이루어 졌는지 확인하면 된다.
주의 : 꼭 vpopmail 사용계정으로 메일링 리스트 설정을 해야 합니다.
root 로 하였을 경우 메일링이 발송 안되는 수도 있습니다.
2.4. Apache, Php, Java(Tomcat), Mysql 개발 환경 웹 Server
이 단원에서는 리눅스에서 다양한 웹 서비스 환경을 구축하는 법에 대해서 알아보도록 하겠다.
리눅스 환경에서 구현하는 웹 서비스 구성으로는 웹 서버 프로그램, 웹 어플리케이션 프로그램,
웹 어플리케이션 연동 DBMS, 그리고 웹 어플리케이션에서 사용하는 라이브러리등으로 구성되어
집니다.
리눅스 환경에서는 예로 부터 apache , PHP, Mysql 등의 구성으로 웹 서비스 환경을 구축해
왔습니다. 요즘에는 Java 개발자들이 많아 짐에 따라 Tomcat 기반의 Jsp 환경도 많이 이용되
고 있습니다. 이런 환경의 웹 서버 구축 법에 대해 살펴 보도록 하겠습니다.
먼저 사용해야 하는 DBMS를 설치 해야 합니다. 여기서는 Mysql를 이용하여 구축을 해 보도록
하겠습니다.
– 필요 프로그램
apache_1.3.33.tar.gz
mysql-4.0.24.tar.gz
php-4.3.10.tar.bz2
ZendOptimizer-2[1].5.2-Linux_glibc21-i386.tar.gz
clibpdf202r1.tar.tar
dist.99.linux.tar.Z
freetype-2.1.3.tar.gz
gd-2.0.21.tar.gz
imap-2004.tar.Z
j2sdk-1_4_1_01-fcs-linux-i586.rpm
jakarta-tomcat-4.1.30.tar.gz
jakarta-tomcat-connectors-4.1.30-src.tar.gz
jpegsrc.v6b.tar.gz
libpng-1.2.5.tar.gz
libungif-4.1.0.tar.gz
pdflib-4.0.3.tar.gz
tiff-v3.5.7.tar.gz
zlib-1.2.1.tar.gz
2.4.1 Mysql DB Server 설치 하기
먼저 http://www.mysql.com 사이트에서 mysql source 를 다운 받는다.
적절한 경로에 source 를 옮겨 놓고 압축을 푼다.
[root@arhfw apmj]# tar xzvf mysql-4.0.24.tar.gz
[root@arhfw apmj]# cd mysql-4.0.24
[root@arhfw mysql-4.0.24]# ./configure –prefix=/usr/local/mysql \\
–localstatedir=/usr/local/mysql/data –with-mysqld-user=mysql –with-charset=euc_kr
[root@arhfw mysql-4.0.24]# make && make install
초기 Mysql DB를 생성한다.
[root@arhfw mysql-4.0.24]# /usr/local/mysql/bin/mysql_install_db
보안적인 문제로 Mysql DB를 관리한 계정을 만든다. 이전에는 root 계정이 mysql DB를 관리
하였지만, Mysql을 이용하여 root 권한이 공개되는 문제가 있어서 요즘에는 Mysql을 일반 계정
에서 관리 하도록 하고 있다.
[root@arhfw mysql-4.0.24]# userdel -r mysql ; groupdel mysql
[root@arhfw mysql-4.0.24]# groupadd mysql
[root@arhfw mysql-4.0.24]# adduser -g mysql -d /usr/local/mysql/data -s /bin/false mysql
[root@arhfw mysql-4.0.24]# chown -R mysql. /usr/local/mysql/data
Mysql 최적화 설정 파일을 /etc/my.cnf 이름으로 복사해 둔다.
[root@arhfw mysql-4.0.24]# cp support-files/my-medium.cnf /etc/my.cnf
Mysql initscript를 /etc/rc.d/init.d 밑에 복사해 둔다.
복사 전에 한글 지원이 가능하게 수정을 한다.
[root@arhfw mysql-4.0.24]# cd /usr/local/mysql
[root@arhfw mysql]# vi share/mysql/mysql.server
————————————————————————————–
$bindir/mysqld_safe –datadir=$datadir –pid-file=$pid_file
위 행을 찾아서 뒤에 아래 옵션을 추가로 붙여준다.
–language=korean –safe-show-database &
————————————————————————————–
[root@arhfw mysql]# cp share/mysql/mysql.server /etc/rc.d/init.d/mysqld
시스템 리부팅 시 자동으로 동작하도록 설정한다.
[root@arhfw mysql]# ln -s /etc/rc.d/init.d/mysqld /etc/rc.d/rc3.d/S90mysqld
Mysql 데몬을 시작한다.
[root@arhfw mysql]# /etc/rc.d/init.d/mysqld start
Mysql 명령을 바로 사용 가능하도록 PATH 설정을 하도록 한다.
[root@arhfw mysql]# vi /etc/profile.d/mysql.sh
————————————————————————————-
MYSQL_HOME=/usr/local/mysql
PATH=$PATH:/usr/local/mysql/bin
export MYSQL_HOME PATH
————————————————————————————-
Mysql path 환경을 적용한다.
[root@arhfw mysql]# source /etc/profile.d/mysql.sh
mysql root password 를 설정한다.
초기에는 mysql root 패스워드가 Null 상태로 셋팅된다.
보안을 위해 Mysql 설치 후에 반드시 mysql root 암호를 변경해 주어야 한다.
[root@arhfw mysql]# mysqladmin -u root password ‘패스워드’
이제 Mysql DB 에 접속해 하여 보자
[root@arhfw mysql]# mysql -u root -p mysql
————————————————————————————
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \\g.
Your MySQL connection id is 1 to server version: 4.0.24-log
Type ‘help;’ or ‘\\h’ for help. Type ‘\\c’ to clear the buffer.
mysql>
————————————————————————————
Mysql 에 대한 보다 자세한 관리자 기술에 대해서는 이후 Mysql administration 과정에서
다루도록 하겠다.
2.4.2 PHP Support Library 설치 하기
PHP 웹 어플리케이션 설치에 앞서 각 시스템 Lib를 통해 PHP 의 기능을 다양하게
추가 할수 있다. PHP 에서 기본적으로 지원하는 함수 이외의 각 Lib에서도 PHP의
다양한 함수를 지원하고 있기 때문에 PHP 설치 전에 PHP 로 프로그래밍을 할때 필요한
추가 함수의 Lib를 설치를 해야 한다.
추가 Lib를 설치 하기 앞서 앞으로 추가 하는 Lib 중 운영체제에서 기본적 으로 제공하지
않는 Lib도 있지만 RPM 으로 기본 제공 되어지는 Lib도 있을것이다.
최적화된 PHP 환경을 만들기 위해서는 필요한 Lib를 모두 Source 설치하는것이 좋지만,
운영체제 구성 요소 중에 Source Lib와 의존성의 문제가 발생할 수도있으니 기존 설치된
RPM 형식의 Lib는 삭제하지 않고 추가로 Source Lib를 설치 하도록 하겠다.
rpm 형태로 설치된 Lib는 /usr/lib 밑에 설치가 될것이고, source 로 설치된 Lib 는
/usr/local/lib 밑에 설치가 될것이다.
– zlib 설치 하기
http://www.gzip.org/zlib/ 에서 zlib 을 다운 받습니다.
[root@arhfw apmj]# tar zxvf zlib-1.2.1.tar.gz
[root@arhfw apmj]# cd zlib-1.2.1
[root@arhfw zlib-1.2.1]# ./configure -s
[root@arhfw zlib-1.2.1]# make
[root@arhfw zlib-1.2.1]# ./configure && make test && make install
[root@arhfw zlib-1.2.1]# cp libz.so* /usr/local/lib
[root@arhfw zlib-1.2.1]# cd /usr/local/lib
[root@arhfw lib]# rm -rf libz.so
[root@arhfw lib]# rm -rf libz.so.1
[root@arhfw lib]# ln -s libz.so.1.2.1 libz.so
[root@arhfw lib]# ln -s libz.so.1.2.1 libz.so.1
시스템 LD_PATH 에 /usr/local/lib 를 추가 하도록 한다
[root@arhfw lib]# vi /etc/ld.so.conf
————————————————————————————–
# 맨 위에 설정을 해준다. 순서대로 우선 순위가 정해진다.
/usr/local/lib
/usr/lib
.
.
————————————————————————————–
추가한 경로를 적용한다.
[root@arhfw lib]# ldconfig
– tiff 설치 하기
[root@arhfw apmj]# tar xzvf tiff-v3.5.7.tar.gz
[root@arhfw apmj]# cd tiff-v3.5.7
[root@arhfw apmj]# ./configure && make && make install
– libpng 설치 하기
http://www.libpng.org/pub/png/libpng.html 에서 다운 받을 수 있다.
[root@arhfw apmj]# cd /usr/local/src/apmj
[root@arhfw apmj]# tar zxvf libpng-1.2.5.tar.gz
[root@arhfw apmj]# cd libpng-1.2.5
[root@arhfw apmj]# cp scripts/makefile.linux Makefile
[root@arhfw apmj]# make test && make install
– clibpdf 설치 하기
http://www.fastio.com 에서 다운 받을 수 있다.
[root@arhfw apmj]# mv clibpdf202r1.tar.tar clibpdf202r1.tar.gz
[root@arhfw apmj]# tar zxvf clibpdf202r1.tar.gz
[root@arhfw apmj]# cd ClibPDF/source
[root@arhfw source]# mv Makefile Makefile.orig
[root@arhfw source]# cp Makefile.Linux Makefile
[root@arhfw source]# make lib && make install
– pdflib 설치 하기
http://www.pdflib.com 에서 다운 받을 수 있다.
[root@arhfw apmj]# tar zxvf pdflib-4.0.3.tar.gz
[root@arhfw apmj]# cd pdflib-4.0.3
[root@arhfw apmj]# ./configure
[root@arhfw apmj]# make && make install
/etc/ld.so.conf 에 pdflib 경로 추가
[root@arhfw apmj]# vi /etc/ld.so.conf
————————————————————————————
.
/usr/share/tcl8.3/pdflib
————————————————————————————
– swf 설치 하기
ftp://ftp.sgi.com/sgi/graphics/grafica/flash 에서 다운 받을 수 있다.
[root@arhfw apmj]# tar zxvf dist.99.linux.tar.Z
[root@arhfw apmj]# mkdir /usr/local/swf
[root@arhfw apmj]# cd dist
[root@arhfw dist]# mkdir /usr/local/swf/include
[root@arhfw dist]# mkdir /usr/local/swf/lib
[root@arhfw dist]# mkdir /usr/local/swf/fonts
[root@arhfw dist]# mkdir /usr/local/swf/psfonts
[root@arhfw dist]# mkdir /usr/local/swf/bin
[root@arhfw dist]# cp swf.h /usr/local/swf/include
[root@arhfw dist]# cp libswf.a /usr/local/swf/lib
[root@arhfw dist]# cp bin/* /usr/local/swf/bin
[root@arhfw dist]# cp fonts/* /usr/local/swf/fonts
[root@arhfw dist]# cp psfonts/* /usr/local/swf/psfonts
– freetype 설치 하기
http://freetype.sourceforge.net 다운 받을 수 있다.
[root@arhfw apmj]# tar xzvf freetype-2.1.3.tar.gz
[root@arhfw apmj]# cd freetype-2.1.3
[root@arhfw freetype-2.1.3]# ./configure && make && make install
– Jpeg 설치 하기
[root@arhfw apmj]# tar xzvf jpegsrc.v6b.tar.gz
[root@arhfw apmj]# cd jpeg-6b
[root@arhfw jpeg-6b]# ./configure –enable-shared –enable-static
[root@arhfw jpeg-6b]# make && make test && make install
– libungif 설치 하기
ftp://sunsite.unc.edu/pub/Linux/libs/graphics 에서 다운 받을 수 있다.
[root@arhfw apmj]# tar zxvf libungif-4.1.0.tar.gz
[root@arhfw apmj]# cd libungif-4.1.0
[root@arhfw libungif-4.1.0]# ./configure && make && make install
– gd 설치 하기
http://www.boutell.com/gd/http/ 에서 다운 받을 수 있다.
[root@arhfw apmj]# tar zxvf gd-2.0.21.tar.gz
[root@arhfw apmj]# cd gd-2.0.21
[root@arhfw gd-2.0.21]# ./configure && make && make install
– Imap 설치 하기
Sendmail 구축 편에서 Imap 설치 하기 문서를 참조하세요.
2.4.3 J2SDK,jakarta-tomcat 설치 하기
– J2SDK 설치 하기
Java 기반의 웹 어플리케이션인 tomcat 을 설치 하기 위해서는 JAVA SDK 가 필요하다.
[root@arhfw apmj]# rpm -Uvh j2sdk-1_4_1_01-fcs-linux-i586.rpm
[root@arhfw apmj]# cd /usr/java
[root@arhfw java]# ln -s j2sdk1.4.1_01/jre jre
[root@arhfw java]# ln -s j2sdk1.4.1_01 java
설치된 JAVA 환경 설정을 한다.
[root@arhfw java]# vi /etc/profile
————————————————————————————
.
.
제일 하단에 아래 설정을 추가한다.
.
# j2sdk config
export PATH=/usr/local/java/bin:$PATH
export JAVA_HOME=”/usr/local/java”
————————————————————————————
설정을 적용시킨다.
[root@arhfw java]# source /etc/profile
정상적인 설치가 완료되었는지 확인한다.
[root@arhfw java]# java -version
java version “1.4.1_01”
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_01-b01)
Java HotSpot(TM) Client VM (build 1.4.1_01-b01, mixed mode)
– apache 1차 configure
[root@arhfw apmj]# tar xzvf apache_1.3.33.tar.gz
[root@arhfw apmj]# cd apache_1.3.33
[root@arhfw apache_1.3.33]# ./configure –prefix=/usr/local/apache
– jakarta-tomcat 설치 하기
[root@arhfw apmj]# tar xzvf jakarta-tomcat-4.1.30.tar.gz
[root@arhfw apmj]# mv jakarta-tomcat-4.1.30 /usr/local/tomcat
[root@arhfw apmj]# tar xzvf jakarta-tomcat-connectors-4.1.30-src.tar.gz
[root@arhfw apmj]# cd jakarta-tomcat-connectors-4.1.30-src/jk/native
[root@arhfw native]# ./buildconf.sh
[root@arhfw native]# ./configure –with-apache=/usr/local/src/apmj/apache_1.3.33
[root@arhfw native]# make && make install
jakarta-tomcat apache modules 가 정상적으로 설치가 되었는지 확인한다.
[root@arhfw native]# ls -al /usr/local/src/apmj/apache_1.3.33/src/modules
.
drwxr-xr-x 3 root root 4096 Apr 27 18:44 jk
.
2.4.4 PHP 설치 하기
2.4.2 에서 설치한 모든 Lib를 PHP 설치 시 연동해서 포함시킨다.
[root@arhfw apmj]# tar xjvf php-4.3.10.tar.bz2
[root@arhfw apmj]# cd php-4.3.10
[root@arhfw php-4.3.10]# ./configure –with-apache=/usr/local/src/apmj/apache_1.3.33 \\
–with-mysql=/usr/local/mysql \\
–with-imap=/usr/local/imap \\
–with-jpeg-dir=/usr/local/lib \\
–with-png-dir=/usr/local/lib \\
–with-gif-dir=/usr/lib \\
–with-zlib-dir=/usr/local/lib \\
–with-gd=/usr/local/lib \\
–with-freetype-dir=/usr/include/freetype2 \\
–with-zlib=/usr/local/lib \\
–with-tiff-dir=/usr/local/lib \\
–with-pdflib \\
–with-cpdflib \\
–with-gettext \\
–with-swf=/usr/local/swf \\
–with-xml \\
–with-mod_charset \\
–with-language=korean \\
–with-charset=euc_kr \\
–enable-ftp \\
–enable-sockets \\
–disable-debug \\
–enable-system \\
–enable-track-vars \\
–enable-calendar \\
–enable-magic-quotes
[root@arhfw php-4.3.10]# make && make install
[root@arhfw php-4.3.10]# cp libs/libphp4.a /usr/local/src/apmj/apache_1.3.33/src/modules/php4/
[root@arhfw php-4.3.10]# cp php.ini-dist /usr/local/lib/php.ini
2.4.5 Apache 설치 하기
지금까지의 과정으로 apache에 tomcat의 jk modules 와 php 의 libphp 모듈이 apache source
에 포함되어졌다. 이제 최종적으로 apache 와 tomcat 과 php 를 연동하여 설치 하면 된다.
[root@arhfw php-4.3.10]# cd /usr/local/src/apmj/apache_1.3.33
최종 apache 설치에 앞서 apache process 생성 갯수를 확장하도록 한다.
/usr/local/src/apmj/apache_1.3.33/src/include/httpd.h 를 열어 HARD_SERVER_LIMIT 의 256
부분을 적절히 증가 시켜 주면 된다. 이 설정은 실제 시스템의 보유 리소스의 정도와 커널에
서 open process, open file 등의 제한이 이 수치를 허용해야 한다.
그렇지 못한 경우는 시스템이 하드웨어 성능이 apache의 요구사항을 충족시킬 능력이 없기
때문에 과부하로 시스템을 다운 될 수도 있다.
————————————————————————————–
#ifndef HARD_SERVER_LIMIT
#ifdef WIN32
#define HARD_SERVER_LIMIT 1024
#elif defined(NETWARE)
#define HARD_SERVER_LIMIT 2048
#else
#define HARD_SERVER_LIMIT 256
#endif
#endif
—————————————————————————————
[root@arhfw apache_1.3.33]# ./configure –prefix=/usr/local/apache \\
–activate-module=src/modules/php4/libphp4.a \\
–activate-module=src/modules/jk/libjk.a \\
–enable-module=so \\
–enable-rule=SHARED_CORE \\
–enable-shared=max
[root@arhfw apache_1.3.33]# make && make install
이제 apache 기반의 tomcat , php 웹 서비스 환경 구축이 완료되었다.
여기에 PHP 가속기인 Zend 를 추가 적으로 설치 해 보도록 하자.
우선 기본 설치된 apache 데몬을 실행하도록 한다.
[root@arhfw apache_1.3.33]# vi /usr/local/apache/conf/httpd.conf
——————————————————————————-
간단히 ServerName 의 주석을 풀고 현 시스테의 도메인이나 IP 를 적어준다.
800 줄 근처에 AddType allplcation/x-httpd-php 로 시작하는 부분을 찾아서..
AddType application/x-httpd-php .html .php3 .php4 .inc .phtml .php .ph <= 요렇게
AddType application/x-httpd-php-source .phps
바꿉니다. ( 혹은 위 2줄을 추가합니다. )
——————————————————————————-
[root@arhfw apache_1.3.33]# /usr/local/apache/bin/apachectl restart
2.4.6 Zend PHP 가속기 설치 하기
[root@arhfw apache_1.3.33]# cd /usr/local/src/apmj
[root@arhfw apmj]# tar xzvf ZendOptimizer-2\\[1\\].5.2-Linux_glibc21-i386.tar.gz
[root@arhfw apmj]# cd ZendOptimizer-2.5.2-Linux_glibc21-i386
[root@arhfw ZendOptimizer-2.5.2-Linux_glibc21-i386]# ./install
그럼 diglog 형태의 설정 대화 상자가 나타난다. 모두 [Next] 로 해서 넘어간다.
그럼 설정이 완료된다.
2.4.7 Apache httpd.conf 설정
[root@arhfw apmj]# vi /usr/local/apache/conf/httpd.conf
——————————————————————————–
ServerType standalone
ServerRoot “/usr/local/apache”
#LockFile /usr/local/apache/logs/httpd.lock
PidFile /usr/local/apache/logs/httpd.pid
ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard
#ResourceConfig /usr/local/apache/conf/srm.conf
#AccessConfig /usr/local/apache/conf/access.conf
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
MinSpareServers 20
MaxSpareServers 40
StartServers 20
MaxClients 256
# apache 웹서버에서 수용 가능한 최대 요청 수이다. 앞 httpd.h 수정 시 정의했던 수 만큼
# 처리가 가능하다.
MaxRequestsPerChild 0
#Listen 3000
#Listen 12.34.56.78:80
#BindAddress *
# Dynamic Shared Object (DSO) Support
# LoadModule foo_module libexec/mod_foo.so
LoadModule env_module libexec/mod_env.so
LoadModule config_log_module libexec/mod_log_config.so
LoadModule mime_module libexec/mod_mime.so
LoadModule negotiation_module libexec/mod_negotiation.so
LoadModule status_module libexec/mod_status.so
LoadModule includes_module libexec/mod_include.so
LoadModule autoindex_module libexec/mod_autoindex.so
LoadModule dir_module libexec/mod_dir.so
LoadModule cgi_module libexec/mod_cgi.so
LoadModule asis_module libexec/mod_asis.so
LoadModule imap_module libexec/mod_imap.so
LoadModule action_module libexec/mod_actions.so
LoadModule userdir_module libexec/mod_userdir.so
LoadModule alias_module libexec/mod_alias.so
LoadModule access_module libexec/mod_access.so
LoadModule auth_module libexec/mod_auth.so
LoadModule setenvif_module libexec/mod_setenvif.so
LoadModule php4_module libexec/libphp4.so
LoadModule jk_module libexec/libjk.so
ClearModuleList
AddModule mod_env.c
AddModule mod_log_config.c
AddModule mod_mime.c
AddModule mod_negotiation.c
AddModule mod_status.c
AddModule mod_include.c
AddModule mod_autoindex.c
AddModule mod_dir.c
AddModule mod_cgi.c
AddModule mod_asis.c
AddModule mod_imap.c
AddModule mod_actions.c
AddModule mod_userdir.c
AddModule mod_alias.c
AddModule mod_access.c
AddModule mod_auth.c
AddModule mod_so.c
AddModule mod_setenvif.c
AddModule mod_php4.c
AddModule mod_jk.c
#ExtendedStatus On
Port 80
User nobody
Group nobody
ServerAdmin root@clunix.org
ServerName 192.168.133.254
DocumentRoot “/usr/local/apache/htdocs”
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory “/usr/local/apache/htdocs”>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<Directory “/home”>
Options FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Deny from env=go_out
Deny from export=go_out
</Directory>
<IfModule mod_userdir.c>
UserDir www
</IfModule>
#<Directory /home/*/public_html>
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
# <Limit GET POST OPTIONS PROPFIND>
# Order allow,deny
# Allow from all
# </Limit>
# <LimitExcept GET POST OPTIONS PROPFIND>
# Order deny,allow
# Deny from all
# </LimitExcept>
#</Directory>
<IfModule mod_dir.c>
DirectoryIndex index.html index.htm index.php index.phtml index.php3 index.jsp
</IfModule>
AccessFileName .htaccess
<Files ~ “^\\.ht”>
Order allow,deny
Deny from all
Satisfy All
</Files>
<Files ~ “^\\.ht”>
Order allow,deny
Deny from all
</Files>
#CacheNegotiatedDocs
UseCanonicalName On
<IfModule mod_mime.c>
TypesConfig /usr/local/apache/conf/mime.types
</IfModule>
DefaultType text/plain
<IfModule mod_mime_magic.c>
MIMEMagicFile /usr/local/apache/conf/magic
</IfModule>
HostnameLookups Off
ErrorLog /usr/local/apache/logs/error_log
LogLevel warn
LogFormat “%h %l %u %t \\”%r\\” %>s %b \\”%{Referer}i\\” \\”%{User-Agent}i\\”” combined
LogFormat “%h %l %u %t \\”%r\\” %>s %b” common
LogFormat “%{Referer}i -> %U” referer
LogFormat “%{User-agent}i” agent
CustomLog /usr/local/apache/logs/access_log common
ServerSignature On
# > AddType text/html .ahtml
# > EBCDICConvert Off=InOut .ahtml
#
# EBCDICConvertByType On=InOut text/* message/* multipart/*
# EBCDICConvertByType On=In application/x-www-form-urlencoded
# EBCDICConvertByType On=InOut application/postscript model/vrml
# EBCDICConvertByType Off=InOut */*
<IfModule mod_alias.c>
Alias /icons/ “/usr/local/apache/icons/”
<Directory “/usr/local/apache/icons”>
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
Alias /manual/ “/usr/local/apache/htdocs/manual/”
<Directory “/usr/local/apache/htdocs/manual”>
Options Indexes FollowSymlinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
ScriptAlias /cgi-bin/ “/usr/local/apache/cgi-bin/”
<Directory “/usr/local/apache/cgi-bin”>
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
</IfModule>
<IfModule mod_autoindex.c>
IndexOptions FancyIndexing
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*
AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core
AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^
DefaultIcon /icons/unknown.gif
#AddDescription “GZIP compressed document” .gz
#AddDescription “tar archive” .tar
#AddDescription “GZIP compressed tar archive” .tgz
ReadmeName README
HeaderName HEADER
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
</IfModule>
<IfModule mod_mime.c>
AddLanguage da .dk
AddLanguage nl .nl
AddLanguage en .en
AddLanguage et .ee
AddLanguage fr .fr
AddLanguage de .de
AddLanguage el .el
AddLanguage he .he
AddCharset ISO-8859-8 .iso8859-8
AddLanguage it .it
AddLanguage ja .ja
AddCharset ISO-2022-JP .jis
AddLanguage kr .kr
AddCharset ISO-2022-KR .iso-kr
AddLanguage nn .nn
AddLanguage no .no
AddLanguage pl .po
AddCharset ISO-8859-2 .iso-pl
AddLanguage pt .pt
AddLanguage pt-br .pt-br
AddLanguage ltz .lu
AddLanguage ca .ca
AddLanguage es .es
AddLanguage sv .sv
AddLanguage cs .cz .cs
AddLanguage ru .ru
AddLanguage zh-TW .zh-tw
AddCharset Big5 .Big5 .big5
AddCharset WINDOWS-1251 .cp-1251
AddCharset CP866 .cp866
AddCharset ISO-8859-5 .iso-ru
AddCharset KOI8-R .koi8-r
AddCharset UCS-2 .ucs2
AddCharset UCS-4 .ucs4
AddCharset UTF-8 .utf8
<IfModule mod_negotiation.c>
LanguagePriority kr en da nl et fr de el it ja no pl pt pt-br ru ltz ca es sv tw
</IfModule>
AddType application/x-tar .tgz
AddEncoding x-compress .Z
AddEncoding x-gzip .gz .tgz
#AddType application/x-compress .Z
#AddType application/x-gzip .gz .tgz
AddType application/x-httpd-php .html .php3 .php4 .inc .phtml .php .ph .jsp .xtm
AddType application/x-httpd-php-source .phps
AddHandler cgi-script .cgi
#AddType text/html .shtml
#AddHandler server-parsed .shtml
#AddHandler send-as-is asis
#AddHandler imap-file map
#AddHandler type-map var
</IfModule>
#MetaDir .web
#MetaSuffix .meta
# Customizable error response (Apache style)
# these come in three flavors
#
# 1) plain text
#ErrorDocument 500 “The server made a boo boo.
# n.b. the single leading (“) marks it as text, it does not get output
#
# 2) local redirects
#ErrorDocument 404 /missing.html
# to redirect to local URL /missing.html
#ErrorDocument 404 /cgi-bin/missing_handler.pl
# N.B.: You can redirect to a script or a document using server-side-includes.
#
# 3) external redirects
#ErrorDocument 402 http://www.example.com/subscription_info.html
# N.B.: Many of the environment variables associated with the original
# request will *not* be available to such a script.
#
# Customize behaviour based on the browser
#
<IfModule mod_setenvif.c>
BrowserMatch “Mozilla/2” nokeepalive
BrowserMatch “MSIE 4\\.0b2;” nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch “RealPlayer 4\\.0” force-response-1.0
BrowserMatch “Java/1\\.0” force-response-1.0
BrowserMatch “JDK/1\\.0” force-response-1.0
BrowserMatch “Webzip” go_out
BrowserMatch “WebZip” go_out
BrowserMatch “Teleport” go_out
BrowserMatch “GetRight” go_out
BrowserMatch “Wget” go_out
</IfModule>
#<Location /server-status>
# SetHandler server-status
# Order deny,allow
# Deny from all
# Allow from .example.com
#</Location>
# Allow remote server configuration reports, with the URL of
# http://servername/server-info (requires that mod_info.c be loaded).
# Change the “.example.com” to match your domain to enable.
#
#<Location /server-info>
# SetHandler server-info
# Order deny,allow
# Deny from all
# Allow from .example.com
#</Location>
# MOD_JK
<IfModule mod_jk.c>
JkWorkersFile /usr/local/tomcat/conf/workers.properies
JkLogFile /usr/local/tomcat/logs/jk.log
JkLogLevel info
</IfModule>
NameVirtualHost 192.168.133.254
<VirtualHost 192.168.133.254>
ServerAdmin clunix@clunix.org
DocumentRoot /home/clunix/www
ServerName clunix.org
ServerAlias clunix.org www.clunix.org
JkMount /*.jsp ajp13
JkMount /webapps/* ajp13
JkMount /ROOT/* ajp13
</VirtualHost>
———————————————————————————-
위 설정은 실무에서 사용되어지는 httpd.conf 파일이다. 기본적으로 생성되는 httpd.conf
파일에서 해당 부분을 추가하여 사용하길 바란다.
apache 설정 파일에 대한 자세한 내용은 apache 관련 서적이나 http://www.apache.org
사이트를 참조하길 바란다.
2.4.8 Tomcat 설정 하기
이제 JSP 개발 환경에서 사용되어지는 Tomcat 설정을 해보도록 하자.
[root@arhfw root]# vi /usr/local/tomcat/conf/workers.properies
———————————————————————————
workers.tomcat_home=/usr/local/tomcat
workers.java_home=/usr/java/java
worker.list=ajp12, ajp13
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
———————————————————————————
2.4.9 Tomcat 과 apache 연동 및 가상 호스트 설정
apache 운영 시 가상호스트로 운영할 때 각 도메인 별로 tomcat 역시 가상 호스트가 지원
가능하다.
[root@arhfw root]# vi /usr/local/tomcat/conf/server.xml
———————————————————————————
.
.
</Host>
<Host name=”clunix.org”>
<Context path=”” docBase=”/home/clunix/www” reloadable=”true”/>
<Alias>www.clunix.org</Alias>
</Host>
</Engine>
</Service>
</Server>
———————————————————————————–
이제 apache ,php, tomcat, mysql 이 연동된 웹 시스템을 구동 시켜 보자.
– apache, php, tomcat 웹서버 시작하기
[root@arhfw root]# /usr/local/apache/bin/apachectl start
[root@arhfw root]# /usr/local/tomcat/bin/startup.sh
– apache, php, tomcat 웹서버 중지하기
만일 서비스 데몬을 중지 할 필요가 있을때는 먼저 tomcat 를 중지하고 apache 를 중지
하도록 한다.
[root@arhfw root]# /usr/local/tomcat/bin/shutdown.sh
[root@arhfw root]# /usr/local/apache/bin/apachectl stop
2.4.10 PHP, JSP 테스트 하기
– PHP 테스트 하기
[root@arhfw root]# vi /home/clunix/www/phpinfo.php
———————————————————————————–
<?
phpinfo ();
?>
———————————————————————————–
브라우저 : http://www.clunix.org/phpinfo.php
– JSP 테스트 하기
[root@arhfw root]# vi /home/syszone/clunix/jsptest.jsp
————————————————————————————
<%
out.println(“Hello, JSP”);
%>
————————————————————————————-
브라우저 : http://www.clunix.org/jsptest.jsp
– Tomcat 테스트 하기
브라우저 : http://192.168.133.254:8080
-> 고양이 화면이 나타나면 정상적으로 셋팅이 완료된것이다.
2.5. Linux Mutimedia Server
Media Streaming Service 는 대부분이 Microsoft 의 Windows Media Streaming Service
로 구축 되어져 왔습니다. 인터넷의 media contents의 활성을 가져온 asf, wma, mpeg와
같은 영상 코덱이 Windows 계열 기반을 중심으로 개발되어지고, 활성화되어 지다 보니
리눅스 서버는 Streaming 서비스에 적합하지 않다는 의견이 많았습니다.
하지만 Streaming 서비스는 이전 부터 UNIX 계열에서 RealServer 라는 프로그램을 통해
RM file 형식의 Streaming 서비스가 활성화 되었었고, 리눅스 역시 RealServer란 프로그램
을 통해 경제적인 비용으로 Streaming 서비스를 구축 할 수 있었습니다.
그리고 MS의 점유물로 여거오던 asf, mpeg 같은 format 형식의 file 역시 근래에 들어서
는 리눅스 서버에서 Streaming이 가능하게 되었습니다.
여기서는 RealServer 와 FFServer 를 통해 리눅스에서 VOD 시스템을 구축하는 방법에
대해 알아보도록 하겠습니다.
2.5.1 Real Server 구축 하기
여기서는 리눅스 운영체제에서 가장 많이 사용되었던 RealServer 설치 방법에
대해 알아보겠다.RealServer 는 상용으로 판매되어지나 소규모에서는 일반 배포판을
사용하여도 무방하다.
먼저 일정한 디렉토리에 realserver 프로그램을 옮겨놓는다.
그런뒤 실행파일인 g2p3-linux-c6.bin 에 실행 퍼미션을 준다.
[root@arhfw realserver]# chmod 755 g2p3-linux-c6.bin
실행 시킨다.
[root@arhfw realserver]# ./g2p3-linux-c6.bin
Welcome to the realserver Setup for UNIX
Setup will help you get realserver running on your computer.
Setup will step you through the installation process by displaying
informational screens. Please follow the navigational controls
below:
Key Behavior
=== ========
N Next
P Previous
X Exit
F Finish (Express Installation)
Each input requires the execution of the key above
followed by the [ENTER] key. Enter [N]ext to continue:( 그냥 엔터 친다.)
If a realserver license key file has been sent to you,
please enter its directory path below. If you have not
received a realserver license key file, then this server
will default to a Basic RealServer. /usr/local/src/apmj/RealPlayServer/license.txt
( 여기는 라이센스키가 있는 위치를 적어준다. )
Installation and use of realserver requires
acceptance of the following terms and conditions:
Press [Enter] to display the license text… (엔터 친다.)
그럼 라이센스 정보가 나온다.
REALNETWORKS, INC.
END USER LICENSE AGREEMENT
REALNETWORKS BASIC SERVER VERSION G2
REDISTRIBUTION NOT PERMITTED
Software License for RealNetworks Basic Server
Version G2
IMPORTANT — READ CAREFULLY: This RealNetworks
License Agreement (“License Agreement”) is a legal
agreement between you (either an individual or an
entity) and RealNetworks, Inc. and its suppliers
and licensors (collectively “RN”) for RN’s Basic
Server Version G2 software (“Software”). You may
install only ONE copy of the Software. By
clicking on the “I Accept” button, installing,
copying or otherwise using the Software, you agree
to be bound by the terms of this License
Agreement. If you do not agree to the terms of
this License Agreement, click on the “I Do Not
Accept” button and/or do not install the Software.
ANY THIRD PARTY SOFTWARE, INCLUDING ANY NON-RN
PLUG-IN, THAT MAY BE PROVIDED WITH THE SOFTWARE IS
INCLUDED FOR USE AT YOUR OPTION. IF YOU CHOOSE TO
USE SUCH SOFTWARE, THEN SUCH USE SHALL BE GOVERNED
BY SUCH THIRD PARTY’S LICENSE AGREEMENT, AN
ELECTRONIC COPY OF WHICH WILL BE INSTALLED IN THE
“realserver” DIRECTORY ON YOUR COMPUTER, UPON
INSTALLATION OF THE SOFTWARE.
1. SOFTWARE OWNERSHIP. This is a license
agreement and NOT an agreement for sale. This
Software and the Documentation is proprietary to
RN, and is protected by the copyright and other
intellectual property laws of the United States
and international treaties. The Software is
licensed, not sold. RN continues to own the
Software, and other content provided or
–More–(13%)
중간 생략 ………………
rbitration Association. The arbitrator’s award
shall be binding and may be entered as a judgment
in any court of competent jurisdiction. This
License Agreement will not be governed by the
United Nations Convention of Contracts for the
International Sale of Goods, the application of
which is hereby expressly excluded.
Copyright (c) 1995-1998 RealNetworks, Inc. and/or
its suppliers. 1111 Third Avenue, Suite 2900,
Seattle, Washington 98101 U.S.A. All rights
reserved. RealNetworks, RealSystem, RealAudio,
RealVideo, and RealPlayer, are trademarks or
registered trademarks of RealNetworks.
Basic Server Gold EULA 11-17-981
1
Choose “Accept” to accept the terms of this
license agreement and continue with realserver setup.
If you do not accept these terms, enter “No”
and installation of realserver will be cancelled.
(라이센스 동의을 묻는곳이다…그냥 엔터)
Enter the complete path to the directory where you want
to be installed. You must specify the full
pathname of the directory and have write privileges to
the chosen directory: /usr/local/real
(리얼서버가 인스톨되는 디렉토리를 적어준다.)
Please enter a username and password that you will use
to access the web-based RealSystem Administrator, the
RealSystem monitors, and RealSystem live encoders:
Username: admin
(설치후 웹상에서 관리할 수 있는데 사용할 관리자 아이디를 적는다.)
Password: (패스워드)
Please enter a port on which realserver will listen for
PNA connections. These connections have URLs that begin
with “pnm://”: (Default: 7070)
(PNA 접속에 port를 적어준다. – 디폴트 권장 )
Please enter a port on which realserver will listen for
RTSP connections. These connections have URLs that begin
with “rtsp://”: (Default: 554)
( RTSP 접속에 사용할 port – 디폴트 권장 )
Please enter a port on which realserver will listen for
HTTP connections. These connections have URLs that begin
with “http://”: (Default: 8080)
( HTTP 접속에 사용할 port – 디폴트 권장 -> 만일 tomcat 설치 시에는 다른
포트를 사용한다. 8880)
realserver will listen for RealSystem Administrator
requests on the port shown. This port has been
initialized to a random value for security. Please
verify now that this pre-assigned port will not interfere
with ports already in use on your system; you can
change it if necessary. (Default: 1278) 1975
(웹상에서 관리자 페이지로 접속할때 사용할 포트 번호)
You have selected the following realserver configuration:
Admin Username: admin
Admin Password: xxxxxxx
Monitor Password: xxxxxxx
Encoder Username: admin
Encoder Password: xxxxxxx
PNA Port: 7070
RTSP Port: 554
HTTP Port: 8080
Admin Port: 1975
Enter [F]inish to begin copying files, or [P]revious
to go back to the previous prompts: F
(환경설정사항을 확인한다. F 를 눌려서 계속 진행 )
Copying RealNetworks program files…………
realserver installation is complete.
The RealSystem Administrator allows you to configure
and maintain realserver through an intuitive
web-based interface. Please note that realserver
must be running in order to use the Administrator.
Would you like to start realserver now and launch
the RealSystem Administrator? (Default: Yes)
(리얼서버 설치 완료 . 서버를 실행하고 관리자 모드를 실행하겠냐는
메세지 입니다. – 엔터)
설치가 완료 되었습니다.
웹에서 http://도메인:관리자포트번호/admin/index.html
으로 접속 하면 관리 도구가 나옵니다. 여기서 서비스를 관리하시면
됩니다.
부팅시 실행방법은 /etc/rc.d/rc.local 파일 안에 다음을 추가
/usr/local/real/Bin/rmserver /usr/local/real/rmserver.cfg -m 64 &
설정 추가는 웹에서도 할수 있고 바로 설정 파일을 수정할수도 있다.
[root@arhfw root]# vi /usr/local/real/rmserver.cfg
——————————————————————
..
</List>
<List Name=”clunix”>
<Var MountPoint=”/clunix/”/>
<Var ShortName=”pn-local”/>
<Var BasePath=”/home/clunix/www”/>
</List>
..
——————————————————————
[root@arhfw root]# cd /home/clunix/www
[root@arhfw www]# vi rmtest.html
——————————————————————
<html>
<body>
<a href=./realtest.ram>테스트</a>
</body>
</html>
——————————————————————
[root@arhfw www]# vi realtest.ram
——————————————————————
rtsp://192.168.133.254/syszone/realdb/Yesterday.rm
pnm://192.168.133.254/syszone/realdb/Yesterday.rm
——————————————————————
2.5.2 SHOUTcast 를 이용한 인터넷 라이브 방송 시스템 구축
– 서버측 설정 :
먼저 http://www.shoutcast.com 사이트로 가셔서 Unix&Linux 용 Shoutcast 프로그램을
다운 받는다.
shoutcast-1-7-1-linux-glibc.tar.gz
shoutcast-1-8-0-linux-glibc6.tar.gz
설치디렉토리에다 위 프로그램의 압축을 푼다.
그럼 아래와 같은 파일이 생성될것입니다.
README content/ sc_serv* sc_serv.conf sc_serv.rip
아래 두개의 파일이 Shoutcast 의 주요 파일 들이다.
sc_serv : shoutcast server 실행파일
sc_serv.conf : 설정파일
먼저 sc_serv.conf 설정파일을 설정한다. 설정파일 안에 변수들 설명이다.
– SHOUTcast Server 환경 설정변수 설명
PortBase :
이건 중요합니다! 사람들이 방송을 듣기 위해서 접속할 포트입니다. 기본값은
8000 이구요 자기 마음대로 바꿀 수 있지만, FTP나 다른 프로그램에서 사용하는
포트와 중복되면 안됩니다. UNIX시스템에서는1024이하의 포트로 설정하기 위해선
루트 권한이 있어야 합니다. PortBase의 포트에 +1 을 한 포트번호가 Dj 플러그
인 에서 서버로 접속할때 쓰이는 포트 입니다. 그러니까 제대로 방송을 하려면
PortBase의 포트넘버와 +1을 한 포트까지 다른데서 사용하지 않는 포트 여야겠죠
MaxUser :
청취자 수의 최대치를 설정합니다. 디폴트는 32, 1.2버젼에서는 1024명까지 지원
합니다. 너무 많이 설정해두지 마세요…… 그냥 32로..
Password :
Dj 툴에서 shoutcast서버에 접속하기 위한 비밀번호입니다. changeme가 디폴트인데
자기가 편리한대로 바꿔주세요. 나중에 server control page에 접속할때도 필요합
니다.
Logfile :
로그하기위한 파일 이름을 지정합니다. 로그하시지 않으려면 공백으로 두면됩니다.
SrcIP :
Source IP라는 뜻인데, shoutcast는 중계방송 역할도 할수있습니다. 즉, 자기
자신이 방송을 하지 않더라도 다른 사람이 운영하는 서버에서 방송이 되고
있다면 그곳의 방송을 자기 서버에서 받아서 꼭 자기가 하는 것처럼 중계를
할 수 있다는 거죠. 예를 들어, A의 서버에서는 실제로 방송을 하지 않고 B라
는 곳에서는 실제로 방송 합니다. 그런데 A서버에서 B서버의 방송을 중계한다면
청취자들은 A서버로 접속해서 B서버에서 하는 방송을 들을 수 있다는 거죠.
머리가 다들 좋으실테니 이해하셨으리라 믿겠습니다. ^^; 이 SrcIP항목은 자기가
서버를 운영할 때, 다른 서버 자신의 서버를 중계할 수 있게 하겠느냐 아니면
못하게 하겠느냐를 정하는 겁니다. 127.0.0.1설정을 해준다면 다른곳에서는
자신의 서버를 중계할수가 없습니다. ANY로 해둔다면 어느곳의 서버에서든지
자신의 서버를 중계할 수 있겠죠. ^^; ANY로 해두세요
DestIP :
이건 청취자를 위한 IP설정인데 ANY로 해두시면 누구나 방송을 들을 수 있습니다.
RelayServer :
[Optional] 자신의 서버로 다른곳에서 방송중인 것을 중계하고자 할 때 서버의
주소를 입력합니다. 중계를 하지 않으면 그냥 디폴트로.
RelayPort :
[Optional] 자신의 서버로 다른곳에서 방송중인 것을 중계하고자 할 때 서버의
포트를 입력합니다. 중계를 하지 않으면 그냥 디폴트로.
RelayPublic :
[Optional] 자신의 서버로 다른곳에서 방송중인 것을 중계하고자 할 때 자신의
서버를 항상 “Public” or “Never”로 설정하세요.
그 밖의 다른 것은 쏘스서버와 돌일하게 설정합니다.
RealTime :
[Console systems only] 이는 청취자수 등의 상태를 서버에 실시간으로 나탈낼
지지의 여부를 결정합니다.
ScreenLog :
[Console systems only] 이 값이 1로 설정되어있으면 SHOUTcast Server의 화면
에 로그정보가 보여집니다. 물론 0 이면 반대 이겠지요.
HistoryLog :
[Optional] “None” 이외의 값을 설정하면 HistoryLogTime에서 설정한 대로 일정
한 간격을 두고 청취자수, 타임스탬프, 메타데이타와 같은 정보를 로그화일에
저장합니다.
HistoryLogTime :
[Optional] 초단위로 설정하는 값에따라서 HistoryLogFile을 기록합니다.
Yport :
[Optional] 이건 yp.shoutcast.com에 접속하기 위한 포튼데요. shoutcast서버와
yp.shoutcast.com간에 통신을 위한겁니다. 프락시를 사용하신다면 800으로 바꾸
시고 아니라면 그냥 80으로 두세요.
NameLookups :
[Optional] 이건 Domain을 reverse해주는 기능입니다. 1로 해놓으시면 도메인으
로도 접속이 가능합니다 대신에 찾을때 속도가 느리죠. 도메인을 좋아하시는 분
은 1로 해두세요
AutoDumpUsers :
[Optional] 1로 설정한다면 소스에서 방송을 하지 않을 때마다 청취자와의 연결을
끊습니다. 다른값을 설정한다면 청취자는 연결된 상태로남아 방송안됨(Dead Air)
메시지 또는 백업파일(아래 BackupFile에서 지정한 화일)을 받게 되겠죠.
IntroFile :
[Optional] 청취가 자신의 서버에 접속했을때, 방송을 바로 듣기 전에 인트로 음악
을 들려주고자 할때 사용하죠. 즉, 청취자가 자신의 서버에 접속을 하면 먼저 인트
로파일을 듣고 나서야 방송을 청취하게 되는 겁니다.. 중요한 것은 인트로 파일명
인데. 자신이 서비스 하는 음질을 파일명에 적어야 하는데 형식은 intro%d.mp3이고
, %d부분을 자신의 음질로 적어주면 OK!. 예를 들어 40k의 음질로 방송을 한다면
c:\\intro40.mp3가 되는 겁니다. 디렉토리는 마음대로~~.
BackupFile :
[Optional] 이것을 지정해두면, 방송소스가 끊어지거나 빙송소스가 30초이상 지연될
때마다 서버가 이 백업화일을 그대로 청취자에게 보내게 됩니다. 주의할점은 이화일
이 MP3 형식이어야하며 당연히 방송하는 스트립과 똑같은 bitrate, sample rate, and
mono/stereo 설정이어야 합니다. 만일 이 파일이 스트림과 틀릴 경우 청취자는 이상
한 소리를 듣게 됩니다..
TitleFormat :
[Optional] 청취자에게 보내지는 제목을 설정하는 부분인데, 예를 들어 ‘꼬마Dj의
12시의 음악여행’ 이라는 제목을 모든 곡의 제목에 넣고 싶다면. TitleForamt=
꼬마Dj’s 12시의 음악 여행:%s 라고 하면되져. 그렇게 되면 지금 서비스하는 곡의
이름이 ‘핑클-화이트’일 때, 청취자에게는 다음과 같이
[꼬마Dj’s 12시의 음악여행:핑클-화이트]와 같이 보이는 겁니다.
하지만 여기서 한글 문제가 생기는데 윈앰프의 근래 버젼에서는 스트리밍시 한글이
보이지 않고 깨진다는 점이져. 그러니 영어로 멋지게(?) 적어보시기 바랍니다.
URLFormat :
[Optional] 이것은 미니브라우저 URL에 적용된다는 점을 제외하곤 TitleFormat이랑
같습니다. 리다이렉션이나 그것을 기억하고자 할 때만 유용하죠!
CurrentLog :
[Optional] 이것은 SHOUTcast 서버처럼 서버에 있는 파일을 주기적으로 업데이트하
기 위한 메카니즘을 제공해주는 기능입니다. CurrentLog 자체는 하나의 파라미터가
아니고 파라미터의 집합으로서 다음과 같습니다.
CurrentLogIn은 HTML template 파일의 이름입니다.
CurrentLogOut은 서버가 출력할 파일의 이름이고,
CurrentLogTime은 서버가 출력 파일을 업데이트하는 시간입니다.
HTML template 파일을 예로 설명한다. 이 파일이 서버에 저장되어 있고 CurrentLogIn
항목이 지정되어 있다면,
<HTML>
<HEAD>
<TITLE>My Current Stats</TITLE>
<HEAD>
<BODY>
My SHOUTcast server is currently playing
<!– CURRENTSONG –>
. You get see more information about it at <!– URL –>
</BODY>
</HTML>
보시다시피, 서버는 적절히 설명되어 있는 필드에 파라미터값들을 넣게 됩니다.
서버가 알아먹는 파라미터들은 LISTENERS, MAXLISTENERS, LISTENERTABLE, GENRE,
DESCRIPTION, URL, HITS, 그리고 CURRENTSONG입니다.
이 파라미터들에 대한 좀더자세한 정보는 SC_SERV.CONF 또는 SC_SERV.INI 파일에
있는 코멘트에서 찾아볼 수 있을 겁니다.
여기까지가 방송에 필요한 서버의 환경설정입니다.
셋팅이 완료되었으면 저장을 하시고 sc_serv 실행파일을 실행하세요.
그런뒤 브라우져로 http://설치서버도메인:BasePort/admin.cgi?pass=password
로 접속하여 reserve ip list 항목에서 방송클라이언트 서버의 ip를 등록시킨다.
여기까지가 방송에 필요한 서버의 환경설정입니다.
참고 :
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
방송을 할때 메모리는 얼마나 필요하며, 내가 사용하는 인터넷 속도로
몇명이 청취할수 있는지 계산하는 방법을 알려드립니다.
청취자 한명에 14KB의 메모리가 필요합니다.
(예를 들어 1000명이 청취 하려면 14MB의 메모리가 필요)
100명의 청취자가 24kbps로 음악을 듣기 위해서는
24kbps*100 = 2,400kbps = 2.4Mbps 의 대역폭이 필요합니다.
(예, 하나로 통신의 ADSL Light인경우는 1Mbps 짜리이므로 …
56Kbps로 방송을 할때 몇명이 청취가능할까요? ^^.. 계산한번 해보시죠?)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
방송시스템쪽 설정 (방송 클라이언트 서버) :
필요한 설치 프로그램
winamp
SHOUTcast Source for Winamp DSP Plug-in
Line Recdrding Plug-in
I3codecp
차례로 설치 한다. 그런후 …
윈앰프 프로그램을 실행한 후에 “Ctrl+P”를 누릅니다.
(윈앰프에서 마우스 오른단추를 누른뒤에 “Opions” -> “Preference…” 를
선택해도 됩니다.)
Plug-ins -> DSP/Effect 선택후
“SHOUTcast Source for Winamp v1.8.0 (dsp_sc.dll)” 를 선택하고
“Close” 단추를 누릅니다
그럼 [SHOUTcast Source] 창이 뜹니다.
여기서 Server 과 Format 설정후 Connect 를 한다.
이로써 일단 방송을 할수 있는 환경 자체가 준비 되어진것이다.
– 운영방식 :
이제 Winamp 에서 곡을 등록하고 연주 시작하면 음악 방속이 시작된다.
음악 연주 컨트롤은 Winamp 방식과 동일하다.
라이브 방송을 할때 Dj들의 멘트를 삽입해야 하는데 연주와 멘트가 동시에
될수 있도록 할려면 Winamp 설정에서 configure 를 클릭하고 ….
“Enable advanced recording mode”에 체크를 하고 “OK”단추를 누릅니다.
그럼 “SHOUTcast source” 창에 “Advanced Mode” 항목이 추가되었습니다
“샤웃캐스트 소스” 창의 “mixers” 단추를 눌러 아래와 같이 “Record
Control” 창과 “Play Control” 창을 띄웁니다
여기서 녹음 설정및 음질 설정 마이크 설정등을 해줍니다.
멘트를 시작할때는 SHOUTcast source 에서 Advanced Mode 설정에서 Lock 버턴
을 누르면 멘트가 방송에 나오게 됩니다.
이로써 SHOUTcast 와 Winamp 를 이용한 인터넷 라이브 방송 시스템 구축편을
마칩니다.
2.6. Samba Server
2.6.1 Samba 란
삼바는 유닉스 기반 시스템이 윈도우 기반 시스템들과 상호 서비스 연동을 가능케 해주는
프로그램이다. 삼바가 마이크로소프트 기반 시스템과 호환되는 것은 마이크로소프트 네트
워크 프로토콜인 SMB(Session Message Block)를 구현 가능하기 때문이다.
리눅스에서 삼바를 이용하게 되면 리눅스와 윈도우 운영체제간의 서비스를 상호 호환 사용
가능하게 된다. 리눅스 운영체제 기반의 파일 시스템을 윈도우에서 사용가능하고, 윈도우
기반의 AD 사용자 계정을 윈도우에서도 사용가능하다. 또한 리눅스에 장착된 프린트와 같은
서비스 윈도우 사용자들이 이용할 수 있게 되는 것이다.
이 장에서는 삼바에 대한 설치 방법과 기본 설정 방법, 그리고 실무에서 주로 사용되는
설정 방법에 대해 알아보도록 하겠다.
2.6.2 Samba 설치하기
먼저 아래 사이트에서 Samba 최신 소스를 다운 받는다.
http://www.samba.org
http://mirror.korea.co.kr/samba/download.html
다운 받은 소스를 /usr/local/src 밑에 놓고 압축을 푼다.
[root@arhdev src]# tar xzvf samba-latest.tar.gz
[root@arhdev src]# cd samba-3.0.12/source
[root@arhdev source]# ./configure \\
–prefix=/usr/local/samba \\
–with-smbmount \\
–with-pam
– 옵션 설명
–with-smbmount : 컴파일 시 smbmount 명령 프로그램도 같이 컴파일 한다.
–with-pam : PAM 관련 인증 기능 활성
[root@arhdev source]# make && make install
[root@arhdev source]# touch /usr/local/samba/lib/smb.conf
[root@arhdev source]# ln -s /usr/local/samba/lib/smb.conf /etc/smb.conf
삼바는 smb.conf 란 하나의 설정 파일로 모든 기능이 제어된다. 이 설정 파일의 샘플은
samba source 디렉토리 하부의 examples 란 폴더 밑에 있다. 여기에 있는 파일을 /etc
밑으로 옮겨도 무방하다.
[root@arhdev source]# vi /etc/rc.d/init.d/samba
—————————————————————————————
#!/bin/sh
#
# /etc/rc.d/init.d/smb – 삼바 서비스를 시작, 중지한다.
#
# 아래와 같이 이 화일을 심볼릭 링크를 시킨다.
#
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
[ ${NETWORKING} = “no” ] && exit 0
case “$1” in
start)
echo -n “Starting SMB services: ”
daemon /usr/local/samba/sbin/smbd -D
daemon /usr/local/samba/sbin/nmbd -D
echo
touch /var/lock/subsys/smb
;;
stop)
echo -n “Shutting down SMB services: ”
killproc smbd
killproc nmbd
rm -f /var/lock/subsys/smb
echo “”
;;
*)
echo “Usage: smb {start|stop}”
exit 1
esac
—————————————————————————————
데몬 관리의 효율성을 높이기 위해 간단한 initscripts 를 만들어 놓는다.
initscripts 를 이용하지 않는 경우는 smbd, nmbd 두 데몬만 실행해도 무방하다.
부팅 시 자동으로 samba 서비스를 시작 시킬려면.
/etc/rc.d/rc.local 파일 제일 밑에 samba 실행 데몬을 실행 시키면 된다.
# vi /etc/rc.d/rc.local
—————————————————————————————
.
/usr/local/samba/sbin/smbd -D
/usr/local/samba/sbin/nmbd -D
—————————————————————————————
2.6.3 Samba 기본 설정 및 사용하기
Samba 는 앞에 설치 단계에서 링크 시킨 /etc/smb.conf 파일에 의해 모든 기능이 제어 된다.
smb.conf 파일에 대해 알아보도록 하자
[root@arhdev root]# vi /etc/smb.conf
—————————————————————————————
[global]
dos charset = cp949
unix charset = euc-kr
workgroup = ARCHON
;; MS 환경에서 WorkGroup에 해당
netbios name = arhdev
;; MS 네트워크 브라우저에서 나타나는 서버 이름
server string = arhdev samba server
log file = /usr/local/samba/var/log.%m
max log size = 1024000
;; 로그 크기가 1MByte 넘게 되면 자동으로 Log file를 새로 생성한다.
;; 로그 파일의 크기가 무한정 커지는것을 방지한다.
hide dot files = yes
;; hidden file를 숨겨버린다.
veto files = /.?*/
host allow = 192.168.123. 192.168.133.
;; 삼바서버에 접근 가능한 클라이언트 네트워크 대역 지정
encrypt passwords = yes
;; 암호화된 암호 사용 여부
null passwords = yes
;; 사용자 계정의 패스워드 사용 여부, yes 인 경우 사용자 계정만 등록 되어져
;; 있는 경우 패스워드 없이 접속 가능
dns proxy = no
preserve case = yes
short preserve case = yes
interfaces = 192.168.123.110/255.255.255.0
;; 삼바 서비스를 하는 IP 주소
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
stat cache = false
log level = 3
security = user
;; 삼바 보안 모델
stat cache = false
template shell = /bin/false
load printers = no
read list = @members
write list = @members
;; 읽기, 쓰기가 가능한 그룹 지정 , 그룹명 앞에 @를 붙여줌
browseable = yes
[data] -> 네트워크 공유 명
comment = 공유 데이터
path = /data/share
valid user = @members
writeable = no
write list = alang
create mask = 644
directory mask = 755
;; 삼바 디렉토리에 접근하여 파일, 디렉토리 생성 시 포미션 설정
—————————————————————————————-
[root@arhdev root]# groupadd members
[root@arhdev root]# adduser -g members clunix
[root@arhdev root]# mkdir /data/share
[root@arhdev root]# chmod 770 /data/share
[root@arhdev root]# chgrp members /data/share/
smb.conf 설정 파일에 접근 권한이 주어진 사용자 환경에 맞게 사용자 및 그룹, 서비스 디렉
토리등을 생성한다.
[root@arhdev root]# cp /usr/local/src/samba-3.0.12/source/script/mksmbpasswd.sh \\
/usr/local/samba/bin/
passwd 파일을 smbpasswd 파일로 변환 시켜 주는 스크립터를 적정 위치에 옮긴다.
[root@arhdev root]# cp /etc/passwd /usr/local/samba/private/
[root@arhdev root]# vi /usr/local/samba/private/passwd
—————————————————————————————
alang:x:500:500::/home/alang:/bin/bash
clunix:x:501:501::/home/clunix:/bin/bash
—————————————————————————————
실제 시스템 passwd 파일에서 samba user 로 사용할 계정만을 선출한다.
[root@arhdev root]# cat /usr/local/samba/private/passwd | \\
/usr/local/samba/bin/mksmbpasswd.sh > /usr/local/samba/private/smbpasswd
mksmbpasswd.sh 파일을 이용하여 선출된 계정의 passwd 파일을 smbpasswd 파일로 변환한다.
만약 samba 계정이 별도로 존재하거나 소수의 계정일 경우는 smbpasswd 의 “-a” option 을 이용
하면 간편하게 만들 수 있다.
[root@arhdev root]# smbpasswd -a alang
[root@arhdev root]# chmod 500 /usr/local/samba/private/
[root@arhdev root]# chmod 600 /usr/local/samba/private/smbpasswd
보안 상 중요한 파일이므로 퍼미션을 강화한다.
[root@arhdev root]# /usr/local/samba/bin/smbpasswd alang
New SMB password:xxxxx
Retype new SMB password:xxxxx
[root@arhdev root]# /usr/local/samba/bin/smbpasswd clunix
New SMB password:xxxx
Retype new SMB password:xxxx
윈도우 실행 창을 열어 cmd.exe 를 실행한다. 그런 후 net use 명령어를 이용하여 네트워크
드라이브를 맺어 보도록 하자.
> net use z: \\\\arhdev\\data /user:alang xxxx
그럼 윈도우 탐색기에 z: 라는 네트워크 드라이브가 생길 것이다.
리눅스에서 역시 mount 를 이용하여 특정 디렉토리에 마운트를 시켜 놓고 사용이 가능하다.
[root@arhfw root]# mkdir /mnt/smb
[root@arhfw root]# mount -t smbfs -o username=clunix,password=root/// \\
//arhdev/data /mnt/smb/
만일 리눅스 사용자와 윈도우 사용자 계정의 이름과 패스워드가 동일한 경우 리눅스 서버의
홈디렉토리를 윈도우에서 쉽게 네트워크 드라이브로 연결 할 수 있는데 이는 smb.conf 파일
밑에 다음과 같이 추가 해 주면 된다.
[homes]
path = %H
public = no
read only = no
create mask = 600
directory mask = 700
그럼 윈도우 탐색기에서 //arhdev/homes 로 연결을 하면 접속이 가능할 것이다.
2.6.4. Samba 사용자 패스워드 관리 방법
삼바를 관리 하다 보면 사용자 패스워드 관리에 대한 고민을 한번쯤 하게 될것이다.
리눅스 시스템의 자원을 윈도우 시스템에서 사용을 할려고 하고, 사용자 인증을 통해서
하고 싶을 경우 리눅스의 계정과 윈도우의 계정이 일치 해야 하는 문제와 리눅스 시스템
계정과 삼바 계정을 이중으로 관리해야 하는 문제등을 겪게 될것이다.
여기서는 실무에서 주로 사용되어 지는 사용자 패스워드 관리 방법에 대해 알아보도록
하겠다.
– 수동으로 smbpasswd 명령어를 통해 관리하는 방법
가장 기본적인 방법으로 mksmbpasswd.sh 를 통해 /etc/passwd 파일을 smbpasswd 파일로
변환 시킨 후 smbpasswd 명령어를 이용하여 삼바 사용자 계정 패스워드를 적용하는 방법
이다. 2.6.3 장의 방식이 이 기본 방식이다.
– NULL PASSWORD 를 이용하는 방식
삼바 계정이 리눅스 시스템에 존재할 경우 패스워드 인증 없이 계정의 존재 여부만으로
접속을 허용해 주는 방식이다. 패스워드에 대한 관리 부담이 필요 없어 진다. 하지만
사용자 계정에 대한 보안 레벨은 매우 낮게 된다. 사용자가 적거나 모든 자료를 공유
가능한 경우에만 주로 사용된다.
사용 방법은 [global] 세션에서 null passwords를 yes 해주면 된다.
그런 후 smbpasswd 로 패스워드 부여 시 -n 옵션을 사용하여 부여를 해주면 된다.
[root@arhdev root]# /usr/local/samba/bin/smbpasswd -n alang
User alang password set to none.
– Update encrypted 를 이용한 방식
사용자의 수가 많을 경우 주로 사용하는 방법이다.
먼저 사용자의 계정만을 셋팅을 한 후 [global] 세션 밑에 password 관련 설정을
아래와 같이 변경한다.
encrypt password = no
update encrypted = yes
그런 후 사용자가 접속 시 적용하는 패스워드가 바로 smbpasswd에 적용되는 방법이다.
단 패스워드는 리눅스 시스템 패스워드와 동일해야 한다.
사용자 패스워드가 다 변경이 되면,
encrypt password = yes
update encrypted = no
로 변경해 주면 된다.
– 패스워드 설정이 완료된 후 이후 System password 파일과 동기화
패스워드 관련 초기 설정이 완료된 후 사용자가 임으로 시스템 패스워드를 변경을 하게
되면 Smbpasswd 도 변경을 해주야 하는 관리상의 번거로움이 존재한다.
이런 문제를 해결하기 위해 주로 사용되는 방법으로 시스템 passwd 파일을 smbpasswd에
alias 시켜서 사용하는 방법이 있다.
smb.conf [ global ]
——————————————————————————–
smb passwd file = /usr/local/samba/private/smbpasswd
passwd program = /usr/bin/passwd.real %u
unix password sync = yes
———————————————————————————
으로 변경 후
[root@arhdev root]# /usr/bin/passwd /usr/bin/passwd.real
[root@arhdev root]# ln -s /usr/bin/passwd.real /usr/local/samba/private/smbpasswd
이제 부터 smbpasswd 로 smb 패스워드를 변경하면 시스템 패스워드도 자동으로 변경이
되게 된다.
– 리눅스 시스템 인증 계정과 삼바 인증 계정 통합 관리
삼바 패스워드 설정이 다 왼료된 상태에서 새로운 계정이 추가 되는 경우에 대해 설정 과정에
대해 알아보도록 하자.
먼저 시스템 계정이 추가 되어져야 할것이다.
[root@arhdev root]# adduser -g members user2
새로 추가된 시스템 계정을 /usr/local/samba/private/smbpasswd 파일에 추가해 줘야 한다.
[root@arhdev root]# cat /etc/passwd | grep user2 | /usr/local/samba/bin/mksmbpasswd.sh \\
>> /usr/local/samba/private/smbpasswd
그런 후 /usr/local/samba/bin/smbpasswd 를 통해 새로 추가되는 계정에 삼바 패스워드를
지정해 줘야 한다.
이와 같이 하나의 계정을 추가 할 때 여러 단계의 설정이 필요하다. 이것을 자동화 하는
스크립터를 생성해 보도록 하자.
2.6.5 Winbind를 이용한 윈도우와 리눅스 통합 모델 구현
Samba 패키지에 기본적으로 들어 있는 Winbind 를 이용하면 유닉스와 Windows 계정 관리를
통합하여 유닉스 머신이 완벽한 NT 계열 도메인 멤버가 되도록 허용한다.
유닉스의 NIS 와 같이 유닉스에서 윈도우 서버의 계정과 그룹을 자기 자신의 시스템에
등록된 계정 처럼 사용 가능하다는 의미이다.
Winbind를 이용하기 위해서는 설치 방법이 위의 기본 방식과는 조금 다른 부분이 있다.
– Samba 설치
다운 받은 samba 소스를 적당한 곳에 풀고 configure 한다.
# tar xzvf samba-latest.tar.gz
# cd samba-x.x.x
# ./configure –prefix=/usr/local/samba
# make
여기서 pam_winbind.so 라이브러리를 삼바에서 자동으로 만들어 주지 않기 때문에 i
수동으로 직접 만들어 줘야 한다.
# make nsswitch/pam_winbind.so
# make install
이렇게 하면 Samba 와 Winbind 라이브러리 설치가 완료 된다.
– 설정하기 ..
nsswitch.conf 설정
먼저 /etc/nsswitch.conf 파일을 설정 함. 기존의 내용은 모두 지우고 간단히 아래
내용만 기입.
# vi /etc/nsswitch.conf
———————————————————–
passwd: files winbind
group: files winbind
———————————————————–
– Samba 설정
그 다음 Samba 설정 파일인 smb.conf 파일을 작성합니다.
smb.conf 파일의 규칙에 대해서는 다른 문서를 참조 하시오.
아래 파일은 Clunix 사내 NAS 서버에 이용된 삼바 설정입니다.
/usr/local/samba/lib/smb.conf
——————————————————————
[global]
client code page = 949
workgroup = CLUNIX
server string = Clunix NAS Server
security = domain
log file = /usr/local/samba/var/log.%m
max log size = 50
encrypt passwords = yes
interfaces = 211.241.202.229/24
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
stat cache = false
log level = 3
winbind separator = +
winbind cache time = 10
# template homedir = /data/clxdb/home/%U
template shell = /bin/false
winbind uid = 10000-20000
winbind gid = 10000-20000
password server = ares
browseable = yes
[회사문서자료]
comment = Clunix Job Doc Folder
path = /data/clxdb/company
public = no
writable = yes
admin users = CLUNIX+Administrator
write list = @CLUNIX+Administrators, @CLUNIX+”Domain Users”,
[홈폴더]
comment = User Home Folder
path = /data/clxdb/home/%U
create mask = 600
directory mask = 700
writable = yes
admin users = CLUNIX+Administrator
write list = @CLUNIX+Administrators, @CLUNIX+”Domain Users”,
[home]
comment = Users Home Path
path = /data/clxdb/home
public = no
writable = yes
admin users = CLUNIX+Administrator
write list = @CLUNIX+Administrators, @CLUNIX+”Domain Users”,
browseable = no
[profile]
comment = Users Profile Path
path = /data/clxdb/profile
public = no
writable = yes
admin users = CLUNIX+Administrator
write list = @CLUNIX+Administrators
browseable = no
————————————————————————–
winbind 를 사용하기 위해 필수적으로 해야하는 설정으론
[global]
workgroup = CLUNIX : 워크그룹 혹은 도메인
security = domain : 보안 모드
encrypt passwords = yes : 암호화된 암호 사용
winbind separator = +
winbind cache time = 10
log level = 3
winbind separator = +
winbind cache time = 10
winbind uid = 10000-20000 : 윈도우 계정이 사용할 uid
winbind gid = 10000-20000 : 윈도우 계정이 사용할 gid
password server = ares : PDC 서버
이와 같다.
smb.conf 의 간단한 법칙으로
[회사문서자료] : 네트워크 공유 명
comment = Clunix Job Doc Folder : 공유드라이브 설명
path = /data/clxdb/company : 공유명의 실질적은 공유 폴더 경로
public = no : 인증없이 공개할건지, 아닌지 ..결정
writable = yes : 읽기만 할것인지, 쓰기도 할것인지..
admin users = CLUNIX+Administrator : 공유 관리자 결정
write list = @CLUNIX+Administrators, @CLUNIX+”Domain Users”, :
실제 쓸수 있는 그룹 지정
smb.conf 파일이 완성되면 기본적으로 리눅스 시스템의 설정 파일이 저장되는
/etc 로복사하던지 심볼릭 링크를 걸어 놓도록 한다.
# ln -s /usr/local/samba/lib/smb.conf /etc/smb.conf
– Pam 설정
이제 winbind 를 통한 유닉스 시스템의 인증을 위해 pam 설정에 winbind
라이브러리를 추가함.
기존거 지우고 아래 내용 복사해서 넣으면 됨.
# vi /etc/pam.d/login
—————————————————————————–
#%PAM-1.0
auth required /lib/security/pam_securetty.so
auth required /lib/security/pam_nologin.so
auth sufficient /lib/security/pam_winbind.so
auth required /lib/security/pam_pwdb.so use_first_pass shadow nullok
account required /lib/security/pam_winbind.so
password required /lib/security/pam_stack.so service=system-auth
session required /lib/security/pam_stack.so service=system-auth
session optional /lib/security/pam_console.so
—————————————————————————–
만일 윈도우 계정 서버의 계정으로 FTP를 사용하고 싶다면…
# vi /etc/pam.d/ftp
—————————————————————————–
#%PAM-1.0
auth required /lib/security/pam_listfile.so item=user sense=deny \\
file=/etc/proftpd/ftpusers onerr=succeed
auth sufficient /lib/security/pam_winbind.so
auth required /lib/security/pam_pwdb.so use_first_pass shadow nullok
# This is disabled because anonymous logins will fail otherwise,
# unless you give the ‘ftp’ user a valid shell, or /bin/false and add
# /bin/false to /etc/shells.
#auth required /lib/security/pam_shells.so
account required /lib/security/pam_winbind.so
session required /lib/security/pam_pwdb.so
—————————————————————————–
– winbind 라이브러리를 시스템 라이브러리 경로에 복사하기
처음 Samba 소스 컴파일 시 별도로 make nsswitch/pam_winbind.so 파일 컴파일
한거 기억하라. 그 위치로 간다.
# cd ~ samba-x.x.x/source/nsswitch
이곳에 가면 libnss_winbind.so, pam_winbind.so 두개의 바이너리 파일이 생성되어져
있을 것이다.
이 파일을 적용하기 위해서 기본적으로 리눅스 시스템의 라이브러리가 저장 되는
곳으로 옮겨야 한다.
# cp libnss_winbind.so /lib
# cp pam_winbind.so /lib/security
라이브러리 버전 충돌이 생길 수 있으니 사전에 대비하자.
# cd /lib
# ln -s libnss_winbind.so libnss_winbind.so.1
# ln -s libnss_winbind.so libnss_winbind.so.2
– 데몬 실행 및 Winbind 로 AD 연결 ..
기본적으로 Samba 는 smbd 와 nmbd 두개의 데몬으로 구동되어진다.
smbd 는 파일 공유 및 프린터 공유등을 제어하고 nmbd 는 Netbios 명을 찾는데 사용된다.
# /usr/local/samba/sbin/smbd -D
# /usr/local/samba/sbin/nmbd -D
매번 실행 할때 마다.. 이 긴 경로를 적기 귀찮으니 아예 root 의 system path 에 samba
경로를 등록하도록 하자.
등록은 /root/.bash_profile 파일에서 등록하면 된다.
# vi /root/.bash_profile
——————————————————————–
.
.
PATH=$PATH:$HOME/bin:/usr/local/samba/sbin:/usr/local/samba/bin
.
——————————————————————-
이제 유닉스 계열 시스템을 윈도우 도메인에 참여 시키자.
# /usr/local/samba/bin/smbpasswd -j DOMAIN -r PDC -U Administrator
그럼 password 를 물어본다. 윈도우 DC 의 Administrator 의 패스워드를 입력한다.
여기서 DOMAIN 은 도메인 이름이고 PDC 는 PDC 서버의 Netbios 이름이다.
이제 시스템의 기본 준비가 완료되었다. winbind 로 연결 해 보자 ..
# /usr/local/samba/sbin/winbind -i
그럼..
Processing section “[회사문서자료]”
Processing section “[홈폴더]”
Processing section “[home]”
Processing section “[profile]”
adding IPC service IPC$
adding IPC service ADMIN$
added interface ip=211.241.202.229 bcast=211.241.202.255 nmask=255.255.255.0
added interface ip=211.241.202.229 bcast=211.241.202.255 nmask=255.255.255.0
resolve_lmhosts: Attempting lmhosts lookup for name ares<0x20>
resolve_hosts: Attempting host lookup for name ares<0x20>
bind succeeded on port 0
cm_get_dc_name: Returning DC ARES (211.241.202.129) for domain CLUNIX
IPC$ connections done anonymously
Connecting to host=ARES share=IPC$
Connecting to 211.241.202.129 at port 445
error connecting to 211.241.202.129:445 (Connection refused)
Connecting to 211.241.202.129 at port 139
Added domain CLUNIX (S-1-5-21-1085031214-220523388-725345543)
getting trusted domain list
이와 같은 로그 메세지가 출력 된다.
이부분이 무사히 진행 되면 wbinfo 명령어로 윈도우 서버의 계정과 그룹에 연결이
되어졌는지 확인한다.
# /usr/local/samba/bin/wbinfo -u : 사용자 검색
resolve_lmhosts: Attempting lmhosts lookup for name ares<0x20>
resolve_hosts: Attempting host lookup for name ares<0x20>
bind succeeded on port 0
cm_get_dc_name: Returning DC ARES (211.241.202.129) for domain CLUNIX
IPC$ connections done by user CLUNIX\\CLUNIX\\Administrator
Connecting to host=ARES share=IPC$
Connecting to 211.241.202.129 at port 445
error connecting to 211.241.202.129:445 (Connection refused)
Connecting to 211.241.202.129 at port 139
CLUNIX+1F4D2A20-A908-4D92-A
CLUNIX+Administrator
CLUNIX+airabbit
CLUNIX+alang
CLUNIX+albatrros
CLUNIX+anmerong
CLUNIX+arbeit
CLUNIX+ballkim
CLUNIX+bjkim
CLUNIX+cezanne
CLUNIX+chom1444
.
.
# /usr/local/samba/bin/wbinfo -g : 그룹 검색
CLUNIX+Domain Admins
CLUNIX+Domain Users
CLUNIX+Domain Guests
CLUNIX+Domain Computers
CLUNIX+Domain Controllers
CLUNIX+Cert Publishers
CLUNIX+Schema Admins
CLUNIX+Enterprise Admins
CLUNIX+Group Policy Creator Owners
CLUNIX+DnsUpdateProxy
CLUNIX+Exchange Domain Servers
CLUNIX+BackOffice Template Users
CLUNIX+BackOffice Folder Operators
.
.
만일 이부분에서
# /usr/local/samba/bin/wbinfo -u
resolve_lmhosts: Attempting lmhosts lookup for name ares<0x20>
resolve_hosts: Attempting host lookup for name ares<0x20>
bind succeeded on port 0
cm_get_dc_name: Returning DC ARES (211.241.202.129) for domain CLUNIX
IPC$ connections done anonymously
Connecting to host=ARES share=IPC$
Connecting to 211.241.202.129 at port 445
error connecting to 211.241.202.129:445 (Connection refused)
Connecting to 211.241.202.129 at port 139
0xc0000022
이와 같이 에러가 나온다면 이는
AD 서버의 보안 정책에 따라서 일반적으로 Anonymous 로 IPC$ 에 접속 인증이
안되는 경우에 발생한다.
로컬보안정책, 도메인컨트롤러 보안정책에서 [보안설정] -> [로컬정책] -> [보안옵션]
에서 “익명연결의 추가적 제한” 부분을 “없음” 으로 해 놓으면 위 부분에서
정상적으로 동작할 것이다.
그래도 안되는 경우가 발생한다.
이때는 wbinfo 인증 계정을 강제로 지정해 놓는 방법이 있다. 원래는 이방법이 보안상
권장하는 방법임 anonymously 로 이유없이 IPC$ 를 열어줄 필요는 없음.
# wbinfo –set-auth-user=DOMAIN\\\\USER%PASSWORD
즉 ..
# wbinfo –set-auth-user=CLUNIX\\\\administrator%패스워드
이 설정은 한번 해주면 시스템에 그 정보가 기록 되어진다.
이제 다시 wbinfo -u 해보면 멋지게 윈도우 서버의 계정들이 나타날것이다.
2.6.6 Swat을 이용한 Samba 설정 및 관리 하기
지금 까지는 smb.conf 를 이용한 설정에 대해서만 살펴 보았다. 이장에서는 Swat 에 대한
간단한 소개와 설정 방법에 대해서만 알아보도록 한다.
SWAT(Samba Web Administartion Tool) 말 그대로 samba 웹 관리 툴이다.
smb.conf 에서 설정하던 내용을 웹 인터페이스로 모두 설정 및 데몬 관리등이 가능하다.
먼저 SWAT을 활성해 해보도록 하자. Samba 를 설치를 하면 SWAT은 기본 설치가 되어진다.
단 설정이 되지 않으면 사용할 수 없다.
SWAT의 경우 xinetd 데몬에서 관리하는 것이 효율적이다.
[root@arhdev root]# vi /etc/xinetd.d/swat
———————————————————————————-
service swat
{
port = 901
socket_type = stream
wait = no
user = root
only_from = localhost
server = /usr/local/samba/sbin/swat
log_on_failure += USERID
}
———————————————————————————–
SWAT 접근을 위해서는 Pam 설정이 필요하다.
[root@arhdev root]# vi /etc/pam.d/samba
————————————————————————————
#%PAM-1.0
auth required /lib/securitypam_pwdb.so shadow
account required /lib/securitypam_pwdb.so
password required /lib/securitypam_pwdb.so shadow use_authtok
session required /lib/securitypam_pwdb.so
————————————————————————————
그런 후 웹 브라우저에서 http://smb_server_ip:901 로 접속하면 SWAT 화면이 뜰것이다.
2.6.7 Samba Mount를 통한 ACL 관리
실제 Samba 는 NFS 와 같은 Kernel Level 에서 지원하는 File System 이라기 보다는 Application Laye 에서 존재하는 API 와 같은 프로그램이다.
그렇기 때문의 흔히 NFS 나 로컬 디스크 장치에 마운트를 걸고 퍼미션을 부여해 권한을 관리하는거와는 다르다.
Samba 의 경우 실제 Samba 서버에 존재하는 데이터와 Samba client 에 존재하는 퍼미션과 권한이
같기 다르다. Samba 서버에 있는 데이터는 smb.conf 에 지정된 설정과 같이 퍼미션 정책이 주어져서 데이터가 관리 되어진다. 하지만 samba client 에서는 client 에서 mount 시킬때 사용되는
smbmnt (mount) 명령의 옵션에 의해 정해진다. 즉 client 에서는 samba 프로그램을 통해 mount
가 이루어 지는 것이기 때문에 smbmount 에 의해 실제의 파일 시스템에 부여된 퍼미션과는
전혀 다르게 부여되는 것이다.
아래의 예를 살펴 보도록 하자.
– Samba 서버 ACL 관련 설정
[global]
.
.
[data]
comment = web data
path = /home/data
writable = yes
write list = @members
create mask = 660
directory mask = 770
위와 같이 create mask 와 directory mask 가 각각 660, 770 으로 주어져 있다.
위의 mask 설정은 실제 Samba 서버의 운영체제에서 부여하여 관리하는 퍼미션 정책에 해당
한다. 즉 실제 Samba 서버의 시스템 퍼미션이라 볼수 있다.
[root@clxfile root]# cd /home/data
[root@clxfile data]# ls -al
————————————————————————————-
total 8
drwxrwx— 2 clunix clunix 4096 Sep 20 18:23 clunix
-rw-rw—- 1 clunix clunix 1 Sep 20 18:13 clunix.txt
————————————————————————————-
즉 samba client 에서 server 로 mount 하여 어떤 디렉토리와 파일을 만들어도 samba 서버에서
는 파일은 660 으로 디렉토리는 770의 권한으로 생성이 되어진다.
– Samba 클라이언트 ACL 관련 설정
Samba Client 의 ACL 관련 설정은 실제 smbmnt 명령의 옵션에 의해 정해 진다.
smbmnt 는 mount 의 “-t” 옵션에서 “smbfs” 가 정의 될때 호출되는 명령으로 보면 된다.
즉 Samba Client 시스템에서 Server 로 아래와 같이 mount 를 해보도록 하자
# mount -t smbfs -o username=clunix,password=password,fmask=644,dmask=707 //samba/data /home
# cd /home
# ls -al
total 5
—————————————————————————————-
drwx—rwx 1 root root 4096 Sep 20 18:23 clunix
-rw-r–r– 1 root root 1 Sep 20 18:13 clunix.txt
—————————————————————————————-
위와 같이 실제 Server 에서의 퍼미션은 770,660으로 지정이 되어 있지만 Client 에서는 707,644
로 퍼미션이 주어지는 것이다.
만일 /etc/fstab 에 위의 옵션을 포함하여 mount 설정을 하고 싶을 경우는 아래를 참조하도록 한다.
# cat /etc/fstab
—————————————————————————————–
//samba/data /home/website smbfs \\
defaults,noauto,user,credentials=/etc/samba/smbauth.dat,fmask=644,dmask=707 0 0
—————————————————————————————–
위 설정에서 credentials 는 mount 의 -o 옵션 뒤에 username 과 password 를 입력하는데 이는
history 등을 위해 공개될 수 있다. 그렇기 때문에 별도의 파일에 username 과 password 를
관리 할 때 사용되어진다.
# cat /etc/samba/smbauth.dat
—————————————————————————————-
username=clunix
password=password
—————————————————————————————-
Samba 인증 정보 파일에 대한 권한을 조정한다.
실제 로컬 시스템 일반 유저의 접근을 제한하고 Samba 그룹에 대한 접근만을 허용하도록 한다.
# chmod 640 /etc/samba/smbauth.data
# chgrp wheel /etc/samba/smbauth.data
# usermod -G wheel clunix
정리를 하면 Samba Server 에 대한 모든 권한 설정은 smb.conf 와 Samba Server 의 시스템 퍼미션에 의해 제어 되고 Samba Client 에서의 권한 설정은 Client System 의 Mount Option 에 의해
제어 된다.
2.6.8 일반 유저로 Samba server mount 하기
일반 유저로 Samba mount 를 하기 위해서는 mount 명령의 퍼미션 변경과 fstab 의 옵션 변경이
필요하다.
Web Service 같이 특정 Service 에서 특정 유저의 소유 권한이 필요한 경우 해당 유저로 Samba
mount 를 해야 하는 경우가 있다. 앞에서 언급했듯이 Samba Client 의 모든 권한 설정은 Mount
옵션에서 제어 되기에 만일 root 로 samba mount 를 하게 되면 mount 된 삼바 서버의 모든 소유
권한은 root 로 지정이 되기 때문이다.
참고 : 간혹 Smb.conf 에서 지정되는 valid users , writable, write list 등의 설정에서
사용자설정을 하게 되는데, 이는 Samba Client 시스템의 시스템 유저에 대한 Mount 된
Resource 의 ACL 권한 설정이 아니라 samba mount 자체에 대한 인증 정보인 것이다.
실제 Client 에 대한 ACL 권한의 모든 것은 Client 의 mount option 에 의해 제어된다.
먼저 일반 유저가 mount 를 하기 위해서는 /etc/fstab 에 Option 에서 “user” 이란 option이
추가 되어야 한다.
# cat /etc/fstab
—————————————————————————————–
//samba/data /home/website smbfs \\
defaults,noauto,user,credentials=/etc/samba/smbauth.dat,fmask=644,dmask=707 0 0
—————————————————————————————–
그런 후 해당 유저에 대해 mount 란 명령을 사용할 수 있게 권한을 수정해야 한다.
기본적인 mount 소유권한과 퍼미션은 root 에 대한 4755 권한이 주어진다.
# ls -al /bin/mount
—————————————————————————————–
-rwsr-xr-x 1 root root 75048 Oct 6 2004 /bin/mount
—————————————————————————————–
mount 명령에 samba mount 권한이 있는 일반 유저의 해당 그룹을 부여하도록 한다.
# chgrp wheel /bin/mount
그럼 일반 유저로 mount 가 가능할 것이다.
– 설정 이전 일반 유저로 smbmount 시
$ mount -t smbfs -o username=clunix,password=password //clxfile/data /home/website/
—————————————————————————————
mount: only root can do that
– 설정 이후 일반 유저로 smbmount 시
$ mount -t smbfs -o username=clunix,password=password //clxfile/data /home/website/
$ cd /home/website
$ ls -al
—————————————————————————————
drwx—rwx 1 clunix clunix 4096 Sep 20 18:23 clunix
-rw-r–r– 1 clunix clunix 1 Sep 20 18:13 clunix.txt
—————————————————————————————
2.7. NFS Server와 AutoMount
네트워크 파일 시스템의 일종인 NFS(Network File System)는 유닉스 환경에서 네트워크를
통해 파일과 응용 프로그램을 호스트간 공유하게 해주는 서비스이다.
대형 서비스 환경 구축 시 공유 파일 서버를 사용하여 데이터의 일관성을 유지 하는 경우
가 많은데 이때 주로 사용되어지는 기술이다.
여기서는 실무에서 주로 사용되어지는 NFS 서버 구축 방법과 효율적인 NFS 서비스 관리 방법
들에 대해 알아보도록 하겠다.
2.7.1 NFS 서버 동작 원리
NFS 서버와 클라이언트간의 통신에는 RPC(Remote Procedure Call)라는 기법을 이용한다.
RPC 는 표준화된 규약이기 때문에 이를 이용하여 클라이언트에서 서버측의 함수들을
로컬시스템 함수 처럼 호출할수도 있고 서버의 사용되어 지는 함수들을 검색할 수도 있다.
NFS 서버는 이런 RPC를 이용하여 자신의 존재와 상태를 클라인트에게 알려주게 된다.
이때 사용되는 프로그램이 Portmapper 이다. 이 portmapper 가 RPC에 등록되어져서
portmapper 를 통해 서버와 클라이어트간의 상태를 공유하고 서비스를 제어하게 된다.
구체적으로 클라이언트에서 NFS서버의 자원을 Mount 하는 과정에 대해 알아보도록 하자.
1. 클라이언트의 Portmapper 에서 서버의 Portmapper 통해 현재 서버의 수행중인 NFS Mount
서버스의 Port 를 알아된다.
2. 클라이언트에서 서버의 마운트 서비스에 접속하여 원하는 파티션에 마운트를 요청한다.
3. 서버의 /etc/export 에 설정된 권한에 맞는 요청일 경우 이에 허가를 내려 준다.
4. 클라이언트는 Portmapper 를 통해 다시 NFS 서비스 Port 를 알아낸다. ( 2049/tcp )
5. 해당 Port 로 접속하여 nfs mount 를 수행한다.
2.7.2 NFS 관련 커널 기능
NFS 는 리눅스 커널 2.2 대 부터 커널에 포함되어져서 배포가 되어지고 있다. 커널에 포함이
됨으로 이전에 비해 보다 안정하고 빠른 성능 향상을 가져 오게 되었다.
그렇기 때문에 NFS 기능을 사용하기 위해서는 커널에 있는 NFS 기능을 활성화 시켜야 한다.
Redhat 같은 리눅스 배포판의 기본 커널에는 대부분 NFS 기능이 활성화 되어져 있지만,
최신 커널로 업그레이드 할때는 반드시 이를 체크하여 주어야 한다.
리눅스 커널에서 NFS 관련 기능은 다음 위치에 있다.
Network File Systems —> x
x x<M> NFS file system support x x
x x[*] Provide NFSv3 client support x x
x x<M> NFS server support x x
x x[*] Provide NFSv3 server support x x
x x[ ] Provide NFS server over TCP support (EXPERIMENTAL) x x
원하는 기능을 커널에 포함시키거나 모듈로 포함시키고 커널 컴파일을 하게 되면 된다.
2.7.3 NFS 서버 설정 하기
NFS 서버 설정은 매우 단순하다. /etc/exports 란 설정 파일에서 서버에 관련된 모든 설정이
완료된다.
간단한 설정 예제를 보도록 하자.
# vi /etc/exports
—————————————————————————–
# NFS 원격 설치 시 사용되는 경로
/data/clunix/teragon *(ro,no_root_squash)
# 사용자 Data 보관에 이용되는 경로
/data/users *(rw,no_root_squash)
—————————————————————————–
exports 설정 형식은 다음과 같다.
/directory_path client_hosts(permissions) client_hosts(permissions)…
/directory_path 는 실제 NFS 상에서 export 될 디렉토리 경로이다.
client_hosts 는 NFS 서버에 접근할수 있는 클라이언트 대역을 정의하는 곳이다.
(permissions)은 클라이언트 호스트에 대한 권한을 지정하는 곳이다.
permissions에 사용되는 주요 옵션으로는 다음과 같은 것이 있다.
—————————————————————————————
ro : 파티션에 읽기 권한만 부여
rw : 파티션에 읽기 쓰기 권한 부여
noaccess : 특정 디렉토리의 엑세스를 거부 시킴
no_root_squash : NFS 상에서 기본적으로는 root 권한에서는 NFS mount 를 수용하지 않는다.
하지만 이 옵션을 이용하면 클라이언트에서 root로도 마운트가 가능하다.
이제 NFS 서버 데몬을 시작 시켜 보자
# /etc/rc.d/init.d/portmap restart
# /etc/rc.d/init.d/nfs restart
2.7.4 NFS 클라이언트 설정하기
클라이언트에서도 NFS 서버에 접근이 가능하도록 Portmapper 데몬을 실행 시키다.
# /etc/rc.d/init.d/portmap restart
NFS mount 를 시켜 보자
# mount -t nfs arhfw:/data/clunix/teragon /mnt/teragon
# mount -t nfs arhfw:/data/users /mnt/users
이와 같이 방법으로 NFS 서비스를 사용할 수 있다.
NFS 서비스는 NFS 기능에 관해서는 서버측 설정 보다는 NFS 클라인트측 설정에 더 많은
의존성을 가지게 된다. 위 예제에서 처럼 NFS 클라이언트는 NFS Mount 를 통해 서버에
접근을 하게 되는데 NFS Mount 옵션에 따라 많은 기능 차이가 있다.
– NFS Mount 상세 옵션 설명
NFS Clients 에서의 nfs.mountd option으로 soft,hard,timeo,rsize,wsize… 등등
많은 option 이 있는데 이중에서 가장 최적화된 옵션을 찾아 되는 것은 남겨진 숙제이다.
주요 옵션 설명이다.
rsize=n : NFS 서버로부터 읽어들이는 바이트 수를 지정 한다.
기본값은 커널에 따라다른데 현재로서는1024 바이트이다.
wsize=n : NFS 서버에 쓰기를 할 때 사용하는 바이트수 를 정한다.
기본값은 커널에 따라다른데 현재 로서는 1024 바이트이다.
timeo=n : RPC 타임아웃이 생기고 나서 첫번째 재전송 요 구를 보낼 때 사용되는
시간> 으로서 1/10 초 단 위이다. 기본값은 7 * 1/10 초이다.
첫번째 타 임 아웃이 생기고 나서는 타임아웃 시간이 최대 치인 60 초에 이르거나
너무 많은 재전송 요구 가 벌> 어 질 때 까지 타임아웃 시간이 2 배로 변화 한다.
만약 파일 시스템이 hard ( hard >옵션을 참고 ) 마운트 되어있다면 각각의 타 임
아웃 시간은 2 배로 증가하고 재전>송 시도 가 일어날 때도 2 배로 증가한다.
최대 타임아웃 시간은 60 초이다.
네트웍 속도가 느리거나 서버 자체가 느리 다든지 여러 개의 라우터와 게 이트웨이를
거칠 때는 마운트 당시 타임 아웃 시간을 늘려 주는 것이 좋다.
retrans=n : 주 타임아웃을 발생시키는 부 타임아웃과 재전 송 횟수를 정한다.
기본값은 3 번의 타임아웃이다. 주 타임 아웃이 일어나면 화일 작업이 중지 되거나
콘솔 상 에 “서버가 반응하지 않음 “server not responding””이라는 메시지가
출력 된다.
retry=n : 백그라운드에서 진행 중인 NFS 마운트 작업 이 포기하기 전까지
실행할 횟수 를정한다. 기본값 은 10000 번이다.
namlen=n : NFS 서버가 RPC 마운트 프로토콜의 버전 2 를 지원하지 않을 때
원격 파일 시스템에서 지원 되는 파일 명의 길이를 명시한다.
POSIX pathconf 함 수 를 지원 하기 위해서 사용된다.
기본값은 255 개의 문자이다.
port=n : NFS 서버와 연결할 수 있는 포트 번호를 정 한다.
만약 0 이라면( 기본값) 원격 호스트의 포트매퍼(portmapper) 에게 질의 하여
알아내도록 한다. 만약 포트매퍼에 NFS 데몬이 등록되어 있지 않은 경우에는
2049 라는 표준 NFS 포트 번호가 사용된다.
mountport=n : mountd 포트 번호 지정하기.
mounthost=name : mountd 를 실행 중인 호스트 명을 정한다.
mountprog=n : 원격 호스트의 마운트 데몬과 접속하기 위해 사용할 수 있는
별도의 RPC 프로그램번호를 정 한다.
만약 여러 개의 NFS 서버를 운영하고 있을 때 사용한다.
기본값은 표준 RPC 마운트 데몬 프로그램 번호인 100005 이다.
bg : 만약 첫 번째 NFS 마운트 시도가 타임아웃 걸리 면 백그라운드에서
실행을 계속 된다. 기본 값은 백그라운드로 실행하지 않고 그냥 포기한다.
fg : 첫번째 NFS 마운트 시도에서 타임아웃이 걸 리 면 그 즉시 포기 해 버린다.
기본값이다.
soft : NFS 화일 작업에서 주 타임아웃이 걸리면 프로 그램에게 I/O 에러를 보고한다.
기본값은 무한히 NFS 화일 작업을 재시도 하는 것이다
hard : NFS 화일 작업에서 주 타임아웃이 걸리면 콘솔 상에 “server not responding”,
“서버가 반응 하지 않음” 이라고 출력하고 무한히 재시도한다. 이것이 기본값이다.
intr : 주 타임아웃이 생기고 하드 마운트 된 상태라면 화 일 작업을 중지하도록
시그널 을 보내도록 허용하고 EINTR 시그널을 보내다.
기본값은 화일 작업을 인터럽트 하지 않는 것이다.
tcp : NFS 화 일 시스템을 기본값인 UDP 가 아니라 TCP 프로토콜을
사용하여 마운트 하도록 한다. 많은 NFS 서버들이 오로지 UDP 만을 지원한다.
udp : NFS 화일 시스템을 UDP 프로토콜로 마운트 한다. 기본값.
2.7.5 NFS Automount 설정하기
automount 에는 am-utils ( amd ), autofs 두 가지의 패키지가 있다.
Redhat9 에서는 기본적으로 autofs 를 채택하고 있다.
간단한 설정에 대해 알아보자.
주요 설정 파일은 ..
/etc/auto.master
/etc/auto.misc
이 있다.
# vi /etc/auto.master
======================================================================
/home /etc/auto.user01 –timeout=5
# vi /etc/auto.user01
======================================================================
user01/data -fstype=nfs,rw,soft,bg master:/data/nfs/user01
# /etc/rc.d/init.d/portmap restart
# /etc/rc.d/init.d/autofs restart
/home/user01/data 로 이동하면 자동으로 master 의 /data/nfs/user01
로 nfs mount 가 된다.
automount 를 사용하게 되면 실제 사용자가 지정된 mount point 에 접근 시에만
자동으로 nfs mount 하고 일정 시간 사용을 하지 않으면 자동으로 umount 를 시
키기 때문에 nfs 서비스로 인한 resource 를 최대한 절약 할 수 있고, 여러명이
지속저으로 Nfs 를 사용할 경우 1개의 곳에서 lock 이 결려도 전체 서비스에 문
제가 생길 가능성이 있는데 automount 로 상당 부분 해소할 수 있다.
autofs-4.x 버전에서는 multiple hostname 기능이 지원한다.
이는 먼저 master 로 Connection 요청을 해서 정상적인 요청이 이루어 지지
않으면 slave 에 연결이 된다. Redhat9 에서는 기본적으로 autofs-3.x 임으로
autofs-4.x 로 업그레이드를 해야 한다.
http://www.kernel.org/pub/linux/daemons/autofs/
2.8. Bridge Type Firewall Server
리눅스 커널에서 지원하는 다양한 Netfilter 관련 모듈과 iptables 란 프로그램을 이용하여
네트워크에 관련된 다양한 패킷을 커널 레벨에서 filter를 해줄 수 있다.
이러한 기능을 이용하여 외부의 접근으로 부터 내부의 인프라를 보호할 수 있는 Firewall
운영체제로 리눅스를 사용하여 온지는 오래 되었다. 최근 들어 하드웨어 박스 형태로 만들
어지는 다양한 방화벽 제품들의 Firmware 운영체제가 대부분이 임베디드 리눅스로 만들어
지고 있는 실정이다.
방화벽은 네트워크 구성에 따라 다양한 방식으로 구성 할 수 있다. 기존의 방화벽은 대부분
NAT(Network Address Translation) 방식으로 구성되어져 왔다. 하지만 NAT 방식에서는
방화벽의 네트워크 이더넷의 성능에 의해 인프라 확장에 대한 제한의 문제가 존재 하였고,
비방화벽 네트워크 인프라를 방화벽이 존재하는 인프라로 변환할때 전 인프라의 모든 PC
단에 작업을 해야 하는 구축 효율상의 문제가 존재 했었다.
여기서 소개할 Bridge Level Firewall 은 리눅스 커널의 Bridge 기능을 이용하여 실제 기존
인프라 구성의 네트워크 환경을 보존한 채 방화벽을 인프라에 포함하는 기술이다.
Bridge 방화벽은 리눅스 커널의 의존도가 크기 때문에 Kernel Compile 과정이 필수이며,
여기서는 상세한 Kernel Compile 과정에 대해서는 언급하지 않겠다.
2.8.1 Bridge 네트워크 구성
– 먼저 bridge 서버의 물리적 네트워크 구성은 다음과 같다.
라우터 —– 브리지서버(eth0)|브리지서버(eth1) —- 백본스위치 —– 클라이언트
——————————————————————————-
라우터 -> 브리지서버(eth0) : cross cable
브리지서버(eth1) -> 백본스위치 : direct cable
——————————————————————————-
– 외부회선 —- 브리지서버(eth0)|브리지서버(eth1) —- 스위치 — 클라이언트
——————————————————————————-
외부회선 -> 브리지서버(eth0) : direct cable
브리지서버(eth1) -> 스위치 : direct cable
——————————————————————————-
Bridge Firewall 서버는 라우터와 백본 스위치 사이에 위치하며, 백본을 통해 오가는
모든 패킷을 감시하게 된다. 다단으로 나누어진 네트워크 환경이라면 각 층의 백본
스위치 앞단에 Bridge Firewall 를 설치하게 되면 해당 스위치를 통해 들어오가 나가
는 패킷을 모두 필터 처리 할 수 있게 된다.
2.8.2. 구축 준비 패키지
H/W :
랜카드 2장 이상 달린 시스템
S/W :
리눅스커널 : 2.4.26
브리지 커널 패치 : ebtables-brnf-5_vs_2.4.25.diff
브리지 유틸 : bridge-utils-0.9.6.tar.gz
iptables 커널 패치 : patch-o-matic-20031219.tar.bz2
iptables 유틸 : iptables-1.2.9.tar.bz2
2.8.3. Bridge Firewall System 커널 구성하기
– kernel patch
# cd /usr/src
# tar jxvf linux-2.4.26.tar.bz2
# ln -sf linux-2.4.26 linux
# cd linux
# patch -p1 < ../ebtables-brnf-5_vs_2.4.25.diff
– iptables patch ( string )
# tar jxvf patch-o-matic-20031219.tar.bz2
# cd patch-o-matic
# ./runme extra
Hey! KERNEL_DIR is not set.
Where is your kernel? [/usr/src/linux] -> Y ( 링크 재대로 걸어야 함 )
그럼 아래와 같이..다음과 같은 패치 한다고 물어본다.
.
.
+ New ‘helper’ match (Martin Josefsson, Harald Welte)
submitted/ip6tables-exthdr-bug.patch.ipv6
+ Fix broken ipv6 extensionheader parser (Andras Kis-Szabo)
submitted/ipv6-agr.patch.ipv6
+ New ip6tables ‘eui64’ match (Andras Kis-Szabo)
submitted/length.patch.ipv6
+ New ip6tables ‘length’ match (Imran Patel, James Morris)
submitted/log-tunnel-fix.patch.ipv6
+ Fix ip6tables ‘LOG’ target MAC address in case of tunnels
(Peter Bieringer, Andras Kis-Szabo)
submitted/nat-memoryleak-fix.patch
+ Fix memoryleak at iptable_nat unload time (zhongyu)
submitted/ownercmd.patch
+ Extend ‘owner’ match to match cmdline (Marc Boucher)
submitted/pkttype.patch
+ New ‘pkttype’ match (Michal Ludvig)
submitted/ulog-nlgroup-shift-fix.patch
+ Fix error with shifting nlgroup in ULOG target (Harald Welte)
submitted/ulog-sparc-bitops-fix.patch
+ Include linux/bitops.h instead of asm/bitops.h
submitted/z-newnat16.patch
+ Redesign of conntrack and nat helper framework, for more info see http://cvs.netfilter.org/cgi-bin/cvsweb/netfilter/documentation/newnat-summary.txt
(Harald Welte, Jozsef Kadlecsik, and others)
submitted/z-newnat_assertfix.patch
+ Fix erroneously printed ASSERT messages when debugging of newnat
enabled (Martin Josefsson)
submitted/z-newnat_changeexpect-lockfix.patch
+ Fix locking bug in ip_conntrack_change_expect() (Martin Josefsson)
Further changes, not previuosly in patch-o-matic:
+ ip6tables usage counter fix (Harald Welte)
+ ip_queue cleanup (James Morris)
+ minor spelling fixes
+ __constant_htons() macro changes
+ ipt_unclean: srcport _can_ be zero
+ yet another ipchains GFP_ATOMIC fix
—————————————————————–
Do you want to apply this patch [N/y/t/f/a/r/b/w/v/q/?]
여기서는 그냥 엔터를 입력한다.
iptable패치에는 내용이 여러 가지가 존재한다. y를 누르면 패치가 된다. 그러나 전부 패치를 >하면 안 된다. 나중에 커널을 컴파일 하면 에러가 나기 때문에 꼭 필요한 것만 y를 눌러 패치 >한다. b를 누르면 뒤로 돌아갈 수 있다.
지금 패치 할 것은 패킷에서 String을 검색하여 패킷을 버리거나 거부 하는 String match support 이다. 이것을 이용하면 Nimda, CodeRed 등의 웜이나 바이러스의 패킷을 차단 할 수 있다.
그리고 메일의 string 을 검색하여 스팸 메일 차단에 이용할 것이다.
계속 엔터를 쳐서 가다 보면 아래와 같은 화면이 나올것 이다.
Welcome to Rusty’s Patch-o-matic!
Each patch is a new feature: many have minimal impact, some do not.
Almost every one has bugs, so I don’t recommend applying them all!
——————————————————-
Already applied: submitted/01_2.4.19
Testing… string.patch NOT APPLIED ( 2 missing files)
The extra/string patch:
Author: Emmanuel Roger <winfield@freegates.be>
Status: Working, not with kernel 2.4.9
This patch adds CONFIG_IP_NF_MATCH_STRING which allows you to
match a string in a whole packet.
THIS PATCH DOES NOT WORK WITH KERNEL 2.4.9 !!!
—————————————————————–
Do you want to apply this patch [N/y/t/f/a/r/b/w/v/q/?]
여기서 y를 누르면 String match가 패치 된다.
계속 엔터를 치면 다른 패치들이 나온다. 필요한 것들이 있으면 패치한다.
– 커널 설정
# cd /usr/src/linux
# make menuconfig
network option 으로 가서 netfilter 관련 설정과 bridge 관련 설정을 한다.
Networking options
x x <*> Packet socket x x
x x [*] Packet socket: mmapped IO x x
x x < > Netlink device emulation x x
x x [*] Network packet filtering (replaces ipchains) x x
x x [ ] Network packet filtering debugging x x
x x [*] Socket Filtering x x
x x <*> Unix domain sockets x x
x x [*] TCP/IP networking x x
x x [*] IP: multicasting x x
x x [ ] IP: advanced router x x
x x [ ] IP: kernel level autoconfiguration x x
x x < > IP: tunneling x x
x x < > IP: GRE tunnels over IP x x
x x [*] IP: multicast routing x x
x x [ ] IP: PIM-SM version 1 support x x
x x [ ] IP: PIM-SM version 2 support x x
x x [ ] IP: ARP daemon support (EXPERIMENTAL) x x
x x [ ] IP: TCP Explicit Congestion Notification support x x
x x [*] IP: TCP syncookie support (disabled per default) x x
x x IP: Netfilter Configuration —> x x
x x IP: Virtual Server Configuration —> x x
x x < > The IPv6 protocol (EXPERIMENTAL) x x
x x < > Kernel httpd acceleration (EXPERIMENTAL) x x
x x SCTP Configuration (EXPERIMENTAL) —> x x
x x < > Asynchronous Transfer Mode (ATM) (EXPERIMENTAL) x x
x x < > 802.1Q VLAN Support x x
x x — x x
x x < > The IPX protocol x x
x x < > Appletalk protocol support x x
x x Appletalk devices —> x x
x x < > DECnet Support x x
x x <*> 802.1d Ethernet Bridging x x
x x <M> Bridge: ebtables x x
x x <M> ebt: filter table support x x
x x <M> ebt: nat table support x x
x x <M> ebt: broute table support x x
x x <M> ebt: log support x x
x x <M> ebt: IP filter support x x
x x <M> ebt: ARP filter support x x
x x <M> ebt: among filter support x x
x x <M> ebt: limit filter support x x
x x <M> ebt: 802.1Q VLAN filter support x x
x x <M> ebt: 802.3 filter support x x
x x <M> ebt: packet type filter support x x
x x <M> ebt: STP filter support x x
x x <M> ebt: mark filter support x x
x x <M> ebt: arp reply target support x x
x x <M> ebt: snat target support x x
x x <M> ebt: dnat target support x x
x x <M> ebt: redirect target support x x
x x <M> ebt: mark target support x x
x x < > CCITT X.25 Packet Layer (EXPERIMENTAL) x x
x x < > LAPB Data Link Driver (EXPERIMENTAL) x x
x x [ ] 802.2 LLC (EXPERIMENTAL) x x
x x [ ] Frame Diverter (EXPERIMENTAL) x x
x x < > Acorn Econet/AUN protocols (EXPERIMENTAL) x x
x x < > WAN router x x
x x [ ] Fast switching (read help!) x x
x x [ ] Forwarding between high speed interfaces x x
x x QoS and/or fair queueing —> x x
x x Network testing —> x x
IP: Netfilter Configuration
x x <*> Connection tracking (required for masq/NAT) x x
x x <M> FTP protocol support x x
x x <M> Amanda protocol support x x
x x <M> TFTP protocol support x x
x x <M> IRC protocol support x x
x x <M> Userspace queueing via NETLINK (EXPERIMENTAL) x x
x x <*> IP tables support (required for filtering/masq/NAT) x x
x x <M> limit match support x x
x x <M> MAC address match support x x
x x <M> Packet type match support x x
x x <M> netfilter MARK match support x x
x x <M> Multiple port match support x x
x x <M> TOS match support x x
x x <M> recent match support x x
x x <M> ECN match support x x
x x <M> DSCP match support x x
x x <M> AH/ESP match support x x
x x <M> LENGTH match support x x
x x <M> TTL match support x x
x x <M> tcpmss match support x x
x x <M> Helper match support x x
x x <M> Connection state match support x x
x x <M> Connection tracking match support x x
x x <M> Unclean match support (EXPERIMENTAL) x x
x x <M> String match support (EXPERIMENTAL) x x
x x <M> Owner match support (EXPERIMENTAL) x x
x x <M> Physdev match support x x
x x <M> Packet filtering x x
x x <M> REJECT target support x x
x x <M> MIRROR target support (EXPERIMENTAL) x x
x x <M> Full NAT x x
x x <M> MASQUERADE target support x x
x x <M> REDIRECT target support x x
x x [*] NAT of local connections (READ HELP) x x
x x <M> Basic SNMP-ALG support (EXPERIMENTAL) x x
x x <M> Packet mangling x x
x x <M> TOS target support x x
x x <M> ECN target support x x
x x <M> DSCP target support x x
x x <M> MARK target support x x
x x <M> LOG target support x x
x x <M> ULOG target support x x
x x <M> TCPMSS target support x x
x x <M> ARP tables support x x
x x <M> ARP packet filtering x x
x x <M> ARP payload mangling x x
다른것은 커널 컴파일 문서를 참고하세요.
P-III / IDE HDD / intel, realtec ethernet Card 시스템의 커널 설정 파일을 다운
받아서 수정후 사용하셔도 됨.
# make dep && make clean
# make bzImage && make modules && make modules_install
# cp System.map /boot/System.map-2.4.26
# cp arch/i386/boot/bzImage /boot/vmlinuz-2.4.26
# cd /boot
# ln -sf System.map-2.4.26 System.map
# ln -sf vmlinuz-2.4.26 vmlinuz
하신후 /etc/lilo.conf 수정하고 lilo 실행
# vi /etc/lilo.conf
—————————————————————————-
prompt
timeout=50
default=bridge
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
message=/boot/message
linear
image=/boot/vmlinuz-2.4.20-8
label=linux
initrd=/boot/initrd-2.4.20-8.img
read-only
append=”root=LABEL=/”
image=/boot/vmlinuz
label=bridge
read-only
root=/dev/hda2
—————————————————————————
리부팅 하세요..
2.8.4. Bridge utiles, iptables 설치 하기
# tar xzvf bridge-utils-0.9.6.tar.gz
# cd bridge-utils
# ./configure
# make
# make install
# tar xjvf iptables-1.2.9.tar.bz2
# cd iptables-1.2.9
# make KERNEL_DIR=/usr/src/linux
# make install KERNEL_DIR=/usr/src/linux
# make install-devel
iptables 설치 하고 난 후 rpm 으로 설치된 iptables 와 충돌이 안나게 기존 명령어
을 막아 놓으세요.
레드헷의 경우 /sbin/iptables 위치함. 적당한 다른 이름으로 변경해둠. 그런후 ..
# mv /sbin/iptables /sbin/iptables.redhat
# ln -sf /usr/local/sbin/iptables /sbin/iptables
2.8.5. Bridge 네트워크 설정하기
Bridge device 추가함
# /usr/local/sbin/brctl addbr clxbr0
# /usr/local/sbin/brctl addif clxbr0 eth0
# /usr/local/sbin/brctl addif clxbr0 eth1
# vi /etc/sysconfig/network-scripts/ifcfg-clxbr0
—————————————————————————-
DEVICE=clxbr0
IPADDR=211.241.202.142
NETMASK=255.255.255.128
ONBOOT=yes
—————————————————————————-
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
—————————————————————————-
DEVICE=eth0
ONBOOT=no
—————————————————————————-
# vi /etc/sysconfig/network-scripts/ifcfg-eth1
—————————————————————————-
DEVICE=eth1
ONBOOT=no
—————————————————————————-
# ifdown lo
# ifdown eth0
# ifdown eth1
# ifup lo
# ifconfig ifconfig
# ifconfig eth0 0.0.0.0
# ifconfig eth1 0.0.0.0
# ifup clxbr0
하면 Bridge Network 설정이 마무리 됨.
Bridge Server 외부와 내부로 ping 이 되는지 확인 함.
매번 리부팅 될때 마다 위와 같은 작업을 해야 하기 때문에 다음 init script을 이용
하여 부팅 시마다 자동으로 적용되도록 함.
# vi /etc/rc.d/init.d/bridge
—————————————————————————
#! /bin/sh
#
# bridge Start/Stop Ethernet Bridge interface with 2 ethernet NIC
#
# description: Ethernet Bridge for transparent(bridge) Firewall
# make bridge interface(clxbr0) and tie 2 NIC to clxbr0 and
# setup firewall & NAT(MASQUERADE) of iptables
#
# Clunix.inc <alang@clunix.com> 2004.5.1
#
# Source function library.
. /etc/init.d/functions
# Source Network config
. /etc/sysconfig/network
# Check that networking is up.
if [ ${NETWORKING} = “no” ]
then
exit 0
fi
[ -x /usr/local/sbin/brctl ] || exit 0
RETVAL=0
start() {
# check /var/lock/subsys/bridge file
if [ -f /var/lock/subsys/bridge ] ; then
return
fi
# make bridge interface
echo -n $”Starting Bridge: ”
/usr/local/sbin/brctl addbr clxbr0 > /dev/null 2>&1 &&
/usr/local/sbin/brctl addif clxbr0 eth0 > /dev/null 2>&1 &&
/usr/local/sbin/brctl addif clxbr0 eth1 > /dev/null 2>&1
RETVAL=$?
if [ $RETVAL -eq 0 ] ; then
success “bridge startup”
else
failure “bridge startup”
fi
echo
# start networking of bridge
echo -n $”Starting Network of Bridge: ”
ifup lo && ifconfig eth0 0.0.0.0 && \\
ifconfig eth1 0.0.0.0 && ifup clxbr0
RETVAL=$?
[ $RETVAL -eq 0 ] && success “Network of bridge startup” \\
|| failure “Network of bridge startup”
echo
touch /var/lock/subsys/bridge
return $RETVAL
}
stop() {
# check /var/lock/subsys/bridge file
if [ ! -f /var/lock/subsys/bridge ] ; then
return
fi
# stop networking of bridge
echo -n $”Stopping Network of bridge: ”
ifdown clxbr0 && ifconfig eth1 down && ifconfig eth0 down && ifdown lo
RETVAL=$?
[ $RETVAL -eq 0 ] && success “Network of bridge stopping” \\
|| failure “Network of bridge stopping”
echo
# stop bridge interface
echo -n $”Stopping Bridge: ”
/usr/local/sbin/brctl delif clxbr0 eth1 > /dev/null 2>&1 &&
/usr/local/sbin/brctl delif clxbr0 eth0 > /dev/null 2>&1 &&
/usr/local/sbin/brctl delbr clxbr0 > /dev/null 2>&1
RETVAL=$?
if [ $RETVAL -eq 0 ] ; then
success “bridge stopping”
else
failure “bridge stopping”
fi
echo
rm -f /var/lock/subsys/bridge
return $RETVAL
}
# See how we were called.
case “$1” in
start)
start
;;
stop)
stop
;;
status)
/usr/local/sbin/brctl show
;;
restart)
stop
sleep 2
start
;;
*)
echo $”Usage: $0 {start|stop|status|restart}”
exit 1
esac
exit $RETVAL
——————————————————————————
# ln -sf /etc/rc.d/init.d/bridge /etc/rc3.d/S11bridge
# chkconfig –add bridge
2.8.6 iptables script 사용하기
# vi /etc/rc.d/init.d/brctl
——————————————————————————
#! /bin/sh
#
# iptables Start/Stop firewall with iptables
#
# description: Clunix Firewall filtering & NAT with iptables
#
# Clunix.inc <alang@clunix.com> 2004.05.01
#
# Source function library.
. /etc/init.d/functions
# Source Network config
. /etc/sysconfig/network
# Check that networking is up.
if [ ${NETWORKING} = “no” ]
then
exit 0
fi
[ -x /usr/local/sbin/iptables ] || exit 0
RETVAL=0
start() {
# check /var/lock/subsys/firewall file
if [ -f /var/lock/subsys/firewall ] ; then
return
fi
# print “start firewall” msg
echo -n $”Starting Firewall: ”
#
# start firewall & NAT
#
# 내부 네트워크 영역 설정
INTER_AREA=”211.241.202.128/25″
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
modprobe ipt_string
modprobe ipt_state
modprobe ipt_REJECT
modprobe ipt_REDIRECT
modprobe ipt_MASQUERADE
modprobe ip_nat_snmp_basic
modprobe ip_nat_ftp
modprobe ip_nat_irc
echo 1 > /proc/sys/net/ipv4/ip_forward
#
# init iptables
#
# flush all chains
iptables -F
iptables -X
chains=`cat /proc/net/ip_tables_names 2>/dev/null`
for i in $chains
do
iptables -t $i -F
iptables -t $i -X
iptables -t $i -Z
done
# 기본 정책 설정
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
# firewall filtering
iptables -P FORWARD DROP
######################################################################
# User defined chains
######################################################################
#
# refuse :
# explicit refuse chains
# logging to /var/log/firewall (via syslog kern.debug) & reject
#
iptables -N refuse
iptables -A refuse ! -i eth1 -m limit –limit 1/m -j LOG \\
–log-prefix “refused: ” –log-level debug
iptables -A refuse -p tcp -m limit –limit 10/s -j REJECT \\
–reject-with tcp-reset
iptables -A refuse -p udp -m limit –limit 10/s -j REJECT
iptables -A refuse -j DROP
#
# global_icmp :
# specified ICMP packets are accepted globally
#
# accept following icmp pkt
# – 0 : echo reply
# – 3 : dest unreachable
# – 5 : redirect
# – 8 : echo request
# – 11 : time exceed
iptables -N global_icmp
iptables -A global_icmp -p icmp –icmp-type 0 -j ACCEPT
iptables -A global_icmp -p icmp –icmp-type 3 -j ACCEPT
iptables -A global_icmp -p icmp –icmp-type 5 -j ACCEPT
iptables -A global_icmp -p icmp –icmp-type 8 -j ACCEPT
iptables -A global_icmp -p icmp –icmp-type 11 -j ACCEPT
#
# global_udp :
# specified udp packets are accepted globally
#
iptables -N global_udp
# edoneky (4661-4663/tcp, 4665/udp) for all PC
iptables -A global_udp -p udp –dport 4665 -j ACCEPT
#
# global_tcp :
# specified tcp packets (that is valid) are accepted globally
#
# specified tcp packets (that is valid) are accepted globally
#
iptables -N global_tcp
# accept tcp syn pkt
# iptables -A global_tcp -p tcp –syn -j ACCEPT
# drop new pkt that has no syn
iptables -A global_tcp -p tcp ! –syn -m state –state NEW -j DROP
# MSN file transfer (6891-6900/tcp) for all PC
# http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q278887&
iptables -A global_tcp -p tcp –dport 6891:6900 -j ACCEPT
# edoneky (4661-4663/tcp, 4665/udp) for all PC
iptables -A global_tcp -p tcp –dport 4661:4663 -j ACCEPT
#
# open :
# accept connection by each server:port
#
iptables -N open
iptables -A open -p tcp -d 211.241.202.153 –dport 22 -j ACCEPT
iptables -A open -p tcp -d 211.241.202.152 –dport 25 -j ACCEPT
# String Rule
# Nimda, CodeRed
iptables -A FORWARD -p tcp –tcp-flags ACK ACK –dport 80 -m string \\
–string “/default.ida?” -j REJECT –reject-with tcp-reset
iptables -A FORWARD -p tcp –tcp-flags ACK ACK –dport 80 -m string \\
–string “XXXXXXXX” -j REJECT –reject-with tcp-reset
iptables -A FORWARD -p tcp –tcp-flags ACK ACK –dport 80 -m string \\
–string “cmd.exe” -j REJECT –reject-with tcp-reset
iptables -A FORWARD -p tcp –tcp-flags ACK ACK –dport 80 -m string \\
–string “root.exe?” -j REJECT –reject-with tcp-reset
# Mail Subject,Content String
iptables -A FORWARD -p tcp –dport 25 -m string –string “test” -j REJECT \\
–reject-with tcp-reset
iptables -A FORWARD -p tcp –dport 25 -m string –string “광고” -j REJECT \\
–reject-with tcp-reset
# SQL Slammer
iptables -A FORWARD -p udp -m string –string “Qh.dllhel32hkern” -j REJECT
######################################################################
# FORWARD chain rules
######################################################################
# accept all packets from internal network (eth1)
iptables -A FORWARD -p ALL -i eth1 -j ACCEPT
iptables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
# New Rules Forward
iptables -A FORWARD -p icmp -j global_icmp
iptables -A FORWARD -p udp -j global_udp
iptables -A FORWARD -p tcp -j global_tcp
iptables -A FORWARD -j open
# otherwise, refuse it
iptables -A FORWARD -j refuse
# accept all pkt from local loopback interface
iptables -A INPUT -i lo -j ACCEPT
# accept all packets by stateful-inspection
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
# filter by global icmp pkt
iptables -A INPUT -p icmp -j global_icmp
# filter by global tcp pkt
iptables -A INPUT -p tcp -j global_tcp
# accept only ssh(22/tcp) pkt
iptables -A INPUT -p tcp -i eth1 –dport 22 -j ACCEPT
iptables -A INPUT -p tcp -i eth0 –dport 22 -j ACCEPT
# otherwise, refuse pkt
iptables -A INPUT -j refuse
#
# accept all out pkt
#
iptables -A OUTPUT -o clxbr0 -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
######################################################################
# for NAT(masquerade)
######################################################################
#
# masquerade
#
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
# print “firewall startup” msg
[ $? -eq 0 ] && success “firewall startup” || \\
# print “firewall startup” msg
[ $? -eq 0 ] && success “firewall startup” || \\
failure “firewall startup”
echo
# lock
touch /var/lock/subsys/firewall
}
stop() {
# check /var/lock/subsys/firewall file
if [ ! -f /var/lock/subsys/firewall ] ; then
return
fi
# print “stop firewall” msg
echo -n $”Stopping Firewall: ”
#
# flush & delete iptables rules
#
chains=`cat /proc/net/ip_tables_names 2>/dev/null`
for i in $chains
do
iptables -t $i -F
iptables -t $i -X
done
iptables -P INPUT ACCEPT && \\
iptables -P OUTPUT ACCEPT && \\
iptables -P FORWARD ACCEPT && \\
iptables -t nat -P PREROUTING ACCEPT && \\
iptables -t nat -P POSTROUTING ACCEPT && \\
iptables -t nat -P OUTPUT ACCEPT && \\
iptables -t mangle -P PREROUTING ACCEPT && \\
iptables -t mangle -P OUTPUT ACCEPT
#
# start firewall & NAT
#
echo 0 > /proc/sys/net/ipv4/ip_forward
# rmmod ip_conntrack_ftp
# rmmod ip_conntrack_irc
rmmod ipt_string
rmmod ipt_state
rmmod ipt_REJECT
rmmod ipt_REDIRECT
rmmod ipt_MASQUERADE
rmmod ip_nat_snmp_basic
rmmod ip_nat_ftp
rmmod ip_nat_irc
# print “firewall stop” msg
[ $? -eq 0 ] && success “firewall stop” || failure “firewall stop”
echo
# unlock
rm -f /var/lock/subsys/firewall
}
# See how we were called.
case “$1” in
start)
start
;;
stop)
stop
;;
status)
/sbin/iptables -L INPUT
/sbin/iptables -L OUTPUT
/sbin/iptables -L FORWARD
;;
restart)
stop
sleep 1
start
;;
*)
echo $”Usage: $0 {start|stop|status|restart}”
exit 1
esac
exit $RETVAL
———————————————————————————
# ln -sf /etc/rc.d/init.d/brctl /etc/rc3.d/S70brctl
그런 후 리부팅 후에도 자동으로 Brige Server 로 작동하는지를 확인한다.
# ifconfig
——————————————————————————–
clxbr0 Link encap:Ethernet HWaddr 00:E0:81:24:31:CC
inet addr:192.168.133.254 Bcast:192.168.133.191 Mask:255.255.255.224
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:81696481 errors:0 dropped:0 overruns:0 frame:0
TX packets:50749394 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:4223860785 (4028.1 Mb) TX bytes:2228833733 (2125.5 Mb)
eth0 Link encap:Ethernet HWaddr 00:E0:81:24:31:CC
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:81494937 errors:0 dropped:0 overruns:0 frame:0
TX packets:63831188 errors:1 dropped:0 overruns:0 carrier:1
collisions:0 txqueuelen:1000
RX bytes:1361301373 (1298.2 Mb) TX bytes:2108741564 (2011.0 Mb)
Interrupt:17 Base address:0xc880 Memory:fe6fe000-fe6fe038
eth1 Link encap:Ethernet HWaddr 00:E0:81:24:31:CD
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:40482607 errors:0 dropped:0 overruns:0 frame:0
TX packets:43123044 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1741652048 (1660.9 Mb) TX bytes:4286806130 (4088.2 Mb)
Base address:0xd080 Memory:fe980000-fe9a0000
———————————————————————————
# iptables -L ( /etc/rc.d/init.d/brctl status )
———————————————————————————
.
ACCEPT tcp — anywhere 192.168.133.184 tcp dpt:1024
ACCEPT tcp — anywhere 192.168.133.184 tcp dpt:5900
ACCEPT tcp — anywhere 192.168.133.186 tcp dpt:ssh
ACCEPT tcp — anywhere 192.168.133.174 tcp dpt:ftp
ACCEPT tcp — anywhere 192.168.133.174 tcp dpt:ssh
ACCEPT tcp — anywhere 192.168.133.174 tcp dpt:http
ACCEPT icmp — anywhere anywhere icmp redirect
ACCEPT icmp — anywhere anywhere icmp echo-request
ACCEPT icmp — anywhere anywhere icmp time-exceeded
ACCEPT all — anywhere anywhere
Chain IN_TCP (1 references)
target prot opt source destination
ACCEPT tcp — 222.236.44.40 anywhere tcp dpt:ssh
ACCEPT tcp — 222.236.44.46 anywhere tcp dpt:ssh
ACCEPT tcp — anywhere anywhere tcp dpt:http
ACCEPT tcp — anywhere 192.168.133.170 tcp dpt:ssh
ACCEPT tcp — anywhere 192.168.133.170 tcp dpt:xdmcp
ACCEPT tcp — anywhere anywhere tcp dpt:rndc
DROP all — anywhere anywhere
Chain IN_UDP (1 references)
target prot opt source destination
ACCEPT udp — anywhere anywhere udp dpt:domain
ACCEPT udp — anywhere anywhere udp dpt:rndc
DROP all — anywhere anywhere
.
———————————————————————————-
2.9. Mysql DB Server Admin
이 장에서는 Mysql DBA 에게 필요한 다양한 기술에 대해 소개 하도록 하겠습니다.
앞장의 [Apache, Php, Java(Tomcat), Mysql 개발 환경 웹 Server] 부분에서 기본적인
Mysql 설치 방법에 대해서는 다룬 적이 있습니다. 이 장에서는 보다 구체적인 Mysql
관리 방법에 대해 소개하도록 하겠습니다.
2.9.1 Mysql 최적화 설치 하기
2.9.1.1 소스 코드로 설치하기
Mysql 을 구할수 있는곳은 http://www.mysql.com/downloads/mirrors.html
을 방문하면 자신이 있는곳에서 가장 가까운 곳에서 소스코드를 다운 받을
수 있습니다.
소스로 mysql 이 설치하기전에 먼저 자신의 시스템이 rpm 으로 이미 설치
가 되어져 있는지 확인하시고 먼저 설치된 rpm 을 제거해 주시길 바랍니다.
# rpm -qa | grep mysql
# rpm -e mysql-x.xx.xx(verison)
# tar xzvf mysql-version.tar.gz // 압축해제
# cd mysql-version // 압축이 풀린 디렉토리로 이동
# ./configure –prefix=/usr/local/mysql –with-charset=euc_kr
// 옵션과 함께 configure 실행
# make // make 실행
# make install // make install 실행
# bin/mysql_install_db // 기본 DB와 테이블 생성
# chown -R mysql. /usr/local/mysql/data // Mysql DB 권한 변경
# bin/safe_mysqld -u mysql & // mysql 데몬 실행
2.9.1.2 설치 옵션
configure 옵션엔 위에 설치시 사용한 –prefix –with-charset 이외도
여러 옵션이 있다. 확인할려면 다음과 같이 문서를 만든뒤 살펴 보도록하자.
# ./configure –help > mysql_otion.txt
대표적인 기타 추가 옵션으로는 다음이 있다.
기타 추가 옵션
–with-unix-socket-dir=/usr/local/mysql/sock/socket.mysql
소켓정보파일을 /usr/local/mysql/sock/socket.mysql 로 지정생성하겠다
이 부분을 기술하지 않으면 /tmp/(디폴트 소켓이름) 으로 사용됩니다.
–localstatedir=/mysqldb : 이것은 데이타베이스파일을 어디에다가 생성
할것인지 지정해주는 것입니다.기술하지 않으면 mysql_path/var 에 DB가
생성된다.
2.9.1.3 mysql 디렉토리 구조
bin : 클라이언트 프로그램, 각종 스크립트 프로그램
include : 개발에 필요한 헤더 파일
info : 각종문서
lib : 개발에 필요한 라이브러리
libexec : mysqld (Mysql 서버 실행 데몬)
share/mysql : Mysql 운영관리 스크립트
sql-bench : 벤치마크프로그램
var : Mysql 의 데이터와 데이터베이스 생성장소,로그파일
2.9.1.4 시스템 부팅시 Mysql 자동 실행방법
BSD 계열의 시스템에서는 /etc/rc.d/rc.local 파일의 제일 하단에 실행 명령어를
적어준다.
/usr/local/mysql/bin/safe_mysqld &
혹은..
/bin/sh -c `cd /usr/local/mysql ; ./bin/fafe_mysqld &`
System V 계열에서는 share/mysql 안에 mysql.server 스크립트를 이용하면 된다.
# cd /usr/local/mysql mysql 프로그램 생성 위치로 가서
# bin/mysql_install mysql DB 를 생성시켜준다.
# cd /usr/local/mysql/share/mysql
# vi mysql.server mysql 제어 스크립트 수정
편집기로 열어서 safe_mysql이 실행되는 라인에 — language=korean 옵션을 추가
$bindir/safe_mysqld –user=$mysql_daemon_user –pid-file=$pid_file \\
–datadir=/usr/local/mysql/var –language=korean &
# chmod 700 mysql.server
# cp -p mysql.server /usr/bin
# cp mysql.server /etc/rc.d/init.d/mysql
# ln -s /etc/rc.d/init.d/mysql /etc/rc.d/rc3.d/S95mysqld
이와 같이 해주면 된다. 주의할것은 S95mysqld 에서 95 번호는 85~99 사이에
임시로 정하되 중복되면 안된다.
일반적으로 mysql 의 시작과 중지는 그냥..
# mysql.server start
# mysql.server stop
이런식으로 하면된다. (System V 계열에서만 적용)
2.9.1.5. 바이너리로 설치하기
Mysql 에서는 소스 코드 배포 이외에 각각의 플랫폼에 맞게 소스코드를 컴파일
하여 바이너리 형태로 Mysql을 배포합니다. 바이너리로 설치할 경우 간편할뿐
아니라 설치시에도 시간을 단축할수 있습니다. 일반적으로 프로그램을 설치시
는 소스로 설치하길 권장하지만 Mysql 의 경우는 최적화된 configure 옵션이
아니라면 바이너리로 설치하는것이 20%~30% 정도 더 빠르다고 합니다.
그이유는 Mysql 개발자들이 가장 최적화된 옵션을 이용하여 바이너리 배포본을
만들기 때문입니다.
http://www.mysql.com/downloads/ 에서 자신의 플랫폼에 맞는
바이너리를 다운
로드 합니다.
# cp Mysql-Version-OS.tar.gz /usr/local // 설치디렉토리로 복사
# tar xzvf Mysql-Version-OS.tar.gz // 압축해제
# mv Mysql-Version-OS mysql // mysql 디렉토리명 변경
# cd mysql // mysql 디렉토리 이동
# scripts/mysql_install_db // 기본 DB 생성
# chown -R mysql. /usr/local/mysql/data
# bin/safe_mysql -u mysql & // Mysql 데몬 실행
2.9.1.6 Mysql 업그레이드 시 주의할 점
Mysql 을 업그레이드 하다 보면 여러가지 문제점에 부딪히게 된다.
이전 버젼의 데이터와의 호환문제와 PHP와 Mysql 혹은 Perl 과 Mysql 연동시
기존의 PHP 나 Perl 이 문제없이 잘 실행되는지등의 문제가 있다.
따라서 Mysql을 업그레이드시엔 꼭 이전 버젼의 Mysql 데몬인 mysqld 와 라이브러리
를 백업해 두는것이 좋다. 문제가 발생할땐 이전의 mysqld 파일만 libexec/mysqld
로 대체해 준다. 그럼..왠만한거는 무난히 잘 호환될것이다. 이밖에 Perl 프로그램
에서 문제가 생기면 새로 DBI 모듈을 설치해준다. 기타 다른 프로그램에서도
라이브러리가 변경됨으로 해서 문제가 발생할수도 있다. 이때는 백업해둔 라이브러리
를 lib 밑에 복사함으로 해결할수 있다.
새로운 Mysql을 설치하면서 charset 을 변경하였을 경우엔 기존의 테이블들을
# myisamchk -r -q 명령어를 이용하여 인덱스를 변경해 주어야 한다.
2.9.2 Mysql Log 파일 관리 하기
Mysql 의 로그 파일은 다음과 같이 크게 3종류가 있습니다.
1. 에러로그
2. 일반적인 로그
3. UPDATE 로그
첫번째 에러 로그는 hostname.err 의 이름으로 서버 실행시 에러를 기록하는 파일입
니다. 두번째 로그파일은 mysql 에 접근하는 사용자와 그들이 파일과 관련된 쿼리를
실행할 경우에 기록되는 로그 파일로 /usr/local/mysql/var 밑에 host_name.log 으로
저장이 되어집니다. Mysql 데이터에 파일을 기록하므로 파일과 관련된 쿼리는 DB 생
성/삭제 , 테이블 생성/삭제 , 레크드 삽입/갱신 이 있습니다.
이 로그 파일은 Mysql 실행시 –log 옵션을 주어 활성화 시키면 된다.
# /usr/local/mysql/bin/safe_mysqld –log &
업데이터로그는 테이블이 변경될때마다 해당 쿼리가 기록 됩니다. 기본적으로 활성
화 되지 않고 Mysql 실행시 –log-update 옵션으로 가능하다.
# /usr/local/mysql/bin/safe_mysql –log-update &
업데이터 로그는 /usr/local/mysql/var 밑에 host_name.00X 식으로 서버가 다시
실행되거나 mysqladmin reflesh 혹은 mysqladmin flush-logs 명령을 내릴때마다
뒤의 번호가 1씩 증가 한다. 혹은 –log-update=mysql.log 와 같이 로그파일명을
정해줄수도 있다. Update 로그는 update 쿼리만 저장하거 같지만 ..
delete , create 등의 쿼리도 모두 저장한다.
mysql 의 사용량이 많은 사이트는 이런 로그파일이 쌓이므로 해서 디스크 용량에
문제가 생길수 있다. 관리자는 수시로 점검하여 삭제를 해어야 한다.
로그 파일을 관리하는 방법으로는 두가지가 있다.
먼저 /usr/local/mysql/share/mysql/mysql-log-rotate 파일을 이용하는 방법과
간단한 스크립트를 작성하여 cron 에 등록한뒤 관리하는 방법이 있다.
/usr/local/mysql/share/mysql/mysql-log-rotate 파일을 이용하는 방법은 ..
–log-update=mysqld.log 와 같이 로그파일을 정해서 관리할때 이용하면 된다.
# vi /usr/local/mysql/share/mysql/mysql-log-rotate
————————————————————————-
—-
# This logname is set in mysql.server.sh that ends up in /etc/rc.d/init.d/mysql
#
# If the root user has a password you have to create a
# /root/.my.cnf configuration file with the following
# content:
#
# [mysqladmin]
# password = <secret>
# user= root
#
# where “<secret>” is the password.
#
# ATTENTION: This /root/.my.cnf should be readable ONLY
# for root !
/usr/local/mysql/var/mysqld.log {
# create 600 mysql mysql
notifempty
daily
rotate 3
missingok
compress
postrotate
# just if mysqld is really running
if test -n “`ps acx|grep mysqld`”; then
/usr/local/mysql/bin/mysqladmin flush-logs
fi
endscript
}
————————————————————————-
—
위의 파일을 /etc/logrotate.d 디렉토리에 복사만 하면 알아서 로테이트 하게 된다.
단..로그파일을 교체한후 mysqladmin flush-logs 를 적용하므로 root 홈디렉토리에
.my.cnf 파일을 만든후 MySQL 의 root 사용자의 암호와 사용자 명을 적어주어야 한
다.
vi /root/.my.cnf
————————————–
[mysqladmin]
password = xxxxxxxxx
user = root
————————————–
정상적인 로그 교체의 확인은 다음과 같이 하면 된다.
# logrotate -f mysql-log-rotate
이밖에 –log-update 등의 옵션을 이용하면 수시로 로그파일의 뒤에 001,002 씩으로
번호가 증가 되면서 저장이 되므로 별도의 스크립트를 작성하여 관리해야 한다.
이는 각자 머리를 잘 짜면 될거 같다.
#!/bin/sh
find /usr/local/mysql/var -name “*.[0-9]*” -type f -mtime +3 -exec rm -f {} \\;
/usr/local/mysql/bin/mysqladmin flush-logs
위와 같은 만들면 된다. 이는 “3일 지난 파일은 지워라” 로 cron 에 등록한뒤 적절한
시간마다 실행해주면 된다.
2.9.3 Mysql 설치 시 발생 문제 해결 하기
보통 솔라리스에서 gcc 를 이용하여 컴파일 하는 경우 warning 하나 없이
설치가 가능합니다. 하지만 이외의 시스템에서는 헤더 파일이 조금씩 다르
기 때문에 warning 메세지가 간혹 나타나기도 한다.
보통 컴파일시 생기는 문제는 컴파일 단계에서 configure 명령을 여러번
내릴 경우 발생합니다.
confiure 명령을 내리면 configure 의 결과를 config.cache파일에저장한
다음에 다시 configure를 실행할때 시간을 절약하기 위하여 이전의
config.cache 내용을 읽게 되는데 이때 시스템 환경이 바뀌었을때는 이전의
config.cache 내용을 읽으므로 error 가 나게 된다. 이때는 config.cache
파일의 유무를 확인한후 지워버린뒤 새로 configure 를 실행해준다.
컴파일시 생기는 다른 문제로는 sql_yacc.cc 파일을 컴파일 하는 도중
다음과 같은 에러가 나는 경우가 있다.
Internal compiler error: program cclplus got fata signal 11
또는
Out out virtual memory
또는
Virtual memory exhausted.
sql_yacc.cc 파일은 인라인 함수(Inline Function)를 사용하므로 매우 많은
메모리를 필요로 합니다. 따라서 이 문제는 대개 메모리나 스왑 영역이 부
족한 경우에 생기게 됩니다. 이문제를 해결하기 위해서는 configure 를 적용
할 때 다음과 같이 –with-low-memory 옵션을 주면 됩니다.
# ./configure –with-low-memory
GNU make version 이 낮을 경우 생기는 에러 내용이다.
making all in mit-pthreads make: Fatal error in reader: Makefile, line
18: Badly formed macro assignment
또는
make: file ‘Makefile’ line 18: Must be separator
또는
pthread.h: No such file or directory
이와 같은 메세지와 함께 에러가 발생하면 최신 make 를 설치하길 바란다.
이밖에 GNU gcc 버젼 문제로 생기는 경우도 있다.
client/libmysql.c:273 parse error before ‘__attribute__’
GNU gcc version 이 2.8.1 이하인 경우는 반드시 업그레이드 하길 바란다.
이밖에 컴파일시 ‘C++ compiler connot create executables’ 라는 메세지가
발생하는 경우도 있는데 이는 Mysql 이 C++ 을 컴파일러로 사용하는데 Mysql
설치하려는 시스템에서는 gcc 를 C++ 컴파일러로 사용하는 경우에 발생하는
에러 입니다. 이 문제를 해결하기 위해서는 g++,libg++,libstdc++ 을 설치해
야 한다. gcc 를 C++ 의 컴파일러로 그대로 사용하는 방법도 있는데 이는
configure 시 다음과 같이 gcc 를 컴파일러로 사용하겠다는 옵션을 적어주면
된다.
# CXX=”gcc -O3″ ./configure
Mysql 데몬을 실행시 발생하는 대표적인 에러는 다음과 같다.
mysqld: Can’t find file: ‘host.frm’
이는 mysql 설치후 DB 를 생성을 하지 않았을때 발생한다. mysql 설치후
반드시 초기 DB 를 생성해 주어야 한다. 다음과 같이 ..
# /usr/local/mysq/bin/mysql_install_db
Can’t start server: Bind on TCP/IP port: Address already in use
위의 메세지는 Mysql 이 사용하는 port 를 이미 다른곳에 사용중에 있을때
발생하는 메세지 이다. mysql 는 기본적으로 3306 포트를 사용하는데 이 포
트를 다른 서비스가 사용중이라면 다음과 같이 다른 포트를 사용하여 포트
충돌을 피해야 한다.
# /usr/local/mysql/bin/safe_mysqld -P3333 &
이밖에도 여러가지 에러와 문제가 발생할수 있다.
이렇땐 /usr/local/mysql/var/hostname.err 파일을 참조하여 문제를 해결
하면 된다.
2.9.4 Mysql 옵션 my.cnf 사용 방법
옵션 파일은 다양한 옵션을 프로그램 실행시 지정하지 않고 파일에 저장하여
좀더 편리하게 Mysql 을 사용하도록 합니다. 옵션 파일에는 크게 두가지가 있
는데 ‘서버에 관련된 옵션’ 과 ‘개인 사용자에게 관련된 옵션’ 이렇게 두개가
있습니다.
옵션파일의 위치로는 다음과 같다.
▶ /etc/my.cnf : Mysql 에 관련된 모든 옵션을 저장하는 옵션파일
▶ DATADIR/my.cnf : Mysql 서버에 관련된 옵션만 지정할수 있는 옵션
▶ $HOMEDIR/.my.cnf : 개인 사용자의 옵션을 지정할수 있는 옵션 파일
옵션 파일 사용법
# : 주석을 의미합니다.
[group] : 옵션을 지정할 프로그램 또는 프로그램 그룹을 지정합니다.
[client] : 클라이언트 프로그램에 해당하는 옵션 적용
option=value : 커맨드 모드에서 mysql –option=value 와 동일하게 적용
set-variable = variable=value :
커멘트 모드에서 –set-variable variable=value 와 동일하고 Mysql 서버의
각종 변수 옵션을 줄때 사용됩니다.
간략한 예제입니다.
/etc/my.cnf
—————————————————
[client]
port=3306
socket=/tmp/mysql.sock
[mysqld]
port=3306
socket=/tmp/mysql.sock
set-variable = key_buffer_size=16M
set-variable = max_allowed_packet=1M
[mysqldump]
quick
————————————————–
$HOMEDIR/.my.cnf
————————————————–
[client]
user=user_name
password=my_password
————————————————–
.my.cnf 는 위의 예제와 같이 자신의 계정의 Mysql 접속 정보가 저장된다.
그러므로 다른 사람에게 공개되면 안된다. 파일의 퍼미션을 600 으로 주어
서 정보 유출을 막도록 한다.
$ chmod 600 $HOMEDIR/.my.cnf
2.9.5 Mysql 관리자 패스워드 관리
MySQL 초기 설치시 관리자 암호는 설정 되어져 있지 않다.실질적으로
서비스 할경우엔 반드시 관리자(root) 암호를 설정해야 한다.
root 암호 설정하는 방법에는 3가지가 있다.
1. UPDATE 문 이용하기
2. SET PASSWORD 이용하기
3. mysqladmin 이용하기
▶ UPDATE 문 이용하기
$ mysql -u root mysql
mysql> update user set password=password(‘new-passwd’) where user=’root’;
mysql> flush privileges;
update 문 이용하여 암호를 변경할땐 꼭 flush privileges; 를 실행
하여 변경된 내용을 적용해야 한다. MYSQL 에서 사용자 권한에 관한
내용은 MYSQL 실행시 메모리에 불러놓고 이용되는데 이에 관해 변경
된 내용이 있을땐 반드시 서버에 변경된 내용을 갱신하라는 명령을
전달해야 한다.
▶ SET PASSWORD 이용하기
mysql> set password for root=password(‘new-passwd’);
이 방법은 flush privileges 가 필요 없다.
▶ mysqladmin 이용하기
root 암호 초기 설정 시 :
$ mysqladmin -u root password new-passwd
root 암호 변경 시 :
$ mysqladmin -u root -p password new-passwd
Enter password:
2.9.6 Mysql 사용자 추가 하기
Mysql 를 작업하다 보면 root 로만 작업하진 않을것이다.
여러사람에게 각각의 DB 를 제공하기 위해서는 반드시 각 DB별로
사용자를 생성해야 한다.
Mysql 에 사용자를 추가하는 방법에는 GRANT 를 이용하는 방법과 INSERT
를 이용하는 방법이 있다.
$ mysql -u root -p mysql ( 먼저 mysql DB 에 접속하자.)
Enter password: ********
mysql> grant all privileges on *.* to alang@localhost
-> identified by ‘password’ with grant option;
위의 내용은 localhost 의 alang 에게 (to alang@localhost ) 모든 테이블에
( *.* ) 모든 권한을 ( all privleges ) 부여하는것을 의미 한다.
참고로 grant 를 이용하여 사용자 추가할때 flush privileges 를 할 필요 없음.
위의 권한을 INSERT 구문으로 하면..
mysql> insert into user values(‘localhost’,’alang’,password
(‘password’),
-> ‘Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’);
mysql> flush privileges;
위와 같이 한 사용자가 모든 DB 에 접근해선 곤란하다. 보통 한 사용자에게
하나의 DB 에만 접근 가능하게 하는것이 표준이다.
mysql> grant all privileges on test.* to alang@localhost
-> identified by ‘password’;
웹호스팅 업체와 같은 곳에서 사용자와 DB를 추가 하는 예를 들어보다.
# mysql -u root -p mysql ( root MYSQL 에 접속 )
mysql> create database DB ( 먼저 추가될 사용자가 사용할 DB 생성 )
mysql> grant all privileges on DB.* to USER@localhost
-> identified by ‘password’; ( 생성된 DB 에
USER 사용자 권한주기 )
이와 같은 방법으로 사용자를 추가 할수 있다.
2.9.7 Mysql 기본 SQL 문 사용 방법
– 데이타 베이스 생성과 삭제
데이터베이스 생성및 삭제에 대해 간단히 알아보자.
데이터 베이스 생성과 삭제에 관련된 SQL 문은 create 와 drop 다.
create database 를 통해 생성하고, drop database 통해 삭제한다.
mysql> show databases;
+———–+
| Database |
+———–+
| board |
| shopdb |
| sysmng |
| test |
| test1 |
+———–+
5 rows in set (0.00 sec)
먼저 어떤 DB 가 있는지 살펴 본다.
mysql> create database test2;
Query OK, 1 row affected (0.01 sec)
create database 를 이용하여 test2 란 DB 를 생성했다.
다시 show databases 를 이용해 확인하자.
mysql> show databases;
+———–+
| Database |
+———–+
| board |
| shopdb |
| sysmng |
| test |
| test1 |
| test2 |
+———–+
6 rows in set (0.01 sec)
mysql> drop database test2;
Query OK, 0 rows affected (0.00 sec)
drop database 를 통해 test2 DB 를 삭제하였다.
mysql> show databases;
+———–+
| Database |
+———–+
| board |
| shopdb |
| sysmng |
| test |
| test1 |
+———–+
5 rows in set (0.01 sec)
이밖에 데이타 베이스의 생성과 삭제는 mysqladmin 이란 명령어를 통해서
도 가능하다.
$ mysqladmin -u root -p create test2 (test2 DB 생성)
$ mysqladmin -u root -p drop test2 (test2 DB 삭제)
이와 같이 데이터베이스를 생성하면 /usr/local/mysql/var 에 생성된 데이터
베이스 명의 디렉토리가 생성되어진다. 그리고 생성된 데이터베이스에서
테이블을 생성하면 생성된 테이블 이름의 파일이 3개가 만들어 지는데 다음과
같다.
테이블이름.frm : 테이블 정의에 대한 정보
테이블이름.ISM : 인덱스 관련 정보
테이블이름.ISD : 데이터 내용
이와 같이 SQL 문으로 인해 만들어진 데이터베이스는 파일로 만들어져 저장
되어진다.
– Mysql SQL 기본 관리
지금까지 다루어온 내용을 기본으로 하여 나만의 데이터 베이스를 만들어
보도록 하겠다.
먼저 앞으로 사용할 DB 를 생성한다.
mysql> create database test1;
Query OK, 1 row affected (0.00 sec)
(test1 이란 DB 를 생성하였다. )
이와 같이 DB 를 생성하였으면 사용하기 전에 이 DB 에 대한 사용권한을
정해 주어야 한다. 즉 어떤 사용자가 어떠한 권한을 이 DB 에서 행할수
있는지를 정해 주어야 한다.
mysql> grant all on test1.* to alang;
Query OK, 0 rows affected (0.01 sec)
test1 이란 DB 의 모든 사용권한을 alang 이란 사용자에게 준다는 뜻이다.
데이터베이스를 생성하면 앞에서 배운바와 같이 /usr/local/mysql/var
에 새로 생성한 DB 명과 같은 디렉토리가 생길것이다. 확인한후 정상적
으로 생성이 되어져 있으면 이제 DB 내에 데이타를 입력할 준비가 완료
되어진것이다.
먼저 DB 에 데이터를 입력하기 전에 꼭 짚고 넘어가야할 사항이 있다.
데이터베이스에서 데이터를 입력하는데는 열과 행의 형식막?데이터가
입력되어진다. 열을 ‘필드’라고 하고 행을 ‘레코드’라고 부른다.
NO NAME EMAIL SEX
1 서진우 alang@clunix.com m
2 박창현 macs911@clunix.com m
3 신상철 scsinn@clunix.com m
4 김승진 jinee@clunix.com m
5 김수경 invoice@clunix.com w
이와 같은 데이터를 입력할려고 한다.
NO,1,2,3,4,5 와 같은 열을 필드라고 한다.
1,서진우,alang@clunix.com,m 와 같은 행을 레코드라고 한다.
레코드가 많아 질수록 데이터의 중복이 발생할 우려가 생긴다.
만일 레코드중 고유 식별 데이터가 없다면 검색시 정확한 검색을 할수가
없다. 그렇기 때문에 데이터베이스를 처음에 설계할때 반드시 고유식별
을 해줄수 있는 필드를 만들어 놓아야 한다. 이를 데이터 베이스에서는
Key(Primary Key) 라고 한다. Key 와 같은 필드엔 반드시 데이터가 들어
있어야 한다. 반대로 필드중 정보를 공개할수 없거나 비워두어도 되는
특성을 가진 필드엔 NULL 값을 가지게 된다. 이제 이론은 그만하고 진짜
로 테이블을 생성해 보도록 한다.
테이블생성은 아주 쉽다. 각 필드에 들어가는 데이터의 자료형과 함께
create table 문을 적어주면 된다.
테이블 생성 형식 :
————————————-
create table 테이블명 (
필드이름1 (Data형) NOT NULL
필드이름2 (Data형)
..
.
PRIMARY KEY (필드이름);
————————————-
NOT NULL 은 반드시 존재해야할 데이터의 경우에 지정한다.
즉 PRIMARY KEY로 사용될 필드에 대해서는 Date type 가 반드시 NOT NULL
이 되어야 겠다.
진짜로 만들어 보자.
mysql> create table member (
-> NO INT NOT NULL,
-> NAME VARCHAR(30),
-> EMAIL VARCHAR(50),
-> SEX VARCHAR(2),
-> PRIMARY KEY (NO));
Query OK, 0 rows affected (0.00 sec)
에러 없이 처리가 무사히 되었다면 show table 과 desc 를 이용하여 테이
블이 정상적으로 생성이 되었는지를 확인하자.
mysql> show tables;
+—————–+
| Tables_in_test1 |
+—————–+
| member |
+—————–+
1 row in set (0.00 sec)
mysql> desc member;
+——-+————-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+————-+——+—–+———+——-+
| NO | int(11) | | PRI | 0 | |
| NAME | varchar(30) | YES | | NULL | |
| EMAIL | varchar(50) | YES | | NULL | |
| SEX | varchar(2) | YES | | NULL | |
+——-+————-+——+—–+———+——-+
4 rows in set (0.00 sec)
훌륭하게 생성이 되었다.
너무 쉽게 했다고 생각 되어지면..지워버리도록 하자..^^;;
mysql> drop table member;
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;
Empty set (0.00 sec)
아주 깨끗하게 지워졌다.
하지만 앞으로의 데이터 입력구문을 배우기 위해서는 테이블이 꼭 필요하다.
다시 입력하도록 한다. (복습…복습..복습…^^;;;)
다시 입력하기 전에 알아 두고 넘어가자.
데이터 형으로 너무나 많은 종류가 있는데 처음에는 대표적인 몇가지만 알
아두고 나중에 자세히 다루기로 하자.
INT : 4byte 정수
CHAR (M) : M개의 문자
VARCHAR (M) : 최대 M개를 넘지 않는 문자
TEXT : 최대 65535 개의 문자
그럼 다음엔 데이터 입력에 대해 살펴보도록 하겠다.
– 데이터 입력
테이블에 데이터를 입력하는 방법엔 insert 문과 load data 문을 사용할수
있다. 먼저 insert 문을 이용하여 데이터를 입력해 보도록 한다.
형식은 아래와 같다.
형식)
insert into 테이블명 (필드명1,필드명2,…) values (“데이터1″,”데이터2”,..);
실제로 입력해 보자.
mysql> insert into member (NO,NAME,EMAIL,SEX) values
-> (“1″,”서진우”,”alang@clunix.com”,”m”);
Query OK, 1 row affected (0.00 sec)
별다른 에러 없이 처리가 되었으면 재대로 입력이 되었는지 살펴 보자.
테이블의 내용을 검색하는데는 앞에 언급한바와 같이 select 구문을 이용한다.
형식)
select 검색필드명.. from 테이블명
mysql> select NO,NAME,EMAIL,SEX from member;
+—-+——–+—————–+——+
| NO | NAME | EMAIL | SEX |
+—-+——–+—————–+——+
| 1 | 서진우 | alang@clunix.com | m |
+—-+——–+—————–+——+
1 row in set (0.00 sec)
select 구문에서 모든 필드값을 검색할때 아스키 문자를 사용할수 있다.
mysql> select * from member;
+—-+——–+—————–+——+
| NO | NAME | EMAIL | SEX |
+—-+——–+—————–+——+
| 1 | 서진우 | alang@clunix.com | m |
+—-+——–+—————–+——+
1 row in set (0.00 sec)
load data 는 데이터베이스 테이블을 초기화 할때 주로 사용되어 진다.
먼저 입력할 데이터를 필드와 레코드에 맞주어 정렬하여 text 파일로 만들
어 놓는다.
member.txt
———————————————-
0 서진우 alang@clunix.com m
1 박창현 macs911@clunix.com m
2 신상철 scsinn@clunix.com m
3 김승진 jinee@clunix.com m
4 김수경 invoice@clunix.com w
———————————————-
텍스트 파일을 만들때 반드시 “방향키(->)”를 사용하여 데이터를 구분해야
한다. space bar 를 사용해선 절대 안된다. 명심해야 한다. 그리고 마지막
행에 공백이 있어서도 안된다. 이 점만 명심하고 데이터 파일을 만들면 된
다. 리눅스의 vi 편집기로 작성할때는 tab 을 사용하여 구분하면 됩니다.
mysql> load data local infile “member.txt” into table member;
mysql> select * from member;
+—-+——–+——————-+——+
| NO | NAME | EMAIL | SEX |
+—-+——–+——————-+——+
| 0 | 서진우 | alang@clunix.com | m |
| 1 | 박창현 | macs911@clunix.com | m |
| 2 | 신상철 | scsinn@clunix.com | m |
| 3 | 김승진 | jinee@clunix.com | m |
| 4 | 김수경 | invoice@clunix.com | w |
+—-+——–+——————-+——+
이와 같이 많은 데이터를 한번에 입력할수가 있다.
– 데이터 수정하기
저장된 데이터에 잘못된 부분이 있어서 수정할 경우에도 두가지 방법이
있다. delete 구문을 이용하여 테이블에 입력된 모든 데이터를 지워버리고
load data 문을 이용하여 다시 입력하는 방법과 update 문을 이용하는 방법
이 있다. 먼저 delete 와 load data 를 이용하는 방법에 대해 알아보자.
mysql> delete from member;
mysql> load data local infile “member.txt” into table member;
형식)
delete from 테이블명 ;
위와 같이 명령을 하면 테이블 내의 모든 데이터가 삭제 된다. where 구문
을 이용하여 부분적으로 삭제도 가능하나, where 구문은 나중에 다루도록
하겠다.
이제 update 문을 이용하는 방법을 알아보자.
형식)
update 테이블명 set 해당 필드명=”수정데이터” where 조건문
mysql> update member set EMAIL=”alang at
sysmng.com”
-> where NO=”0″;
Query OK, 1 row affected (0.00 sec)
일치하는 Rows : 1개 변경됨: 1개 경고: 0개
위의 구문은 NO 가 0 인 필드에서 EMAIL 값을 alang at
sysmng.com 으로 변경
한다는 의미를 갖는다.
재대로 변경이 되었는지 확인을 해보도록 하자.
mysql> select * from member;
+—-+——–+——————-+——+
| NO | NAME | EMAIL | SEX |
+—-+——–+——————-+——+
| 0 | 서진우 | alang@sysmng.com | m |
| 1 | 박창현 | macs911@clunix.com | m |
| 2 | 신상철 | scsinn@clunix.com | m |
| 3 | 김승진 | jinee@clunix.com | m |
| 4 | 김수경 | invoice@clunix.com | w |
+—-+——–+——————-+——+
5 rows in set (0.00 sec)
이로써 데이터 변경에 대해서 마치도록 하겠습니다.
다음편엔 select 구문에 대해서 보다 자세하게 알아 보도록 하겠습니다.
– SELECT 문 사용하기
데이터양이 많이 지면..막연히 [ select * from table_name ] 와 같이 검색
하면..눈과 기억력이 무척 좋아야 겠죠..!! 그렇기 때문에 대량의 DB 를 검
색할땐 자신이 원하는 내용만을 검색할수 있는 select 구문을 이용하여야
합니다. 이제 select 구문과 같이 사용할수 있는 조건문에 대해 알아 보도
록 하겠습니다.
1. 원하는 행만 검색하기
원하는 행 검색이란..검색하고자 하는 컬럼 값을 포함하는 행만을 검색하
도록 하는 방법이다.
일단 member 테이블의 모든 내용을 검색합니다.
mysql> select * from member;
+—-+——–+——————-+——+——+——–+
| NO | NAME | EMAIL | SEX | AREA | HOB |
+—-+——–+——————-+——+——+——–+
| 0 | 서진우 | alang@clunix.com | m | 서울 | 운동
|
| 1 | 박창현 | macs911@clunix.com | m | 서울 | 운동
|
| 2 | 김수경 | invoice@clunix.com | w | 서울 |
컴퓨터 |
| 3 | 신상철 | ttt@clunix.com | m | 경기 | 컴퓨터 |
| 4 | 김승진 | bbb@clunix.com | m | 서울 | 컴퓨터 |
| 5 | 이필유 | ccc@clunix.com | w | 경기 | 요리 |
| 6 | 우서준 | ddd@clunix.com | m | 서울 | 운동 |
+—-+——–+——————-+——+——+——–+
7 rows in set (0.00 sec)
이번엔 회원중 여자분 만을 검색하도록 하겠습니다.
mysql> select * from member where sex=’w’;
+—-+——–+——————-+——+——+——–+
| NO | NAME | EMAIL | SEX | AREA | HOB |
+—-+——–+——————-+——+——+——–+
| 2 | 김수경 | invoice@clunix.com | w | 서울 |
컴퓨터 |
| 5 | 이필유 | ccc@clunix.com | w | 경기 | 요리 |
+—-+——–+——————-+——+——+——–+
2 rows in set (0.00 sec)
여기서 where 구문을 이용하여 원하는 행만을 검색할수 있는 예제이다.
위의 구문을 풀이 하면 member 란 테이블에서 sex 컬럼값이 w 인 행만
검색하란 의미이다.
2. 원하는 열만 검색하기
이번엔 원하는 열만 검색하는 방법이다. 원하는 열 검색이란..
검색하고자 하는 컬럼값만을 출력하도록 하는 것이다.
즉 만일 회원들의 이름만 검색하고자 한다. 혹은 회원들의 email 만
검색하고자 한다.. 이럴경우 사용하는 방법이다.
컬럼중 NAME 컬럼열만 검색
mysql> select name from member;
+——–+
| name |
+——–+
| 서진우 |
| 박창현 |
| 김수경 |
| 신상철 |
| 김승진 |
| 이필유 |
| 우서준 |
+——–+
7 rows in set (0.00 sec)
컬럼중 EMAIL 컬럼열만 검색
mysql> select email from member;
+——————-+
| email |
+——————-+
| alang@clunix.com |
| macs911@clunix.com |
| invoice@clunix.com |
| ttt@clunix.com |
| bbb@clunix.com |
| ccc@clunix.com |
| ddd@clunix.com |
+——————-+
7 rows in set (0.00 sec)
컬럼중 NAME 과 EMAIL 만 검색
mysql> select name,email from member;
+——–+——————-+
| name | email |
+——–+——————-+
| 서진우 | alang@clunix.com |
| 박창현 | macs911@clunix.com |
| 김수경 | invoice@clunix.com |
| 신상철 | ttt@clunix.com |
| 김승진 | bbb@clunix.com |
| 이필유 | ccc@clunix.com |
| 우서준 | ddd@clunix.com |
+——–+——————-+
위와 같이 [ select 검색컬럼명 from 테이블명 ] 형식으로 원하는 열만
검색할수 있다.
원하는 컬럼가 여러개 일경우는 (,) 로 구분하면 된다.
고급 SELECT 문 사용하기..
1. 중복행 제거
각 컬럼에서 중복된 행을 없애기 위하여 select 구문의 “검색컬럼명”
앞에 distinct 를 넣어 주면 된다.
mysql> select distinct sex from member;
+——+
| sex |
+——+
| m |
| w |
+——+
sex 컬럼값에 중복된 행을 제거하고 대표대는 값만을 출력하게 된다.
수학의 교집합에 해당하는 것이다.
mysql> select distinct sex,name from member;
+——+——–+
| sex | name |
+——+——–+
| m | 서진우 |
| m | 박창현 |
| w | 김수경 |
| m | 신상철 |
| m | 김승진 |
| w | 이필유 |
| m | 우서준 |
+——+——–+
위의 예문은 distinct 를 이용하여 컬럼값을 그룹별로 묶어서 출력하는
예이다.
2, where 구문에서 논리 연산과 관련 연산 사용하기
만일 where 구문 사용에서 여러가지 연산구문을 이용하여 다양한 검색을 행할수
있다. 사용되는 기호엔 or, and, =, !=, <, > 등이 있다.
no 컬럼값이 1 혹은 3 인 행을 검색하는 구문예이다.
mysql> select * from member where no=’1′ or no=’3′;
+—-+——–+——————-+——+
| NO | NAME | EMAIL | SEX |
+—-+——–+——————-+——+
| 1 | 박창현 | macs911@clunix.com | m |
| 3 | 김승진 | jinee@clunix.com | m |
+—-+——–+——————-+——+
no 컬럼값이 1보다 크고 4보다 작은 행은 검색하는 구문예이다.
mysql> select * from member where no < 4 and no > 1 ;
+—-+——–+——————+——+
| NO | NAME | EMAIL | SEX |
+—-+——–+——————+——+
| 2 | 신상철 | scsinn@clunix.com | m |
| 3 | 김승진 | jinee@clunix.com | m |
+—-+——–+——————+——+
2 rows in set (0.00 sec)
no 컬럼값이 1 인 필드를 제외한 나머지 필드를 검색한다.
mysql> select * from member where no != ‘1’;
+—-+——–+——————-+——+——+——–+
| NO | NAME | EMAIL | SEX | AREA | HOB |
+—-+——–+——————-+——+——+——–+
| 0 | 서진우 | alang@clunix.com | m | 서울 | 운동
|
| 2 | 김수경 | invoice@clunix.com | w | 서울 |
컴퓨터 |
| 3 | 신상철 | ttt@clunix.com | m | 경기 | 컴퓨터 |
| 4 | 김승진 | bbb@clunix.com | m | 서울 | 컴퓨터 |
| 5 | 이필유 | ccc@clunix.com | w | 경기 | 요리 |
| 6 | 우서준 | ddd@clunix.com | m | 서울 | 운동 |
+—-+——–+——————-+——+——+——–+
6 rows in set (0.00 sec)
3. 내림차순, 오름차순 정렬 검색
DB 를 검색하다 보면 테이블에 저장된 값들을 컬럼별로 정렬해서 출력해야 할
경우가 생긴다. 이때 사용되는것이 [ ORDER BY ] 이다.
ORDER BY 컬럼명 ASC : 내림차순(정)
ORDER BY 컬럼명 DESC : 오름차순 (역)
내림차순에서 ASC 는 생략 가능하다.
차순은 영문은 abc… 한글은 ㄱ,ㄴ,ㄷ.. 숫자는 1,2,3.. 순으로 정해진다.
mysql> select * from member order by no asc;
+—-+——–+——————-+——+——+——–+
| NO | NAME | EMAIL | SEX | AREA | HOB |
+—-+——–+——————-+——+——+——–+
| 0 | 서진우 | alang@clunix.com | m | 서울 | 운동
|
| 1 | 박창현 | macs911@clunix.com | m | 서울 | 운동
|
| 2 | 김수경 | invoice@clunix.com | w | 서울 |
컴퓨터 |
| 3 | 신상철 | ttt@clunix.com | m | 경기 | 컴퓨터 |
| 4 | 김승진 | bbb@clunix.com | m | 서울 | 컴퓨터 |
| 5 | 이필유 | ccc@clunix.com | w | 경기 | 요리 |
| 6 | 우서준 | ddd@clunix.com | m | 서울 | 운동 |
+—-+——–+——————-+——+——+——–+
7 rows in set (0.00 sec)
mysql> select * from member order by sex asc;
mysql> select * from member order by sex asc;
+—-+——–+——————-+——+——+——–+
| NO | NAME | EMAIL | SEX | AREA | HOB |
+—-+——–+——————-+——+——+——–+
| 0 | 서진우 | alang@clunix.com | m | 서울 | 운동
|
| 1 | 박창현 | macs911@clunix.com | m | 서울 | 운동
|
| 3 | 신상철 | ttt@clunix.com | m | 경기 | 컴퓨터 |
| 4 | 김승진 | bbb@clunix.com | m | 서울 | 컴퓨터 |
| 6 | 우서준 | ddd@clunix.com | m | 서울 | 운동 |
| 2 | 김수경 | invoice@clunix.com | w | 서울 |
컴퓨터 |
| 5 | 이필유 | ccc@clunix.com | w | 경기 | 요리 |
+—-+——–+——————-+——+——+——–+
7 rows in set (0.00 sec)
mysql> select * from member order by name;
+—-+——–+——————-+——+——+——–+
| NO | NAME | EMAIL | SEX | AREA | HOB |
+—-+——–+——————-+——+——+——–+
| 2 | 김수경 | invoice@clunix.com | w | 서울 |
컴퓨터 |
| 4 | 김승진 | bbb@clunix.com | m | 서울 | 컴퓨터 |
| 1 | 박창현 | macs911@clunix.com | m | 서울 | 운동
|
| 0 | 서진우 | alang@clunix.com | m | 서울 | 운동
|
| 3 | 신상철 | ttt@clunix.com | m | 경기 | 컴퓨터 |
| 6 | 우서준 | ddd@clunix.com | m | 서울 | 운동 |
| 5 | 이필유 | ccc@clunix.com | w | 경기 | 요리 |
+—-+——–+——————-+——+——+——–+
7 rows in set (0.00 sec)
위의 예제들은 각각 no,sex,name 컬럼들을 내림차순으로 정렬한것이다.
다음예는 오름차순으로 정렬을 해 보도록 하자.
mysql> select * from member order by no desc;
+—-+——–+——————-+——+——+——–+
| NO | NAME | EMAIL | SEX | AREA | HOB |
+—-+——–+——————-+——+——+——–+
| 6 | 우서준 | ddd@clunix.com | m | 서울 | 운동 |
| 5 | 이필유 | ccc@clunix.com | w | 경기 | 요리 |
| 4 | 김승진 | bbb@clunix.com | m | 서울 | 컴퓨터 |
| 3 | 신상철 | ttt@clunix.com | m | 경기 | 컴퓨터 |
| 2 | 김수경 | invoice@clunix.com | w | 서울 |
컴퓨터 |
| 1 | 박창현 | macs911@clunix.com | m | 서울 | 운동
|
| 0 | 서진우 | alang@clunix.com | m | 서울 | 운동
|
+—-+——–+——————-+——+——+——–+
7 rows in set (0.00 sec)
mysql> select * from member order by sex desc;
+—-+——–+——————-+——+——+——–+
| NO | NAME | EMAIL | SEX | AREA | HOB |
+—-+——–+——————-+——+——+——–+
| 2 | 김수경 | invoice@clunix.com | w | 서울 |
컴퓨터 |
| 5 | 이필유 | ccc@clunix.com | w | 경기 | 요리 |
| 0 | 서진우 | alang@clunix.com | m | 서울 | 운동
|
| 1 | 박창현 | macs911@clunix.com | m | 서울 | 운동
|
| 3 | 신상철 | ttt@clunix.com | m | 경기 | 컴퓨터 |
| 4 | 김승진 | bbb@clunix.com | m | 서울 | 컴퓨터 |
| 6 | 우서준 | ddd@clunix.com | m | 서울 | 운동 |
+—-+——–+——————-+——+——+——–+
7 rows in set (0.01 sec)
mysql> select * from member order by name desc;
+—-+——–+——————-+——+——+——–+
| NO | NAME | EMAIL | SEX | AREA | HOB |
+—-+——–+——————-+——+——+——–+
| 5 | 이필유 | ccc@clunix.com | w | 경기 | 요리 |
| 6 | 우서준 | ddd@clunix.com | m | 서울 | 운동 |
| 3 | 신상철 | ttt@clunix.com | m | 경기 | 컴퓨터 |
| 0 | 서진우 | alang@clunix.com | m | 서울 | 운동
| 1 | 박창현 | macs911@clunix.com | m | 서울 | 운동
| 4 | 김승진 | bbb@clunix.com | m | 서울 | 컴퓨터 |
| 2 | 김수경 | invoice@clunix.com | w | 서울 |
+—-+——–+——————-+——+——+——–+
7 rows in set (0.00 sec)
– ALTER 구문 사용하기
1. 필드 추가 하기
더 많은 데이터가 증가 되면서 필드의 개수를 추가 해야 할 경우가 종종
발생하게 된다. 이때 사용되는 구문이 alter 구문이다.
mysql> select * from member;
+—-+——–+——————-+——+——+——–+
| NO | NAME | EMAIL | SEX | AREA | HOB |
+—-+——–+——————-+——+——+——–+
| 0 | 서진우 | alang@clunix.com | m | 서울 | 운동
|
| 1 | 박창현 | macs911@clunix.com | m | 서울 | 운동
|
| 2 | 김수경 | invoice@clunix.com | w | 서울 |
컴퓨터 |
| 3 | 신상철 | ttt@clunix.com | m | 경기 | 컴퓨터 |
| 4 | 김승진 | bbb@clunix.com | m | 서울 | 컴퓨터 |
| 5 | 이필유 | ccc@clunix.com | w | 경기 | 요리 |
| 6 | 우서준 | ddd@clunix.com | m | 서울 | 운동 |
+—-+——–+——————-+——+——+——–+
7 rows in set (0.00 sec)
위의 출력문과 같이 현재 no,name,email,sex,area,bob 의 필드로 구성된
테이블이 member 이다. 여기에 나이에 관련된 age 필드를 추가 한다고
가정하면..
mysql> alter table member add age varchar(3);
Query OK, 7 rows affected (0.00 sec)
레코드: 7개 중복: 0개 경고: 0개
mysql> select * from member;
+—-+——–+——————-+——+——+——–+——+
| NO | NAME | EMAIL | SEX | AREA | HOB | age |
+—-+——–+——————-+——+——+——–+——+
| 0 | 서진우 | alang@clunix.com | m | 서울 | 운동
| NULL |
| 1 | 박창현 | macs911@clunix.com | m | 서울 | 운동
| NULL |
| 2 | 김수경 | invoice@clunix.com | w | 서울 |
컴퓨터 | NULL |
| 3 | 신상철 | ttt@clunix.com | m | 경기 | 컴퓨터 |
NULL |
| 4 | 김승진 | bbb@clunix.com | m | 서울 | 컴퓨터 |
NULL |
| 5 | 이필유 | ccc@clunix.com | w | 경기 | 요리 |
NULL |
| 6 | 우서준 | ddd@clunix.com | m | 서울 | 운동 |
NULL |
+—-+——–+——————-+——+——+——–+——+
7 rows in set (0.00 sec)
위와 같이 [ alter table member add age varchar(3) ] 구문을 사용하면
된다. alter 구문의 형식은 다음과 같다.
형식)
ALTER TABLE [테이블 이름] ADD [추가필드명] [변수타입]
위의 예제에서 보는 바와 같이 alter table 필드를 추가 하면 행당 필드
값은 무조건 NULL 로 표시된다.
2. 필드 삭제 하기
필요없는 필드를 제거 하는 것도 alter 구문으로 한다. 형식은 다음과
같다.
형식 )
ALTER TABLE [테이블 이름] DROP [삭제필드명]
mysql> alter table member drop age;
Query OK, 7 rows affected (0.00 sec)
레코드: 7개 중복: 0개 경고: 0개
mysql> select * from member;
+—-+——–+——————-+——+——+——–+
| NO | NAME | EMAIL | SEX | AREA | HOB |
+—-+——–+——————-+——+——+——–+
| 0 | 서진우 | alang@clunix.com | m | 서울 | 운동
| 1 | 박창현 | macs911@clunix.com | m | 서울 | 운동
| 2 | 김수경 | invoice@clunix.com | w | 서울 | 컴퓨터 |
| 3 | 신상철 | ttt@clunix.com | m | 경기 | 컴퓨터 |
| 4 | 김승진 | bbb@clunix.com | m | 서울 | 컴퓨터 |
| 5 | 이필유 | ccc@clunix.com | w | 경기 | 요리 |
| 6 | 우서준 | ddd@clunix.com | m | 서울 | 운동 |
+—-+——–+——————-+——+——+——–+
7 rows in set (0.00 sec)
3. 필드정보 변경하기
필드 속성을 변경할때도 alter 구문을 이용한다. 형식은 다음과 같다.
형식 )
ALTER TABLE [ 테이블 이름 ] CHANGE [현재 필드명] [변경할 필드명] [변수타입]
예) 필드명 변경
먼저 member 테이블 정보를 확인하자.
mysql> desc member;
+——-+————-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+————-+——+—–+———+——-+
| NO | int(11) | | PRI | 0 | |
| NAME | varchar(30) | YES | | NULL | |
| EMAIL | varchar(50) | YES | | NULL | |
| SEX | char(2) | YES | | NULL | |
| AREA | varchar(8) | YES | | NULL | |
| HOB | varchar(10) | YES | | NULL | |
| age | char(3) | YES | | NULL | |
+——-+————-+——+—–+———+——-+
7 rows in set (0.00 sec)
age 필드명을 “나이” 로 바꾸어 보자.
mysql> alter table member change age 나이 varchar(3);
Query OK, 7 rows affected (0.01 sec)
레코드: 7개 중복: 0개 경고: 0개
확인하자.
mysql> desc member;
+——-+————-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+————-+——+—–+———+——-+
| NO | int(11) | | PRI | 0 | |
| NAME | varchar(30) | YES | | NULL | |
| EMAIL | varchar(50) | YES | | NULL | |
| SEX | char(2) | YES | | NULL | |
| AREA | varchar(8) | YES | | NULL | |
| HOB | varchar(10) | YES | | NULL | |
| 나이 | char(3) | YES | | NULL | |
+——-+————-+——+—–+———+——-+
7 rows in set (0.00 sec)
예) 변수타입 변경
mysql> alter table member change 나이 나이 varchar(10);
Query OK, 7 rows affected (0.00 sec)
레코드: 7개 중복: 0개 경고: 0개
mysql> desc member;
+——-+————-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+————-+——+—–+———+——-+
| NO | int(11) | | PRI | 0 | |
| NAME | varchar(30) | YES | | NULL | |
| EMAIL | varchar(50) | YES | | NULL | |
| SEX | char(2) | YES | | NULL | |
| AREA | varchar(8) | YES | | NULL | |
| HOB | varchar(10) | YES | | NULL | |
| 나이 | varchar(10) | YES | | NULL | |
+——-+————-+——+—–+———+——-+
7 rows in set (0.00 sec)
예) 필드명과 변수타입 변경
mysql> alter table member change 나이 age varchar(3);
Query OK, 7 rows affected (0.00 sec)
레코드: 7개 중복: 0개 경고: 0개
mysql> desc member;
+——-+————-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+————-+——+—–+———+——-+
| NO | int(11) | | PRI | 0 | |
| NAME | varchar(30) | YES | | NULL | |
| EMAIL | varchar(50) | YES | | NULL | |
| SEX | char(2) | YES | | NULL | |
| AREA | varchar(8) | YES | | NULL | |
| HOB | varchar(10) | YES | | NULL | |
| age | char(3) | YES | | NULL | |
+——-+————-+——+—–+———+——-+
7 rows in set (0.00 sec)
이것을 Mysql 관리에 필요한 기본 SQL 문 설명을 마치도록 하겠습니다.
다음은 Mysql DB 백업 및 복구에 대해 알아보겠습니다.
2.9.8 Mysql DB 백업 및 복구
Database 에서 백업과 복구는 매우 중요한 부분이다.
시스템 불안및 외부 영향으로 데이타에 손상이 갔을때 백업이 재대로 되어
있지 않을경우 정말 막연할것이다. 이밖에 서버를 이전한다던지 기타 한꺼
번에 DB 전체를 재 갱신 할때 백업과 복구에 관련된 기술은 필수적이라 할
수 있다.
Mysql 에서 백업 명령어로 대표적인 것은 mysqldump 를 들수 있다.
2.9.8.1 백업하기
형식 )
mysqldump -u [ DB user ] -p [ password ] [ DB_name ] > backup_file_name
[alang@arhdev alang]$ mysqldump -u alang -p test1 > test.dat
Enter password:
위와 같이 Mysql 백업을 할수가 있다. 백업된 파일의 내용을 보도록 하자.
[alang@arhdev alang]$ vi test.dat
———————————————————————
# MySQL dump 8.13
#
# Host: localhost Database: test1
#——————————————————–
# Server version 3.23.37
#
# Table structure for table ‘member’
#
CREATE TABLE member (
NO int(11) NOT NULL default ‘0’,
NAME varchar(30) default NULL,
EMAIL varchar(50) default NULL,
SEX char(2) default NULL,
AREA varchar(8) default NULL,
HOB varchar(10) default NULL,
PRIMARY KEY (NO)
) TYPE=MyISAM;
#
# Dumping data for table ‘member’
#
INSERT INTO member VALUES (5,’이필유’,’ccc@clunix.com’,’w’,’경기’,’요리’);
INSERT INTO member VALUES (6,’우서준’,’ddd@clunix.com’,’m’,’서울’,’운동’);
————————————————————————–
이와 같이 DB 의 내용이 dump 되어져서 text 파일로 만들어져 있으면
백업이 무사히 되어진것이다.
만일 대용량의 DB 를 전체적으로 백업하기엔 부담스러울수도 있다.
그리고 필요한 부분은 일부분인데 전체로 백업하는것도 힘들것이다.
하지만 이런 문제로 크게 걱정할 필요는 없다.
mysqldump 는 원하는 table 만 백업할수도 있다.
형식)
mysqldump -u [DB_user] -p [password] [DB_name] [table_name] > backup_file_name
[alang@arhdev alang]$ mysqldump -u alang -p test1 member > member.sql
위 구문은 test1 DB 의 member 테이블만을 member.sql 파일로 백업 하는 구문이다.
2.9.8.2. 백업 파일 복구 하기
백업파일을 복구 하는 방법은 매우 간단하다.
앞에 mysql 접속하는 방법과 매우 유사 하다.
형식 )
mysql -u [ DB_ser ] -p [ DB_name ] < backup_file_name
예 )
mysql -u alang -p test2 < member.sql
위와 같이 백업파일을 복구 할수가 있습니다.
2.9.9 Mysql Replication으로 엔터프라이즈 Mysql 구축 하기
– svr1, svr2 서버에 mysql 을 버전은 3.23 이상으로 설치 한다.
– mysql replication 설정하기
svr1 서버를 master 서버로 지정 함.
svr2 서버를 slaver 서버로 지정 함.
– master 서버에 DB 복제를 해주는 역활의 User 를 만든다.
mysql > GRANT FILE ON *.* TO cluster@”%” IDENTIFIED BY ‘<password>’;
여기서 % 대신에 slave 서버 주소를 적어 주어도 상관없음.
master 의 /etc/my.cnf
——————————————————————-
[mysqld]
log-bin
binlog-do-db=syszone
server-id=1
——————————————————————-
binlog-do-db=’DB 이름’
slaver 의 /etc/my.cnf
——————————————————————-
[mysqld]
server-id=2
master-host=192.168.133.165
master-user=repli
master-password=root///
master-port=3306
——————————————————————-
master-user=repli 가 잘 안되면 그냥 root 로 한다.
단..root 역시 원격 DB 접속을 가능토록 해주어야 한다.
mysql> select User,Host from user;
+———+———–+
| User | Host |
+———+———–+
| root | % |
| www | % |
| | localhost |
| root | localhost |
| sahak21 | localhost |
| www | localhost |
| www | svr2 |
+———+———–+
svr1, svr2 서버의 mysql deamon 을 차례로 start 시킨다.
확인 절차 –master server ( svr1 )
mysql > show master status;
+————–+———-+————–+——————+
| File | Position | Binlog_do_db | Binlog_ignore_db |
+————–+———-+————–+——————+
| svr1-bin.023 | 79 | syszone | |
+————–+———-+————–+——————+
확인 절차 –slave server ( svr2 )
| Master_Host 192.168.133.165
| Master_User root
| Master_Port 3306
| Connect_retry 60
| Master_Log_File svr1-bin.023
| Read_Master_Log_Pos 79
| Relay_Log_File svr2-relay-bin.025
| Relay_Log_Pos 271
| Relay_Master_Log_File svr1-bin.023
| Slave_IO_Running Yes
| Slave_SQL_Running Yes
| Replicate_do_db
| Replicate_ignore_db
| Last_errno 0
| Last_error
| Skip_counter 0
| Exec_master_log_pos 79
| Relay_log_space 271
여기서 master pos 에 관련된것이 master status 의 position 값과 일치해야 한다.
이제 Mysql master 서버에 insert 작업을 한 후 slave 서버에서 확인을 해보면 역시 데이터가
추가되었을 것이다.
2.10. Oracle DB Server Admin
2.10.1 Oracle 9i 설치 하기
2.10.2 Oracle File Data Structure 설계 시 고려 사항
Oracle DBA로 있으면서 가장 흔히 겪는 문제가 tablespace 의 크기가 다 차서 에러가 발생
하거나 Oracle 관련 특정 파티션의 데이터가 Full 상태가 되어서 에러가 발생하는 일들일
것이다.
여기서는 이 후 Oracle High AvailAbility System 구축 시 필요한 기본 Oracle DBA 관련
기술 중 Oracle file Data 제어에 대해 살펴 보도록 하겠다.
———————————————–
Control File, Redo Log File, Data File
분류 시 고려해야 할 사항들
———————————————–
Control Files
– Control File은 크기가 작으므로 중요하므로 여러 디스크에 저장 되면 좋다.
– Control File은 디스크 마다 이름이 같은 것이 좋다. (추 후 문제시 복구 용이)
Redo Log Files
– 그룹 단위이며 한 그룹에는 적어도 2개 이상의 Redo Log File(Member)이 있어야 한다.
– 같은 그룹에 속한 Redo Log File 들은 다른 디스크에 저장되는 것이 좋다.
– Datafile 과 Redo Log File은 같은 디스크에 위치하지 않도록 한다.
(복구 시 필요하므로 따로 둔다 – 같이 오류,에러시 복구 불가능)
Data Files
– System, Undo, Temporary 및 오라클 디폴트 제공 테이블 스페이스 영역은 같은 디스크에
존재하는 것이 좋다.
– System, Undo, Temporary 등 테이블 스페이스 영역은 오라클이 사용하므로
사용자 영역과 다른 디스크에 위치하는 것이 좋다.
– 같은 테이블 스페이스에 존재하는 Data File도 다른 디스크에 위치하게 만드는 것이 좋다.
– Datafile 과 Redo Log File은 같은 디스크에 위치하지 않도록 한다.
(복구시 필요하므로 따로 둔다 – 같이 오류, 에러시 복구 불가능)
예) disk1 ~ disk5까지의 디스크가 존재한다.
각각의 디스크에 Control File, Reod Log File, Data File을 배치하라.
단, 사용자 Tablespace는 happy 한 개 존재한다.
———
DISK 1
———
control.ctl
happy01.dbf
———
DISK 2
———
control.ctl
happy02.dbf
———
DISK 3
———
control.ctl
system01.dbf, undotbs01.dbf, temp01.dbf, cwlite01.dbf, drsys01.dbf,
example01.dbf, indx01.dbf, odm01.dbf, tools01.dbf, users01.dbf, xdb01.dbf
———
DISK 4
———
control.ctl
redo01.log, redo02.log, redo03.log
———
———
DISK 5
———
control.ctl
redo01.log, redo02.log, redo03.log
오라클 성능을 위해서는 위 사항을 충분히 고려 해서 설계하는 것이 좋을 것이다.
하지만 HA 설계 시에는 Data File Managing Point 가 많아 진다는 단점이 있을 것
이다. 이는 성능과 관리의 상반된 관점에서의 설계자가 결정해야 할 문제라 생각한다.
2.10.3 Oracle File Data Control 하기
Oracle을 설치 하고 실제 시스템 전체 구성이나 설계에 따라 Oracle 의 Data file Path
를 변경해야 할 경우가 많이 생기게 된다. 여기에 설명하는 것들은 이때 필수적으로 필요한
기술들이다.
기본적으로 오라클 DB 를 생성했다면 {ORACLE_BASE}/oradata 밑에 아래와 같은
DB file 이 있을 것이다.
—————————————————————
————————————– control file
control01.ctl
control02.ctl
control03.ctl
————————————– data file
———————non-system data file
cwmlite01.dbf
drsys01.dbf
example01.dbf
indx01.dbf
odm01.dbf
tools01.dbf
users01.dbf
xdb01.dbf
oem_repository.dbf
———————system data file
system01.dbf
undotbs01.dbf
———————temporary data file
temp01.dbf
————————————— log file
redo01.log
redo02.log
redo03.log
s————————————————————–
여기에는 크게 control file, data file, log file 로 분류를 할수 있다.
여기서 data file 의 경우에는 다시 system data file, non-system data file,
temporary data file 로 나눌 수 있다.
각각의 파일 별로 데이터 경로를 변경하는 방법이 조금씩 다르다.
—————————————————————–
+ Control File Data Path Modify
—————————————————————–
기본적인 Control file 위치는 초기화 파라메터 파일 에서 확인 할수 있다.
$ORACLE_HOME/dbs/init<SID>.ora 파일 안에 아래과 같이 존재
control_files=(“/oracle/oradata/disk3/control.ctl”,
“/oracle/oradata/disk4/control.ctl”,
“/oracle/oradata/disk5/control.ctl”)
Oracle 9i 에서는 기본적으로 init<SID>.ora 파일이 없을 것이다.
초기 설치 시에는 관련 정보가 모두 server parameter 파일인 spfile<SID>.ora 에 저장이
되기 때문에 별도로 초기화 파라메터 파일을 생성해야 한다.
생성 구문은 다음과 같다.
$ sqlplus /nolog
SQL> conn / as sysdba
SQL> create pfile from spfile;
SQL> shutdown normal
그럼 {ORACLE_HOME}/dbs 밑에 init<SID>.ora 파일이 생성이 되어져 있을 것이다.
이제 각 control file 의 현재 위치가 확인 되면 옮겨 보도록 하자
먼저 init<SID>.ora 파일의 열어서 control_file 의 control file 경로를 옮길 위치로
변경을 한다.
그런 후 기존의 control0X.ctl file 을 OS 상에서 물리적으로 옮길 경로로 copy 한다.
그런 후 DB 를 변경된 pfile 로 start 시킨다.
$ sqlplus /nolog
SQL> conn / as sysdba
SQL> startup pfile='{ORACLE_HOME}/dbs/init<SID>.ora’
— 수정된 정보 확인
SQL> col NAME format a35
SQL> select * from v$controlfile;
정상적으로 변경이 완료되면 기존 control file 을 삭제한다.
— 변화된 정보를 spfile 에 새로 적용 시킨다.
기존 spfile 을 잠시 다른곳을 백업해 두고 지운다.
SQL> create spfile from pfile;
이로써 control file 변경이 완료된다.
—————————————————————–
+ DB DATA File Path Modify
—————————————————————–
DB DATA file 은 system file, non-system file, temp file 로 나누어진다.
— system file 변경 방법
– Database가 Mount 단계이어야 한다.
– 이동하고자하는곳에 이동하고자 하는 Data File이 존재해야 한다.
– 4 번은 Control File을 갱신시키는 역할을 한다.
– GAD는 Global Area Database 명이다.
1. 오라클을 shutdown 시킨다.
2. startup mount상태로 만든다.
3. !mv $ORACLE_BASE/oradata/<GAD>/system01.dbf
$NEW_VOL/oradata/<GAD>/system01.dbf
4. ALTER DATABASE RENAME
FILE ‘$ORACLE_BASE/oradata/<SID명>/system01.dbf’
TO ‘$NEW_VOL/oradata/<SID명>/system01.dbf’
5. alter database open;
— non system file 변경 방법
– Tablespace는 offline 이어야한다.
– 이동하고자하는곳에 이동하고자 하는 Data File이 존재해야 한다.
– 4 번은 Control File을 갱신시키는 역할을 한다.
– GAD는 Global Area Database 명이다.
1. startup 상태에서 수행한다.
2. alter tablespace <tablespace명> offline; (mount 상태과 같다)
3. SQL> !mv $ORACLE_BASE/oradata/<GAD>/userdata01.dbf
$NEW_VOL/oradata/<GAD>/userdata01.dbf
4. ALTER TABLESPACE userdata RENAME
DATAFILE ‘$ORACLE_BASE/oradata/<GAD>/userdata01.dbf’
TO ‘$NEW_VOL/oradata/<GAD>/userdata01.dbf’;
5. alter tablespace <tablespace명> online;
—————————————————————–
+ Temporary File Path Modify
—————————————————————–
—————————————————
Temporary Tablespace 관리시 주의사항
—————————————————
오라클 설치 시의 temp 테이블 스페이스는 Default Temporary Tablespace는
삭제되지 않는다. 이동 할수도 없다. 그렇기에 새로운 Temporary 를 원하는 위치에
만들고, 새로운 Temporary tablespace 를 default temporary 로 지정한 후 기존적을
삭제해 버리면 된다.
————————————
Temporary Tablespace 생성
————————————
temp1라는 이름(논리적인 이름)으로
‘$ORACLE_BASE/oradata/<SID명>/temp1.dbf’ 라는 (물리적) 위치에 생성 할 경우
-> 기본적으로 오라클 생성 시 temp 라는 이름으로 기본 temporary 가 생성
됨..
CREATE TEMPORARY TABLESPACE temp1
TEMPFILE ‘$NEW_VOL/oradata/<SID명>/temp1.dbf’ SIZE 20M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 4M;
—————————————-
Default Tempory Tablespace로 바꾸기
—————————————-
temp1 라는 Temporary Tablespace를 생성 후 다음을 실행한다.
ALTER DATABASE
DEFAULT TEMPORARY TABLESPACE temp1;
——————————————
Temporary Tablespace 삭제
——————————————
DROP TABLESPACE temp
INCLUDING CONTENTS AND DATAFILES;
—————————————————————–
+ Log File Path Modify
—————————————————————–
—————————————————-
Redo Log File 이름 바꾸기 및 이동 시키기
—————————————————-
a. Database를 shutdown 한다.
b. 옮길 위치에 Redo Log File을 복사한다.
!cp ${ORACLE_BASE}/oradata/redo01.log
${NEW_VOL}/oradata/redo01.log
c. Database를 MOUNT 모드로 실행시킨다.
d. 다음의 명령어를 실행한다.
ALTER DATABASE RENAME FILE
‘${ORACLE_BASE}/oradata/redo01.log’
TO ‘${NEW_VOL}/oradata/redo01.log’;
e. Database를 Open 모드로 변경한다.
ALTER DATABASE open;
2.10.4 Oracle 백업 및 복구 하기
2.10.5.1 Oracle Cold (FULL) Backup
Oracle 의 Full 백업은 실제 Oracle Data file를 전체로 백업 하여 Oracle 서버 자체에 문제
발생 시 새로이 Oracle 를 설치 한 후 복구 할때 주로 사용되는 백업 방식이다.
COLD BACKUP은 데이타베이스가 정상적으로 SHUTDOWN된 상태에서 데이타화일, 로그화일,
콘트롤화일을 모두 백업받는 것을 말한다. SHUTDOWN하지 않고 OPEN된 상태에서 백업을
받으면 백업받은 내용을 나중에 사용할 수가 없으므로 유의해야 한다.
COLD BAKUP을 위해서 데이타베이스를 SHUTDOWN할 때에는 NORMAL, IMMEDIATE 옵션을 사용해야
하며 ABORT를 사용해서는 안된다.
IMMEDIATE를 사용한 경우에는 SHUTDOWN 후에 다시 STARTUP 하고 NORMAL로 SHUTDOWN 하도록
한다.
컨트롤화일과 데이타화일 및 로그화일의 위치를 확인하여 tar, cpio, dd등의 명령을 이용하여
백업받도록 한다.
– ORACLE COLD BACKUP 절차
1. 먼저 이전 DB_Server 의 환경을 검사한다.
# .bash_profile 의 환경설정 검사
# $ORACLE_HOME/dbs/파라메타(*.ora)파일 검사
–> init<SID>.ora 은 DB_name 과 실질적인 server 환경의
DB의 경로를 지정한다.
# $ORACLE_HOME/oradata/DB_name/*.ctl –> contralfile 검사
# $ORACLE_HOME/oradata/DB_name/*.log –> logfile 검사
# $ORACLE_HOME/oradata/DB_name/*.dbf –> databasefile 검사
# 기타 databasefile 검사
#테이블 스페이스 와 데이터 파일 정보
SVRMGR> select tablespace_name,file_name,v$datafile.status,enabled
2> from dba_data_files, v$datafile
3> where file_id=file#;
TABLESPACE_NAME FILE_NAME STATUS ENABLED
—————————— ——————————————————————————– ——- ———-
SYSTEM /home/oracle/oradata/auction/system01.dbf SYSTEM READ WRITE
OEM_REPOSITORY /home/oracle/oradata/auction/oemrep01.dbf ONLINE READ WRITE
RBS /home/oracle/oradata/auction/rbs01.dbf ONLINE READ WRITE
TEMP /home/oracle/oradata/auction/temp01.dbf ONLINE READ WRITE
USERS /home/oracle/oradata/auction/users01.dbf ONLINE READ WRITE
INDX /home/oracle/oradata/auction/indx01.dbf ONLINE READ WRITE
DRSYS /home/oracle/oradata/auction/drsys01.dbf ONLINE READ WRITE
APDATA1 /home/oracle/oradata/auctionplus/apdata1.dbs ONLINE READ WRITE
APIDX1 /home/oracle/oradata/auctionplus/apidx1.dbs ONLINE READ WRITE
APRBS /home/oracle/oradata/auctionplus/aprbs.dbs ONLINE READ WRITE
APTEMP /home/oracle/oradata/auctionplus/aptemp.dbs ONLINE READ WRITE
APDATA1 /home/oracle/oradata/auctionplus/apdata2.dbs ONLINE READ WRITE
APDATA1 /home/oracle/oradata/auctionplus/apdata3.dbs ONLINE READ WRITE
APDATA1 /home/oracle/oradata/auctionplus/apdata4.dbs ONLINE READ WRITE
APDATA1 /home/oracle/oradata/auctionplus/apdata5.dbs ONLINE READ WRITE
APDATA1 /home/oracle/oradata/auctionplus/apdata6.dbs ONLINE READ WRITE
APDATA1 /home/oracle/oradata/auctionplus/apdata7.dbs ONLINE READ WRITE
APDATA1 /home/oracle/oradata/auctionplus/apdata7.dbs ONLINE READ WRITE
APDATA1 /home/oracle/oradata/auctionplus/apdata8.dbs ONLINE READ WRITE
APDATA1 /home/oracle/oradata/auctionplus/apdata9.dbs ONLINE READ WRITE
APDATA1 /home/oracle/oradata/auctionplus/apdata10.dbs ONLINE READ WRITE
APDATA1 /home/oracle/oradata/auctionplus/apdata11.dbs ONLINE READ WRITE
APDATA1 /home/oracle/oradata/auctionplus/apdata12.dbs ONLINE READ WRITE
APDATA1 /home/oracle/oradata/auctionplus/apdata13.dbs ONLINE READ WRITE
APDATA1 /home/oracle/oradata/auctionplus/apdata14.dbs ONLINE READ WRITE
APDATA1 /home/oracle/oradata/auctionplus/apdata15.dbs ONLINE READ WRITE
CMAIL /cmail/cmail_db/cmail_data.ora ONLINE READ WRITE
#리두로그 파일 정보
SVRMGR> select v$logfile.member,v$logfile.group#,v$log.status,bytes
2> from v$logfile,v$log
3> where v$logfile.group#=v$log.group#;
MEMBER GROUP# STATUS BYTES
———————————————- —————- ———-
/home/oracle/oradata/auction/redo01.log 1 INACTIVE 512000
/home/oracle/oradata/auction/redo02.log 2 CURRENT 512000
#컨트롤 파일의 정보
SVRMGR> select * from v$controlfile;
STATUS NAME
——- ——————————————————————————–
/home/oracle/oradata/auction/control01.ctl
/home/oracle/oradata/auction/control02.ctl
#파라메타 파일의 정보
SVRMGR> show parameter;
NAME TYPE VALUE
———————————– ——- ——————————
O7_DICTIONARY_ACCESSIBILITY boolean TRUE
always_anti_join string NESTED_LOOPS
always_semi_join string standard
aq_tm_processes integer 0
audit_file_dest string ?/rdbms/audit
audit_trail string NONE
background_core_dump string partial
background_dump_dest string /home/oracle/admin/auction/bdu
backup_tape_io_slaves boolean FALSE
bitmap_merge_area_size integer 1048576
blank_trimming boolean FALSE
buffer_pool_keep string
buffer_pool_recycle string
commit_point_strength integer 1
compatible string 8.1.0
control_file_record_keep_time integer 7
control_files string /home/oracle/oradata/auction/c
core_dump_dest string /home/oracle/admin/auction/cdu
cpu_count integer 2
create_bitmap_area_size integer 8388608
cursor_space_for_time boolean FALSE
db_block_buffers integer 8192
.
.
위의 방법으로 실제 현 시스템의 Oracle Data File 의 실제적인 위치를 파악한다.
2. 오라클 백업
오라클 인스턴스 데몬을 shutdown 한다.
SQL > shutdown
# cd $ORACLE_HOME
# mkdir fullbackup
# cp $ORACLE_HOME/dbs/*.ora $ORACLE_HOME/fullbackup
# cp $ORACLE_HOME/oradata/DB_NAME/*.ctl $ORACLE_HOME/fullbackup
# cp $ORACLE_HOME/oradata/DB_NAME/*.log $ORACLE_HOME/fullbackup
# cp $ORACLE_HOME/oradata/DB_NAME/*.dbf $ORACLE_HOME/fullbackup
# cp $ORACLE_HOME/oradata/기타DB_NAME/DB_file $ORACLE_HOME/fullbackup
3. 오라클 설치
4. 오라클 복구 (완전복구)
# 데이타파일을 원래 경로에 복사한다.
# SQL> sqlplus / as sysdba
# SQL> startup mount;
# SQL> recover database;
media recovery complete
# SQL> alter database open;
2.10.4.2 Oracle HOT (Open) Backup
Open 백업은 Full 백업과는 달리 서비스 전체 중지 없이 백업 되는 관련 테이블 스페이스만
단계적 중지를 시켜 백업 시키는 방법이다.
여기서는 실무에서 사용하는 Oracle Open Backup Scripts 를 설명하도록 한다.
# vi /home/oracle/bin/open_backup.sh
————————————————————————————-
#!/bin/sh
#rdate -s time.nuri.net
bkdir_name=`date +%Y%m%d`
#mount -t ext2 /dev/hda1 /orabackup
rm -rf /orabackup/ora_*-1
mv /orabackup/ora_* /orabackup/ora_${bkdir_name}-1
mkdir /orabackup/ora_${bkdir_name}
$ORACLE_HOME/bin/sqlplus internal<<EOF
alter tablespace system begin backup;
!cp /home/oracle/data1/oradata/ORA8/system01.dbf /orabackup/ora_${bkdir_name}/system01.dbf
alter tablespace system end backup;
alter tablespace RBS begin backup;
!cp /home/oracle/data1/oradata/ORA8/rbs01.dbf /orabackup/ora_${bkdir_name}/rbs01.dbf
!cp /home/oracle/data1/oradata/ORA8/rbs02.dbf /orabackup/ora_${bkdir_name}/rbs02.dbf
alter tablespace RBS end backup;
alter tablespace TEMP begin backup;
!cp /home/oracle/data1/oradata/ORA8/temp01.dbf /orabackup/ora_${bkdir_name}/temp01.dbf
!cp /home/oracle/data1/oradata/ORA8/temp02.dbf /orabackup/ora_${bkdir_name}/temp02.dbf
alter tablespace TEMP end backup;
alter tablespace USERS begin backup;
!cp /home/oracle/data1/oradata/ORA8/users01.dbf /orabackup/ora_${bkdir_name}/users01.dbf
alter tablespace USERS end backup;
alter tablespace TOOLS begin backup;
!cp /home/oracle/data1/oradata/ORA8/tools01.dbf /orabackup/ora_${bkdir_name}/tools01.dbf
!cp /home/oracle/app/oracle/product/8.0.5/dbs/data.dbf /orabackup/ora_${bkdir_name}/data.dbf
!cp /home/oracle/app/oracle/product/8.0.5/dbs/data2.dbf /orabackup/ora_${bkdir_name}/data2.dbf
!cp /home/oracle/app/oracle/product/8.0.5/dbs/data3.dbf /orabackup/ora_${bkdir_name}/data3.dbf
alter tablespace TOOLS end backup;
alter tablespace TB_DGJOB begin backup;
!cp /home/oracle/app/oracle/product/8.0.5/dbs/datafile_dg_1.dbf /orabackup/ora_${bkdir_name}/datafile_dg_1.dbf
alter tablespace TB_DGJOB end backup;
alter database backup controlfile to ‘/orabackup/ora_${bkdir_name}/control.ctl’ reuse;
alter database backup controlfile to trace;
!cp /home/oracle/data1/oradata/ORA8/redoORA801.log /orabackup/ora_${bkdir_name}/redoORA801.log
!cp /home/oracle/data2/oradata/ORA8/redoORA802.log /orabackup/ora_${bkdir_name}/redoORA802.log
!cp /home/oracle/data3/oradata/ORA8/redoORA803.log /orabackup/ora_${bkdir_name}/redoORA803.log
!cp /home/oracle/app/oracle/product/8.0.5/dbs/initORA8.ora /orabackup/ora_${bkdir_name}/initORA8.ora
exit
EOF
—————————————————————————————-
2.10.4.3 IMPORT/EXPORT 백업 복구 하기
2.10.5 Oracle 과 Web Program 연동하기
Oracle 기반의 DBMS를 PHP 웹 어플리케이션에서 사용할 경우 Mysql 연동 처럼 PHP 컴파일
시 연동을 시켜줘야 한다.
여기서는 PHP 연동에 대해 간단히 알아보도록 하겠다.
그냥 기존 APM 연동 시 PHP configure option 중 마지막에 아래 구문을 추가한다.
–with-oci8=${ORACLE_HOME}
그런 후 php apache modules 를 컴파일 하면 된다.
2.11. Log Server And Remote Backup Server
대규모 시스템 환경을 관리하는 엔지니어의 경우 로그 서버와 백업 서버를 원격으로
분리해서 관리하게 되는데 이장에서는 이에 대한 기술적인 부분에 대해 소개 하고자
한다.
2.11.1 Remote Log Server 구축 하기
호스팅 환경이나 다수의 시스템을 관리하는 환경 혹은 클러스터링 시스템 환경 등
여러대의 서버를 관리하는 곳이라면 별도의 로그 서버를 구축해 두시는 것이 좋다.
이유는 효율성과 안정성이라 볼수 있다. 실제 시스템에 일어나는 무한한 상황들을
일일이 로컬 시스템의 로그 파일에 기록하다 보면 디스크 I/O 성능 상에 문제나
로그 파일이 커져서 디스크 Full 상태가 되어 문제가 발생하는 경우가 종종 발생 한다.
또한 해커등의 칩입으로 시스템에 문제가 발생하면 대부분 로그를 통해 추적을 하게
되는데 로컬 시스템에 로그 파일이 있는 경우 이 로그 파일 역시 해커의 의해 손상을
입을 수 있기 때문에 로그는 환경이 받혀 주면 원처적으로 로컬에서 분리해서 관리
하는 것이 좋다.
원격 로그 서버나 백업 서버의 경우 1장에서 언급하였지만 네트워크를 통해 데이터를
전송하기 때문에 서비스 네트워크 채널과 분리를 해줘야 할 것이다. 그래야 실제 서비스
의 네트워크 성능에는 지장을 주지 않을 것이다.
구축은 간단하다. 먼저 /etc/services 에서 syslogd 가 사용 하는 Port 514/udp 가 열러져
있는지 확인한다. 원격으로 로그를 전송할때 UDP Port 를 이용하게 되어 있다.
이는 로그를 보내는쪽/받는쪽 모두 열려저 있어야 한다.
1. 서비스 서버 설정
/etc/syslog.conf 파일을 설정..
————————————————————————–
# Don’t log private authentication messages!
*.info;mail.none;news.none;authpriv.none;cron.none /var/log/messages
*.info;mail.none;news.none;authpriv.none;cron.none @logserver_name # 추가
authpriv.* /var/log/secure
authpriv.* @logserver_name # 추가
————————————————————————-
보통 위의 추가된 예문 처럼..원격 로그 서버로 보내고 싶은 로그 메세지
설정부분에 @뒤에 원격지 로그서버의 도메인이나 호스트명을 적어 주면된다.
물른 /etc/hosts 에 해당 로그서버의 hosts 가 등록되어 있어야 한다.
이와 같이 설정하고 syslogd 를 재시작 해준다.
2. 로그 서버 설정
현재 init script 로 띄워진 syslogd 데몬을 죽이고…다음 방식으로 데몬을 시작한다.
/sbin/syslogd -m 0 -r -h
-m 0 : 기본설정되어있는것으로 변경하지 않아도 됩니다. 이건 지정한 분
동안에 MARK 라고 로그파일에 기록을 합니다. 0 이면 기록을 하지 않는 것
이지요.
-r : 인터넷 도메인 소켓을 이용해 네트웍에서 메시지를 받는 옵션
-h : 기본적으로 syslogd는 원격 호스트에서 받은 메시지를 로그 기록으
로 전송하지 않습니다. 이 옵션을 사용하여 원격 호스트에서 받은 로그파
일을 전송합니다. (전송이란 받은 쪽의 로그 파일에 기록한다고 생각하면 됩니다)
2.11.2 Remote Backup Server 구축 하기
1장에서 원격 백업 서버에 대한 기본 기술적 설명에 대한 부분은 언급 한적이 있다.
여기서는 보다 실무적으로 접급해서 실무 환경을 가정하고 백업 서버 환경을 구축 해보자.
2.12. Server Monitoring
2.12.1 운영체제 기본 명령어를 이용한 시스템 모니터링
이 장에서는 운영체제에 포함된 기본 명령어를 이용하여 시스템 자원의 활용 상태와
서비스 운영 상태등의 시스템 모니터링에 대해 알아보도록 하겠다.
시스템에 기본 자원으로는 흔히 프로세스, 메모리, 디스크, 네트워크등이 있을 것이다.
시스템에서 특정 서비스를 운영하기 위해 여러개의 프로그램이 필요하게 될것인데,
이때 시스템 자체에 부하가 발생한다고 하면 관리자의 입장에서 시스템의 리소스 부족
의 원인을 찾아야 할것이다. 리소스 부족 원인이란 어플리케이션과 사용자 요청이 현
시스템의 보유 리소스를 초과 하는 경우와 DOS 공격과 같이 악으적인 방식으로 시스템
의 자원을 고갈 시키는 경우가 발생할 것이다. 관리자는 이런 경우 시스템의 부하 증세
가 어떤 리소스 요소에서 발생하는 것이고, 이것이 정상적인 서비스 증대로 인한 증세
인지, 악의적인 외부 공격에 의한 증세인지를 파악해야 할것이다.
아래는 실무에서 시스템 부하 발생 시 문제에 접근하는데 주로 사용되는 명령어 활용
방법들이다. 참고로 이 장의 내용은 실무에 필요한 응용 기술을 설명하는 성격을
가지고 있다. 리눅스 기본 명령어에 대한 자세한 정보가 필요할 때는 다른 리눅스 서적
이나 인터넷의 정보를 활용하길 바란다.
2.12.1.1 프로세스 모니터링
– w : 사용자 로그인 정보와 시스템 전반적인 상태 점검
[root@arhdev root]# w
———————————————————————————-
10:26:16 up 1 day, 22:07, 3 users, load average: 0.20, 0.05, 0.02
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.123.16 10:24am 0.00s 0.04s 0.00s w
root pts/1 192.168.123.16 10:25am 8.00s 0.04s 0.04s -bash
root pts/2 192.168.123.16 10:25am 17.00s 0.08s 0.02s top
———————————————————————————-
w 명령은 시스템이 전반적인 현황에 대한 정보를 가장 직관적이며, 간단하게 정보를 출력
해 주는 명령이다. 시스템이 갑자기 느려지던지, 문제가 발생하면 가장 먼저 w 란 명령으로
현재 접속자 상황과 접속자가 사용하고 있는 프로그램과 해당 프로그램의 CPU 사용율,
그리고 전체 시스템에 대한 load average 등을 파악 할 수 있다.
– ps : 프로세스에 활당된 메모리와 CPU 사용량 파악
[root@arhdev root]# ps aux
———————————————————————————-
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 1376 476 ? S May09 0:04 init [3]
root 2 0.0 0.0 0 0 ? SW May09 0:00 [keventd]
root 3 0.0 0.0 0 0 ? SW May09 0:00 [kapmd]
root 4 0.0 0.0 0 0 ? SWN May09 0:00 [ksoftirqd_CPU0]
root 9 0.0 0.0 0 0 ? SW May09 0:00 [bdflush]
root 5 0.0 0.0 0 0 ? SW May09 0:00 [kswapd]
root 6 0.0 0.0 0 0 ? SW May09 0:00 [kscand/DMA]
root 7 0.0 0.0 0 0 ? SW May09 0:09 [kscand/Normal]
root 8 0.0 0.0 0 0 ? SW May09 0:00 [kscand/HighMem]
root 10 0.0 0.0 0 0 ? SW May09 0:00 [kupdated]
root 11 0.0 0.0 0 0 ? SW May09 0:00 [mdrecoveryd]
root 15 0.0 0.0 0 0 ? SW May09 0:00 [kjournald]
.
.
———————————————————————————–
ps aux 명령을 이용하면 현 시스템의 프로세스에 활당된 프로그램 정보를 확인 할 수 있다.
또한 해당 프로그램의 시스템 리소스 활당 상태도 파악할 수 있다.
ps aux 실행하면 실제 실행 중인 상당량의 프로세스 정보가 올라가기 때문에 한눈에 찾고자
하는 프로세스를 찾기 힘들 것이다. 그렇기 때문에 grep 이나 head 와 같은 부가 명령어를
이용하여 급박한 문제 상황에서 신속한 점검을 해야 할것이다.
[root@arhdev root]# ps aux | grep sendmail
root 659 0.0 0.4 5936 2528 ? S May09 0:00 sendmail: accepting connections
smmsp 668 0.0 0.4 5736 2264 ? S May09 0:00 sendmail: Queue runner@01:00:00 for /var/spool/clientmqueue
위와 같이 grep 명령을 이용하면 grep 으로 원하는 정보만을 추출하여 출력해 준다.
시스템 관리자라고 하면 현 시스템을 관리하면서 문제의 요지가 있는 프로그램에 대한 정보를
파악하고 있을 것이다. 이런 경우 바로 문제 원인이 추측되는 프로그램 상태를 바로 확인
할 수 있다.
[root@arhdev root]# ps aux | sort -r +2 | head -5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2043 2.0 0.4 6924 2232 ? S 10:25 0:17 /usr/sbin/sshd
root 2139 0.1 0.5 9244 2808 pts/1 S 10:39 0:00 vim dcpu
root 1996 0.0 0.4 6816 2148 ? S 10:25 0:00 /usr/sbin/sshd
root 1948 0.0 0.4 6816 2148 ? S 10:24 0:00 /usr/sbin/sshd
위 명령 예제는 sort 와 head 를 이용해서 활당된 프로세스 중 cpu 사용량이 많은 순으로
상위 5개의 프로세스 리스트를 확인하는 명령이다.
– pstree : 프로세스에 활당된 프로세스의 의존 관계 표시
[root@arhdev bin]# pstree
————————————————————————————
init-+-bdflush
|-crond
|-eth0
|-kapmd
|-keventd
|-khubd
|-4*[kjournald]
|-klogd
|-kscand/DMA
|-kscand/HighMem
|-kscand/Normal
|-ksoftirqd_CPU0
|-kswapd
|-kupdated
|-mdrecoveryd
|-6*[mingetty]
|-rhnsd
|-2*[sendmail]
|-sshd-+-2*[sshd—bash]
| `-sshd—bash—pstree
|-syslogd
`-xinetd
————————————————————————————-
pstree 는 프로세스의 구조를 디렉토리 표기 형식으로 출력해 준다. 특정 프로세스에서
파생된 프로세스를 추적하는데 주로 사용한다.
– lsof : 프로세스가 Open 한 모든 파일의 정보 파악
[root@arhdev root]# lsof -p 688
————————————————————————————-
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
rhnsd 688 root cwd DIR 3,2 4096 2 /
rhnsd 688 root rtd DIR 3,2 4096 2 /
rhnsd 688 root txt REG 3,3 9128 129993 /usr/sbin/rhnsd
rhnsd 688 root mem REG 3,2 106400 16091 /lib/ld-2.3.2.so
rhnsd 688 root mem REG 3,3 31202800 195370 /usr/lib/locale/locale-archive
rhnsd 688 root mem REG 3,2 1539996 64181 /lib/tls/libc-2.3.2.so
rhnsd 688 root 0u unix 0xdf1a7580 1104 socket
lsof 는 list open files 의 약자로 전반적인 시스템 모니터링에 매우 유용한 명령이다.
위 예제는 ps 명령어를 통해 특정 프로그램의 PID 를 파악하였을 경우 이 프로세스에 의존된
모든 File 의 정보를 출력해 준다. 이는 해당 프로그램을 구동할때 사용되는 파일을 파악할
수 있으며, 이를 통해 문제의 프로그램 대응에 필요한 정보를 얻을 수 있다.
– top : 시스템 모니터링 프로그램
[root@arhdev root]# top
————————————————————————————-
10:58:06 up 1 day, 22:39, 3 users, load average: 0.00, 0.00, 0.00
38 processes: 36 sleeping, 2 running, 0 zombie, 0 stopped
CPU states: 0.0% user 0.0% system 0.0% nice 0.0% iowait 100.0% idle
Mem: 505712k av, 495936k used, 9776k free, 0k shrd, 43980k buff
309812k actv, 8096k in_d, 91748k in_c
Swap: 1020088k av, 0k used, 1020088k free 358428k cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
1 root 15 0 476 476 428 S 0.0 0.0 0:04 0 init
2 root 15 0 0 0 0 SW 0.0 0.0 0:00 0 keventd
3 root 15 0 0 0 0 SW 0.0 0.0 0:00 0 kapmd
4 root 34 19 0 0 0 SWN 0.0 0.0 0:00 0 ksoftirqd_CPU
9 root 25 0 0 0 0 SW 0.0 0.0 0:00 0 bdflush
5 root 15 0 0 0 0 SW 0.0 0.0 0:00 0 kswapd
6 root 15 0 0 0 0 SW 0.0 0.0 0:00 0 kscand/DMA
7 root 15 0 0 0 0 SW 0.0 0.0 0:09 0 kscand/Normal
top 은 UNIX 계열 운영체제에서 기본적으로 제공하는 시스템 모니터링 프로그램이다.
시스템에 모니터링에 필요한 대부분의 정보를 한 화면에 제공 하기 때문에 매우 유용하다.
2.12.1.2 메모리 모니터링
– free : 시스템 메모리 모니터링
[root@arhdev root]# free -m
total used free shared buffers cached
Mem: 493 484 9 0 43 350
-/+ buffers/cache: 91 402
Swap: 996 0 996
free 는 시스템의 메모리 사용 현황 정보를 파악하는 명령어 이다. -m 옵션을 붙여 주면
MByte 단위로 출력을 해 주므로 시각적으로 보기에 유용하다.
메모리 사용 정보에 대해 보다 자세한 정보가 필요할 때는 /proc/meminfo 정보를 확인
하는 것도 효과적일 것이다.
– vmstat : 메모리와 I/O 관련 모니터링 프로그램
[root@arhdev root]# vmstat 5 5
procs memory swap io system cpu
r b w swpd free buff cache si so bi bo in cs us sy id
1 0 0 0 9776 44664 358428 0 0 5 1 107 9 0 0 100
0 0 0 0 9776 44680 358428 0 0 0 6 107 7 0 0 100
0 0 0 0 9776 44680 358428 0 0 0 0 106 5 0 0 100
0 0 0 0 9776 44680 358428 0 0 0 0 107 5 0 0 100
0 0 0 0 9776 44680 358428 0 0 0 0 106 5 0 0 100
vmstat 는 시스템의 메모리 사용 현황과 시스템 I/O 에 미치는 로드를 모니터링 하는
프로그램이다.
또한 vmstat 는 메모리 모니터링 도구 이지만 CPU 활동 항상도 포함하고 있다.
vmstat 5 5 는 5초 간격으로 5번 출력하라는 의미이다.
us : 사용자 프로그램을 실행시키는 사용 시간의 비율
sy : CPU 시간 단위로 소비된 CPU 사이클의 비율
id : 휴지시간 비율 ( 놀고 있는 시간 )
참고 : sy 가 50% 가 넘는다면 이는 I/O 에 문제가 있음을 예상할수 있다.
해당 프로그램이 효율적으로 I/O 를 사용하는지 확인이 필요하다.
id 가 항상 0 이다.즉 cpu 가 항상 일만 한다고 생각하면 된다.
이 역시 어디선가 작업이 계속 축적되고 있다고 보면 된다.
swap-out 이 지속적으로 항상 발생한다면 메모리가 부족하다고 생각하면 된다.
이밖에 메모리를 가장 많이 사용하는 프로그램을 파악하는데 ps 를 이용할 수 있는데
이 방법은 앞에서 설명한 ps , sort , head 명령을 같이 응용하면 효과적으로 파악
할 수 있다.
[root@arhdev root]# ps aux | sort -r +3 | head -10
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2043 0.5 0.4 6924 2232 ? S 10:25 0:17 /usr/sbin/sshd
root 1996 0.0 0.4 6816 2148 ? S 10:25 0:00 /usr/sbin/sshd
root 1948 0.0 0.4 6816 2148 ? S 10:24 0:00 /usr/sbin/sshd
root 659 0.0 0.4 5936 2528 ? S May09 0:00 sendmail: accepting connections
2.12.1.3 디스크 모니터링
– df : 시스템의 디스크 파티션 별 디스크 사용량 모니터링
[root@arhdev root]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda2 2.9G 288M 2.5G 11% /
/dev/hda1 99M 9.0M 85M 10% /boot
/dev/hda6 60G 3.8G 54G 7% /data
none 247M 0 247M 0% /dev/shm
/dev/hda3 9.7G 2.8G 6.4G 31% /usr
df 는 시스템의 디스크 파티션 별로 활당된 디스크 용량과 현재 사용량에 대해 확인할 수
있는 명령어이다. -h 옵션과 같이 사용하면 Byte 단위에서 Mege, Giga, Tera 단위등을
사용해서 출력해 줌으로 관리자 입장에서 정보 파악 시 효과적일 것이다.
또한 -Th 를 이용하면 각 파티션의 파일 시스템 종류에 대한 정보도 확인 할수 있다.
[root@arhdev root]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/hda2 ext3 2.9G 288M 2.5G 11% /
/dev/hda1 ext3 99M 9.0M 85M 10% /boot
/dev/hda6 ext3 60G 3.8G 54G 7% /data
none tmpfs 247M 0 247M 0% /dev/shm
/dev/hda3 ext3 9.7G 2.8G 6.4G 31% /usr
– du : 현 디렉토리에 포함된 파일과 하위 디렉토리의 디스크 사용 용량 파악
[root@arhdev root]# du -h | more
4.0K ./Desktop
836K ./.xmms/Skins
4.0K ./.xmms/Plugins
864K ./.xmms
72K ./bin/dock/theme
568K ./bin/dock
8.0K ./bin/rdesktop
2.5M ./bin
16K ./rdesktop/doc/CVS
92K ./rdesktop/doc
16K ./rdesktop/uiports/CVS
220K ./rdesktop/uiports
20K ./rdesktop/CVS
240K ./rdesktop/autom4te.cache
16K ./rdesktop/crypto/CVS
du 는 현 디렉토리에 포함된 파일과 하위 디렉토리의 디스크 용량을 확인 할때 사용되는
명령어 이다. du 명령 자체로는 모든 파일과 디렉토리의 개별적 디스크 용량 정보를 출력
하기 때문에 디렉토리 내에 포함된 파일과 하위 디렉토리가 많을 경우 grep, sort, find
명령 등을 이용하여 선별적으로 해당 파일의 크기를 파악 하는 것이 효율적이다.
[root@arhdev src]# find ./ -name “sendmail*” -exec du -h {} \\;
528K ./apmj/sendmail-8.12.8-9.90.i386.rpm
292K ./apmj/sendmail-cf-8.12.8-9.90.i386.rpm
100K ./apmj/sendmail-devel-8.12.8-9.90.i386.rpm
596K ./apmj/sendmail-doc-8.12.8-9.90.i386.rpm
위 명령 구문의 현 디렉토위 하위에 sendmail 이란 구문을 포함한 파일을 모두 추출하고
그 파일의 용량을 체크하는 명령이다.
[root@arhdev src]# find ./ -name “sendmail*” -exec du -h {} \\; \\
| awk ‘{sum+=$1}; END {print “Total disk use=” sum }’
Total disk use=1516
위 구문은 보다 응용된 명령 구문으로 awk 를 이용하여 Sendmail 파일 크기를 모두 합해
출력하는 구문이다.
만일 현 디렉토리에 대한 디스크 전체 크기만 알고 싶을 경우에는 -sh 란 옵션을 이용하면
된다.
[root@arhdev src]# du -sh
1005M .
이 밖에 호스팅 업체와 같이 사용자가 많은 경우 사용자 별로 홈디렉토리 크기를 파악할
수 있어야 하는데 이때도 du 를 응용하면 간편하게 파악 할 수가 있다.
[root@arhdev root]# du -h –max-depth=1 /home
1013M /home/alang
366M /home/clunix
12M /home/family
13M /home/juhnn
28k /home/sojung
12M /home/skywolf
21M /home/cnt75
1.7G /home/usr01
.
.
이 밖에 디스크 I/O 에 대한 로드는 앞 메모리 모니터링 부분에서 언급한 vmstat 에서
정보를 얻을 수 있을 것이다.
2.12.1.4 네트워크 모니터링
– netstat
netstat 는 네트워크 관련 리소스 및 서비스 현황을 점검하는 강력한 모니터링 프로그램
이다. 자세한 명령어 사용법은 man 페이지를 활용하길 바란다. 여기서는 실무 네트워크
모니터링 시 주로 사용하는 기술에 대해 언급하겠다.
[root@arhdev root] # netstat -l
———————————————————————————-
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:mysql *:* LISTEN
tcp 0 0 *:pop3 *:* LISTEN
tcp 0 0 *:http *:* LISTEN
tcp 0 0 ns.sysmng.com:domain *:* LISTEN
tcp 0 0 localhost:domain *:* LISTEN
tcp 0 0 *:ftp *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 *:telnet *:* LISTEN
tcp 0 0 localhost:rndc *:* LISTEN
tcp 0 0 *:smtp *:* LISTEN
udp 0 0 ns.sysmng.com:domain *:*
udp 0 0 localhost:domain *:*
udp 0 0 *:43481 *:*
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 1182 /tmp/mysql.sock
———————————————————————————–
현 시스템에 LISTEN 상태로 열려져 있는 서비스 포트를 점검한다.
여기서 정상적인 네트워크 서비스이외의 다른 서비스 포트가 열려져 있으면 해킹의 의심을
해보아야 할것이다.
[root@arhdev root]# netstat -ant
———————————————————————————–
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:37 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:901 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:6012 0.0.0.0:* LISTEN
tcp 0 0 192.168.123.110:22 192.168.123.16:36332 ESTABLISHED
tcp 0 0 192.168.123.110:22 192.168.123.16:36333 ESTABLISHED
tcp 0 0 192.168.123.110:22 192.168.123.16:36329 ESTABLISHED
————————————————————————————
현 시스템에 TCP 로 서비스하는 서비스 포트나 해당 서비스에 접속한 호스트 정보와 접근
포트에 대한 정보를 출력한다.
[root@arhdev root]# netstat -anu
————————————————————————————
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 222.236.44.46:53 0.0.0.0:*
udp 0 0 127.0.0.1:53 0.0.0.0:*
udp 0 0 0.0.0.0:43481 0.0.0.0:*
————————————————————————————
[root@arhdev root]# netstat -s
————————————————————————————
Ip:
578283 total packets received
0 forwarded
0 incoming packets discarded
99748 incoming packets delivered
164760 requests sent out
Icmp:
251 ICMP messages received
0 input ICMP message failed.
ICMP input histogram:
destination unreachable: 241
echo requests: 1
echo replies: 9
162 ICMP messages sent
0 ICMP messages failed
ICMP output histogram:
destination unreachable: 161
echo replies: 1
Tcp:
5 active connections openings
10 passive connection openings
0 failed connection attempts
0 connection resets received
3 connections established
18475 segments received
164345 segments send out
0 segments retransmited
0 bad segments received.
0 resets sent
.
.
———————————————————————————–
netstat -s 는 현 시스템의 프로토콜 별로 들어오고 나가는 패킷 정보를 출력해 주는
역활을 한다.
이밖에도 많은 기능이 있지만 로컬 시스템의 네트워크 상황을 모니터링 하는데는 위의
명령이면 충분할 것이다.
아래는 netstat 실행 시 표시되는 포트 stat 에 대한 설명이다.
LISTEN : 서버의 데몬이 떠서 접속 요청을 기다리는 상태
SYS-SENT : 로컬의 클라이언트 어플리케이션이 원격 호스트에 연결을 요청한 상태
SYN_RECEIVED :
서버가 원격 클라이언트로부터 접속 요구를 받아 클라이언트에게
응답을 하였지만 아직 클라이언트에게 확인 메시지는 받지 않은 상태
ESTABLISHED : 3 Way-Handshaking 이 완료된 후 서로 연결된 상태
FIN-WAIT1 , CLOSE-WAIT , FIN-WAIT2 :
서버에서 연결을 종료하기 위해 클라이언트에게 종결을 요청하고 회신을 받아
종료하는 과정의 상태
CLOSING : 흔하지 않지만 주로 확인 메시지가 전송도중 분실된 상태
TIME-WAIT : 연결은 종료되었지만 분실되었을지 모를 느린 세그먼트를 위해
당분간 소켓을 열어놓은 상태
CLOSED : 완전히 종료
– lsof
앞에서 언급 하였듯이 lsof 는 시스템에서 프로세스가 잡고 있는 모든 파일에 대한
정보를 모니터링 하는 프로그램이다. 네트워크 서비스 역시 서비스 프로그램의 실행 파일이
실행 되어져서 동작하는 것이기에losf 는 유용한 네트워크 서비스 모니터링 프로그램으로
활용할 수 있다.
[root@arhdev root]# lsof -i
————————————————————————————
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 628 root 3u IPv4 982 TCP *:ssh (LISTEN)
xinetd 639 root 5u IPv4 1005 TCP *:swat (LISTEN)
xinetd 639 root 6u IPv4 1006 TCP *:time (LISTEN)
sendmail 659 root 4u IPv4 1056 TCP localhost.localdomain:smtp (LISTEN)
sshd 1948 root 4u IPv4 3788 TCP 192.168.123.110:ssh->192.168.123.16:36329 (ESTABLISHED)
sshd 1948 root 8u IPv4 3812 TCP localhost.localdomain:x11-ssh-offset (LISTEN)
[root@arhdev root]# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 628 root 3u IPv4 982 TCP *:ssh (LISTEN)
xinetd 639 root 5u IPv4 1005 TCP *:swat (LISTEN)
xinetd 639 root 6u IPv4 1006 TCP *:time (LISTEN)
sendmail 659 root 4u IPv4 1056 TCP localhost.localdomain:smtp (LISTEN)
sshd 1948 root 4u IPv4 3788 TCP 192.168.123.110:ssh->192.168.123.16:36329 (ESTABLISHED)
sshd 1948 root 8u IPv4 3812 TCP localhost.localdomain:x11-ssh-offset (LISTEN)
————————————————————————————-
-i 옵션을 이용하여 현 시스템의 구동 중인 네트워크 서비스와 서비스 실행 명령, Open port
서비스 접속 호스트 등의 정보를 한 눈에 확인이 가능하다.
[root@arhdev root]# lsof -i@192.168.123.16
————————————————————————————-
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 1948 root 4u IPv4 3788 TCP 192.168.123.110:ssh->192.168.123.
————————————————————————————-
여러명의 접속자가 있을 경우 위의 예제 처럼 @<host_name> 형식으로 특정 호스트에 대한
정보만을 출력할 수도 있다.
– tcpdump
tcpdump 는 지정한 형태의 패턴을 포함한 네트워크 패킷 헤더들을 추출하여 출력해 주는
프로그램이다. 이 프로그램을 통해 현 시스템에 오고 가는 네트워크 패킷들을 모니터링
할 수 있기 때문에 고급적인 시스템 네트워크 상황과 네트워크 서비스 상황을 점검할 수
있게 해 주는 프로그램이다.
주요 사용 방법은 다음과 같다.
# tcpdump -i eth1 host arhdev
————————————————————————————–
tcpdump: listening on eth
11:21:08.162329 192.168.123.16.39502 > arhdev.ssh: P 2114086125:2114086173(48) ack 2269029966 win 29120 <nop,nop,timestamp 35268113 34153212> (DF) [tos 0x10]
11:21:08.163024 192.168.123.16.39502 > arhdev.ssh: . ack 49 win 29120 <nop,nop,timestamp 35268114 34159558> (DF) [tos 0x10]
11:21:08.262396 192.168.123.16.39502 > arhdev.ssh: P 48:96(48) ack 49 win 29120 <nop,nop,timestamp 35268123 34159558> (DF) [tos 0x10]
11:21:08.262923 192.168.123.16.39502 > arhdev.ssh: . ack 97 win 29120 <nop,nop,timestamp 35268124 34159568> (DF) [tos 0x10]
————————————————————————————–
11:25:27.847703 192.168.123.16.ssh > arhdev.32778: P 6384:6448(64) ack 2351 win 10880 <nop,nop,timestamp 35294082 34185522> (DF) [tos 0x10]
11:25:27.847869 arhdev.32778 > 192.168.123.16.ssh: . ack 6448 win 10304 <nop,nop,timestamp 34185522 35294082> (DF) [tos 0x10]
11:25:27.848017 192.168.123.16.ssh > arhdev.32778: P 6448:6528(80) ack 2351 win 10880 <nop,nop,timestamp 35294082 34185522> (DF) [tos 0x10]
11:25:27.848197 arhdev.32778 > 192.168.123.16.ssh: . ack 6528 win 10304 <nop,nop,timestamp 34185522 35294082> (DF) [tos 0x10]
————————————————————————————–
위 출력 결과는 192.168.123.16 시스템에서 tcpdump 로 현 시스템의 eth1 네트워크 카드로
들어 오고 나가는 모든 네트워크 패킷을 추출한 내용이다.
실제 위 내용을 보면 192.168.123.16 의 39502 포트를 통해 arhdev 의 ssh 프로토콜로 접속을
하여 특정 패킷을 날리고 있다는 것을 확인할 수 있다.
또한 반대로 arhdev 의 32778 포트에서 192.168.123.16 의 ssh 서비스에 접속하여 특정 작업
을 하고 있다는 것을 확인 할 수 있다.
그럼 tcpdump 의 주요 옵션과 조건식, 그리고 실무에서 주로 사용하는 명령에 대해서 알아
보도록 하자.
* tcpdump 주요 옵션
-a : network, broadcast 주소를 이름들로 바꾼다.
-c(Number) : 제시된 수의 패킷을 받은 후 종료한다.
-i : 패킷 추출 대상의 네트워크 인터페이스를 지정한다.
-ddd : packet-matching code를 숫자로 출력한다.
-e : 출력되는 각각의 행에 대해서 link-level 헤더를 출력한다.
-f : 외부의 internet address를 가급적 심볼로 출력한다
-F file : filter 표현의 입력으로 파일을 받아들인다.
커맨드라인에 주어진 추가의 표현들은 모두 무시된다.
-l : 표준 출력으로 나가는 데이터들을 line buffering한다.
다른 프로그램에서 tcpdump로부터 데이터를 받고자 할 때, 유용하다.
-n : 모든 주소들을 번역하지 않는다(port,host address 등등)
-N : 호스트 이름을 출력할 때, 도메인을 찍지 않는다.
-O : packet-matching code optimizer를 실행하지 않는다.
이 옵션은 optimizer에 있는 버그를 찾을 때나 쓰인다.
-p : 인터페이스를 promiscuous mode로 두지 않는다.
-q : 프로토콜에 대한 정보를 덜 출력한다. 따라서 출력되는 라인이 좀 더 짧아진다.
-S : TCP sequence번호를 상대적인 번호가 아닌 절대적인 번호로 출력한다.
-t : 출력되는 각각의 라인에 시간을 출력하지 않는다.
-tt : 출력되는 각각의 라인에 형식이 없는 시간들을 출력한다.
-v : 좀 더 많은 정보들을 출력한다.
-vv : ‘-v’보다 좀 더 많은 정보들을 출력한다.
-w : 캡춰한 패킷들을 분석해서 출력하는 대신에 그대로 파일에 저장한다.
-x : 각각의 패킷을 헥사코드로 출력한다
* tcpdump 주요 조건식
tcpdump를 사용하는 주요 형태는 다음과 같다.
# tcpdump <옵션> <type> <dir> <proto>
옵션은 위에 설명 하였고 <type>는 네트워크 패킷의 target 으로 생각하면된다.
host, net, port 가 그에 해당한다. <type>에 특정 값이 없으면 host가 default로 주어진다.
<dir>는 특정한 전송 방향을 가르킨다. src, dst, src or dst, src and dst등이 있다.
<proto>는 패킷 모니터링을 할 대상 프로토콜이다. tcp, udp, ip, arp 등이 이에 해당한다.
아래는 흔히 사용되는 tcpdump 조건식 들이다.
# dst host HOST
packet의 IP destination 항목이 HOST일때 참이 된다.
# src host HOST
packet의 IP source 항목이 HOST일때 참이 된다.
# host HOST
IP source, IP destination 항목 중 어느 하나라도 HOST이면 참이다.
# ether dst ehost
ethernet destination 주소가 ehost일 때 참이다.
# ether src ehost
ethernet source 주소가 ehost일 때 참이다.
# ether host ehost
ethernet source, destination 항목들 중 어느 하나라도 ehost이면 참이다.
# gateway host
패킷이 host를 게이트웨이로 사용하면 참이다.
이 말의 의미는 ethernet sour ce나 destination 항목은 host이지만,
IP source와 destination은 host가 아닐 때를 말한다.
# dst net NET
패킷의 IP destination 주소가 NET의 network number를 가지고 있을 때 참이 다.
# src net NET
패킷의 IP source 주소가 NET의 network number를 가지고 있을 때 참이다.
# net NET
패킷의 IP source 주소 혹은 destination 주소가 NET의 network number를 가 지고 있을 때
참이다.
# net netmask mask
IP 어드레스가 지정된 netmask를 통해서 net과 매칭되면 참이다.
# net net/len
IP 어드레스가 netmask와 len 비트만큼 매치되면 참이다.
# dst port PORT
패킷이 ip/tcp, ip/udp 프로토콜의 패킷이고 destination port의 값이 PORT일 때 참이다.
port는 /etc/services에 명시된 이름일 수도 있고 그냥 숫자일 수도 있다.
만약 이름이 사용됐다면 port 번호와 프로토콜이 같이 체크될 것이다.
만약 숫자나 불 확실한 이름이 사용됐을 경우에는 port 번호만이 체크될 것이다.
# src port PORT
패킷의 source port의 값으로 PORT를 가지면 참이다.
# port PORT
패킷의 source, destination port 중에 하나라도 PORT이면 참이다.
# less length
패킷이 length보다 짧거나 같으면 참이다.(len <= length)
# greater length
패킷이 length보다 짧거나 같으면 참이다.(len >= length)
# ip proto protocol
패킷이 지정된 종류의 프로토콜의 ip패킷이면 참이다.
Protocol은 icmp, igrp, udp, nd, tcp 중의 하나 혹은 몇 개가 될 수 있다.
주의할 점은 tcp, udp, icmp들은 ‘\\’로 escape되어야 한다.
# ehter broadcast
패킷이 ethernet broadcast 패킷이라면 참이다. ehter는 생략 가능하다.
# ip broadcast
패킷이 IP broadcast 패킷이라면 참이다.
# ether multicast
패킷이 IP multicast 패킷이라면 참이다.
# ether proto protocol
패킷이 ether type의 protocol이라면 참이다. ㅑ
protocol은 ip, arp, rarp 중에 하나 혹은 몇개가 될 수 있다.
ip proto protocol에서와 마찬가지로 ip, arp, rarp는 escape 되어야 한다.
아래는 간단한 사용 예제 들이다.
# tcpdump -vv port 80 : 80 번 포트가 반응하는 패킷을 검출함.
# tcpdump src 192.168.1.1 : 192.168.1.1에서 오는 패킷을 검출함
# tcpdump dst 192.168.1.2 : 192.168.1.2 로 가는 패킷을 검출함
2.12.2 Open Source 기반의 Server Managemnet System 설치 및 관리
2.12.2.1 MRTG 를 이용한 시스템 리소스 모니터링
MRTG는 Multi Router Traffic Crapher 의 약어로서 네트워크 트래픽과 시스템 리소스의
현황을 그래픽 인터페이스로 표현해 주는 대표적인 모니터링 도구 이다.
MRTG 는 snmp 를 이용하여 snmp 에서 제공하는 시스템 정보를 받아 다양한 형태의 분석
,관리 툴을 구성할 수 있다.
아래는 net-snmp 와 mrtg 를 이용하여 시스템 모니터링 서버를 구축해 보도록 한다.
snmpd 와 mrtg 를 이용한 웹 그래픽 모니터링 시스템을 구축 하기 위해서는 기본적으로
zlib, gd, libpng, libjpeg 등의 라이브러리가 필요하다. 이는 앞의 APM 서버 구축 시
설치 하는 방법이 자세히 나와 있다.
먼저 시스템의 정보를 분석할 수 있는 net-snmpd 를 설치하는 방법에 대해 알아보도록
하자.
– net-snmp 설치
이전에 snmpd 는 ucd-snmpd 프로그램을 사용하였는데 근래에 들어 net-snmpd로 변경이
되었다. 관련 패키지는 http://sourceforget.net 에서 다운 받을 수 있다.
설치에 앞서 배포판 패키지에 기본적으로 설치 되어진 net-snmp 관련 패키지를 삭제 한다.
[root@arhfw src]# rpm -e net-snmp-devels
[root@arhfw src]# rpm -e net-snmp-utils
[root@arhfw src]# rpm -e net-snmp –nodeps
다운 받은 패키지의 압축을 푼다.
[root@arhfw src]# tar xzvf net-snmp-5.2.1.tar.gz
[root@arhfw src]# cd net-snmp-5.2.1
[root@arhfw net-snmp-5.2.1]# ./configure
..configure 과정에서 몇 가지 정보를 물어 보게 된다. 해당 정보를 입력한다.
.
*** Default SNMP Version:
.
Default version of SNMP to use (3): -> Enter
.
*** System Contact Information:
System Contact Information (root@): admin@domain.com
.
*** System Location:
System Location (Unknown): Ace Techno TowerV,Guro3-Dong,Guro-Gu,Seoul,Korea
*** Logfile location:
Location to write logfile (/var/log/snmpd.log): -> Enter
Location to write persistent information (/var/net-snmp): -> Enter
.
.
config.status: creating mibs/Makefile
config.status: creating net-snmp-config
config.status: creating include/net-snmp/net-snmp-config.h
config.status: executing default commands
———————————————————
Net-SNMP configuration summary:
———————————————————
SNMP Versions Supported: 1 2c 3
Net-SNMP Version: 5.2.1
Building for: linux
Network transport support: Callback Unix TCP UDP
SNMPv3 Security Modules: usm
Agent MIB code: mibII ucd_snmp snmpv3mibs notification target
agent_mibs agentx utilities
SNMP Perl modules: disabled
Embedded perl support: disabled
Authentication support: MD5 SHA1
Encryption support: DES AES
———————————————————
[root@arhfw net-snmp-5.2.1]# make
[root@arhfw net-snmp-5.2.1]# umask 022
[root@arhfw net-snmp-5.2.1]# make install
mrtg 및 기타 그래픽 모니터링 툴에서 snmp perl modules을 사용하는 경우가 많다.
perl 에서 지원하는 snmp 모듈을 인스톨 하자.
Perl/SNMP 모듈인스톨을 하자.
[root@arhfw net-snmp-5.2.1]# cd perl/SNMP/
[root@arhfw SNMP]# perl Makefile.PL
[root@arhfw SNMP]# make
[root@arhfw SNMP]# make install
[root@arhfw SNMP]# cd ../..
Sample 설정 파일을 이용하여 snmp 설정을 한다.
[root@arhfw net-snmp-5.2.1]# cp EXAMPLE.conf /usr/local/share/snmp/snmpd.conf
[root@arhfw net-snmp-5.2.1]# cd /usr/local/share/snmp
[root@arhfw snmp]# vi snmpd.conf
——————————————————————————-
주석 부분은 살펴만 보고 실제 주요 적용 부분은 아래와 같다.
####
# First, map the community name (COMMUNITY) into a security name
# (local and mynetwork, depending on where the request is coming
# from):
# sec.name source community
#com2sec local localhost COMMUNITY
#com2sec mynetwork NETWORK/24 COMMUNITY
com2sec local localhost 12345
com2sec clunix 192.168.123.0/24 54321
com2sec public default 54321
####
# Second, map the security names into group names:
# sec.model sec.name
group mysite v1 local
group mysite v2c local
group mysite usm local
group mydomain v1 clunix
group mydomain v2c clunix
group mydomain usm clunix
group public v1 public
group public v2c public
group public usm public
####
# Finally, grant the 2 groups access to the 1 view with different
# write permissions:
# context sec.model sec.level match read write notif
access mysite “” any noauth exact all all all
access mydomain “” any noauth exact all all none
access public “” any noauth exact sytem none none
——————————————————————————
이 시스템 자체에서 모니터툴인 MRTG 가 설치 되어져 있어 로컬 시스템의 리소스만 모니터링
한다고 하면 local 부분의 community 를 바꾸어 주어야 하고, 원격 시스템에 MRTG 가 설치
되어져 있는 경우에는 mynetwork 부분의 NETWOK/24 부분에 원격시스템의 주소를 적어주고
community를 변경해 주면 된다.
이제 snmpd daemon 을 실행한다.
[root@arhfw snmp]# /usr/local/sbin/snmpd
정상적으로 시스템 정보를 읽어 오는 지 테스트를 한다.
[root@arhfw snmp]# snmpget -v1 -c 12345 localhost system.sysLocation.0
———– ———–
(community) (source)
SNMPv2-MIB::sysLocation.0 = STRING: Right here, right now.
[root@arhfw snmp]# snmpwalk -v1 -c 12345 localhost system
——————————————————————————-
SNMPv2-MIB::sysDescr.0 = STRING: Linux arhfw 2.4.30 #3 SMP 2005. 06. 08. (수)
09:53:01 KST i686
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
SNMPv2-MIB::sysUpTime.0 = Timeticks: (20395) 0:03:23.95
SNMPv2-MIB::sysContact.0 = STRING: Me <me@somewhere.org>
SNMPv2-MIB::sysName.0 = STRING: arhfw
SNMPv2-MIB::sysLocation.0 = STRING: Right here, right now.
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORID.1 = OID: IF-MIB::ifMIB
SNMPv2-MIB::sysORID.2 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.3 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.4 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.5 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.6 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORID.7 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.8 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.9 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORDescr.1 = STRING: The MIB module to describe generic objects for network interface sub-layers
SNMPv2-MIB::sysORDescr.2 = STRING: The MIB module for SNMPv2 entities
SNMPv2-MIB::sysORDescr.3 = STRING: The MIB module for managing TCP implementations
SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for managing IP and ICMP implement
———————————————————————————–
만일 소스를 localhost 가 아닌 로컬의 ip address 나 원격 시스템의 snmpd 를 이용하여
원격 시스템의 정보를 확인 하고 싶을 경우는 (source)의 위치에 원격 서버의 ip address
를 입력하고 -c 옵션 뒤에 community 를 snmpd.conf 에 지정된 community 를 입력하도록
한다.
위 snmpd.conf 의 설정을 기준으로 테스트를 한다고 하면 192.168.123.100 시스템의 정보
를 확인 하고 싶다면 아래와 같이 확인이 가능하다.
[root@arhfw snmp]# snmpwalk -v1 -c 54321 192.168.123.100 system
———————————————————————————–
SNMPv2-MIB::sysDescr.0 = STRING: Linux arhfw 2.4.30 #3 SMP 2005. 06. 08. (수)
09:53:01 KST i686
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
SNMPv2-MIB::sysUpTime.0 = Timeticks: (28984) 0:04:49.84
SNMPv2-MIB::sysContact.0 = STRING: Me <me@somewhere.org>
SNMPv2-MIB::sysName.0 = STRING: arhfw
SNMPv2-MIB::sysLocation.0 = STRING: Right here, right now.
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORID.1 = OID: IF-MIB::ifMIB
SNMPv2-MIB::sysORID.2 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.3 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.4 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.5 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.6 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORID.7 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.8 = OID: SNMP-MPD-MIB::snmpMPDCompliance
———————————————————————————–
– mrtg 설치
먼저 MRTG 를 설치하기 위해서 apache+PHP 에 gd 와 libpng,zlib가 연동되어져있어야 합니다.
그런 후 MRTG 를 설치하시는게 좋을것입니다.
apache + php + libpng + zlib + libjpeg 는 앞 단원에서 자세히 설명한 적이 있다.
여기서는 바로 mrtg 설치에 대해 알아 보도록 한다.
[root@arhfw src]# tar xzvf mrtg-2.12.1.tar.gz
[root@arhfw src]# cd mrtg-2.12.1
[root@arhfw mrtg-2.12.1]# ./configure –prefix=/usr/local/mrtg \\
–with-gd=/usr/local/lib –with-zlib=/usr/local/lib –with-libpng=/usr/local/lib
[root@arhfw mrtg-2.12.1]# make
[root@arhfw mrtg-2.12.1]# make install
MRTG 가 이상없이설치 완료 되었으면 bin 디렉토리 밑에 mrtg,cfgmaker 와 같은 실행파일이
만들어 져 있다.
이제 MRTG 설치가 완료 되었다.
다음 단원에서 mrtg.cfg 설정에 대해 알아 보도록 한다.
– mrtg.cfg 설정
cfgmaker 란 명령어로 해당 시스템의 mrtg.cfg 파일을 생성하도록 한다.
사용 방법은 아래와 같다.
# ./cfgmaker xxxxxxx@localhost
(xxxxxxx는 snmp 설치시 community 이고 localhost에는 ip address 혹은 domain name 을
적어준다. )
cfgmaker 를 이용할때 몇가지 옵션을 이용하여 해당 시스템에 최적화된 설정 파일을 바로
생성 할 수도 있다.
생성전에 cfg 파일이 생성될 디렉토리를 만들어 놓도록 한다.
[root@arhfw bin]# mkdir /usr/local/mrtg/cfg
[root@arhfw bin]# ./cfgmaker \\
> –global ‘WorkDir: /home/clunix/www/mrtg/’ \\
> –global ‘Language: korean’ \\
> –global ‘Options[_]: bits,growright’ \\
> –output /usr/local/mrtg/cfg/mrtg-basic.cfg \\
> 12345@localhost
———————————————————————————
.
–coca: store in confcache 12345@localhost_ Eth 00-e0-29-47-5c-6c –> 4
–coca: store in confcache 12345@localhost_ Eth 00-e0-29-47-5c-6d –> 5
–coca: store in confcache 12345@localhost_ Eth 00-e0-81-02-fd-ef –> 6 (duplicate)
–base: Get Interface Info
–base: Walking ifIndex
–base: Walking ifType
–base: Walking ifAdminStatus
–base: Walking ifOperStatus
–base: Walking ifMtu
–base: Walking ifSpeed
–base: Writing /usr/local/mrtg/cfg/mrtg-basic.cfg
———————————————————————————
/usr/local/mrtg/cfg 에 가서 mrtg-basic.cfg 파일이 정상적으로 생성 되었는지 확인한다.
[root@arhfw bin]# cd /usr/local/mrtg/cfg
[root@arhfw cfg]# ls mrtg-basic.cfg
mrtg-basic.cfg
그럼 기본적으로 시스템의 네트워크 장치를 통한 네트워크 트래픽을 체크하는 기본 설정
파일이 생성이 되어져 있을 것이다.
만일 SNMPWALK Problem for 1.3.6.1.2.1.2.2.1.3 on xxxxxxxxx@localhost:
와 같은 메세지가 뜨면 이는 community 가 틀리거나 snmp 데몬이 정상적으로 동작 하지 않는
경우이다. 앞에 설정 과정을 다시 한번 점검해 보도록 한다.
설정 내용을 한번 살펴 보도록 하자
[root@arhfw cfg]# vi mrtg-basic.cfg
——————————————————————————–
EnableIPv6: no
WorkDir: /home/clunix/www/mrtg/
Language: korean
Options[_]: bits,growright
### Interface 2 >> Descr: ‘eth0’ | Name: ” | Ip: ” | Eth: ” ###
Target[localhost_2]: 2:12345@localhost:
SetEnv[localhost_2]: MRTG_INT_IP=”” MRTG_INT_DESCR=”eth0″
MaxBytes[localhost_2]: 12500000
Title[localhost_2]: Traffic Analysis for 2 — arhfw
PageTop[localhost_2]: <h1>Traffic Analysis for 2 — arhfw</h1>
<div id=”sysdetails”>
<table>
<tr>
<td>System:</td>
<td>arhfw in Right here, right now.</td>
</tr>
<tr>
<td>Maintainer:</td>
<td>Me <me@somewhere.org></td>
</tr>
<tr>
<td>Description:</td>
<td>eth0 </td>
</tr>
<tr>
<td>ifType:</td>
<td>ethernetCsmacd (6)</td>
</tr>
<tr>
<td>ifName:</td>
<td></td>
</tr>
<tr>
<td>Max Speed:</td>
<td>100.0 Mbits/s</td>
</tr>
</table>
</div>
.
.
———————————————————————————-
그럼 위와 같은 형식으로 현재 활성화 상태로 있는 네트워크 장치에 대한 설정이 자동
생성 되어져 있을 것이다. 설정 내용을 간단히 설명하면..
WorkDir: /home/clunix/www/mrtg/ => mrtg 관련 결과 파일이 생성될 위치
Language: korean => mrtg 결과 파일
Options[_]: bits,growright => traffic 단위, 그래표 흐름 방향
Target[localhost_2]: => [localhost_2]는 mrtg 실행 시 생성되는 파일 명에 해당한다.
즉 eth0 네트워크 카드에서 발생하는 트래픽을 보고 싶을 경우 localhost_2.html 페이지
에서 확인이 가능한 것이다.
이 파일 명은 접근이 쉽게 수정을 하면 된다.
이제 mrtg 를 실행 시켜 보자. 먼저 Mrtg bin Directory 로 이동한다.
– mrtg 실행
[root@arhfw cfg]# cd /usr/local/mrtg/bin
앞 서 만들어 놓은 mrtg-basic.cfg 파일을 대상으로 mrtg 페이지를 생성하도록 한다.
[root@arhfw bin]# ./mrtg ../cfg/mrtg-basic.cfg
Rateup WARNING: /usr/local/mrtg/bin/rateup The backup log file for arhfw-clxbr0 was invalid as well
Rateup WARNING: /usr/local/mrtg/bin/rateup Can’t remove arhfw-clxbr0.old updating log file
Rateup WARNING: /usr/local/mrtg/bin/rateup Can’t rename arhfw-clxbr0.log to arhfw-clxbr0.old updating log file
처음 실행 시는 위와 같이 몇가지 Warning 이 발생한다. 이는 처음 실행 시 기본적인 파일이
생성되지 못해 발생하는 경고다. 3번 정도 실행하면 더 이샹의 경고는 없을 것이다.
이제 위의 workdir 에 지정된 경로에 가면 mrtg 관련 페이지가 생성이 되어져 있을 것이다.
위의 명령 구문을 cron 에 등록하여 주기적으로 네트워크 트래픽을 체크 하도록 하자.
실무에서는 이런 Mrtg 체크 항목이 많이 있을 것이다. 항목마다 cron 에서 개별적으로 등록,
관리 하게 되면, 관리 상 비효율적인 부분이 많이 발생할 것이다.
아래와 같이 mrtg 항목을 일괄 관리 할 수 있는 스크립트를 작성 하도록 한다.
[root@arhfw bin]# vi /usr/local/mrtg/bin/mrtgstart.sh
————————————————————————————-
#!/bin/sh
MRTG_HOME=/usr/local/mrtg
$MRTG_HOME/bin/mrtg $MRTG_HOME/cfg/mrtg-basic.cfg
————————————————————————————-
mrtgstart.sh 에 실행 권한을 준다.
[root@arhfw bin]# chmod 755 mrtgstart.sh
그런 후 cron에 위 mrtgstart.sh 를 등록하도록 한다.
이후 추가 되는 Mrtg 항목은 모두 mrtgstart.sh 스크립터에 등록하도록 한다.
[root@arhfw bin]# crontab -e
————————————————————————————
*/1 * * * * /usr/local/mrtg/bin/mrtgstart.sh
————————————————————————————
[root@arhfw bin]# /etc/rc.d/init.d/crond restart
이제 웹 브라우저에서 mrtg 결과 Reports 를 확인한다.
http://www.domain.com/mrtg/arhfw_eth0.html
[그림 Mrtg 모니터링 ]
mrtg Reports 를 보면 일간 그래프, 주간 그래프, 월간 그래프, 연간 그래프 등이 있는데
mrtg 항목이 여러개일 경우 일간 그래프 만을 index 화 시킨 index.html를 자동 생성할 수
있다.
# /usr/local/mrtg/bin/indexmaker –output=/home/clunix/www/mrtg/index.html \\
–title=”Clunix’s Linux Work System Mrtg Monitor” \\
–sort=name \\
–enumerate \\
/usr/local/mrtg/cfg/mrtg-basic.cfg
그럼 /home/clunix/www/mrtg/index.html 페이지가 생성이 된다.
– Snmp 를 이용한 mrtg의 다양한 시스템 모니터링 설정
mrtg 의 경우 단순히 네트워크 Traffic 만을 체크하진 않는다. snmp 의 경우 시스템에서
유동적인 대부분의 리소스와 상태를 모니터링 할 수 있기 때문에 이를 이용하면 다양한
시스템 리소스를 MRTG 를 이용하여 그래프로 표현 할 수 있다.
여기서는 실무에서 주로 모니터링을 하는 CPU, MEM, SWAP, DISK, TCP 등에 대한 리소스를
모니터링 하는 방법에 대해 알아본다.
아래 mrtg.cfg 파일은 위 리소스를 체크하는 설정 파일이다.
[root@arhfw cfg]# vi mrtg-server.cfg
———————————————————————————–
LoadMIBs: /usr/local/share/snmp/mibs/UCD-SNMP-MIB.txt,/usr/local/share/snmp/mibs/TCP-MIB.txt
workdir: /home/clunix/www/mrtg
Language: korean
# CPU Monitoring
# (Scaled so that the sum of all three values doesn’t exceed 100)
Target[arhfw_cpu]:ssCpuRawUser.0&ssCpuRawUser.0:12345@localhost + ssCpuRawSystem.0&ssCpuRawSystem.0:12345@localhost + ssCpuRawNice.0&ssCpuRawNice.0:12345@localhost
Title[arhfw_cpu]: Server CPU Load
PageTop[arhfw_cpu]: <H1>CPU Load – System, User and Nice Processes</H1>
MaxBytes[arhfw_cpu]: 100
ShortLegend[arhfw_cpu]: %
YLegend[arhfw_cpu]: CPU Utilization
Legend1[arhfw_cpu]: Current CPU percentage load
LegendI[arhfw_cpu]: Used
LegendO[arhfw_cpu]:
Options[arhfw_cpu]: growright,nopercent
Unscaled[arhfw_cpu]: ymwd
# Memory Monitoring (Total Versus Available Memory)
Target[arhfw_mem]: memAvailReal.0&memTotalReal.0:12345@localhost
Title[arhfw_mem]: Free Memory
PageTop[arhfw_mem]: <H1>Free Memory</H1>
MaxBytes[arhfw_mem]: 100000000000
ShortLegend[arhfw_mem]: B
YLegend[arhfw_mem]: Bytes
LegendI[arhfw_mem]: Free
LegendO[arhfw_mem]: Total
Legend1[arhfw_mem]: Free memory, not including swap, in bytes
Legend2[arhfw_mem]: Total memory
Options[arhfw_mem]: gauge,growright,nopercent
kMG[arhfw_mem]: k,M,G,T,P,X
# Memory Monitoring (Percentage usage)
Title[arhfw_mem1]: Percentage Free Memory
PageTop[arhfw_mem1]: <H1>Percentage Free Memory</H1>
Target[arhfw_mem1]: ( memAvailReal.0&memAvailReal.0:12345@localhost ) * 100 / ( memTotalReal.0&memTotalReal.0:12345@localhost )
options[arhfw_mem1]: growright,gauge,transparent,nopercent
Unscaled[arhfw_mem1]: ymwd
MaxBytes[arhfw_mem1]: 100
YLegend[arhfw_mem1]: Memory %
ShortLegend[arhfw_mem1]: Percent
LegendI[arhfw_mem1]: Free
LegendO[arhfw_mem1]: Free
Legend1[arhfw_mem1]: Percentage Free Memory
Legend2[arhfw_mem1]: Percentage Free Memory
# New TCP Connection Monitoring (per minute)
Target[arhfw_ntcp]: tcpPassiveOpens.0&tcpActiveOpens.0:12345@localhost
Title[arhfw_ntcp]: Newly Created TCP Connections
PageTop[arhfw_ntcp]: <H1>New TCP Connections</H1>
MaxBytes[arhfw_ntcp]: 10000000000
ShortLegend[arhfw_ntcp]: c/s
YLegend[arhfw_ntcp]: Conns / Min
LegendI[arhfw_ntcp]: In
LegendO[arhfw_ntcp]: Out
Legend1[arhfw_ntcp]: New inbound connections
Legend2[arhfw_ntcp]: New outbound connections
Options[arhfw_ntcp]: growright,nopercent,perminute
# Established TCP Connections
Target[arhfw_etcp]: tcpCurrEstab.0&tcpCurrEstab.0:12345@localhost
Title[arhfw_etcp]: Currently Established TCP Connections
PageTop[arhfw_etcp]: <H1>Established TCP Connections</H1>
MaxBytes[arhfw_etcp]: 10000000000
ShortLegend[arhfw_etcp]:
YLegend[arhfw_etcp]: Connections
LegendI[arhfw_etcp]: In
LegendO[arhfw_etcp]:
Legend1[arhfw_etcp]: Established connections
Legend2[arhfw_etcp]:
Options[arhfw_etcp]: growright,nopercent,gauge
# Disk Usage Monitoring
Target[arhfw_disk]: dskPercent.1&dskPercent.2:12345@localhost
Title[arhfw_disk]: Disk Partition Usage
PageTop[arhfw_disk]: <H1>Disk Partition Usage / and /usr</H1>
MaxBytes[arhfw_disk]: 100
ShortLegend[arhfw_disk]: %
YLegend[arhfw_disk]: Utilization
LegendI[arhfw_disk]: /
LegendO[arhfw_disk]: /usr
Options[arhfw_disk]: gauge,growright,nopercent
Unscaled[arhfw_disk]: ymwd
—————————————————————————————
이제 mrtgstart.sh 에 위 설정을 적용하도록 한다.
[root@arhfw mrtg]# vi /usr/local/mrtg/bin/mrtgstart.sh
————————————————————————————–
.
$MRTG_HOME/bin/mrtg $MRTG_HOME/cfg/mrtg-server.cfg
————————————————————————————–
mrtg index 페이지를 생성한다.
# /usr/local/mrtg/bin/indexmaker –output=/home/clunix/www/mrtg/index.html \\
–title=”arhfw’s Linux Work System Mrtg Monitor” \\
–sort=name \\
–enumerate \\
/usr/local/mrtg/cfg/mrtg-basic.cfg \\
/usr/local/mrtg/cfg/mrtg-server.cfg
브라우저에서 확인 한다.
http://domain.com/mrtg/index.html
[ 그림 Mrtg 모니터링2]
– Shell Scripts 를 이용한 Mrtg 시스템 리소스 모니터링
위에서는 snmpd 에서 제공하는 정보를 이용하여 시스템 리소스 모니터링을 한것이다.
여기서는 로컬 시스템에 shell scripts 를 제작하여 결과를 mrtg 그래프로 표현하는
방법에 대해 알아보도록 한다.
먼저 Mrtg 가 그래표를 그리는 patten 을 이해해야 한다. 간단히 설명하면 mrtg 는
하나의 그래프에서 두개의 결과를 표현할 수 있는데 이는 mrtg.cfg 파일에서 LegendI
와 LegendO 로 표현을 한다. LegendI,LegendO 값은 Target 에 지정된 명령을 실행 시
행 단위로 출력되는 두개의 값을 순서되로 입력하게 된다.
하나의 예를 들어 보자.
[root@arhfw bin]# vi /usr/local/mrtg/bin/web_count.sh
———————————————————————————-
#!/bin/sh
a=`ps auxw | grep httpd | grep -v grep | wc -l`
b=`netstat -an | grep :80 | wc -l`
echo $a
echo $b
———————————————————————————-
위 값은 httpd daemon 의 수와 session 수를 측정하는 scripts 이다. 이 scripts 를 실행
하면 아래와 같은 결과가 나온다.
[root@arhfw bin]# /usr/local/mrtg/bin/web_count.sh
24
1
즉 여기서 24 가 mrtg.cfg 의 LegendI 에 해당하고 1 이 LegendO 해당하게 된다.
위 scripts 를 이용하여 mrtg 로 web process 수와 session 수를 모니터링 하는 mrtg 설정
을 생성하면 아래와 같다.
[root@arhfw cfg]# vi mrtg-web.cfg
———————————————————————————–
WorkDir: /home/clunix/www/mrtg
Language: korean
Target[web]: `/usr/local/mrtg/bin/web_count.sh`
WithPeak[web]: my
MaxBytes[web]: 100
Title[web]: test’s system: httpd daemon & httpd session
Options[web]: gauge,integer,growright,nopercent
YLegend[web]: Number
LegendI[web]: httpd daemon:
LegendO[web]: httpd session:
Legend1[web]: Number of httpd
Legend2[web]: Number of session
Legend3[web]: 5 Min Max Number of httpd
Legend4[web]: 5 Min Max Number of httpd session
ShortLegend[web]: 개
PageTop[web]: <H1>arhfw’s system: httpd daemon & session</H1>
———————————————————————————–
cfg 의 각 항목을 설명하면 아래와 같다.
Target[mrtg_tag] ->
mrtg가 data를 얻어올 target을 지정한다. 주로 snmp 를 이용하 지만 여기서는 shell script
로 얻어온다. snmp를 이용하지 않을 경우 즉, shell script 나 perl 또는 다른 C 로 만든
binary 를 사용할 경우에는 “ 문자열로 해당 명령어를 감싸주면 된다.
“ 는 작은 따옴표(single quote) 가 아니라 tab key 바로 위에 있 는 `를 의미한다.
Title[mrtg_tag] ->
별 의미가 없다. 다만 이 mrtg_tag의 설정이 무엇인가를 구분하 기 위한 tag 정도라고
여기면 되겠다.
MaxBytes[mrtg_tag] ->
원래의 의미는 network전송량의 최대값을 의미 하지만 여기서 는 조금씩 틀리다.
이 부분에 대해서 지정을 할 필요가 있는 부 분에 대해서는 각각의 설정에서 이값을 어떻게
구하는지 설명을 붙여 놓을 것이다.
Options[mrtg_tag] ->
Options 에는 여러가지 옵션이 있지만 보통 많이 사용 하는 것은 3가지 즉, gauge, integer,
nopercent 정도이다. gauge는 얻어진 값을 절대값으로 평가를 하며, 주로 network 과 상관
이 없는 system 의 resouce 즉 disk, process 같은 것들을 측정할 때 많이 사용이 되어진다.
integer 는 측정 graph에 들어가는 수치와 측정 graph 하단의 수치를 정수로 보여주는 것을
의미한다.
지정치 않을 경우 소숫점 1자리로 표현이 된다. nopercent는 위 에서 지정한 MaxBytes 의
값을 기준으로 몇 % 를 사용하고 있다고 나타내는 것을 출력하지 않게 한다.
Unscaled[mrtg_tag] ->
mrtg는 기본적으로 Y축은 측정값의 최대 수치에 맞추어서 Y축의 최대값을 보여준다.
즉 Y 축의 좌표가 유동적으로 표현이 된다는 의미이다.
하지만 이 지시자를 설정을 하면 Y 축의 좌표의 최대값은 MaxBytes 에서 설정한 값으로
고정이 된다. 이 지시자의 value는 d,w,m,y 4개의 값을 가지며 이들은 각각 day graph,
week graph, month graph, year graph (mrtg는 기본적으로 이 4 개의 graph로 구성이 된다.)
를 의미한다.
WithPeak[mrtg_tag] ->
WithPeak 는 5분간의 최대 수치를 graph로 나타내게 된다. 이것 역시 d,w,m,y 의 값을
가지며 month graph와 year graph 에서만 Peak 값을 graph로 그리려면 m,y 로 지정을 하면
된다.
YLegend[mrtg_tag] ->
YLegend 는 graph 의 Y 축의 tag 를 지정한다. 즉 Y 축의 이름을 지정한다고 생각하라.
ShortLegend[mrtg_tag] ->
X 축 아래의 평균 수치를 나타내는 단위를 적는다. 이 부분은 상당히 유동적이기 때문에
운영 하면서 어떻게 사용되는지 판단해 보기 바란다.
LegendO[mrtg_tag] ->
Output data 의 tag 이다. 그래프에서 파란색 문자열에 해당한다.
LegendI[mrtg_tag] ->
Input data 의 tag 이다. 그래프에서 초록색 문자열에 해당한다.
Legend1,2,3,4[mrtg_tag] ->
year graph 하단의 그래프 설명을 지정한다. 차례대로 1,2,3,4 가 되며, 지정을 하지 않으면
나타나지 않는다.
PageTop[mrtg_tag] ->
html 로 변환할때 가장 상단의 title을 지정한다. 이 부분은 꼭 <H1> tag 로 감싸줘야 한다.
PageTop지시자의 아래에는 필요한 문자열 같은 것을을 html 양식으로 지정할수도 있다.
이제 snmp 정보를 이용하지 말고 scripts 를 이용하여 몇 가지 시스템 리소스 모니터링
그래프를 생성해 보도록 하자.
아래에 httpd , mysql, system load average 를 모니터링 하는 스크립터를 생성한다.
[root@arhfw bin]# vi /usr/local/mrtg/bin/web_count.sh
———————————————————————————-
#!/bin/sh
a=`ps auxw | grep httpd | grep -v grep | wc -l`
b=`netstat -an | grep :80 | wc -l`
c=`uptime | sed -e s/,//g | awk ‘{print $3,$4,$5}’`
d=`hostname`
echo $a
echo $b
echo $c
echo $d
———————————————————————————-
[root@arhfw cfg]# vi /usr/local/mrtg/bin/mysql_count.sh
————————————————————————————-
#!/bin/sh
a=`ps auxw | grep mysqld | grep -v grep | wc -l`
b=`netstat -an | grep mysql.sock | wc -l`
c=`uptime | sed -e s/,//g | awk ‘{print $3,$4,$5}’`
d=`hostname`
echo $a
echo $b
echo $c
echo $d
————————————————————————————-
[root@arhfw bin]# vi /usr/local/mrtg/bin/load_average.sh
————————————————————————————-
#!/bin/sh
result1=`uptime | sed -e s/,//g`
result2=${result1##*average:}
a=`echo $result2 | awk ‘{print $1}’`
b=`echo $result2 | awk ‘{print $3}’`
c=`uptime | sed -e s/,//g | awk ‘{print $3,$4,$5}’`
d=`hostname`
echo $a
echo $b
echo $c
echo $d
————————————————————————————–
[root@arhfw bin]# chmod 755 web_count.sh
[root@arhfw bin]# chmod 755 mysql_count.sh
[root@arhfw bin]# chmod 755 load_average.sh
위 Scripts를 통한 결과를 Mrtg로 그래프로 출력하는 cfg 설정 파일을 만든다.
[root@arhfw cfg]# vi mrtg-scripts.cfg
————————————————————————————-
WorkDir: /home/clunix/www/mrtg
Language: korean
Target[arhfw_web]: `/usr/local/mrtg/bin/web_count.sh`
WithPeak[arhfw_web]: my
MaxBytes[arhfw_web]: 100
Title[arhfw_web]: arhfw’s system: httpd daemon & httpd session
Options[arhfw_web]: gauge,integer,growright,nopercent
YLegend[arhfw_web]: Number
LegendI[arhfw_web]: httpd daemon:
LegendO[arhfw_web]: httpd session:
Legend1[arhfw_web]: Number of httpd
Legend2[arhfw_web]: Number of session
Legend3[arhfw_web]: 5 Min Max Number of httpd
Legend4[arhfw_web]: 5 Min Max Number of httpd session
ShortLegend[arhfw_web]: 개
PageTop[arhfw_web]: <H1>arhfw’s system: httpd daemon & session</H1>
Target[arhfw_mysql]: `/usr/local/mrtg/bin/mysql_count.sh`
WithPeak[arhfw_mysql]: my
MaxBytes[arhfw_mysql]: 100
Title[arhfw_mysql]: arhfw’s system: mysql daemon & mysql session
Options[arhfw_mysql]: gauge,integer,growright,nopercent
YLegend[arhfw_mysql]: Number
LegendI[arhfw_mysql]: mysql daemon:
LegendO[arhfw_mysql]: mysql session:
Legend1[arhfw_mysql]: Number of mysql
Legend2[arhfw_mysql]: Number of session
Legend3[arhfw_mysql]: 5 Min Max Number of mysql
Legend4[arhfw_mysql]: 5 Min Max Number of mysql session
ShortLegend[arhfw_mysql]: 개
PageTop[arhfw_mysql]: <H1>arhfw’s system: mysql daemon & session</H1>
Target[arhfw_load]: `/usr/local/mrtg/bin/load_average.sh`
WithPeak[arhfw_load]: my
Title[arhfw_load]: arhfw : Load Average
MaxBytes[arhfw_load]: 100
Options[arhfw_load]: growright,gauge,transparent,nopercent
YLegend[arhfw_load]: Load Average
ShortLegend[arhfw_load]: avg
LegendI[arhfw_load]: 5 min:
LegendO[arhfw_load]: 15 min:
Legend1[arhfw_load]: 5분간 평균 Load AVG.
Legend2[arhfw_load]: 15분간 평균 Load AVG.
Legend3[arhfw_load]: 5분간 최대 Load AVG.
Legend4[arhfw_load]: 15분간 최대 Load AVG.
PageTop[arhfw_load]: <H1>arhfw’s system: Load Average</H1>
————————————————————————————
[root@arhfw bin]# cd /usr/local/mrtg/bin
[root@arhfw bin]# ./mrtg ../cfg/mrtg-scripts.cfg
웹 브라우저에서 확인 한다.
http://domain.com/mrtg/arhfw_load.html
http://domain.com/mrtg/arhfw_web.html
http://domain.com/mrtg/arhfw_mysql.html
– 원격 시스템 통합 모니터링
원격 시스템 통합 모니터링은 여러 대의 시스템에서 snmpd 데몬이 각 시스템의 리소스 정보
를 제공하고 Mrtg 그래프를 생성하는 하나의 관제 서버에서 각 시스템의 snmpd 리소스 정보
를 제공받아 통합적으로 리소스 그래프를 관리하는 방식의 시스템의 구성하는 것이다.
이 방식의 구축법은 이미 앞에서 언급을 하였듯이 snmpd.conf 설정 시 해당 시스템의 snmpd
정보를 reading 할수 있는 네트워크 대역 혹은 시스템을 선정하여 권한을 주고, 해당 시스템
에서 Mrtg 그래프를 생성하는 방법을 이용하면 된다.
지금까지 다루어온 내용으로 실제 환경에서의 Mrtg 통합 모니터링 시스템을 구축 하여 보도
록 하자.
시스템 구성은 다음과 같다.
arhfw (192.168.123.100) : Mrtg (Local Monitoring, Remote Monitoring), Snmpd
arh01 (192.168.123.101) : Snmpd
arh02 (192.168.123.102) : Snmpd
arh04 (192.168.123.104) : Snmpd
arh05 (192.168.123.105) : Snmpd
일단 arh01, arh02, arh04, arh05 에 net-snmp 를 설치 한다. arhfw 는 앞에서 언급한 바와
같이 동일한 구성으로 snmpd 와 mrtg 를 설치 해두도록 한다.
* arh01, arh02, arh04, arh05 의 /usr/local/share/snmp/snmpd.conf 주요 설정 사항
– arh01~05’s snmpd.conf
————————————————————————————
# sec.name source community
com2sec local localhost COMMUNITY
com2sec clunix 192.168.123.100 54321
# sec.model sec.name
group MyRWGroup v1 local
group MyRWGroup v2c local
group MyRWGroup usm local
group MyROGroup v1 clunix
group MyROGroup v2c clunix
group MyROGroup usm clunix
# context sec.model sec.level match read write notif
access MyROGroup “” any noauth exact all none none
access MyRWGroup “” any noauth exact all all none
————————————————————————————
이제 arh01~arh05 의 snmpd daemon 을 실행한다.
[root@arh01 snmp]# /usr/local/sbin/snmpd
[root@arh02 snmp]# /usr/local/sbin/snmpd
[root@arh04 snmp]# /usr/local/sbin/snmpd
[root@arh05 snmp]# /usr/local/sbin/snmpd
이제 arhfw 시스템에서 arh01~arh05 의 snmpd resource 정보를 읽어 올 수 있는지 테스트
한다.
[root@arhfw root]# snmpwalk -v1 -c 54321 192.168.123.101 system
————————————————————————————-
SNMPv2-MIB::sysDescr.0 = STRING: Linux arh01 2.4.20-8smp #1 SMP Thu Mar 13 17:45:54
EST 2003 i686
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
SNMPv2-MIB::sysUpTime.0 = Timeticks: (22000) 0:03:40.00
SNMPv2-MIB::sysContact.0 = STRING: Me <me@somewhere.org>
SNMPv2-MIB::sysName.0 = STRING: arh01
SNMPv2-MIB::sysLocation.0 = STRING: Right here, right now.
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORID.1 = OID: IF-MIB::ifMIB
SNMPv2-MIB::sysORID.2 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.3 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.4 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.5 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.6 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORID.7 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.8 = OID: SNMP-MPD-MIB::snmpMPDCompliance
.
.
————————————————————————————-
만일 위와 같이 해당 시스템의 정보를 읽어 올 수 없고, 아래와 같은 메세지가 나타나면,
arh01~arh05 시스템의 iptable 정책이나 community (password) 일치등을 점검해 보도록
한다.
[root@arhfw root]# snmpwalk -v1 -c 54321 192.168.123.101 system
Timeout: No Response from 192.168.123.101
마일 snmpd 가 실행 중인 시스템에 iptables 와 같은 방화벽이 설치가 되어져 있다면
tcp 161 port 를 mrtg 시스템의 ip에 대해 방화벽에서 열어줘야 할 것이다.
arh01~arh05 의 모든 시스템의 snmpd의 정보를 불려 올 수 있다면, arhfw 에서 MRTG설정을
하도록 한다.
[root@arhfw mrtg]# cd /usr/local/mrtg/cfg/mrtg-arh01.cfg
————————————————————————————-
LoadMIBs: /usr/local/share/snmp/mibs/UCD-SNMP-MIB.txt,/usr/local/share/snmp/mibs/TCP-MIB.txt
workdir: /home/clunix/www/mrtg
Language: korean
# CPU Monitoring
# (Scaled so that the sum of all three values doesn’t exceed 100)
Target[arh01_cpu]:ssCpuRawUser.0&ssCpuRawUser.0:54321@arh01 + ssCpuRawSystem.0&ssCpuRawSystem.0:54321@arh01 + ssCpuRawNice.0&ssCpuRawNice.0:54321@arh01
Title[arh01_cpu]: Arh01’s Server CPU Load
PageTop[arh01_cpu]: <H1>Arh01’s CPU Load – System, User and Nice Processes</H1>
MaxBytes[arh01_cpu]: 100
ShortLegend[arh01_cpu]: %
YLegend[arh01_cpu]: CPU Utilization
Legend1[arh01_cpu]: Current CPU percentage load
LegendI[arh01_cpu]: Used
LegendO[arh01_cpu]:
Options[arh01_cpu]: growright,nopercent
Unscaled[arh01_cpu]: ymwd
# Memory Monitoring (Total Versus Available Memory)
Target[arh01_mem]: memAvailReal.0&memTotalReal.0:54321@arh01
Title[arh01_mem]: Arh01’s Free Memory
PageTop[arh01_mem]: <H1>Arh01’s Free Memory</H1>
MaxBytes[arh01_mem]: 100000000000
ShortLegend[arh01_mem]: B
YLegend[arh01_mem]: Bytes
LegendI[arh01_mem]: Free
LegendO[arh01_mem]: Total
Legend1[arh01_mem]: Free memory, not including swap, in bytes
Legend2[arh01_mem]: Total memory
Options[arh01_mem]: gauge,growright,nopercent
kMG[arh01_mem]: k,M,G,T,P,X
# Established TCP Connections
Target[arh01_etcp]: tcpCurrEstab.0&tcpCurrEstab.0:54321@arh01
Title[arh01_etcp]: Arh01’s Currently Established TCP Connections
PageTop[arh01_etcp]: <H1>Arh01’s Established TCP Connections</H1>
MaxBytes[arh01_etcp]: 10000000000
ShortLegend[arh01_etcp]:
YLegend[arh01_etcp]: Connections
LegendI[arh01_etcp]: In
LegendO[arh01_etcp]:
Legend1[arh01_etcp]: Established connections
Legend2[arh01_etcp]:
Options[arh01_etcp]: growright,nopercent,gauge
# Network Traffic for Eth0
Target[arh01_net]: 2:54321@arh01:
SetEnv[arh01_net]: MRTG_INT_IP=”” MRTG_INT_DESCR=”eth0″
MaxBytes[arh01_net]: 12500000
Title[arh01_net]: Arh01’s Traffic Analysis for eth0
PageTop[arh01_net]: <h1>Arh01’s Traffic Analysis for eth0</h1>
Options[arh01_net]: bits,growright
————————————————————————————–
[root@arhfw cfg]# vi mrtg-arh02.cfg
————————————————————————————–
LoadMIBs: /usr/local/share/snmp/mibs/UCD-SNMP-MIB.txt,/usr/local/share/snmp/mibs/TCP-MIB.txt
workdir: /home/clunix/www/mrtg
Language: korean
# CPU Monitoring
# (Scaled so that the sum of all three values doesn’t exceed 100)
Target[arh02_cpu]:ssCpuRawUser.0&ssCpuRawUser.0:54321@arh02 + ssCpuRawSystem.0&ssCpuRawSystem.0:54321@arh02 + ssCpuRawNice.0&ssCpuRawNice.0:54321@arh02
Title[arh02_cpu]: Arh02’s Server CPU Load
PageTop[arh02_cpu]: <H1>Arh02’s CPU Load – System, User and Nice Processes</H1>
MaxBytes[arh02_cpu]: 100
ShortLegend[arh02_cpu]: %
YLegend[arh02_cpu]: CPU Utilization
Legend1[arh02_cpu]: Current CPU percentage load
LegendI[arh02_cpu]: Used
LegendO[arh02_cpu]:
Options[arh02_cpu]: growright,nopercent
Unscaled[arh02_cpu]: ymwd
# Memory Monitoring (Total Versus Available Memory)
Target[arh02_mem]: memAvailReal.0&memTotalReal.0:54321@arh02
Title[arh02_mem]: Arh02’s Free Memory
PageTop[arh02_mem]: <H1>Arh02’s Free Memory</H1>
MaxBytes[arh02_mem]: 100000000000
ShortLegend[arh02_mem]: B
YLegend[arh02_mem]: Bytes
LegendI[arh02_mem]: Free
LegendO[arh02_mem]: Total
Legend1[arh02_mem]: Free memory, not including swap, in bytes
Legend2[arh02_mem]: Total memory
Options[arh02_mem]: gauge,growright,nopercent
kMG[arh02_mem]: k,M,G,T,P,X
# Established TCP Connections
Target[arh02_etcp]: tcpCurrEstab.0&tcpCurrEstab.0:54321@arh02
Title[arh02_etcp]: Arh02’s Currently Established TCP Connections
PageTop[arh02_etcp]: <H1>Arh02’s Established TCP Connections</H1>
MaxBytes[arh02_etcp]: 10000000000
ShortLegend[arh02_etcp]:
YLegend[arh02_etcp]: Connections
LegendI[arh02_etcp]: In
LegendO[arh02_etcp]:
Legend1[arh02_etcp]: Established connections
Legend2[arh02_etcp]:
Options[arh02_etcp]: growright,nopercent,gauge
# Network Traffic for Eth0
Target[arh02_net]: 2:54321@arh02:
SetEnv[arh02_net]: MRTG_INT_IP=”” MRTG_INT_DESCR=”eth0″
MaxBytes[arh02_net]: 12500000
Title[arh02_net]: Arh02’s Traffic Analysis for eth0
PageTop[arh02_net]: <h1>Arh02’s Traffic Analysis for eth0</h1>
Options[arh02_net]: bits,growright
————————————————————————————–
arh04,arh05 에 대한 mrtg 설정도 위와 같이 만든다.
mrtg 실행 Scripts에 arh01~arh05 에 대한 실행 명령을 추가한다.
[root@arhfw bin]# vi /usr/local/mrtg/bin/mrtgstart.sh
————————————————————————————–
#!/bin/sh
MRTG_HOME=/usr/local/mrtg
$MRTG_HOME/bin/mrtg $MRTG_HOME/cfg/mrtg-basic.cfg
$MRTG_HOME/bin/mrtg $MRTG_HOME/cfg/mrtg-server.cfg
$MRTG_HOME/bin/mrtg $MRTG_HOME/cfg/mrtg-arh01.cfg
$MRTG_HOME/bin/mrtg $MRTG_HOME/cfg/mrtg-arh02.cfg
$MRTG_HOME/bin/mrtg $MRTG_HOME/cfg/mrtg-arh04.cfg
$MRTG_HOME/bin/mrtg $MRTG_HOME/cfg/mrtg-arh05.cfg
————————————————————————————–
mrtg start scripts 를 실행한다.
[root@arhfw bin]# /usr/local/mrtg/bin/mrtgstart.sh
mrtg 통합 index 페이지를 생성한다.
[root@arhfw mrtg]# /usr/local/mrtg/bin/indexmaker \\
–output=/home/clunix/www/mrtg/index.html \\
–title=”Clunix’s Archon Linux Systems Mrtg Monitoring Page” \\
–columns=1 \\
–sort=name \\
–enumerate \\
/usr/local/mrtg/cfg/mrtg-basic.cfg \\
/usr/local/mrtg/cfg/mrtg-server.cfg \\
/usr/local/mrtg/cfg/mrtg-arh01.cfg \\
/usr/local/mrtg/cfg/mrtg-arh02.cfg \\
/usr/local/mrtg/cfg/mrtg-arh04.cfg \\
/usr/local/mrtg/cfg/mrtg-arh05.cfg
mrtg index 페이지 확인을 한다.
http://domain.com/mrtg/index.html
[그림 mrtg 그래프 3 ]
2.12.2.2 RRDTOOL 을 이용한 시스템 리소스 모니터링
rrdtool 은 MRTG와 같이 시스템의 자원을 모니터링 하는 기능을 가지고 있으면서 보다 더 개선된
형태로 그래프 출력을 해 주는 도구 이다. MRTG 와 가장 큰 차이점은 MRTG 의 경우 두개의 값만을
그래표로 출력하는 제한이 있었는데 RRD 에서는 두개 이상의 데이터를 그래표에 출력할 수 있게
된다.
rrdtool 을 이용한 다양한 front application 등이 있어 원하는 시스템 리소스를 쉽게 모니터링
할수 있다. 관련 사이트는 아래와 같다.
http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/
http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/rrdworld/index.en.html
여기에서는 rrdtool 설치 방법과 간단한 front application 을 이용하여 시스템 리소스를 측정하는
법에 대해 살펴 보도록 한다.
– rrdtool 설치
먼저 위 사이트에서 다운 받은 소스의 압축을 푼다.
# tar xzvf rrdtool-1.2.10.tar.gz
# cd rrdtool-1.2.10
configure 파일로 Makefile 을 생성한다.
# ./configure –prefix=/usr/share
–exec-prefix=/usr \\
–bindir=/usr/bin \\
–sbindir=/usr/sbin \\
–libexecdir=/usr/libexec \\
–includedir=/usr/include \\
–sysconfdir=/etc \\
–localstatedir=/var \\
–datadir=/usr/share \\
–infodir=/usr/share/info \\
–mandir=/usr/share/man \\
–with-gnu-ld
# make
# make install
# make site-perl-install
– rrd front applicaion 설치
각 시스템 리소스에 대한 많은 rrd front application이 존재 하는데 여기서는 rrdmonitor
를 설치 해 보도록 한다.
rrdmonitor는 아주 simple 한 시스템 측정 rrd scripts 를 제공하여 cpu, network,process,
memory,login users 등의 시스템 사용 정보를 rrdgraphe 로 제공하게 된다.
아래 주소에서 관련 소스를 다운 받을 수 있다.
http://escher.coresystem.net/rrdmonitor-1.17.tgz
웹서비스가 가능한 경로에 rrdmonitor 소스의 압축을 푼다.
# tar xvzf rrdmonitor-1.17.tgz
# cd rrdmonitor
rrdmonitor 의 경우 간단한 Perl scripts로 구성되어져 있다. cgi 파일에 실행 권한을 준다.
# chmod 755 *.cgi
scripts 폴더의 rrd scripts를 시스템 환경에 맞게 수정한다.
# cd scripts
rrd scripts 에는 cpu.pl, load.pl, logged_users.pl, memory.pl, process.pl, swap.pl,
traffic.pl 등이 존재하고 각 .pl 파일을 열고 rrd graphe, 와 data 가 생성될 위치를 지정
해 주면 된다.
# vi cpu.pl
—————————————————————————————
# 해당 시스템의 perl 경로를 일치 시켜 준다.
# which perl 로 찾아서 perl 의 경로를 일치 시킨다.
#!/usr/bin/perl
#
# CPU.pl
# vincent@coresystem.net (using only bin)
#
# rrd data 와 image 가 생성될 곳이다. 해당 시스템의 맞게 경로를 수정한다.
my $rrd = ‘/home/www/www/rrd/rra’;
my $img = ‘/home/www/www/rrd/img’;
.
.
.
————————————————————————————–
이제 각 scripts 를 cron 에 등록하여 주기적으로 실행 하면 된다. 하지만 관리의 편리성을
위해 해당 .pl scripts 를 일괄적으로 실행할 수 있는 scripts 만들면 된다.
rrdmonitor 의 scripts directory 에 보면 cmd.sh 란 script 가 이미 있다.
이 파일을 열어 경로를 수정해 주어 사용하면 된다.
# vi cmd.sh
————————————————————————————-
#!/bin/bash
/home/www/www/rrd/scripts/traffic.pl
/home/www/www/rrd/scripts/cpu.pl
/home/www/www/rrd/scripts/process.pl
/home/www/www/rrd/scripts/memory.pl
/home/www/www/rrd/scripts/logged_users.pl
/home/www/www/rrd/scripts/swap.pl
————————————————————————————-
이제 cron 에 cmd.sh 를 5분 간격으로 실행하도록 설정을 한다.
# crontab -e
————————————————————————————-
*/5 * * * * /home/www/www/rrd/scripts/cmd.sh
————————————————————————————-
crond daemon 을 재시작한다.
# /etc/rc.d/init.d/crond restart
브라우저에서 정상적으로 그래프가 생성되었는지를 확인한다.
http://~domain.com/rrd/index.html
[RRD Monitor 화면]
만일 소스 코드나 권한 문제에 대한 에러가 발생하면 apache 의 conf 파일에서 cgi 사용이
허가 되어져 있는지를 확인하도록 한다.
이로써 간단한 rrdtool 을 이용한 system monitoring 환경을 구축해 보았습니다.
이로써 2장 리눅스 서버 구축과 실무 운영에 대한 내용을 마치도록 하겠습니다.