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장 리눅스 서버 구축과 실무 운영에 대한 내용을 마치도록 하겠습니다.

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.