달력

42024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

##

## httpd.conf -- Apache HTTP server configuration file

##

 

 

httpd.conf 파일은 크게 세부분으로 나누어져 있다.

    Section 1: Global Environment  : 아파치 전체적인 영향이 미치는 설정
    Section 2: 'Main' server configuration : 주 서버에 대한 설정
    Section 3: Virtual Hosts : 가상 호스트에 대한 설정

 

     ### Section 1: Global Environment

전제환경설정 파트로 Section 1에서 설정하는 것들은 아파치 웹서버에

전반적인 영향을 미친다.

 

ServerType standalone

서버의 구동방법으로는 standalone과 inetd방식이 있는데,  standalone
방식은 하나의 웹데몬(아파치서버)이 클라이언트의 접속을 모두 처리하는
방식으로 응답속도가 빠른 방법으로 주로 이방식을 사용한다. inetd 방식은
inetd라는 시스템의 /etc디렉토리 끝에 존재하는 inetd라는 슈퍼데몬이
클라이언트의 접속요구가 있을 때마다 웹서버를 구동하는 방식이다.
일반적으로 응답속도가 빠르고 효율적인 standalone으로 설정하여 사용한다.


ServerRoot "/usr/apache"

아파치서버의 홈디렉토리를 지정하며 절대경로로 지정한다. 이후로 나오는
대부분의 패스들은 이 경로에 대한 상대경로로 지정이 된다. 예를 들어
환경설정파일, 에러로그파일등의 상대경로의 기준이 되는 위치이다.


LockFile logs/accept.lock

아파치 컴파일시 USE_FCNTL_SERIALIZED_ACCEPT나

USE_FLOCK_SERIALIZED_ACCEPT으로 컴파일 했을 때 사용되는
LockFile의 경로지정시에 사용된다. 가급적 기본값으로 사용한다.

    LockFile /usr/apache/logs/httpd.lock


PidFile logs/httpd.pid

PidFile 설정은 ServerType을 Standalone으로 설정했을때만 유효한
것으로 아파치 서버의 프로세스가 생성되어 있을 때 그 프로세서ID(PID)를
기록하는 파일을 지정한다.  당연히 아파치서버가 재시작되거나 과부하로
인해 PID가 바뀌게 될 경우에는 이 파일의 PID값도 바뀌게 된다.  즉
다시말해서 여기서 지정된 파일(httpd.pid)에 실행되고 있는 아파치서버의
프로세스번호(PID)값이 기록된다고 하면 정답이다. ServerRoot를 기준으로한
상대경로로 지정된다.  절대경로로 지정하려면 "/"로 시작하는 절대경로를
적어주면 된다.

    PidFile /usr/apache/logs/httpd.pid

 

ScordBoardFile /usr/apache/logs/httpd.scoreboard

내부 서버 프로세서 정보를 저장하는데 사용된다. 모든 아키텍쳐가 이것을 필요로 하진 않는다.


ResourceConfig conf/srm.conf
AccessConfig conf/access.conf

아파치 서버의 환경설정파일은 3개이다. au httpd.conf, srm.conf, access.conf
가 그것이다. 그러나 하나의 설정파일로 하는 것이 효율적이기 때문에
지금은 httpd.conf파일안에 3개의 파트(Section)로 나누어서 하나의
파일안에서 설정을 하고 있다. srm.conf와 access.conf파일의 내용은 현재
비어있는 상태이지만, 필요하다면 이 파일 내에도 설정을 할 수 있다.
아파치 서버가 실행이 될 때는 httpd.conf, srm.conf, access.conf 순으로
언제나 이 3개의 파일을 모두 읽고 난뒤에 실행이 되기 때문이다. 만약 이
두 개의 파일을 서버가 무시하도록 하려면 다음과 같이 하거나 "#"으로 붙여
두면 주석처리되어 무시된다.

    #ResourceConfig /usr/apache/conf/srm.conf
    #AccessConfig /usr/apache/conf/access.conf

   
Timeout 300

클라이언트의 요청에 의해 서버와 연결이 되었을 때 클라이언트와
서버간에 아무런 메시지가 발생하지 않았을 때 오류로 처리될 시간을
초단위로 설정한다. 초기값은 1200이며 보통은 300초로 지정을 한다.
네트웍의 속도가 나쁠수록 수치값은 높게 설정하는 것이 좋다.

 

KeepAlive On

접속한 채로 특별한 요청없이 지속적인 연결을 허용할 것인지를 설정한다.
허용하지 않으려면 off

 

MaxKeepAliveRequests 100

클라이언트가 접속된 시간동안 아파치서버에 요청할 수 있는 최대의
개수를 지정한다. 0을 지정하면 제한없음을 의미하며, 서버의 성능향상을
위하여 가능한 높은 값이 좋다.
 
KeepAliveTimeout 10

아파치 서버는 같은 접속상태의 클라이언트에서 여기서 지정한 초만큼의
요청이 없었을 때 접속을 끊게 된다.

 

MinSpareServers 5
MaxSpareServers 10

아파치 웹서버는 성능향상과 빠른 응답속도를 위해 유휴서버(현재 서비스대기 중인

프로세스)를 만들게 되는데 이 유휴서버의 개수는 시스템의 상황에 따라 달라지게 된다.

유휴서버가 MinSpareServers의 개수(5) 보다 적게되면 추가로 생성을 하게 되며 MaxSpareServers의 개수(10)보다 많게 되면 죽이게 된다.

즉, 유휴서버의 개수를 적절히 조절하기 위한 것이라 생각하면 된다.


StartServers 5  

아파치 웹데몬이 구동될 때 자식프로세스를 몇 개로 할 것인가를 지정한다.

시작할 때 동시에 띄우게 될 웹데몬의 개수이다. 그러나 웹데몬이 구동되고 난 뒤엔 시스템의 상황(부하율등)에 따라 대부분 합리적인 개수만큼 동적으로 생성되었다가 죽기도 하므로 큰 의미를 가지는 것은 아니다.

 

MaxClients 150

아파치웹서버에 접근할 수 있는 클라이언트의 최대갯수는 이 상한값으로
제한한다. 여기서 지정한 개수이상의 클라이언트의 요청이 생긴다면
아파치는 응답하지 않고 이 요청을 무시한다.  이를 제한하는 이유는
시스템의 자원을 아파치 웹서버가 무한정 차지하는 것을 방지하기 위한
것이다.

 

MaxRequestsPerChild 30

아파치 웹서버의 자식프로세스들이 클라이언트의 요청 개수를 지정한다.
만약 자식프로세스가 이 값만큼의 클라이언트요청을 받았다면 이 자식프로세스는 자동으로 죽게된다. 이 값이 0으로 설정이 된다면 자식프로세스가 자동으로 죽는일은 없을 것이다. 그러나 0아닌 다른 값으로 설정함으로서 프로세스의 수를 적절히 조절하여 시스템의 부하조절과 자원낭비를 어느정도 방지 할 수 있다.

 

Listen 3000
Listen 12.34.56.78:80

사용자 Request를 대기하는 port 시스템의 기본값이외에 다른 IP Address와 포트에 대해서도 연결할 수 있도록 해 준다. 환경설정파일(httpd.conf) 맨뒤에 나오는 가상호스트(Virtual
Host)부분에서 설정되는 가상호스트를 설정하기 위해 필요하다.


BindAddress *

서버가 응답할 수 있는 IP Address를 설정하는 것이다. 하나의 시스템에
있는 아파치웹서버 하나로 여러 웹서버처럼 관리하는 웹호스팅서비스등에서
많이 이용하는 것으로 여러 IP Address를 인식할 수 있게 한다. "*"으로
설정이 되었다면 모든  IP Address에 대해 응답할 수 있으며, IP Address를
지정한다면 지정한 IP Address에 대해서만 응답할 수 있게 된다.  여러개의
IP Address를 ISP로부터 할당받아서 웹호스팅서비스를 하고자 한다면
이부분에서 지정해 주면된다. 이 설정파일의 맨 뒷부분에 나오는
<VirtualHost>~</VirtualHost>부분의 IP bind 가상호스트부분에서 아파치
웹서버가 응답할 수 있도록 하려면 여기서 IP Address를 지정해 줘야 한다.

 

Dynamic Shared Objdec(DSO) support

DSO로 빌트된 모듈의 기능을 사용하기 위하여 쓰인다.

DSO 매카니즘에 대하여 상세히 알고 싶으면 http://httpd.apache.org/docs/dso.html을 읽기 바란다. httpd binary에 이미 설치된 모듈리스트르 알고 싶으면 httpd -l 을 실행한다.

로드된 모듈의 순서는 중요하기 때문에 변경시 주의를 요한다.
  ex) LoadMule foo_module libexec/mod_foo.so

 

ExtendedStatus On

server-status로 아파치웹서버의 상태를 상태를 모니터링 할 때
"자세한상태정보"기능을 제공할 것인지(On) 아닌지(Off)를 설정하는 것이다.

 

 

     ### Section 2: 'Main' server configuration

Section 2에서 설정하는 항목들은 아파치의 주된서버가 사용할 값들을
지정한다. <VirtualHost>에 정의된 가상호스트들에서 지정하지 않는 것은
여기서 지정된 값이 기본값으로 적용된다. 또한 여기서 지정하는 값을 각
<VirtualHost>내에도 지정할 수 있으며 이경우엔 각<VirtualHost>내에서
지정한 값이 우선적용된다.

 

Port 80

아파치웹서버의 기본포트를 지정한다. 특별하게 사용하는 것이 아니라면
80번으로 해둬야 한다. 사용가능한 포트는 0 ~ 65535이며 1024이하의
포트번호는 시스템에서 특별하게 예약되어 있으므로 80번 이외의 다른
포트를 사용하려면 1024이상의 포트번호를 지정해서 사용해야 할 것이다.
특별한 지정이 없다면 <VirtualHost>에 정의된 각각의 가상호스트들의
기본포트가 된다. 만약 <VirtualHost> 내에서 Port가 지정이 된다면 그
포트번호가 우선한다.

(특별히 PORT를 따로 지정해 줄 필요가 있을 때는 따로 지정해 주며,
이때는 웹서버로 접근할 때 반드시 따로지정한 PORT번호로 접근해야 한다.
예를들어 Port 1234로 지정했다면, 접근시 : http://www.domain.co.kr:1234
로 접속해야한다. 단, 80번은 default이므로 Port번호를 입력하지 않아도
도메인만으로 그냥 접근할 수 있다. 예: http://www.domain.co.kr )

 

SSL Support

SSL을 제공하고자 할때 HTTP port와 HTTPS port를 listen해야 한다.

    <IfDefine SSL>

    Listen 80

    Listen 443

    Listen 8888

    </IfDefine>

 

User nobody
Group nobody

아파치 웹데몬이 요청을 받았을 때 여기서 지정한 user와 group으로
응답을 하게된다. 이 설정은 ServerType이 Standalone방식이며, 아파치의
실행이 root권한으로 실행이 되었을 때 유효한 것이다. 많은
웹서버관리자들이 nobody로 설정을 해 두고 있으며, 만약 시스템에 nobody
user가 없다면 새로생성(useradd)을 해야 할 것이다. 단, root로 설정하는
것은 절대로 있어서는 안되며 nobody이외의 다른 시스템사용자 id로 지정을
한다면 정말 신중히 모든면(시스템 보안 및 자원사용등)에서 깊게 고려를
해봐야 한다.

 

ServerAdmin webmaster@www.domain.co.kr

여기서 지정하는 email address는 웹문서 로딩에러등의 문제에서
클라이언트측으로 보내질 메일주소값이다. 대부분
웹서버관리자의 email address로 설정을 한다.

 

ServerName new.host.name

클라이언트에게 보여주는 호스트이름을 지정한다. www를 쓰지않는
호스트에서 www를 쓰는 것처럼 보이게 할 수 있다. 예를 들어
bbs.manualand.co.kr을 www.manualand.co.kr로 지정해서 쓸 수 있다.
이곳에 IP Address를 적게 되면 클라이언트에는 Ip Address를 보여준다.

 

DocumentRoot "/usr/local/apache/htdocs"

아파치 웹서버의 웹문서가 있는 경로를 지정한다. 예를 들어
"http://www.manualand.co.kr/index.html"의 초기 문서라면 이 초기문서의
절대 경로는 여기서 지정된 "/usr/local/apache/htdocs/index.html"이 된다.
경로의 맨 마지막에 "/"를 추가해서는 안된다. Alias를 사용하여 다른 위치를
지정할 수도 있다.

 

<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>      
                

<Directory>에서 지정되는 값에 대한 옵션은 다음과 같은 의미를 가지고
있다.
        None : 일단 모든허용을 하지 않는다.
        All : 모든허용을 한다.
        Indexes :
        Includes :
        FollowSymlinks :
        ExeCGI :
        MultiViews :


UserDir public_html

<IfModule mod_userdir.c>

    UserDir public_html

</IfModule>

하나의 아파치 웹서버에서 여러 사용자의 홈페이지를 별도로 만들어
관리할 때 필요한 개별 가입자의 홈페이지 디렉토리이름이다. 예를 들어
sspark이란 계정가입자의홈페이지는 "http://manualand.co.kr/~sspark"라는
홈페이지를 가지고 있을 때 sspark의 계정에서 "public_html"이란
디렉토리가 홈디렉토리가 되어 이 디렉토리에 있는 초기문서 index.html을
불러서 보여주게 된다.

 

<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>
    <Limit PUT DELETE PATCH PROPPATCH MKCOL COPY
MOVE LOCK UNLOCK>
        Order deny,allow
        Deny from all
    </Limit>
</Directory>

계정사용자의 홈페이지(public_html)의 접근에 대한 옵션을 지정한 것이다.


DirectoryIndex index.html

디렉토리만을 지정했을 경우에 그 디렉토리에서 찾게될 문서의 순서를
지정해 준다. 즉, 디렉토리 이름만을 지정하더라도 여기서 지정한
index.html을 찾아서 웹브라우즈에 보여준다. 여러개의 파일을 지정할 수
있으며, 이런 경우에는 순서대로 찾아서 보여준다. 예를 들어
"DirectoryIndex index.html index.htm"로 지정했다면 먼저 "index.html"을
찾아서 있다면 이 파일을 로딩하고, "index.html"이 없다면 "index.htm"을
찾아서 로딩해 준다.

    <IfModule mod_userdir.c>

        DirectoryIndex index.html

    </IfModule>

 

AccessFileName .htaccess

디렉토리별로 접근제어할 정보(ID, Password)를 담고 있는 파일을
지정한다. 디렉토리별로 인증을 거쳐서 접근할 수 있는 설정을 하기위한
것이다. 예를 든다면 어떤 홈페이지의 전부나 혹은 일부에로 접근하려고 할
때 ID, Password를 묻는 창이 뜨면서 맞게 입력한 경우에만 접근허용하는
것이다.  보안상의 이유로 이 파일의 이름을 다른 이름으로 바꾸로 싶다면
".htaccess"대신에 다름이름을 적어주면 된다.

 

<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
</Files>

바로위에서 설정한 파일(".htaccess")의 내용을 볼 수 없게 할 때 사용하는
옵션이다. 보안상의 이유로 이 옵션은 설정해 두는 것이 좋다. 만약 이
옵션을 주석처리해 둔다면 ".htaccess"파일에 대한 보안은 누구도 장담할 수
없을 것이다.

 

CacheNegotiatedDocs

디폴드로 아파치는 content와 연관된 각각의 document에 "Pragma: no-cache"를 보낸다.

이것은 proxy 서버가 document에 cache를 사용하지 않을것인지를 묻게 된다.

이 라인을 주석처리 하면 documents에 cache를 허용할수 있게 된다.

#CacheNegotiatedDocs


UseCanonicalName On

On으로 설정하면, self-referencing URL을 만들때마다 "canonical" name 형식에 따른 hostname과 port를 사용할것이다.

Off로 설정하면 아파치는 가능하면 client가 제공한 hostname과 port를 사용할것이다.

이것은 또한 CGI 스크립트의 SERVER_NAME과 SERVER_PORT에 영향을 준다.

 

TypesConfig conf/mime.types

웹서버의 mime type을 지정한 파일을 지정한다. mime.types파일은 서버에
의해 리턴될 수 있는 파일명과 mime형식을 기술해 놓은 파일이다.

  <IfModule mod_mime.c>

       TyperConfig /usr/apache/conf/mime.types

   </IfModule>

  

DefaultType text/plain

mime.types 파일에 정의 되어있지 않은 파일형식에 대한 요청을 받았을 때
알 수 없는 문서타입에 대하여 사용할 기본적인 mime 타입을 정해둔다.

 

<IfModule mod_mime_magic.c>

    MIMEMagicFile /usr/apache/conf/magic

</IfModule>

mod_mime_magic module은 서버에서 type별 정의된 다양한 hints를 사용할수 있게 해준다.

MIMEMagicFile은 hint가 정의된 위치를 알려준다.


HostnameLookups Off

웹서버의 로그(access_log)를 지정하는 Format에서 "DNS Lookup"으로
지정하였을 때, domain으로 남길 것인가, IP Address로 남길 것인가를
지정한다. Default로 Off는 IP Address로 남기는 것이며, Domain으로 변경할
필요가 없으므로 on으로 설정한 것보다는 속도가 조금빠르다.on으로 하게
되면 IP address를 IP Domain으로 변환해야 하므로 속도가 조금 느릴 수
있다.

 

ErrorLog /usr/apache/logs/error_log

아파치 웹서버의 에러로그 기록파일을 지정한다.  참고할 사항은 맨마지막에 설정하는 <VirtualHost>부분에서 각서버에 대한 에러파일을 지정해 두지 않으면 그에 대한 에러로그도 여기에 기록되며, 지정해 두게 되면 그에 해당하는 로그는 이 파일에 기록되지 않는다.

 

LogLevel warn

바로위에서 설정한 에러로그 파일에 얼마나 자세하게 적을 것인지를
결정한다. 다음에 해당하는 순서대로 중요도가 정해진다.

" debug → info → notice → warn → error → crit → alert → emerg "

 

SetEnvlf Request_URI \.gif dontlog

SetEnvlf Request_URI server-status dontlog

아래에서 사용할 CustomLog에서 사용자지정 환경변수 지정을 사용할수 있다.

해당 항목에 대해서는 log파일에 추가되지 않음.

 

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\"
\"%{User-Agent}i\"" combind
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

바로 아래에서 사용할 CustomLog에서 사용할 몇가지 로그형식의 별명을 정한 곳이다.
웹서버의 관리자나 서버관리자는 이 부분을 특히 유심히 봐둬야 한다.
웹서버의 로그를 어떤 식으로 남길 것인가를 결정하는 Format을 지정하는 곳이다.

원하는 정보를 지정해서 볼 수 있으므로, 관리자에게 필요한 Format으로 설정해야 하며,

또한 접속통계를 내기에 적당한 Format으로 설정해 둬야 한다.

 

CustomLog /usr/apache/logs/access_log common env=!dontlog

위에서 정한 로그형식(여기선 common)대로 로그를 남기게 된다.
맨마지막에서 지정하는 <VirtualHost>부분에서도 아파치 1.3.9버전 부터는
CustomLog를 가상호스트별로 지정할수 있도록 CustomLog를 제공한다.
<VirtualHost>에서 CustomLog를 지정하지 않으면 여기서 지정한 형식대로
로그를 남기게 되며 <VirtualHost>부분에서 CustomLog를 지정했을
경우에는 여기서 지정한 로그형식은 무시된다.

 

#CustomLog  /usr/apache/logs/referer_log referer
#CustomLog  /usr/apache/logs/agent_log agent
#CustomLog  /usr/apache/logs/access_log combined

위에서 지정한 4가지의 로그형식(combind, common, referer, agent)중에서
원하는 부분의 #(주석행)을 제거하면 지정된다.

 

ServerSignature On

Optionally하게 서버가 생성하는 문서(error documents, FTP directory listings, mod_status and mod_info output etc., but not CGI generated documents)에 서버 버전과 가상호스트 이름을

포함하는 라인을 추가한다. 
"EMail"로 설정하면 mailto에 의해 SeverAdmin에 링크된다.

ON | OFF | EMail

 

EBCDIC configuration:

Fujitsu-Siemens' BS2000/osd, IMB's OS/390, IMB's TPF 과 같은 메인프레임에서만

EBCDIC 코드셋을 사용한다.

아래의 디폴트 설정은 bianary 파일이 ASCII 머신에  저장될때 text 파일이 EBCDIC에 저장된다구 가정한다. 따라서 일반적인 POSIX 툴이나 grep, sort를 이용하여 조작할수 있다.

    EBCDICConver tByType On=InOut text/message/multipart/

    EBCDICConver tByType On=In      application/x-www-form/urlencoded

    EBCDICConver tByType On=Inout  application/postscript model/vrml

    EBCDICConver tByType Off=InOut

ASCII HTML 문서와 EBCDIC HTML 문서를 동시에 사용하고자 한다면, ASCII 문서에 전환을 위한 파일 확장자를 사용할수 있다.

    AddType            text/html  .ahtml

    EBCDICConvert Off=InOut  .ahtml

 

Alias /icons/ "/usr/local/apache/icons/"

필요한 만큼의 디렉토리 별칭을 만들어 쓸 수 있다. 사용하는 형식은 다음과 같다.
Alias fakename(가상이름) realname(진짜이름)

fakename이 /로 끝나면 서버는 그것이 표현된 URL을 요구할것이다.

fakename이 /로 끝나면 realname도 /로 끝나야 한다.

fakename이 /를 생략하면 realname로 /를 생략해야한다.

 

    Alias /icons/ "/usr/local/apache/icons/"

 

    <Directory "/usr/local/apache/icons">
          Options Indexes MultiViews
          AllowOverride None
          Order allow,deny
          Allow from all
    </Directory>

 

ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"

ScriptAlias는 서버스크립트를 포함한다. ScriptAlias는 실제디렉토리 안에
들어있는 문서를 서버에 의해 응용프로그램으로 취급되어 실행되는 것을
제외하고는 근본적으로 Aliases와 같다.

 

Redirect old-URi new-URL

client에게 서버의namespace에 문서가 더이상 존재하지 않을때 clinet에게 재위치된 문서가

어디에 있는지 알려준다.

    Format: Redirect old-URI new-URL


IndexOptions FancyIndexing

IndexOPtions는 디렉토리목록을 표시할 때 사용할 옵션을 지정한다.
Standard는 표준적인 디렉토리를 나타내며, FancyIndexing은 좀더 예쁜
디렉토리목록을 표시해 준다.

 

AddIcon*

아래에서 지정하는 AddIcon으로 시작하는 설정은 바로위에서 설정한
디렉토리인덱싱 옵션을 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

AddDescription은 서버가 생성한 인덱스의 파일 뒤에 간단한 설명을
표시할 때 사용한다. 이 설정은 IndexOptions가 FancyIndexing으로
설정되었을때만 표시되며, 설정형식은 다음과 같다.
형식 : AddDescription "표시할 설명" 파일확장자

 

ReadmeName README

ReadmeName은 디렉토리목록표시 뒤에 붙여서 보여줄 README파일의
이름을 지정한다.(일종의 꼬릿말)

 

HeaderName HEADER

HeaderName은 디렉토리목록표시 앞에 붙여질 파일의 이름을 지정한다.
(일종의 머릿말)

 

IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t

디렉토리목록을 인덱싱할 때 제외할 파일명을 지정한다. 즉 디렉토리
목록에 포함하지 않을 파일을 지정한다. 쉘스타일의 와일드카드(*, ?)가
허용된다.

 

AddEncoding x-compress Z
AddEncoding x-gzip gz tgz

AddEncoding은 특정브라우즈(Mosaic/X 2.1+)에서 받고있는 중에 정보에
대한 압축해제를 할 수 있도록한다. 단 모든 웹브라우즈에서 이 기능을
제공하는 것은 아니다.

 

AddLanguage en .en
AddLanguage fr .fr
AddLanguage de .de
AddLanguage da .da
AddLanguage el .el
AddLanguage it .it

AddLanguage는 문서의 언어를 지정하게 한다.

 

LanguagePriority en fr de

언어의 우선순위를 내림차순으로 지정한다.

 

AddType application/x-httpd-php3 .php3
AddType application/x-httpd-php3-source .phps
AddType application/x-tar .tgz

AddType은 mime.types의 실제 편집없이도 mime을 설정할 수 있다.

또한 특정 type에 특정 files을 만들게도 할수 있다.

 

AddHandler cgi-script .cgi

AddHandler는 파일확장자를 처리기(Handler)에 매핑(연결)시켜주게 된다.

서버 측면의 include나 CGI outside ScriptAliased directories를 사용하려면

이 라인을 주석처리 하면 된다.

 

AddType text/html .shtml
AddHandler server-parsed  .shtml

server-parsed HTML 파일을 사용하려고 할때

 

 

 

#AddHandle send-as-is asis

Apache의 send-asis HTTP 파일특성의 사용을 위해서는 이 라인을 주석처리할것.

 

#AddHandle imap-file map

server-parsed imagemap 파일을 사용하려고 할때

 

SSI(Server Side Include)문서를 인식하게 하기위한 설정이다. SSI코드가
들어가 있는 문서는 확장자가 *.shtml이다. 시스템의 날짜와 카운터등
CGI프로그램을 하지 않아도 HTML문서에서 단 몇줄로 CGI의 효과를 낼 수
있는 SSI기능을 인식하게끔 하는 설정이다.


#Format: Action media/type /cgi-script/location
#Format: Action handler-name /cgi-script/location

Action은 매칭되는 파일이 호출될때마다 스크립트를 실행시킬 수 있도록
미디어 타입을 정의한다.

 

MetaDir .web

MetaDir은 아파치가 찾을 메타정보파일들의 디렉토리이름을 지정한다. 이
파일들은 문서를 전송할 때 포함되는 HTTP 헤더정보가 포함되어 있다.

 

MetaSuffix .meta

MetaSuffix는 메타정보를 포함하고 있는 접미어의 이름을 지정한다.


에러발생시 응답을 정의할 수 있는 방법을 3가지 나타내고 있다.

    1) 일반적인 텍스트

ErrorDocument 500 "The server made a boo boo.

    2) 지역적인 방향전환

ErrorDocument 404 /missing.html
ErrorDocument 404 /cgi-bin/missing_handler.pl

    3) 외부 방향전환

ErrorDocument 402
http://some.other_server.com/subscription_info.html


  다음의 BrowserMatch는 keepalives기능을 쓰지못하게 하며 HTTP
헤드방식을 설정한다.

BrowserMatch "Mozilla/2" nokeepalive

  이 설정은 Netscape 2.x 또는 이를 따르는 브라우즈에 대하여 KeepAlive
기능을 쓰지 못하게한다.

BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0
force-response-1.0

  이 설정은 잘못구현된 HTTP/1.1과 301또는 302반응에 대하여
KeepAlive를 적절히 제공하지 못하는 마이크로소프트 인터넷익스플로러
4.0b2d에 관한 것이다.

BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0

  위의 3가지 설정은 기본적인 1.1반응도 처리하지 못하며 HTTP/1.0 스팩을
제한하고 있는 브라우즈에 대하여 HTTP/1.1반응을 하지 못하게 한 것이다.

<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from www.manualand.co.kr
</Location>

  서버의 상태를 점검할 수 있게하는 설정이다. 이는
"http://www.manualand.co.kr/server-status"와 같은 형식으로 서버의 상태를
점검할 수 있다. "6장. 아파치서버 모니터링"편에서 자세히 설명되어 있다.
여기서 지정한 "SetHandler server-status"의 설정으로 인해 서버
모니터링을 할 수 있는 것이다.

<Location /server-info>
    SetHandler server-info
    Order deny,allow
    Deny from all
    Allow from www.manualand.co.kr
</Location>

  이설정을 위해서는 mod_info.c가 적재되어야 하며, 이는
"http://www.manualand.co.kr/server-info"와 같은 방식으로 서버의 정보를
볼 수 있다. 위에서 설정한 server-status와 함께 실행중인 웹서버의
상태점검을 위한 것이다.

<Location /cgi-bin/phf*>
    Deny from all
    ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi
</Location>

  아파치 1.1이전 버전의 오래된 버그에 대한 악용이 있을시에는 지정한곳
(http://phf.apache.org/phf_abuse_log.cgi) 으로 방향을 전환시킨다.


<IfModule mod_proxy.c>
ProxyRequests On

  아파치 웹서버를 Proxy서버로 사용할 때 on을 해줘야 한다. 즉   
프락시서버 지시자로서 프락시서버를 on 시킨다.

<Directory proxy:*>
    Order deny,allow
    Deny from all
    Allow from .your_domain.com
</Directory>

ProxyVia On

  HTTP/1.1 "Via:"헤드처리를 활성화시킬 것인지 비활성화 시킬것인지를
지정한다. Off, On, Full, Block중 하나가 올 수 있으며 Full은 서버버전을
포함하며, Block은 나가는 모든 것에 대해 Via:헤더를 제거한다.

CacheRoot "/usr/local/apache/proxy"
CacheSize 5
CacheGcInterval 4
CacheMaxExpire 24
CacheLastModifiedFactor 0.1
CacheDefaultExpire 1
NoCache a_domain.com another_domain.edu joes.garage_sale.com

  이 설정은 캐시기능을 활성화 하기 위한 것이다.

### Section 3: 가상호스트 설정

  여러분의 시스템에서 여러개의 도메인이나 호스트네임을 설정하여
관리하고자 한다면 <VirtualHost>부분을 설정해 줘야 한다. 가상호스트에
대한 정보는 http://www.apache.org/docs/vhosts/를 참조해 보면 좀더
자세한 정보를 얻을 수 있다.  '-S'옵션을 사용함으로써 가상호스트의 설정에
대한 점검을 할 수 있다.  name-based 가상호스트를 사용하길 원한다면
적어도 한 개이상의 IP Address를 정의할 필요가 있다. "4-2절의 내용"과
"10장.웹호스팅 서비스를 위한 가상호스트"편에서 자세히 설명되어 있다.

NameVirtualHost 12.34.56.78:80
NameVirtualHost 12.34.56.78

<VirtualHost www.manualand.co.kr>
    ServerAdmin webmaster@manualand.co.kr
    DocumentRoot /home/sspark/public_html
    ServerName www.manualand.co.kr
    ErrorLog /home/sspark/public_html/aw/error_log
    CustomLog /home/sspark/public_html/aw/access_log common
</VirtualHost>

        ServerAdmin은 해당서버의 관리자 전자우편이며,
        DocumemtRoot는 해당서버의 홈디렉토리이며,
        ServerName은 해당서버의 도메인이며,
        ErrorLog는 해당서버의 에러파일 위치이며
        CustomLog는 로그파일위치와 포맷을 지정한 것이다.

<VirtualHost _default_:*>
</VirtualHost>

  Default 가상호스트 설정으로 위에서 설정되지 않은 다른 모든 호스트에
대해서 응답을 하고자 할 경우설정해 준다.

'OS > LINUX' 카테고리의 다른 글

[phpschool 펌] [서버]대량 메일 발송???  (0) 2004.12.17
뻘짓거리.. ㅡㅡ;  (0) 2004.12.16
[엠파스 펌] netstat 에서 state 설명  (0) 2004.12.02
[펌] FreeBSD설치 안내서  (0) 2004.11.11
[펌] Installing Oracle9i on FreeBSD  (0) 2004.11.11
Posted by tornado
|
NETSTAT [-a] [-e] [-n] [-s] [-p proto] [-r] [interval]
-a 모든 커넥션 - 모든 접속 및 listen 포트 정보 알아내기
-e Ethernet 통계정보
-n 주소와 포트 정보
-p proto 지정된 프로토콜과 관련된 커넥션 정보
   netstat -s -p tcp 3 (tcp관련된 패킷량을 3초 마다 다시 보여주기)
-r 라우팅 테이블 정보
interval 통계 정보를 지정 시간마다
 

netstat 상태확인시 서버 프로그램에서는 connection갯수가 11개이고
                   클라이언트 쪽에는 conection갯수가 10개인 경우
서버와 클라이언트가 연결을 끊을때
1. 클라이언트가 서버에게 연결을 끊겠다고알린다.
2. 서버는 클라이언트에게 알았다고 대답한다.
3. 클라이언트는 이 응답을 받고 연결을 끊는다.
4. 하지만 서버는 연결을 바로 끊지않고 일정시간동안 연결을 유지시킨다
   - 서버가 클라이언트로부터 연결을 끊겠다는 신호를 받고 알았다고 응답패킷을
     보냈는데 클라이언트가 이것을 받지 못하고 다시 서버측에 연결을 끊겠다고 신호를 보낼때가 있다.
     이때 서버쪽에서 바로 연결을 끊어버렸다면 이 신호를 무시하게 될테고,
     클라이언트는 연결을 끊기 위해 서버쪽에 계속 신호를 보낼수 있기 때문이다.

State
state는 TCP Connection state를 말하는 것으로 아래와 같은 의미를 가진다.
CLOSED      - TCP 소켓의 최초상태
              또는 서버로 SYN을 보낸후 SYN-ACK를 못 받아서 TIME OUT 된 상태
CLOSE_WAIT  - 애플리케이션이 FIN패킷을 받고 ACK를 보낸상태
SYN_SENT    - TCP소켓을 성립시키기 위해 SYN 패킷을 서버쪽으로 보낸 상태
ESTABLISHED - SYN을 보내고 SYN-ACK를 받은후 ACK패킷을 서버쪽으로 보낸 상태
FIN_WATE_1  - 소켓 종료를 위해 FIN 패킷을 보낸 상태
FIN_WAIT_2  - FIN 패킷을 보내고 FIN_ACK를 받은 상태
TIME_WAIT   - FIN_WAIT_2에서 상대가 FIN을 보내고 그것에 대해 ACK로 답한후의 상태
              LAST_ACK이 손실될 경우를 대비해서 2MSL을 대기한 후 CLOSED로 바뀐다.

LISTEN
서버 애플리케이션이 적재되어 수동적인 모드로 포트를 개설하였음을 의미.
TCP는 연결 요청이 수신 되기를 기다림

SYN-SENT
로컬 시스템의 클라이언트 애플리케이션이 원격 호스트에 능동적인 개설을
요청. TCP는 Synchronize flag 를 설정한 시작 세그먼트를 전송 하였으며, 원격 시스
템도 역시 Synchronize flag 를 설정한 시작 세그먼트로 응답할 것을 기다림.

SYN-RECEIVED
서버의 TCP가 원격 클라이언트로부터 Synchronize flag가 설정된 시작 세
그먼트를 수신하였고 자신의 시작 세그먼트로 응답 하였으며, 그 세그먼트에 대한 확인
메세지를기다림.

ESTABLISHED
가상회선이 작동. 3단계 핸드셰이킹 과정이 완료되면 두 시스템은 이 상태
에 들어감.

FIN-WAIT-1
로컬 애플리케이션은 가상 회선에 능동적인 종결을 요청하였으며, TCP는
Finish flag가 설정된 종결 세그면트를 전송. 그러나 TCP는 아직도 원격 시스템이 세그
먼트에 대한 확인 메세지와 자신만의 종결 세그먼트로 응답하기를 기다림. 회선이 완
전히 종결될 때까지 원격 시스템으로부터 데이터는 수신하지만, 추가적인 데이터를 전
송하지는않음.

COLSE-WAIT
(FIN-WAIT-1 의 설명과 같이) Finish flag 가 설정된 종결 세그먼트가 수신
되었고 로컬 TCP는 그 세그먼트에 대한 확인 메세지를 송신 시스템에 전송함. 그러
나 로컬 TCP는 로컬 애플리케이션에서 작업을 종료하지않아 자신의 종결 세그먼트를 생
성하지 못함
 
FIN-WAIT-2
(FIN-WAIT-1 의 설명과 처럼) 로컬 TCP는 Finish flag 가 설정된 종결 세그
먼트를 전송하였으며, (WAIT-CLOSE 의 설명대로) 원격 시스템으로 부터 그 세그먼
트에 대한 확인 메세지를 수신함. 그러나 원격 애플리케이션이 아직 작업을 종료 하지 않
아 원격TCP가 자신의 종결 세그먼트를 생성하지 못하고 있는 상태임.
 
LAST-ACK
(FIN-WAIT-1의 설명과 같이) Finish flag 가 설정된 종결 세그먼트가 수신되
었고, 로컬 애플리케이션은 회선의 종결에 합의하여 자신도 종결을 요청함. 그 결과
로컬 TCP는 Finish flag 가 설정된 자신의 종결 세그먼트를 전송 하였으며, 이 세그먼
트에 대한 확인 메세지가 수신되면 종결됨.
 
CLOSING
이 상태는 흔하지 않으며, 일반적으로 세그먼트가 네트워크에서 분실되었다
는것을 나
타냄. 이런 경우 로컬 TCP는 (FIN-WAIT-1 의 설명과 같이) Finish flag 가
설정된 종결 세그먼트를 전송 하고 (LAST-ACK 의 설명과 같이) 원격 시스템의 종결
세그먼트도수신하였지만, FIN-WAIT-1 단계에서 전송한 세그먼트에 대한 확인 메세지
가 수신되지않은 상태임. 이 상태는 보통 확인 메세지가 전송 도중 분실되었다는 의미임.
 
TIME-WAIT
회선의 종결 절차가 완결되었으나 TCP 는 분실되었을지 모르는 느린 세그
먼트를 위해 당분간 소켓을 열어 놓은 상태로 유지. 이 상태는 새로운 연결이 기존의 연결
에서 사용된 일련번호를 다시 사용하는 것을 막음. 원격 시스템이 종결하는 호스트
로부터 더이상 데이터를 수신할 가능성이 없으므로, 이 상태는 능동적인 종결을 요청
한 호스트에서만 나타남.
 
CLOSED
아무일도 발생하지 않음. 회선은 종결되었고, TCP는 그 가상 회선에 사용하
였던 모든자원을 놓아줌. 이 상태를 보여줄 수 있는 가상 회선이 없으므로 아무 일도
발생하지 않음.

'OS > LINUX' 카테고리의 다른 글

뻘짓거리.. ㅡㅡ;  (0) 2004.12.16
[펌] [Apache] httpd.conf 환경설정  (0) 2004.12.08
[펌] FreeBSD설치 안내서  (0) 2004.11.11
[펌] Installing Oracle9i on FreeBSD  (0) 2004.11.11
[펌] FreeBSD 5.0 설치하기  (0) 2004.11.11
Posted by tornado
|

FreeBSD설치 안내서 입니다.

pdf포맷이고 한글이며 저작권에 관해서는 파일내를 참고하세요...

'OS > LINUX' 카테고리의 다른 글

[펌] [Apache] httpd.conf 환경설정  (0) 2004.12.08
[엠파스 펌] netstat 에서 state 설명  (0) 2004.12.02
[펌] Installing Oracle9i on FreeBSD  (0) 2004.11.11
[펌] FreeBSD 5.0 설치하기  (0) 2004.11.11
[펌]sendmail 인증 사용하기..  (0) 2004.11.05
Posted by tornado
|

Copy & Paste 가 제대로 안되서 그냥 pdf파일로 만듬


내가 FreeBSD를 설치를 하고 거기에 Oracle까지 설치를 하게 될줄은 몰랐음...


재미있긴했으나...


OS를 설치하는건 역시 노가다였음-_-

'OS > LINUX' 카테고리의 다른 글

[엠파스 펌] netstat 에서 state 설명  (0) 2004.12.02
[펌] FreeBSD설치 안내서  (0) 2004.11.11
[펌] FreeBSD 5.0 설치하기  (0) 2004.11.11
[펌]sendmail 인증 사용하기..  (0) 2004.11.05
[bbs.kldp.org에서 펌] 분할 압축하기...  (0) 2004.10.14
Posted by tornado
|

r1.2과 현재 버전의 차이점

FreeBSD(프비라고 부르겠다)는 분명 편리하고 강력한 OS 임에도 불구하고, 우리나라에는 많이 알려지지 않은 것이 사실이다. 그 이유에는 관련 자료나 번역 문서의 부족도 한 몫 할 것이다.
이 문서에서는 프비를 설치하는 과정을 설명한다. 각 과정마다 캡처를 해서 구성했기 때문에 이해하기 쉬울 것이다. 나는 프비 5.1 을 VMware 에 설치했다. 현재 최신 버전은 5.2 이지만, VMware 에서 원활히 설치가 안되는 관계로 5.1 로 설치했다. 비록 VMware 로 설치했지만, 일반 서버나 데스크탑에서와 거의 같을 것으로 생각한다.
이 문서에서는 프비를 설치하는 과정을 설명한다. 각 과정마다 캡처를 해서 구성했기 때문에 이해하기 쉬울 것이다. 나는 프비 5.1 을 vmware 에 설치했다. 현재 최신 버전은 5.2 이지만, vmware 에서 원활히 설치가 안되는 관계로 5.1 로 설치했다. 비록 vmware 로 설치했지만, 일반 서버나 데스크탑에서와 거의 같을 것으로 생각한다.
우선 프비를 다운로드 받아야 한다.

[ftp://ftp4.kr.freebsd.org/pub/FreeBSD/releases/i386/ISO-IMAGES/]
@@ -187,7 +187,7 @@

http://fat81.org/moniwiki/images/freebsd_install/39.GIF

나의 경우는 VMware를 사용해서 설치를 하고 있기 때문에 '29. VMWare guest OS (generic)' 을 선택했다. 예전에는 xfree86에서 VMware을 지원하지 않았기 때문에, 설치후에 vmware-tool 을 설치해서 따로 잡아주어야 했지만, xfree86 4.3.x 에서 부터는 공식적으로 지원하고 있다. 참 좋아졌다. ^^;
나의 경우는 vmware를 사용해서 설치를 하고 있기 때문에 '29. VMWare guest OS (generic)' 을 선택했다. 예전에는 xfree86에서 vmware을 지원하지 않았기 때문에, 설치후에 vmware-tool 을 설치해서 따로 잡아주어야 했지만, xfree86 4.3.x 에서 부터는 공식적으로 지원하고 있다. 참 좋아졌다. ^^;

http://fat81.org/moniwiki/images/freebsd_install/40.GIF



들어가기 전에 #

FreeBSD(프비라고 부르겠다)는 분명 편리하고 강력한 OS 임에도 불구하고, 우리나라에는 많이 알려지지 않은 것이 사실이다. 그 이유에는 관련 자료나 번역 문서의 부족도 한 몫 할 것이다.
이 문서에서는 프비를 설치하는 과정을 설명한다. 각 과정마다 캡처를 해서 구성했기 때문에 이해하기 쉬울 것이다. 나는 프비 5.1 을 vmware 에 설치했다. 현재 최신 버전은 5.2 이지만, vmware 에서 원활히 설치가 안되는 관계로 5.1 로 설치했다. 비록 vmware 로 설치했지만, 일반 서버나 데스크탑에서와 거의 같을 것으로 생각한다.
우선 프비를 다운로드 받아야 한다.


CD 설치를 할 것이므로 받은 파일을 CD로 굽도록 한다.

설치 하기 #

CD롬 부팅을 하면, 아래 그림이 뜬다. 이는 프비 5.x 들어서부터 생긴 부팅화면인데, 옆에 서있는 데몬(프비의 마스코드다)가 귀엽기만 하다 ^^;
총 7개의 메뉴가 있다. 간단히 설명을 하자면, 다음과 같다.

번호 설명
1 기본적인 부팅이다. 일반적으로 설치를 할때 선택한다.
2 ACPI 기능을 활성화 시켜서 부팅한다.
3 안전모드로 부팅한다.
4 싱글 모드로 부팅한다. 비상시에 사용한다.
5 verbose logging 모드로 부팅한다.
6 부트로더 프롬프트로 빠져나간다.
7 재부팅한다.

http://fat81.org/moniwiki/images/freebsd_install/1.GIF

앞에서 1 번을 선택하고 성공적으로 부팅하면 다음과 같이 설치 화면이 뜬다. 여기서도 각 메뉴에 따라서 설명하자면, 다음과 같다.

번호 설명
Standard 가장 기본적인 설치 방법이다.
Express 좀더 빠른 설치 방법이다. 전문가에게 권장
Custom 설치하고 싶은 것만 설치할 수 있는 방법이다. 역시 전문가에게 권장
Configure 설정을 추가하거나, 변경하고 싶을 때 선택한다.
Doc 설치 관련 문서를 볼 수 있다.
Keymap 키보트 타입을 설정한다.
Options 설치옵션을 보거나 설정할 수 있다.
Fixit 비상모드로 고칠때 선택한다.
Upgrade 소프트웨어를 업그레이드 할 때 선택한다.
Load Config 설치 설정 파일을 읽어 들인다.
Index 함수를 검색한다.

http://fat81.org/moniwiki/images/freebsd_install/2.GIF

위에서 'Standard' 를 선택하면 아래와 같이 FDISK 화면이 나온다. 여기서는 프비를 설치할 전체 파티션 하나만 정해주면 된다. 혹시나 리눅스에서 처럼 각 파티션을 지정주지 않아도 된다. 나중에 각각의 파티션을 지정하는 부분이 있다.

http://fat81.org/moniwiki/images/freebsd_install/3.GIF

프비를 설정할 전체 파티션을 정했으면, 그 파티션을 'Set Bootable' 로 설정해준다. 모든 설정이 끝났으면, 'Q' 를 눌러서 다음 단계로 넘어가자.

http://fat81.org/moniwiki/images/freebsd_install/4.GIF

부트로더 설정 화면이다. 여기서는 하드에 프비만 설치를 할 것이기 때문에 'Standard' 를 선택한다. 만일 동일 하드에 다른 파티션에 다른 OS 가 설치되어 있다면, '?BootMgr' 이나 'None' 을 선택한다.

http://fat81.org/moniwiki/images/freebsd_install/5.GIF

다음은 앞에서 설정해준 전체 파티션에서 각각의 세부적인 파티션으로 지정해주는 단계이다.

http://fat81.org/moniwiki/images/freebsd_install/6.GIF

파티션을 지정해 줄때 주의할 점이 있다. 리눅스와 같이 루트(/) 파티션과 스왑 파티션만으로 설치를 하게 되면, 다음에 부팅이 안된다는 점이다.
내가 삽질을 했던 부분인데, 나중에 알게된 사실이지만, 프비에서는 최소한 / , swap , /var , /usr 파티션으로 나눠주어야 한다.

http://fat81.org/moniwiki/images/freebsd_install/7.GIF

다음은 설치 유형을 지정해주는 부분이다. 여기서는 'All' 을 선택했다. 각자 자신에 목적에 맞게 선택하면 된다.

http://fat81.org/moniwiki/images/freebsd_install/8.GIF

설치할 매체를 지정해주는 부분이다. 보다시피 프비는 여러가지 설치매체를 지원한다. 앞에서 우리는 CD로 구웠기 때문에 'CD/DVD' 를 선택한다.

http://fat81.org/moniwiki/images/freebsd_install/9.GIF

프비 베이스 시스템이 설치되고 있는 모습이다.

http://fat81.org/moniwiki/images/freebsd_install/10.GIF

설치가 완료되면, 아래와 같이 설치가 성공했다는 축하 메세지가 뜬다. 아직 설치가 끝난 것이 아니다. 이제 시작에 불과하다.

http://fat81.org/moniwiki/images/freebsd_install/11.GIF

랜카드를 설정해주는 과정이다. 위와 같은 메세지가 뜨지 않았다면, 불행하지만, 프비에서 인식을 못했다는 얘기다. 왠만하면, 프비에서 지원하는 랜카드를 쓰기를 권장한다. 'Yes' 로 선택한다.

http://fat81.org/moniwiki/images/freebsd_install/12.GIF

아래 그림과 같이 맨 위에 잡힌 랜카드 종류와 장치명이 보일 것이다.

http://fat81.org/moniwiki/images/freebsd_install/13.GIF

각자 네트워크 환경에 맞게 설정을 해주면 된다. 유동 IP 라면, DHCP를 선택하면 되고, 고정 IP 라면, STATIC을 선택하면 된다.

http://fat81.org/moniwiki/images/freebsd_install/14.GIF

다음은 네트워크 게이트웨이 서버로 사용할 것인지를 묻는다. 여기서는 'No' 를 선택한다.

http://fat81.org/moniwiki/images/freebsd_install/15.GIF

다음은 inetd 서비스 데몬을 설정할 것인지를 묻는다.

http://fat81.org/moniwiki/images/freebsd_install/16.GIF

익명(anonymous)으로 FTP 서버에 접속이 가능하게 할 것인지를 묻는다.

http://fat81.org/moniwiki/images/freebsd_install/17.GIF

NFS(network file system)을 설정할 것인지를 묻는다.

http://fat81.org/moniwiki/images/freebsd_install/18.GIF

보안 레벨을 설정하는 부분이다. 프비는 보안설정을 상, 중, 하로 설정할 수가 있다. 따로 지정을 해주지 않으면 중간으로 선택이 된다.

http://fat81.org/moniwiki/images/freebsd_install/19.GIF

나의 경우 따로 지정을 해주지 않았기에 'Moderate' 에 대한 설정을 하고 있다. 센드메일(sendmail) 과 SSH 를 허용한다.

http://fat81.org/moniwiki/images/freebsd_install/20.GIF

시스템 콘솔을 설정할 수 있다. 나는 'No' 를 선택했다.

http://fat81.org/moniwiki/images/freebsd_install/21.GIF

시스템 시간을 세팅해주는 부분이다. 여기서는 'Yes' 를 선택했다.

http://fat81.org/moniwiki/images/freebsd_install/22.GIF

시간을 CMOS 에 지정되어 있는 설정으로 사용할 것인지 아니면, 따로 설정을 해줄 것인지를 지정한다. 여기서는 'No' 를 선택했다.

http://fat81.org/moniwiki/images/freebsd_install/23.GIF

여기서는 현재 살고 있는 지역을 선택해주면 된다. 시스템 시간대를 맞추기 위한 설정이다.

http://fat81.org/moniwiki/images/freebsd_install/24.GIF

프비에서 리눅스 애플리케이션을 실행시킬 수 있도록 하게 하는 라이브러리를 설치하겠는지를 묻는다. 여기서는 'Yes' 를 선택했다.

http://fat81.org/moniwiki/images/freebsd_install/25.GIF

다음은 마우스 설정이다. X window 를 사용한다면, 반드시 있어야 한다. 마우스가 있다면, 'Yes' 를 선택한다.

http://fat81.org/moniwiki/images/freebsd_install/26.GIF

마우스의 종류나 타입(type)를 정해주는 곳이다. 2 번(Enable)을 선택해서 마우스 포인터가 제대로 나오는지, 잘 움직이는 지를 확인한다.

http://fat81.org/moniwiki/images/freebsd_install/27.GIF

X server 를 설치 여부를 묻는다. 여기서는 'Yes' 를 선택했다.

http://fat81.org/moniwiki/images/freebsd_install/28.GIF

X server 를 설치하기 위해 설정을 해주어야 한다. 모두 X server 설정을 위한 도구지만, 각각 설정하는 방법들이 다르다. 나는 4번(xf86config)을 선택했다.

http://fat81.org/moniwiki/images/freebsd_install/29.GIF

현재 마우스 데몬이 실행되고 있고, '/dev/sysmouse' 로 선택해주면 된다.

http://fat81.org/moniwiki/images/freebsd_install/30.GIF

본격적인 xf86config 프로그램이 실행되었다. 'Enter' 입력해서 다음 단계로 넘어간다.

http://fat81.org/moniwiki/images/freebsd_install/31.GIF

마우스 설정이다. 여기서는 '1. Auto' 선택한다.

http://fat81.org/moniwiki/images/freebsd_install/32.GIF

에뮬레이션 3버튼을 사용할 것인가 여부를 묻는 과정이다. 여기서는 'y' 를 선택했다.

http://fat81.org/moniwiki/images/freebsd_install/33.GIF

마우스 장치를 지정해주는 부분이다. 앞에서 것과 같이 그냥 'Enter' 치고 넘어가면 기본적으로 '/dev/sysmouse' 로 설정된다.

http://fat81.org/moniwiki/images/freebsd_install/34.GIF

키보드 설정이다. '1. Generic 101-key PC' 선택한다.

http://fat81.org/moniwiki/images/freebsd_install/35.GIF

키보드 언어를 설정하는 부분이다. 'Korean' 이 없으므로, '1. U.S. English' 을 선택한다.

http://fat81.org/moniwiki/images/freebsd_install/36.GIF

모니터 설정이다. 정확히 현재 모니터의 해상도를 모른다면, 가장 근접한 값을 선택하면 된다. 하지만 개인적으로 모니터 메뉴얼을 보고 정확한 값을 입력하는 방법을 권장한다.

http://fat81.org/moniwiki/images/freebsd_install/37.GIF

수평 해상도를 설정하는 부분이다.

http://fat81.org/moniwiki/images/freebsd_install/38.GIF

그래픽 카드를 설정하는 부분이다. 자신의 그래픽카드의 정보를 정확히 알고 있다면, 굳이 xfree86 이 지원하는 그래픽 카드 목록을 안봐도 되겠지만 보는 것을 강력 추천한다.

http://fat81.org/moniwiki/images/freebsd_install/39.GIF

나의 경우는 vmware를 사용해서 설치를 하고 있기 때문에 '29. ?VMWare guest OS (generic)' 을 선택했다. 예전에는 xfree86에서 vmware을 지원하지 않았기 때문에, 설치후에 vmware-tool 을 설치해서 따로 잡아주어야 했지만, xfree86 4.3.x 에서 부터는 공식적으로 지원하고 있다. 참 좋아졌다. ^^;

http://fat81.org/moniwiki/images/freebsd_install/40.GIF

그래픽 카드 메모리를 지정해준다.

http://fat81.org/moniwiki/images/freebsd_install/42.GIF

해상도를 설정한다.

http://fat81.org/moniwiki/images/freebsd_install/43.GIF

가상(virtual) 화면이 물리(physical) 화면보다 클때 사용할 것이지를 물어본다. 여기서는 'y' 선택했다.

http://fat81.org/moniwiki/images/freebsd_install/44.GIF

색상의 수를 설정한다.

http://fat81.org/moniwiki/images/freebsd_install/45.GIF

이제 모든 X 설정이 끝났다. /etc/X11?/XF86Config 파일에 설정 내용을 저장할 것이지를 묻는다.

http://fat81.org/moniwiki/images/freebsd_install/46.GIF

X Manager 를 선택할 차례다. 프비는 많은 X Manager 를 지원하고 있다. 여기서는 'GNOME 2' 선택했다.

http://fat81.org/moniwiki/images/freebsd_install/47.GIF

여기서는 패키지를 선택해서 설치하는 과정이다. 보면 알겠지만, 프비가 지원하는 애플리케이션 엄청나게 많은 것을 알 수 있다. 필요한 것만 체크해서 설치하면 된다.

http://fat81.org/moniwiki/images/freebsd_install/48.GIF

일반 계정 유저를 만들기를 권하고 있다. root 로 로그인해도 되지만, 이것은 매우 위험하다.

http://fat81.org/moniwiki/images/freebsd_install/49.GIF

마지막으로 위에서의 과정에서 설정을 수정한다거나, 제거한다거나, 추가할 것이 있으면, 'Yes' 를 선택한다.

http://fat81.org/moniwiki/images/freebsd_install/50.GIF

이렇게 해서 길고긴(?) 프비 설치를 모두 마쳤다. 재부팅을 하고 나면, 프비 5.1 이 여러분을 맞이할 것이다.

'OS > LINUX' 카테고리의 다른 글

[펌] FreeBSD설치 안내서  (0) 2004.11.11
[펌] Installing Oracle9i on FreeBSD  (0) 2004.11.11
[펌]sendmail 인증 사용하기..  (0) 2004.11.05
[bbs.kldp.org에서 펌] 분할 압축하기...  (0) 2004.10.14
[펌] SNMP개요및 설치,운용  (0) 2004.08.21
Posted by tornado
|

엠파스 블로그에서 펌~~



/etc/mail/sendmail.mc 에서 아래 부분을 수정한다.

# vi /etc/mail/sendmail.mc

127.0.0.1 부분을 찾아 삭제
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')
위 두줄앞에 있는 dnl 을 삭제

# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
# /etc/rc.d/init.d/sendmail restart

설정이 완료된 순간부터 access.db 의 내용은 무시되며
서버 로그인 정보를 이용하여 메일 보내기가 가능해진다.

아웃룩 설정부분에서 아래부분을 체크한다.

'계정속성 -> 서버' 아래쪽에 있는 '보내는 메일 서버' 의 '인증필요' 부분을 체크.

'OS > LINUX' 카테고리의 다른 글

[펌] Installing Oracle9i on FreeBSD  (0) 2004.11.11
[펌] FreeBSD 5.0 설치하기  (0) 2004.11.11
[bbs.kldp.org에서 펌] 분할 압축하기...  (0) 2004.10.14
[펌] SNMP개요및 설치,운용  (0) 2004.08.21
한글 putty  (0) 2004.08.13
Posted by tornado
|
see2002
novice
novice


가입: 2003년 2월 11일
올린 글: 74

올리기시간: 2003년8월27일 8:41    주제: 인용과 함께 답변

저의 경우, split을 사용해서 분할합니다.

< 분할압축(650메가단위)예 >
코드:
tar -cvzf filename.tar.gz
split -b 650m filename.tar.gz filename.tar.gz_

< 압축해제 >
코드:
cat filename.tar.gz_* | tar -xvzf -

'OS > LINUX' 카테고리의 다른 글

[펌] FreeBSD 5.0 설치하기  (0) 2004.11.11
[펌]sendmail 인증 사용하기..  (0) 2004.11.05
[펌] SNMP개요및 설치,운용  (0) 2004.08.21
한글 putty  (0) 2004.08.13
[펌] temp..정리하기전..  (0) 2004.08.11
Posted by tornado
|
SNMP개요및 설치,운용
Posted on 2003/4/23
Topic:
네트웍 프로그래밍
article_SNMP_개요위키 홈으로

SNMP

윤 상배

dreamyun@yahoo.co.kr

교정 과정
교정 0.8 2003년 4월 20일 21시
최초 문서작성


1절. 소개

개인적으로 최근들어 SNMP에 관심을 가지게 되었다. (실은 상당히 오래되었지만) 그래서 앞으로 몇부? 에 걸쳐서 SNMP관련 강좌를 개설하고자 한다. 강좌는 SNMP개요및 설치운용에서 부터 시작해서 프로그래밍을 통해서 SNMP응용 애플리케이션을 제작하고, 확장 MIB(뒤에 설명한다)를 작성하는 것 까지를 다룰것이다.

이번글은 그중 첫번째 글로 SNMP개요와 설치및 운용에 대한 글이다. 설치및 운용은 실제 어떻게 작동되는지 눈으로 확인하는 차원의 수준에서 이루어질 것이며, 설치되는 snmp애플리케이션의 상세설치와 높은 수준에서의 운용에 대해서는 언급하지 않을것이다. 이러한 것들은 (필요할경우)해당 snmp애플리케이션의 메뉴얼을 참고해서 개인적으로 학습해야만 할것이다.

여기에서 얻은 지식은 나중에 SNMP애플리케이션을 제작하는 밑거름이 될것이다.


2절. SNMP개요

2.1절. SNMP란 무엇인가

SNMP는 Simple Network Management Protocol의 약자이다. 해석을 해보자면 간단한 네트워크관리를 위한 규약 인데, 말그대로 SNMP는 네트워크관리를 위한 용도로 사용되는 프로토콜이다. 가장 앞에 Simple라는 단어가 붙어있는데, 진짜로 간단한 프로토콜인지 아닌지는 사람에 따라 약간씩 차이가 있을수 있다. 필자가 보기엔 그리 복잡한 프로토콜은 아닌것 같은데, 어떤 사람들은 매우 복잡한 프로토콜 이라고 말하는 사람들도 있다.

그럼 먼저 SNMP가 나타난 배경에 대해서 알아보도록 하겠다. SNMP가 쓰이기 전에 일반적으로 사용되는 네트워크 관리는 ICMP에 의존했었다. ICMP는 Network계층의 프로토콜로써, 운영체제에 관계없이 사용할수 있는 간단한 프로토콜이였다. 이 프로토콜을 이용해서 우리는 네트워크로 연결된 각각의 호스트가 작동하고 있는지, 작동한다면 어느정도의 응답시간을 가지고 작동하는지 등의 간단한 정보를 얻을수 있었으며, 초기에는 이정도로도 필요한 네트워크 관리가 가능했었다. ICMP를 이용한 가장 유용한 도구는 아마도 ping 프로그램일 것이다.

그러나 인터넷의 사용이 보편화되고 네트워크에 연결된 호스트의 수가 증가하자 거기에 따라서 네트워크 구성역시 복잡해지고, ICMP만을 가지고는 이러한 네트워크의 관리를 효율적으로 할수 없게 되었다.

그래서 몇가지 프로토콜에 대한 연구가 진행되었고, SGMP, HIMS, CMIP/CMIS등이 제안되게 되었다. 이중에서 SGMP를 발전시킨 SNMP가 사실상 네트워크 관리를 위한 표준적인 프로토콜로 자리잡게 되었다. 다른 프로토콜들이 사용되지 않은데에는 몇가지 이유가 있었다. CMIP/CMIS는 너무 방대하고 너무 복잡했으며, HEMS의 경우에는 실제 적용사례가 적었기 때문이다.

어쨋든 SNMP는 거의 대부분의 운영체제에서 사용되어 지고 있다. 여러분이 사용하는 Linux, 그밖의 대부분의 유닉스와, 윈도우계열 운영체제는 기본적으로 SNMP프로토콜을 사용하는 도구들을 제공하고 있다. 그외에도 router등 TCP/IP를 네트워크 프로토콜로 사용되는 운영체제들 역시 SNMP는 필수적으로 제공하고 있다.


2.2절. SNMP로 할수 있는 것들

SNMP를 이용해서 할수 있는 것들은 다음과 같다.

네트워크 구성관리

네트워크상의 호스트들이 어떤 구조를 이루고 있는지 지도를 그리는게 가능하다.

성능관리

각 네트워크 세그먼트간 네트워크 사용량, 에러량, 처리속도, 응답시간 등 성능 분석에 필요한 통계정보를 얻어낼수 있다.

장비관리

SNMP의 주목적이 네트워크관리관리 이기는 하지만 SNMP특유의 유연한 확장성을 이용하여서 시스템정보(CPU, MEMORY, DISK 사용량)의 정보를 얻어올 수 있도록 많은 부분이 확장되었다. 이 정보는 네트워크문제를 해결하는데 큰도움을 준다. 예를들어 특정 세그먼트의 네트워크 사용량이 갑자기 급증했는데, 특정 호스트의 CPU사용율까지 갑자기 증가했다면, 우리는 해당 호스트에서 문제가 발생했을것이란걸 유추해낼수 있을것이다.

보안관리

정보의 제어 및 보호 기능, 최근버젼인 SNMP3는 특히 정보보호를 위한 기능이 향상되었다.


2.3절. SNMP를 통한 망의 구성

SMTP는 인터넷상에서 메시지를 교환하기 위한 프로토콜로 사용되며, 주로 전자메일 교환을 위해서 사용되는 프로토콜이다. 그러나 SMTP는 어디까지나 프로토콜일 뿐이며, 실제 메시지를 인터넷상에서 주고 받기 위해서는 SMTP프로토콜을 사용하는 SMTP서버(Sendmail같은)와 SMTP클라이언트(mutt, pine같은)가 준비되어 있어야만 한다.

SNMP역시 그자체로는 프로토콜일 뿐이며 SNMP프로토콜을 활용해서 실제 네트워크 관리 정보를 얻어오기 위해서는 응용 애플리케이션이 준비되어있어야만 한다. 보통의 네트워크프로토콜을 사용하는 애플리케이션이 서버/클라이언트 모델로 구성되듯이 SNMP역시 서버와 클라이언트로 구성된다.

그림 1. SNMP망 관리 시스템

일반적으로 SNMP망 에서는 서버/클라이언트라고 부르지 않고 snmp manager/snmp agent라고 부른다. snmp agent는 관리대상이 되는 시스템에 설치되어서 필요한 정보(네트워크 혹은 시스템)를 수집하기 위한 snmp 모듈(혹은 애플리케이션) 이며, snmp manager은 snmp agent가 설치된 시스템에 필요한 정보를 요청하는 snmp 모듈이다. snmp agent는 서버, snmp manager은 클라이언트로 생각하면 이해하기가 좀더 수월할 것이다(그러나 반드시 agent가 서버, manager이 클라이언트가 되는건 아니다. 그냥 개념적으로 이해만 하고 있도록 하자).

2.4절. MIB에 대해서

SNMP는 네트워크를 관리하기 위한 프로토콜이다. 그렇다면 무엇을 관리할 것인가(관리객체)를 결정해야 할것이다. 관리객체를 결정했다면, 이러한 관리객체를 효과적으로 관리하기 위해서 이를 분류해야 할것이다. 이게 바로 MIB이다.

MIB는 Man In Black의 줄임말이 아니다. Management Information Base의 줄임말인데, 관리되어야할 자원 객체의 분류된 정보를 말한다. 관리되어야할 객체는 시스템정보, 네트워크사용량, 네트워크 인터페이스정보 등이 된다.

이 MIB객체들은 관리하기 편하도록 Tree구조를 가지게 된다. 다음은 MIB의 일반적인 구조이다.

그림 2. MIB계층 구조

MIB는 위에서 처럼 계층적인(디렉토리) 구조를 가지게 된다(위의 그림은 MIB를 설명하기 위해 일부만을 표시하고 있다). 예를들어서 agent가 설치되어 있는 시스템으로 부터 시스템부가정보(sysDescr)를 얻어오길 원한다면 ISO.org.dod.internet.mgmt.mib-2.system.sysDescr과 같은 식으로 manger에서 데이타를 요청하면 된다.

위의 MIB계층 구조를 보면 각 MIB옆에 숫자가 있는것을 볼수 있다. 이 숫자가 OID번호이다. 즉 sysDescr의 OID값은 1.3.6.1.1.2.1.1.1 이 될것이다. OID번호를 이용하는 이유는 MIB고유 문자열을 통해서 원하는 데이타를 가져오기위해서는 아무래도 요청이 길어질수가 있기 때문이다.

MIB는 IANA(Internet Assigned Number Authority)라는 단체에서 관리하며 표준적으로 사용되고 있다. 그럼으로 표준적인 MIB구현을 위해서는 IANA에서 OID를 부여받아야만 한다. 그래야 전체네트워크상에서 다른 여러가지 MIB와 중복되지 않고 사용이 가능할것이다.

작은 정보: cisco과 같은 대중적인(거의 표준이나 마찬가지인) 제품들은 모두 자체적인 MIB를 구현해서 IANA에 등록하여 사용하고 있다. 여러분이 cisco 라우터등의 SNMP정보를 접근할수 있다면 cisco MIB가 등록되어 있음을 확인할수 있을것이다. 확인하는 방법은 다음 강좌에서 따로 언급하도록 하겠다.

MIB는 계층적 구조를 가짐으로 필요에 따라서 확장해서 사용이 가능하며, (물론 프로그래밍 능력이 있어야 하지만)때에 따라서는 자체 회사내에서만 사용가능하거나 제한된 네트워크 영역의 네트워크상황을 관제하는 제품을 위한 MIB를 추가해야 하는경우가 생길수 있을것이다. 그래서 사설로 MIB를 만들어서 사용할수 있는 여지를 남겨두었다. (마치 독립된 지역네트워크를 위해 사설IP를 사용하는 것처럼) 이러한 사설 MIB는 private(4)의 enterprises(1)에 정의해서 사용할수 있다. 여러분이 그리 대중적이지 않은 그래서 IANA에 등록되지 않은 어떤 장비의 고유 SNMP정보를 얻어오고 싶다면 업체에 문의하거나, 메뉴얼을 확인하는 정도로 쉽게 SNMP정보를 얻어올수 있다.

현재 MIB는 버젼 2까지나와 있으며, 버젼의 구분을 위해서 MIB-1, MIB-2로 부르고 있다. MIB-2는 MIB-1의 확장판으로 MIB-1의 모든 객체를 포함하여 약 171개의 객체들을 더 포함하고 있다. 최근의 제품들은 대부분 MIB-2를 지원하고 있다. 물론 위에서 말했듯이 독자적인 MIB를 만들어서 사용할수 있으며, 이를 확장 MIB라고 부른다.


2.5절. SNMP 프로토콜의 동작과 구성

현재 SNMP는 버전 3가지 나와있는 상태이지만 아직까지는 버젼2가 가장 널리 사용 되고 있다. 필자역시 SNMP 버젼 2에 대한 경험이 많은 관계로 버젼2를 기준으로 설명하도록 하겠다.

SNMP는 기본적으로 네트워크 정보를 수집하는데 그 목적이 있는데, 수집하는 몇가지 각각 다른 방법이 있다. 일반적으로 생각해서 우리가 생활중에 얻게 되는 정보는 우리가 요구해서 발생하는 정보와(신문을 구입한다든지, 인터넷으로 서핑을 하는등) 뉴스속보와 같은 형식으로 중요한 일이 있을때 발생하는 정보가 있을것이다. 또한 단지 정보를 얻는데 그치지 않고 정보를 입력하기도 한다.

SNMP정보수집역시 기본적으로 위의 일상생활에서의 정보수집과 같은 방식으로 이루어진다. 이하 snmp manager은 manager로 snmp agent는 agent로 부르도록 한다.

GET

manager에서 agent로 특정 정보를 요청하기 위해서 사용한다.

GET NEXT

기본적으로는 GET과 같은일을 한다. 그러나 SNMP에서 각정보들은 계층적 구조로 관리된다. 위의 MIB계층 구조를 나타낸 이미지에서 우리는 system(1)계층밑에 있는 모든 정보를 가져오고 싶을 때가 있을것이다. 그럴경우 GET NEXT를 사용할수 있다.

SET

manager에서 agent로 특정 값을 설정하기 위해서 사용한다.

TRAP

agent에서 통보해야될 어떤 정보가 발생했을때(임계치를 넘는네트워크자원 사용등) manager에게 해당 상황을 알리기 위해서 사용한다. 위의 다른 요청들이 동기적 요청이라면 이것은 비동기적 사건을 알리기 위해서 사용되어진다.

SNMP프로토콜은 기본적으로 어떤 정보를 요청하는 메시지와 이에 대한 응답메시지로 이루어지며 다음과 같은 구조를 가지고 있다.

표 1. SNMP 메시지

Version Community name SNMP PDU
Version은 말이 필요없다. SNMP프로토콜의 버젼번호를 나타낸다. Community name은 메니저와 에이전트간의 관계를 나타내는데, 인증, 접근통제등의 목적으로 사용된다. 보통은 간단하게 public을 사용한다. PDU 는 Physical Data Unit의 줄임말인데, 실제 전송되는 필요한 정보들을 담고 있는 Unit이다. Unit 이라고 하는 이유는 실제 전송되는 정보들의 부가 속성을 나타내기 위한 몇가지 값들을 포함하고 있기 때문이다. PDU는 PDU 타입(GET인지 Set인지 GET Next인지, TRAP인지등)과, Request-id, 실제보내고자 하는 데이타등(OID와 OID에 대한 값들)으로 구성되어 있다.

SNMP를 통해서 전달되는 메시지들은 기본적으로 UDP를 이용하게 된다. 바로위에서 PDU는 Request-id를 포함하고 있다고 했는데, 데이타그램처리방식인 UDP의 단점을 극복하기 위해서 사용되는 값으로, 각 메시지의 요청번호를 표시한다. 그래야만 수신된 SNMP메시지가 어떤 요청에 대해서 수신된 메시지인지 확인이 가능할것이기 때문이다.


3절. SNMP 설치 및 운용

그럼 실제로 시스템에 SNMP(agent와 manager 애플리케이션)을 설치해서 정보를 가져오는걸 간단히 테스트 해보도록 하겠다.

설치는 Linux(Kernel-2.4.x)에서 ucd-snmp로 할것이다. 위에서 설명했듯이, SNMP는 manager과 agent로 운영되게 되는데, 테스트의 편의를 위해서 하나의 시스템(localhost)에서 manager와 agent를 운용하도록 하겠다.


3.1절. ucd-snmp 설치

ucd-snmp는 net-snmp.sourceforge.net에서 얻을수 있으며 애플리케이션 관련 정보들도 얻을수 있다. ucd-snmp는 현재 버젼 5.x대까지 진행되어 있는데, 5.x부터는 net-snmp로 이름을 바꾸고 개발되어지고 있으며, 4.x버젼까지를 ucd-snmp라고 부르고 있다. 필자는 익숙한 ucd-snmp(버젼 4.x)를 설치하도록 할것이다. 비록 net-snmp가 최신이긴 하지만 별로 다루어본적이 없고, 대부분의 경우 아직까지는 ucd-snmp가 많이 사용되어지고 있기 때문이다. 최신이 아니라고 불만을 가질 필요는 없다. 근본적으로 net-snmp와 ucd-snmp간의 차이는 없으며, 우리의 목적은 최신의 snmp애플리케이션을 테스트하는게 아닌 snmp의 기능과 원리를 이해하고 이를 이용해서 필요한 응용 애플리케이션을 작성하는 것이기 때문이다.

위의 URL에서 ucd-snmp를 다운받아서 압축을 풀고 컴파일 하도록 하자. 컴파일 하는중에는 아마도 아무런 문제가 없을것이다. 컴파일은 매우 일반적인 방법을 따른다. 적당한 디렉토리에 압축을 풀고 ./configure, make, make install 하면된다.

	[root@localhost src]# tar -xvzf ucd-snmp-4.2.6.tar.gz [root@localhost src]# cd ucd-snmp-4.2.6 [root@localhost ucd-snmp-4.2.6]# ./configure  [root@localhost ucd-snmp-4.2.6]# make [root@localhost ucd-snmp-4.2.6]# make install			
헤에... 너무 간단하지 않은가 ?


3.2절. SNMP AGENT 실행

make install 까지 했다면 agent와 manager프로그램이 모두 설치되어 있을 것이다. 그리고 여기에 더불어 개발자를 위한 각종 라이브러리와 헤더파일들도 설치된다. 이 라이브러리와 헤더파일들은 개발할때 필요하며 다음 강좌에서 다루게 될것이다.

ucd-snmp는 agent 프로그램으로 snmpd를 제공한다. agent환경을 제대로 만들려면 복잡해보이는(사실은 그리 복잡하다고 볼수없는) 설정파일을 만들어줘야 하지만 이것은 각자의 몫이다. net-snmp프로젝트 홈페이지에서 제공하는 메뉴얼을 참고하기 바란다. 어쨋든 현재로써는 단지 snmpd를 띄우는 정도로 snmp agent환경을 만들수 있다.

[root@localhost root]# snmpd			
이것으로 snmp를 테스트할 최소한의 agent환경이 구축되었다.


3.3절. SNMP MANAGER 테스트

3.3.1절. 동기적인 데이타 요청 - snmp get, get next

GETGET NEXT는 동기적인 정보요청을 위해서 사용한다. manager에서 agent에 대해서 정보를 요청했을때 해당 정보를 agent에서 보내주는 방식이다. GET은 단일정보요청을 위해서 사용하며, GET NEXT는 해당 계층의 하위에 있는 모든 정보의 요청을 위해서 사용된다.

ucd-snmp는 이러한 정보요청을 위한 manager프로그램으로 snmpgetsnmpnext, snmpwalk를 제공한다.

snmpget은 이름에서 알수 있듯이 agent로부터 특정한 정보를 얻어내기 위해서 사용한다. 정보를 얻기 위해 필요한 기본정보는 agent가 설치되어 있는 서버의 주소(혹은 이름) 와 커뮤니티(권한을 위한)이름 그리고 얻기 원하는 정보의 OID번호 혹은 MIB의 계층이름이다. 예를들어서 localhost로부터 public권한을 가지고 sysDescr(시스템 부가정보)정보를 얻어오고 싶다면 아래와 같이 하면 된다.

 [root@localhost /root]# snmpget localhost public system.sysDescr.0system.sysDescr.0 = Linux localhost 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686				
혹은 MIB이름대신에 OID번호를 사용해도 된다.
 [root@localhost /root]# snmpget localhost public 1.1.0 system.sysDescr.0 = Linux localhost 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686				

snmpwalk는 해당 MIB의 하위계층에 있는 모든 정보를 요청한다. 예를들어 system MIB의 하위 계층에 있는 모든 OID에 대한 정보를 요청하길 원한다면 아래와 같이 하면된다. 이게 가능한 이유는 snmpwalk가 정보를 요청하기 위해서 snmp메시지를 만들때 PDU타입을 GET NEXT를 사용하기 때문이다. 나중에 직접구현하게 될것이다. 지금은 구현에 신경쓰지 말자.

[root@localhost /root]# snmpwalk localhost public systemsystem.sysDescr.0 = Linux localhost 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686system.sysObjectID.0 = OID: enterprises.ucdavis.ucdSnmpAgent.linuxsystem.sysUpTime.0 = Timeticks: (2685699) 7:27:36.99system.sysContact.0 = yundream@joinc.co.krsystem.sysName.0 = localhostsystem.sysLocation.0 = myhome system.sysORLastChange.0 = Timeticks: (0) 0:00:00.00....				
system하위의 모든 OID에 대한 정보를 얻어오고 있음을 확인할수 있다.

snmpgetnext는 snmpwalk의 기능 축소판정도로 볼수 있을것이다. 즉 MIB계층구조에서 현재 요청한 OID의 다음 OID의 정보를 가져온다. 예르들어 system.sysDescr.0에 대한 정보를 요청하면 다음 OID인 system.sysObjectID.0의 정보를 요청하게 될것이다. 이게 가능한 이유는 snmpwalk와 마찬가지로 내부적으로 GET NEXT를 이용하고 있기 때문이다. snmpwalk가 더이상 얻을수 없을때까지 OID를 요청하는것과 달리 snmpgetnext 바로다음의 OID만을 요청한다.

 [root@localhost /root]# snmpgetnext localhost public system system.sysDescr.0system.sysDescr.0 = Linux localhost 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686system.sysObjectID.0 = OID: enterprises.ucdavis.ucdSnmpAgent.linux				


3.3.2절. 비동기적인 데이타 요청 - snmp trap

기본적으로 GET, GET NEXT를 통한 데이타요청은 일정한 polling시간을 가지고 manager에서 agent로 필요한 정보를 요청하는 방식이다. 그러나 이걸 이용해서는 비동기적으로 발생하는 정보를 수집할수가 없다.

이러한 비동기적인 정보는 여러가지가 될수 있다. 예를들면 특정 네트워크 세그먼트에 문제가 생겼다거나 디스크나 메모리용량을 과다하게 사용하고 있다거나(많은 운영체제의 경우 시스템정보까지도 snmp를 통해서 얻을수 있도록 허용하고 있다)하는 사건들은 비동기적으로 발생할것이다. 이럴경우에는 agent에서 manager측으로 사건을 통보해야 할것이다. 이렇게 agent에서 manager측으로 비동기적으로 사건을 통보하는 것을 SNMP TRAP라고 한다(간단히 말해서 경고메시지 보내는거다).

ucd-snmp에서는 이러한 trap정보를 전송하고 받기 위해서 snmptrapdsnmptrap를 제공한다. snmptrapd는 agent에 제공되는 데몬프로그램으로 manager에서의 trap데이타 발생을 기다린다. snmptrap는 agent에 설치되어서 사용될수 있으며 trap데이타를 manager로 전송하는 일을한다.

이 snmptrap은 꽤 유용하게 사용할수 있다. 간단하게 스크립트로 만들어서 어떤 파일이 변조되었을경우 trap정보를 manager쪽으로 발생시킨다거나, 프로세스 갯수가 일정갯수 이상 초과했을때 이를 전송한다든지 하는 기능을 비교적 간단하게 추가시킬수 있을것이다.

다음은 ucd-snmp에서 제공하는 trap애플리케이션을 이용한 간단한 테스트이다. 먼저 snmptrapd를 manager측에서 실행시켜야 한다. 이 애플리케이션은 옵션없이 실행할경우 데몬모드로 실행되며 표준출력을 시키지 않음으로 다음과 같이 옵션을 주고 실행시켜서 일반모드(forground)에서 받은 trap정보를 표준출력하도록 실행시키도록 하자.

[root@localhost root]# snmptrapd -f -P2003-04-23 00:13:34 UCD-snmp version 4.2.6 Started.				
이제 agent측에서 snmptrap를 이용해서 trap정보를 manager로 전송해보도록 하자.
[root@localhost root]# snmptrap -v 2c -c public localhost "" ucdStart sysContact.0 s "yundream"				
그러면 manager로 system.sysContact.0="yundream" 과 같은 정보가 전달되는걸 확인할수 있을것이다.

이들 ucd-snmp에서 제공하는 애플리케이션들의 자세한 사용법은 메뉴얼 페이지를 참고하기 바란다.


4절. 결론

이상 SNMP의 개념과 개념의 이해를 위해서 실제 사용되는 snmp애플리케이션을 설치해서 간단히 운영테스트까지 해보았다. 이러한 운영테스트를 위해서 ucd-snmp를 사용했는데, 다음 강좌는 ucd-snmp에서 제공하는 snmplib를 통해서 snmp애플리케이션을 만드는 법을 다루도록 하겠다.

'OS > LINUX' 카테고리의 다른 글

[펌]sendmail 인증 사용하기..  (0) 2004.11.05
[bbs.kldp.org에서 펌] 분할 압축하기...  (0) 2004.10.14
한글 putty  (0) 2004.08.13
[펌] temp..정리하기전..  (0) 2004.08.11
[펌] 20만통 메일과 sendmail  (0) 2004.07.09
Posted by tornado
|

한글 putty

OS/LINUX 2004. 8. 13. 12:02

한글 putty~~~

 

 

 

 

'OS > LINUX' 카테고리의 다른 글

[bbs.kldp.org에서 펌] 분할 압축하기...  (0) 2004.10.14
[펌] SNMP개요및 설치,운용  (0) 2004.08.21
[펌] temp..정리하기전..  (0) 2004.08.11
[펌] 20만통 메일과 sendmail  (0) 2004.07.09
[허접] 내부 IP MSN 차단 .... ㅡㅡ  (0) 2004.07.07
Posted by tornado
|

DMZ (DeMilitarized Zone)

 

외부에서 엑세스가능한 서버들의 네트웍을 할당해 놓은 곳

 

방화벽의 종류중에, Screened subnets 라는 종류에서
앞뒤로 방화벽을 설치해 놓고, 중간에 서버를 가져다 놓는데,

이 부분을 DMZ 라고 부른다.

 

더 자세한 것은 방화벽을 찾아보면 자세히 나와있습니다.

 

컴퓨터 네트웍에서, DMZ란 회사의 사설 네트웍과 외부의 공중 네트웍 사이에, 중립 지역으로서 삽입된 컴퓨터 호스트, 또는 소형 네트웍을 말한다. 이것은 외부의 사용자들이 회사의 중요 데이터를 가지고 있는 서버에 직접 접속하는 것을 방지한다 (이 용어는 1950년 초 한국전쟁 후 남북한 사이에 조성된 지리적 완충지역을 부르는 말로부터 유래되었다). DMZ를 두는 것은 선택 사항이지만, 방화벽 보다 더 안전한 방법이며, 게다가 프록시 서버로서의 역할도 효과적으로 수행한다.

 

소규모 회사를 위한 대표적인 DMZ 구성에서, 별도의 호스트 컴퓨터가 사설 네트웍 내의 사용자들로부터 웹사이트 또는 공중 네트웍 상의 다른 회사 컴퓨터의 접속에 관한 요청을 받는다. 그리고 나서 DMZ 호스트는 공중 네트웍에 관한 이러한 요청을 위해 세션을 개시한다. 그러나, DMZ 호스트는 사설 네트웍 내로 들어오는 세션은 개시할 수 없다. DMZ 호스트는 오직 요청된 패킷들을 내부로 전달하는 것만이 가능하다.

 

회사 외부의 공중네트웍의 사용자들은 오직 DMZ 호스트만을 액세스할 수 있다. DMZ 호스트에는 일반적으로 외부 세계에 서비스할 수 있도록 회사의 웹페이지를 가지고 있을 수 있지만, 그 외 회사의 어떠한 다른 데이터도 제공하지 않는다. 그러므로, 만약 외부의 사용자가 DMZ 호스트의 보안을 뚫고 침입한 경우, 웹페이지는 훼손될 수 있지만, 그 외 회사의 다른 어떠한 정보도 노출되지 않는다. 라우터 제작으로 유명한 시스코에서, DMZ를 설정하기 위한 제품을 판매하고 있다.

 

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

보안에서 DMZ란 우리나라에 있는 비무장지대와 같습니다.

말그대로 무장을 하지 않는 다는 것이죠.
그렇다면 왜 무장을 하지 않는가?

그 이유는
주로 DMZ는 방화벽과 연관해서 사용이 되어지는데
기본적으로 방화벽은 네트웍을 보호하는 하드웨어나 소프트웨어입니다.
즉 방화벽은 불법적인 침입에 대하여 필터링을 하는 놈이라고 생각하시면 되겠죠?

그러면 DMZ 를 왜 구성하는가?

그 이유는 바로 서비스에 있습니다.
여러분의 회사나 학교의 네트웍에는 외부로 노출되어야 할 서버나 PC들이 있습니다.
예를 들어 웹서버나 홈페이지 서버, 기타 로긴 서버나 인터넷에서 자신의 네트웍의 서버자원
을 사용해야 하는 서버들이 있겠지요.

그러면 이 서버들을 방화벽 아래에 두게 되면 어쩔수 없이 사용하는 포트를 열어야 합니다.
그렇겠죠? 웹서비스는 HTTP를 열어주어야 하고 FTP서비스는 FTP 포트를 열어주어야 합니다.
이런 식으로 방화벽에 DMZ를 구성하지 않고 서버와 클라이언트PC들을 하나의 네트웍으로 구성하면
보안에 HOLE 이 생길 소지가 있다라는 것입니다.

즉 웹서비스의 열려진 HTTP 포트를 통해서 해킹이 가능해지면 이를 통해 내부클라이언트 PC까지도
손쉽게 해킹이 가능하게 됩니다.

그러므로 DMZ를 구성하게 되는 것이지요.

열어줘야 할 것들은 DMZ를 구성해서 따로 네트웍을 할당 하는 것입니다.
그러면 DMZ에서 로컬 네트웍으로의 침입이 불가능하게 되는 것이죠.

인터넷 -> DMZ : OPEN (필요한 서비스만)
DMZ -> 로컬네트웍 : CLOSE (DMZ 서버를 통해서 로컬네트웍으로의 불법적인 침입 방지)
로컬네트웍 -> DMZ : OPEN (필요한 서비스만)
인터넷 -> 로컬네트웍 : CLOSE (로컬네트웍 보호)

이런 식의 정책적용이 기본적인 방화벽의 DMZ 관련 정책입니다.

가장 기본적으로 DMZ를 구성하는 경우는 아래와 같습니다.

방화벽에 NIC를 3장 달아서
하나는 인터넷, 다른 하나는 DMZ, 나머지 하나는 로컬네트웍으로 연결을 시켜주는 것이죠.

마지막으로 다시 정리해보면
DMZ는 외부에서 엑세스 가능한 서버들의 네트웍을 할당해 놓은 곳이며
DMZ를 구성함으로써 로컬네트웍의 보안을 가져갈 수 있다.

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

간단히 말해 비무장 지대입니다.

네트워크 상에서 여러가지 보안 정책을 쓰지 않는 구역을 말하는데..

물론 방화벽을 걷어 버리는 것은 아닙니다.

하지만, 포트가 다 열리고, 중간에 필터링을 없애는 거죠..

공용네트워크가 있다면, 대게 포트필터나, 방화벽 등등으로 제한들이 걸려 있습니다.

보안상의 문제도 있고, 트래픽 관리상의 목적도 있겠죠..

이러한 네트워크에서 특정 PC 를 DMZ 로 놓게 되면, 포트가 모두 열리게 되고, 필터제한을

일시적으로 제거 할 수 있습니다.

물론 이런건 설정 하기 나름이구요..DMZ 를 한다 하더라도, 불법패킷에대한 방화벽 기능등은

유지가 되구요..물론 이것 역시 설정하기 나름이겠지만..암튼..이런 제한을 풀어버리는 역활을

DMZ 라 합니다.

물론 DMZ 설정을 해 두면 보안상으로 치명적일 수 있겠죠?..

생각 나는대로 적습니다..

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

DMZ 를 세팅하기 위해서는 내부적인 IP 가 고정으로 변환해야 한다는 것이고,
케이블 모뎀이 외부로 부터 연결시켜 주는 IP 는 개인이 임의적으로 설정할 수
없습니다.

또한 케이블 모뎀을 통해서 인터넷이 되는 것이기 때문에, 사용자가 IP 설정에서
임의의 IP 를 설정해 놓는다 해도, 그 IP 로 설정이 되는 것이 아니라, 인터넷
서비스 없체에서 모뎀으로 동적으로 뿌려주는 IP 를 이용하게 됩니다.

따라서 IP 공유기에서 DHCP 사용을 하지 않으시고, 아이피를 192.168.1.x 이런식으로
고정해서 내 컴퓨터에 설정해 주시면 DMZ 사용하는데는 이상이 없을것 같습니다.

추가로, 개개인별로 고정 IP 를 사용하게 되면, 어떤 문제가 있느냐 하고
질문 하셨는데, 인터넷 서비스 없체는 고객의 수만큼 충분한 IP 를 가지고
있지 않고, 그때 그때 필요로 하는 고객에게 IP 를 주는 식으로 효율성을
높이고 있으며, 또 고정 IP 를 주게 되면, 다운로드 위주의 대역폭을 설정해
놓은 모뎀이 개개인들의 서버 사용으로 인해서 업로드 트레픽이 많아 지게되어
전체적으로 속도 저하를 가져 오게 되어서, 고정 IP 를 주지 않는 것으로 알고
있습니다.

도움 되셨길..^^

 

 

 

포트포워딩

 

포트와 아이피는 별게 입니다.

사실상 특별한 보안상의 문제나 isp 업체에서 해당 포트를 막아 놓지 않은 이상 굳이 포트를 변경할 필요는 없을듯 합니다.

기본 포트가 아니면 다른 사람들이 접속할때 마다 포트를 지정해줘야 하므로 불편하죠. 그냥 기본 포트로 하는 것이 좋습니다.

다만 공유기에서 DMZ 기능을 제공하느냐의 문제입니다.
DMZ 기능이란 공유기에 할당된 ip 주소를 하위 피씨의 사설아이피로 직접 연결해 주는 기능으로, 포트별로 여러대의 피씨에 할당해줄수도 있습니다.

만약 공유기가 DDNS 기능까지 지원한다면, 외부에서 접속할때 수시로 바뀌는 아이피 주소가 아닌 업체에서 할당받은 도메인 명으로 항상 접속 할수 있습니다.

아이피 주소는 그냥 현재 상태 그대로 두셔도 됩니다.
가지고 계신 공유기가 외부 관리는 지원하는 것으로 보아 DDNS 까지 지원하지 않을까 싶긴 한데요. 메뉴얼의 dmz 기능과 DDNS 기능부분을 참조하세요.

더 궁금하신 사항은 쪽지로..

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

유동 아이피라 하면 DHCP서버에서 자동으로 아이피를 할당 받는 것을 말합니다.

만에 하나 현재 이용하고 있는 초고속 인터넷 서비스가 B&A 같은 사설아이피를 할당받은 네트워크라면 서버 구축이 불가능하나, 공인 아이피를 할당 받았을 경우는 DDNS( Dynamic Domain Name Server) 를 이용해서 구축이 가능합니다.

DNS 는 아이피로 된 피씨의 주소를 도메인 명으로 연결해주는 서비스인데 유동아이피일 경우 DNS에서 질문자의 피씨를 찾을수 없게되기 때문에 DNS 서비스는 불가합니다. 하지만 질문자의 서버에 DDNS 클라이언트 프로그램을 설치해서 수시로 DNS서버로 아이피의 현재 상태를 전송해준다면 서비스가 가능해지죠. 이렇게 클라이언트에서 아이피 정보를 수시로 보내서 갱신하여서 고정된 이름으로 접속 할수 있도록 해주는 것은 DDNS 서비스 라고 합니다.

추가정보로 가정에서 공유기를 통해서 피씨를 서버로 사용하는 것은 불가능하였지만, 요즘 공유기의 기능으로 DMZ 기능을 이용하면 공유기에서 내부에 연결된 사설 아이피의 피씨로 무조건 연결하도록 임의로 설정하여 서버로써의 활용도 가능합니다. 일부 제품에서는 DDNS서비스 까지 무료로 지원해주고 있습니다.

DDNS 서비스는 몇군데 업체에서 하고 있지만 DNS 서버의 트래픽이 적을 수록 본인의 컴퓨터로 연결되는 속도는 빨라집니다. 가입할때 신경을 쓰셔야 할부분입니다.

DDNS 서비스를 이용하면 FTP 뿐만 아니라 웹서버, 터미날 서비스로 외부에서 내 컴퓨터를 직접 작동하여 끄는것등의 작업까지 가능합니다. 

예 할 수 있습니다.
FTP서버를 설치하는데는 유동이든 고정이든 전혀 문제가 없습니다.

여기서 유동이란 말은 그 아이피(서버로 사용하는 컴의 주소)가 자주 바뀔 수 있다는 말이죠. 유동아이피에는 임대기간이라는것이 있습니다. 아이피를 받은 시간으로부터 몇시간동안 똑같은 아이피를 부여하게끔 DHCP 서버에서 지정을 해줍니다. 다시 말해서 오늘 주소는 "10.125.8.115" 였던것이 임대기간이 지난 내일은 "10.125.8.125" 로 바뀌어 버리는 것입니다. FTP 서버(웹서버도 마찬가지 입니다)가 설치되어 돌아가더라도 그 주소를 모른다면 (다른 이들이 찾지 못한다면) 무용지물이겠지요. 해서 유동아이피라면 사용하기가 힘들다는 겁니다. 매번 현재 주소를 사용자들에게 알려줘야 하기때문이죠. 이게 바로 문제점이 되겠구요.

여기에 따른 해결책으로는 아이피를 고정아이피로 바꾸는 방법, 그리고 많은 분들이 말씀하셨지만 네이밍 서비스를 이용하는 방법이 있겠지만 돈이 듭니다(사야하죠).

그밖에 유동아이피를 고정아이피처럼 사용할 수 있는게 바로 포워딩입니다. 조그만 프로그램이 사용하고자 하는 서버 피씨에 상주해서 아이피가 바뀔때마다 (보통 얼마 시간만에 업데이트하라고 정해놓습니다) 포워딩해주는 호스트에 정보를 전달해주지요.
즉, 10.125.8.115 을 abc.no-ip.com 으로 매핑 해놓고 만일 아이피가 바뀌면 바뀐아이피(만약 바뀐주소가 10.125.8.125 이라면)로 또다시 10.125.8.125 를 abc.no-ip.com 이런식으로 매핑을 시켜줍니다. 그래서 외부 사용자들은 abc.no-ip.com 이라는 도메인 하나로 접속이 가능하게 되는 것이지요.

이런 포워딩을 서비스해주는 곳은 많이 있습니다.
http://www.no-ip.com
http://www.codns.com/korean
http://xdns.co.kr
검색사이트에서 유동아이피로 검색 해보시면 많이 찾을 수 있을 것입니다. 개인적으로는 이 방법을 씁니다.

 

 

유동 ip를 사용할 경우의 문제점
: ftp서버의 ip가 유동 적으로 변함으로 하여 ftp client가 어떤 ip로 접근해야 하는지를 알 수 없으므로 ftp 서비스가 거의 불가능함

해결방안
: dynamic DNS의 사용
ftp client는 domain name으로 ftp 서버에 접속함
ftp 서버는 유동적인 자신의ㅣ ip를 항상 DDNS(dynamic DNS)서버에 알려줌으로 해서 DNS query가 들어 왔을 때 실시간으로 바뀌는 서버의 ip address를 ftp client에게 알려줌.

DDNS 사용시 필요한 점
: DDNS 서비스를 할 서버가 필요함 ftp서버에는 DDNS client program이 설치 되어 실시간으로 ftp 서버의 ip address를 DDNS 서버에 전송하고 DDNS 서버는 update된 ip address를 DNS의 domain과 매칭 시키는 작업을 함

'OS > LINUX' 카테고리의 다른 글

[펌] SNMP개요및 설치,운용  (0) 2004.08.21
한글 putty  (0) 2004.08.13
[펌] 20만통 메일과 sendmail  (0) 2004.07.09
[허접] 내부 IP MSN 차단 .... ㅡㅡ  (0) 2004.07.07
[펌] 프로세스죽이기  (0) 2004.07.07
Posted by tornado
|

펌...

http://tunelinux.pe.kr/sysadmin/iskim/linux-window-7.html



7. 기업 환경을 위한 리눅스 블랙박스 만들기[7]

7.1 20만통의 메일과 sendmail

이번달에는 webmin등을 이용한 서버 설정에서 잠시 벗어나 본격적인 서버 설정에 대해서 알아보자. 아무리 기업환경을 대상으로 한다고 해도 리눅스에 대한 개념을 갖추지 못한 사용자만이 있는 것은 아니며 유닉스에 익숙한 관리자들도 많을 것인데 이들은 유닉스에 익숙하고 리눅스를 유닉스 중의 하나로 보고 일반적인 관리방법만을 적용하고 있다. 왜냐하면 현재 인터넷등에서 리눅스에 대한 글은 초보와 중급 정도의 독자를 대상으로 하고 있으며 대부분의 글이 처음 설치와 제대로 동작하기 정도에서 멈추기 때문이다. 여기저기 흩어져 있는 설정 방법들을 모두 섭렵하기에는 관리자들이 시간이 없으며 그런 문제를 전문적으로 해결해 줄 곳도 없기 때문이다. 또한 아무리 오픈소스가 인기가 있고 리눅스 열풍이 한반도를 휘몰아쳐도 여전히 나는 남의 정보를 얻어 오지만 내 것은 줄 수 없다는 생각이 지배적이기 때문이다.

필자는 여기 저기서 특별한 개발이 진행되고 있다는 소식을 주워 듣고는 있는데 제품화가 진행되고 있다는 소리는 있지만 이 것을 공개하고 있다는 이야기는 듣지 못하고 있다. 아무리 리눅스가 바람을 타더라도 이런 상황에서는 아무도 도약할 수 없다. 리눅스 마케팅의 대상은 한국이 아니라 전세계 시장이며 이런 마케팅은 정보의 공개에 의해서 그 힘을 얻을 수 있다. 각자 알고 있는 것을 일단 공개하자. 얻은 만큼 주어야 클 수 있고 보답이 돌아온다는 것을 명심해야 하지 않을까? 이 글은 필자가 대규모 메일 중계 서버를 관리하면서 알게된 경험을 바탕으로 쓴 글이다. webmin으로 하는 서버 설정을 기대하고 이 글을 읽는 독자들에게는 다소 어려운 글이겠지만 나중에는 결국 도움을 줄 수 있는 글이 될 것이다.

한 개의 서비스가 대규모화 되고 소위 엔터프라이즈급의 처리가 가능하기 위해서는 소규모일 때에는 전혀 문제가 되지 않던 것들이 엄청난 문제를 일으키게 된다. 리눅스가 대규모 서버로서 제대로 설 수 있기 위해서는 어떤 것들을 고려해야 하는지에 대해 알아보자. 이 글에서는 메일서버에 대해서만 언급하고 있지만 꼭 그 것에만 국한 된 것은 아니며 웹서버나 삼바등에서도 활용가능하다.

7.2 숙제풀이

지난 달에 sendmail이 가능하면 처리할 메일을 즉시 보내기를 하도록 하는 방법에 대해 물었다. 그 방법은 다양한데 가장 빠른 방법은 실제로 과중한 부담을 받는 메일서버를 관리하면서 고쳐 나가보는 것이다. 숙제의 답은 본문 속에서 찾아 볼 수 있다. 리눅스에서 하루에 20만통의 메일을 전송, 수신, 중계를 해야할 때 생길 수 있는 문제에 대해서 생각하다보면 이 정도의 문제는 쉽게 답을 낼 수 있을 것이다.

7.3 이글의 범위

이 글은 sendmail을 인스톨하고 설정하는 법에 대한 설명이 아니다. 기본적인 설정에 대해서는 언급하지 않는다. 네임서버 설정과 MX 레코드등에 대해서도 언급하지 않는다. 사용자명 재지정을 위한 alias, 수신 메일의 도메인을 처리할 것인가 여부를 결정하는 sendmail.cw, 수신 메일의 도메인과 사용자명을 바꿔치기하는 virtusertable, 변경전의 도메인을 새 도메인과 일치시키는 domaintable, 송신메일에서 사용자와 도메인명을 바꿔치기하는 genericstable, 상태편 사이트의 메일서버 문제를 처리하는 mailertable, 메일을 처리해 주는데 문제가 없는 사이트로 인정하는 sendmail.ct 등에 대해서 구체적으로 언급하지 않는다. 독자적인 sendmail.cf를 만들기 위해서 필요한 m4 프로그램 사용법도 마찬가지이다. 알고 싶으면 /usr/lib/sendmail-cf를 조사해 보기 바란다. 배포본의 설정은 /usr/lib/sendmail-cf/cf/redhat.mc에 들어 있다. m4 사용법은 이 글의 주제가 아니며 자세한 관련 문서가 같은 디렉토리에 있고 인터넷을 통하면 쉽게 한글문서도 구할 수 있다.

이 글에서 언급하는 대부분의 프로그램에 대한 사용법은 알고 있어야 한다. 모른다면 프로그램 예가 나올 때 마다 메뉴얼 페이지를 조사할 것을 권한다. sendmail 자체에 대해서 잘 모르는 사용자들이나 하루에 100개 미만의 메일을 처리하는 서버를 다룬다면 이 글을 읽지 않아도 좋다. 일반적인 sendmail의 옵션을 알고 싶으면 소스에 함께 배포되는 설명파일을 읽던지 인터넷을 뒤지던지 관련 서적을 구입할 것을 권한다. 시스템 설정 과정에 대한 사항도 자세히 설명하지 않는다. 이 글의 목적은 엔터프라이즈급 환경에서 리눅스를 운용할 때, 특히 메일서버로 사용할 때 제기될 수 있는 문제에 대해서 쓰는 글이며 메일서버 설정법에 대한 초보적이고 지루한 강의가 아니기 때문이다.

7.4 필요한 것들

리눅스를 메일서버로 사용하기 위해서는 sendmail 패키지가 필요하다. 물론 대부분의 배포본에는 기본적으로 메일서버가 인스톨되도록 만들어져 있다. 대규모 사이트가 아니라면 기본적인 설정으로 문제가 없다. 대규모 사이트에서 메일분산을 위해서는 sendmail 소스 배포본의 프로그램이 필요하므로 소스도 가져오기 바란다. 자체 네임서버도 필요하다. 배포본의 캐싱만 하는 네임서버를 인스톨해 둘 것. 그외 syslogd와 logrotate, top, killall 프로그램 사용법에 대한 지식도 필요하다. 하드웨어는 하루 전송량 1000통이하라면 팬티엄200, 메모리 64메가정도, 그 이상이라면 팬티엄II-450, 메모리 128혹은 256이상이 필요하다. 서버라면 스카시 하드 디스크를 사용하고 있을 것이다. IDE도 상관없지만 속도가 문제라면 스카시 하드 디스크가 적당할 것이다. 네트웍은 가능한한 빠른 것이 좋으며 트래픽을 감시하면서 메일서버의 처리량이 한계를 넘어가면 네트웍 속도를 업그레이드 하던지 속도에 맞게 메일서버의 처리량을 조절하면 될 것이다.

7.5 1천통의 이메일

하루에 1천통 이하의 메일을 처리하는 사이트가 있다. 사용자들은 윈도우에서 메일을 전송하고 리눅스의 계정으로 메일을 받는다. 사용자는 1-200명 정도이고 각 사용자는 10개 정도의 메일을 주고 받는다. 보내는 메일은 리눅스서버가 중계해 주고 받는 메일은 사용자들이 5분 단위로 pop3나 IMAP으로 가져 간다. 이 정도의 부담이라면 기본 배포본의 설정과 팬티엄 정도의 하드웨어 56K-128K정도의 네트웍 속도에서도 부담이 없다. 한 사람당 메일 쿼타로 5M를 준다면 1G 정도의 하드 디스크 여유가 있으면 된다. 파일서버, 프린터서버, 웹서버로 같이 사용해도 된다. 자체 네임서버를 구축할 필요도 없으며 메일 큐 디렉토리의 크기에도 신경 쓸 필요가 없다. 로그파일도 크지 않을 것이다. 90퍼센트 이상의 사이트에서 이 정도의 부담으로 리눅스를 사용하고 있는데 시스템 관리자도 거의 필요 없고 서버를 구석에 놓고 그냥 쓰면 된다. 정전이 되었거나 무심코 리셋키를 눌러서 하드디스크에 문제가 생기지 않는다면 일년이상 신경쓰지 않아도 된다.

sendmail의 기동은 /etc/rc.d/init.d/sendmail에 의해서 시작된다. 중요부분은 다음과 같을 것이다.

     start)        # Start daemons.        echo -n "Starting sendmail: "        daemon /usr/sbin/sendmail -bd -q1h        echo        touch /var/lock/subsys/sendmail

sendmail은 데몬 모드(-bd)로 큐는 한 시간에 한 번씩 뒤져 보게(-q1h) 되어 있다. sendmail은 메일 접속을 받으면 자식 프로세스를 생성하여 처리하며 1시간에 한 번씩, 전송이 되지 않은 메일을 다시 보내기를 시도한다. 1천통의 메일은 이 방식으로 별 문제 없이 처리가 될 것이다. 이런 시스템 관리자는 복잡한 sendmail에 대해서 신경 쓰지 말고 다른 작업에 시간을 투자하기를 권한다.

7.6 1만통의 이메일

1만통의 메일은 사용자가 500명 정도, 1-2개의 메일링 리스트, 그리고 중계해 주어야 할 윈도우 클라이언트가 50-100대 정도 있게 된다. 한 개의 도메인 전체에 대한 메일을 담당하는 메일서버로 사용하는 경우일 것이다. 기본 설정으로 사용하기에는 몇가지의 문제가 발생한다. 500명의 사용자가 5분에 한 번씩 pop3을 사용하고 큐에는 평균 100통 이상의 메일이 저장되어 있게 된다. 가장 문제가 되는 것은 한 개의 데몬이 주고 받는 메일을 처리하기에는 힘들게 된다. 이제 데몬을 구분하도록 하자. 중계와 수신을 위해서, 그리고 큐에 쌓여 있는 메일을 처리할 두 개의 데몬으로 나눈다.

        daemon /usr/sbin/sendmail -bd         /usr/sbin/sendmail -q30m

수신,전송을 위한 데몬은 몇가지 제한 사항에 따라 메일을 직접 전송할 것인지 큐에 쌓아 놓고 나중에 보낼 것인지 결정한다. 해당 옵션은 /etc/sendmail.cf에 있는데 다음과 같은 것이다.

  # load average at which we just queue messages  #O QueueLA=8  # load average at which we refuse connections  #O RefuseLA=12  # maximum number of children we allow at one time  #O MaxDaemonChildren=12

LA란 Load Average라는 뜻인데 오렐리의 sendmail 책에 보면 복잡한 식으로 설명되어 있지만 경험적으로는 동시에 처리하고 있는 메일 프로세스의 수와 일치하는 것으로 보인다. QueueLA=8이란 현재 처리하고 있는 메일 프로세스의 수가 8개 이상이면 전송을 중단하고 일단 큐에 쌓은 다음에 나중에 처리하라는 뜻이다. 또한 RefuseLA=12란 메일 처리 프로세스 수가 12개 이상이면 접속을 거부하라는 의미가 된다. 마찬가지로 MaxDaemonChildren=12란 한개의 sendmail 데몬이 만들어 낼 수 있는 자식 프로세스의 수를 12개로 제한한다는 뜻이다. 이제 이 값을 바꾸어 준다. 큐에 메일을 쌓지 않고, 네임서버에 의뢰한 결과 보낼 주소가 유효한 것이고 상대편 메일서버가 전송을 허가해 준 메일이라면 즉시 전송을 시도하도록 한다. 그리고 가능한한 지연 없이 메일을 받아 들이고 원하는 모든 접속을 수용할 수 있도록, 접속 거부를 시작할 프로세스 수와 자식 프로세스의 최대값을 큰 값으로 유지한다.

  O QueueLA=128  O RefuseLA=128  O MaxDaemonChildren=64

첫칸에 #가 붙은 것은 sendmail에 설정되지 않으므로 변경하고 싶으면 #를 제거하고 값을 바꾸어 준다. 이제 sendmail은 동시에 128개(수신, 중계 sendmail 64, 큐처리 64)까지 뜰 수 있다. 수신메일은 최대 64개 까지 동시에 처리되며 중계나 수신은 64개 까지는 거부없이 받아 들인다. 물론 메일 거부는 부하가 많이 걸릴 때 발생하며 상대편 메일서버는 이 때에 메일 전송에 실패하지만 잠시 후에는 접속이 가능하게 되기 때문에 일시적 메일 서버 접속 거부는 아무런 문제가 없다. 잘못된 주소로 메일을 보내거나 이 메일 서버가 전송을 시도하는 상대편 메일서버가 다운되어 메일을 보낼 수 없을 때만 메일이 큐에 쌓인다. 큐에 쌓인 메일은 큐처리 전용의 메일서버가 계속해서 전송을 시도하게 되며 정말로 갈 수 없는 메일이 아니라면 몇 시간 안에 메일은 보내지게 될 것이다. 한 개의 메일이 계속 전송이 불가능 할 때 최대로 큐에 저장될 수 있는 값은 5일이다. 그 후에는 큐처리 메일서버가 이 메일을 강제로 삭제하게 된다. 이 값은 sendmail.cf에 있으며 바꾸기를 원하면 직접 찾아 보기 바란다.

7.7 5만통의 이메일

5만통의 메일을 주고 받게 되면 sendmail이 아닌 다른 부분에서 문제가 발생한다. 우선 수신, 중계 전용의 sendmail이 serial하다는 것이 문제가 된다. sendmail은 메일을 수신하면 이 메일이 로칼에 있는 사용자에게 오는 메일인지 중계를 해야 하는 것인지 판단해야 한다. 중계를 해야 하는 것이라면 네임서버에게 헤더에 적힌 메일 주소값을 보내 실제 숫자 IP 주소로 바꾸어 줄 것을 요청한다. 그 동안 이 프로세스는 다른 메일은 받아들이지 않는다. 또다른 메일을 받아들이기 위해서는 자식 프로세스가 fork되어야 하고 64개의 메일 프로세스는 각각 네임서버에게 주소값을 의뢰하는 시간 지연이 있다. 네임서버가 신속히 반응하지 않으면 그 프로세스는 최대 5분까지 1개의 메일 때문에 대기해야 한다. 그 동안 계속 메일이 전송되면 네임서버의 지연으로 대기하는 프로세스는 제외한 프로세스들이 처리해야 하므로 여러개의 프로세스가 네임서버 지연으로 묶이게 되면 금방 64개의 자식 프로세스가 생성되고 그 이상 생성될 수 없으므로 나머지 전송 메일은 전송 시도조차 할수 없게 된다.

즉 1분에 70개의 메일이 전송되고 그 중에서 5개의 메일이 네임서버 지연으로 묶여 있게 될 때는 그 중에서 59개만 처리되고 대기 메일이 5개, 나머지 6개는 전송 실패를 하게 된다. 상대편 메일 서버는 일정시간이 지나야 메일을 재전송하게 되기 때문에 전송지연이 생기게 된다. 물론 메일을 도착 즉시 읽어야 하는 것은 아니지만 이런 지연으로 인해 중요한 업무를 처리할 수 없게 되면 심각한 일이 아닐 수 없다.

또한 중계를 요청한 메일 주소가 잘못되어 있을 경우에는 5분의 지연이 있게 된다. 그래서 평균적으로 목적지 주소가 잘못된 중계메일이 30%정도의 메일서버 수행 성능 손실을 가져올 수 있다. 서버를 빠른 하드웨어로 대체해도 이 문제는 해결되지 않는다.

정상적으로 전송될 수 있는 메일은 1M 네트웍 환경에서, 크기가 10k 이내라면 3초 안에 네임서버 조회, 상대편 서버와 접속, 사용자 인증, 메일 본문 전송의 모든 작업이 끝나게 된다. 100개의 메일을 300초 동안에 모두 전송 할 수 있음을 뜻한다. 좀 더 빠른 하드웨어와 네트웍에서 같은 메일을 2초 만에 전송할 수 있다면 200초가 걸린다. 그러나 그 중에서 1개의 메일이 잘못되었다면 이 메일이 5분(300초)간의 전송 지연을 유발하게 되고 총 걸린 시간은 600(300+300)분과 500(200+300)분의 차이가 된다. 9개의 정상 메일과 1개의 비정상 메일에 대해서 이야기 했지만 1000개의 메일에서 20개의 메일이 이상하다면 총 걸린 시간은 거의 차이가 나지 않는다(11960초와 12940초).

이 문제를 해결하고자 단순히 빠른 서버를 구입한다고 했을 때 하드웨어 업그레이드에 비해서 전송효율이 같은 비율로 올라가는 것은 아니다. 이 것은 마치 99미터를 1초만에 달리고 나머지 1미터를 10초에 달리는 선수와, 99미터를 2초에 달리고 나머지를 같은 10초에 달리는 100M 경주와 비슷하다. 평균적으로 빠르지 않으면 결과는 차이가 거의 없는 것이다. serial 방식의 메일 전송의 병목은 시스템의 수행 성능이 아니라 잘못된 메일이 점유하는 프로세싱 타임에 있다.

5만통의 메일을 처리하기 위해서는 이런 serial 문제를 해결해야 한다. 수신, 중계 메일은 메일을 받아들이는 순간에는 네임서버에 유효한 주소인지 의뢰하는 등의 지연을 가져올 수 있는 모든 행위를 하지 않도록 하고 무조건 메일을 큐에 쌓도록 하는 것이다. 큐에 쌓인 메일은 큐 처리 전용의 메일서버가 병렬적으로 메일을 전송할 수 있도록 만든다.

        /usr/sbin/sendmail -bd -ODeliveryMode=defer        /usr/sbin/sendmail -q1m -OMaxDaemonChildren=64

DeliveryMode는 4가지가 있다. 각각은 sendmail 책에 있으므로 관심있는 사용자는 찾아 보기 바란다. 그 중에서 defer 모드는 수신 메일을 그 즉시 직접 전송을 하지도 않을 뿐 아니라 받은 메일이 유효한 것인지 네임서버에 의뢰하는 등의 시간지연이 있을 수 있는 행위를 전혀 하지 않고 큐에 쌓기만 한다. -q1m란 큐처리 데몬은 1분 단위로 자식 프로세스를 만들고 이 프로세스가 처리할 메일이 있는지 확인하게 하는 것이다. 메일이 큐에 없을 때는 자식 프로세스가 뜬 후에 처리할 메일이 없음을 확인하고 스스로 죽게 된다. 만약 메일이 많이 수신되어 큐에 메일이 쌓이기 시작하면 1분에 한 번씩 큐 전용 메일서버가 자식 프로세스를 만들어 내고 이 들은 각자 메일 전송을 시작한다.

64개의 메일 프로세스가 뜨기까지는 64분이 걸리는데 처음 뜬 프로세스가 1분에 2개의 메일을 처리한다고 하면 평균적으로 64분 동안 64개의 프로세스가 각각 64개의 메일을 처리하는 것이다. 즉 수신 메일이 분당 32개의 메일을 큐에 쌓는 정도의 부하(하루 총 메일량 46080개)에서는 평균적으로 큐처리 메일이 32개 정도가 뜨게 된다. 수신 전용의 데몬은 평균 10개 이내로 떠있게 되는데 그 이유는 한 개의 메일을 단순히 큐에 쌓는 행위는 거의 시간이 걸리지 않기 때문에 뜨는 즉시 메일을 처리하고 죽게 되기 때문이다.

그러나 이런 수치상의 결론이 실제와는 일치하지 않는데 그 이유는 전송될 수 없는 메일이 큐에 쌓이게 되면서 전체적인 성능을 떨어뜨리기 때문이다. 64분 동안 주소가 잘못된 1개의 메일은 각각의 프로세스가 1번씩 전송을 시도하므로 총 64번 시도된다. 전송될 수 없는 메일은 한 개의 프로세스를 5분동안 잡아 놓고 있으므로 10개의 메일이 전송될 수 없도록 하는 효과가 있고 64개의 프로세스에 대해서는 640개의 메일을 보낼 수 없도록 하는 것이다. 하루 동안 계산하면 총 15000여통의 메일을 보내지 못하게 만드는 결과를 낳는다. 한 개의 메일은 5일 동안 살아 있으므로 이런 메일이 다른 방식으로 처리되지 않는다면 메일서버는 엄청난 비효율에 시달려야 한다. 나중에는 큐에는 거의 이런 악성 메일로만 가득차 있고 정작 바로 보낼 수 있는 메일이 이들 속에 묻혀 전송이 되지 못하고 그대로 쌓이는 것을 보게 될 것이다.

sendmail의 소스 배포본의 contrib 디렉토리에는 이 문제를 해결하는데 도움을 주는 프로그램 re-mqueue.pl이 있다. 이 프로그램은 perl로 만들어져 있으며 어떻게 사용하는지는 그 프로그램 안에 자세한 설명이 있다. perl과 관련한 사항은 설명하지 않는다. 소스를 보고 어떻게 활용할 것인지는 스스로 판단하기 바란다.

큐에 쌓이는 메일은 방금 받은 메일과 1시간 전에 받았지만 아직 처리 되지 못한 메일, 그리고 여러 시간 혹은 며칠 전에 받았지만 전송할 수 없는 메일들이 함께 들어 있다. 우선 1-2시간 안에 모든 메일은 큐 처리 데몬이 한 번씩 전송을 시도하기 때문에 1-2시간 전에 받았지만 아직 한 번도 전송이 시도된 적이 없는 메일은 없다고 가정한다. 그러므로 cron을 돌려서 2시간(64개의 데몬이 각각의 메일 전송을 2번 시도한 시간)안에 처리되지 못한 메일은 일차 큐에서 분리하여 다른 큐에 보내고 이 이차큐에 있는 메일을 처리하는 sendmail 데몬을 돌려서 그 메일들을 전송 하도록 한다. 우선 데몬을 다른 방식으로 띄운다.

        /usr/sbin/sendmail -bd -ODeliveryMode=defer        /usr/sbin/sendmail -q1m -OMaxDaemonChildren=64 \                           -OQueueDirectory=/var/spool/mqueue        /usr/sbin/sendmail -q10m -OMaxDaemonChildren=32 \                           -OQueueDirectory=/var/spool/mqueue2

/var/spool/mqueue2를 만들고 여기에는 2시간이 지난 메일을 처리하는 데몬을 최대 32개 까지 띄울 수 있도록 한다. 전송 지연이 있는 메일은 문제가 있는 것이므로 새로운 프로세스는 10분 정도의 시간 간격으로 뜨게 하면 별로 시스템 부담이 없게 될 것이다.

이제 mqueue의 일차 큐에서 mqueue2의 이차 큐로 메일을 보내는 것은 crontab을 사용해서 처리한다.

 # crontab -e 1-59/10 * * * * /usr/sbin/re-mqueue.pl /var/spool/mqueue /var/spool/mqueue2 7200

10분 단위로 mqueue에서 mqueue2로 2시간(7200초)가 지난 메일을 이동시킨다. 이제 일차 큐에는 전송 중이거나 전송을 기다리는 메일들만 남게 되고 악성메일(현재 보낼 수 없는 메일)은 제거되므로 효율이 눈에 띄게 증가하게 된다. redhat-5.2 이상의 설정이 이와 유사하지만 큐디렉토리간의 파일 이동을 위한 프로그램 설정이 되지 않았다. reahat-5.2 이상을 인스톨 했다면 re-mqueue.pl을 사용해 볼 것을 권한다.

7.8 10만통의 이메일

10만통의 메일을 하루에 처리하는 서버는 거의 엔터프라이즈급이라고 볼 수 있다. 하드웨어는 펜티엄II-dual, 메모리는 256M이상이 필요하고 네트웍은 1M급이 되어야 할 것이다. 리눅스의 사용자 계정은 현재 65536명까지 가능하지만 userid를 공유하는 서로 다른 사용자명을 사용할 수 있다. 또한 쉽게 사용자를 추가하고 제거하는 방법이 고려되어야 하고 사용자 인증 자체도 한 번의 메일을 위해서 64K를 뒤지는 비효율적인 방법이 아닌 다른 방법이 사용되어야 한다. 그러나 이 것은 이 글의 주제가 아니다. 10만통의 메일을 주고 받는 서버는 B급 도메인의 메일서버가 될 것인데 이 글에서는 계정 사용자보다는 주로 하위 클라이언트의 메일 중계를 중심으로 설명한다.

10만통의 메일을 처리하는 서버는 또다른 문제에 직면하게 된다. sendmail은 메일을 전송하면서 그 결과 메세지를 syslogd를 통해서 /var/log/maillog에 저장한다. /var/log/maillog에는 pop3를 사용하여 클라이언트가 메일을 가져가는 기록과 한 개의 메일이 전송될 때마다의 기록을 남긴다. maillog는 cron 이 작동하여 한 주마다 크기를 줄이게 되어 있다(/etc/logrotate.conf참조). 그 크기를 계산해 보자. 아래는 성공적으로 메일 중계가 이루어진 한 개의 메일에 대한 로그이다.


Apr xx xx:xx:xx mail sendmail[24543]: XAA24543: from=<xxx@xxx.com>, \ size=2909, class=0, pri=32909, nrcpts=1, \ msgid=<45672:phj650:99xxxx_23:45:57>, proto=SMTP, relay=[210.108.5.10]Apr xx xx:xx:xx mail sendmail[24543]: XAA24543: to=<xxxxx@xxxmail.net>, \ delay=00:00:00, mailer=esmtp, stat=queuedApr xx xx:xx:xx mail sendmail[26062]: XAA24543: to=<xxxxx@xxxmail.net>, \ claddr=<xxxxxxx@xxxinc.com> (504/504), delay=00:09:27, xdelay=00:00:01,\ mailer=esmtp, relay=r-xxxxx.xxxmail.net. [xxx.xxx.152.76], \ stat=Sent (AAA06884 Message accepted for delivery)

한 개의 정상적인 메일이 전송될 때 나오는 메세지는 560여 바이트가 된다. 이 것은 정상적으로 전송된 메일의 경우에만 그렇고 여러가지 이유에 의해서 전송되지 않는 메일은 하루에 여러번 전송 시도를 하기 때문에 여기에 더해서 그 때마다 에라 메세지가 쌓인다. 그러므로 평균적으로 한 개의 메일이 1k정도의 메세지를 뿌린다고 하자. 하루에 10만개의 메일을 전송하니까 로그는 100M가 된다. 일주일 동안 로그 파일의 크기는 700M로 커진다.

메일계정이 1000명이라고 할 때 각각의 사용자가 5분마다 한 번씩 메일을 체크한다. 한 번의 메일 체크 로그는 아래와 같다.


Apr xx xx:xx:15 mail ipop3d[22650]: port 110 service init from 210.xxx.x.xApr xx xx:xx:18 mail ipop3d[22650]: Login user=xxxxx host=[210.xxx.x.xx] nmsgs=7/7Apr xx xx:xx:24 mail ipop3d[22650]: Logout user=xxxxx host=[210.xxx.x.xx] nmsgs=0 ndele=7

한 번에 약 0.2k의 로그가 쌓인다. 윈도우에서 pop3을 사용해 메일을 가져가고 근무 시간 이후에는 컴퓨터를 끈다고 가정하면 하루에 8시간 근무하는 사용자는 192K의 로그를 만들어 내고, 1000명은 192M를, 일주일에는 1.3G의 로그를 생성시킨다. 메일 서버에 하드 디스크가 넉넉하다면 로그 파일의 크기가 커지더라도 하드 디스크 용량 때문에 문제가 생기지는 않을 것이다. 한 사용자당 5M씩 할당하면 메일을 저장할 영역으로 5G가 필요하고 로그를 위해서 2G이상이 필요하다(logrotate값이 4라면 8G.)

문제는 여기에 있지 않다. syslogd는 한 개의 파일, maillog를 열어 놓고 계속해서 로그 메세지를 쌓게 되는데 이 때 1M이상을 넘어가면 1개의 로그 메세지를 처리하기 위해서 시스템 자원을 10 퍼센트 이상 사용하며, 10M를 넘어가면 40 퍼센트 이상, 100M 메가를 넘어가면 거의 80퍼센트 이상의 시스템 자원을 사용하게 된다. 로그 파일이 커질 수록 점점 시스템 자원이 고갈 되어서 나중에는 메일 전송 보다는 로그 쓰기 작업에 모든 프로세싱 타임을 사용해야 한다. 아래의 예는 /usr 파일을 백업하기 위해 사용한 tar에서 부르는 gzip이 시스템 자원을 79.4 퍼센트를 사용하고 있음을 보여주는 예이다.


    x:xxxx  up 1 day,  2:05,  2 users,  load average: 0.22, 0.05, 0.02  49 processes: 46 sleeping, 3 running, 0 zombie, 0 stopped  CPU states: 78.6% user,  5.7% system,  0.0% nice, 15.8% idle  Mem:  192896K av, 189948K used,   2948K free, 283288K shrd,  12496K buff  Swap: 104416K av,      0K used, 104416K free                133384K cached    PID USER     PRI  NI  SIZE  RSS SHARE STAT  LIB %CPU %MEM   TIME COMMAND   4688 root      11   0   580  580   232 S       0 79.4  0.3   0:06 gzip   4687 root       4   0   532  532   432 R       0  3.9  0.2   0:00 tar   4689 root       2   0   708  708   548 R       0  0.9  0.3   0:00 top

지금 여러분의 시스템에서 top 명령을 사용해 보기 바란다. 시스템 자원을 10퍼센트 이상 사용하고 있는 프로세스가 있다면 필시 하드 디스크를 접근하고 있는 프로그램일 것이다. 컴퓨터에서 하드 디스크를 빈번하게 사용하는 작업이 여러개 떠 있다면 성능은 급격하게 하락하게 된다. 메일서버 뿐만 아니라 웹서버와 같은 데몬들의 성능이 느려 졌다면 필시 이런 문제가 개입되어 있을 확률이 높다.

배포본에 있는 로그 파일 처리는 하루에 10만개의 메일을 처리하기에는 역부족이다. 좀 더 효율적인 처리를 생각해 보자. 우선 아래 파일을 만든다.

  /etc/logrotate.mail  daily  size 100k  rotate 2  errors root  create  /var/log/maillog {    postrotate        /usr/bin/killall -HUP syslogd    endscript  }  /var/log/messages {    postrotate        /usr/bin/killall -HUP syslogd    endscript  }

maillog, messages 외에 /var/log에 있는 파일 중에서 시간 별로 그 크기가 1M 이상씩 증가하는 것이 있다면 여기에 첨가한다. 로그 파일은 가능한한 작게 유지하는 것이 좋다. 위에서 로그 파일의 크기가 100k 이상이 되면 무조건 작게 만들도록 설정을 했다. 로그를 줄일 때 이전 로그는 log.1이 되고 log.1은 log.2가 된다. 여기서 rotate를 2로 만들었기 때문에 log.2는 삭제되고 log.1은 log.2가 되며 log는 log.1이 되고 새 파일 log가 만들어져 syslogd가 여기에 쓰기를 한다. cron 작업은 다음과 같이 설정한다.

   #crontab -e   1-59/10 * * * * /usr/sbin/logrotate /etc/logrotate.mail

10분 마다 로그를 점검하여 그 크기를 줄인다. 이렇게 10분마다 로그처리를 위해 프로세싱 타임을 소모하더라도, 로그의 크기를 줄여서 얻는 효과가 더 크기 때문에 빈번한 로그 처리 작업에 드는 프로세싱 타임을 상쇄하고 남는다. 여러분의 웹서버가 오래 켜 놓으면 시간이 지날 수록 점점 느려지는 이상한 증상은 없는가? 이런 증상 때문에 메모리를 늘이거나 대용량의 하드웨어를 구입할 계획을 세우고 있었다면 /var/log/httpd 디렉토리를 점검해 보기를 바란다. access_log가 10M 이상은 아닌가?

10만통의 메일을 처리하는 서버에는 일차큐에 시간당 5천통의 메일이 쌓인다. 이제 64개의 메일 프로세스로는 감당을 할 수 없다. 한개의 메일은 2시간 동안 큐에 대기하게 되는데 2시간 동안 1만통의 메일이 쌓이게 되므로 그 동안에 각각의 메일을 처리 할 수 있을 확률이 낮아 진다. 이렇게 64개의 큐처리 메일 서버가 동작하면서 두시간 안에 모든 메일을 한 번씩이라도 전송 시도 하기가 어려워지는 상황에서 더욱 상황을 나쁘게 만드는 것은 5퍼센트(500개)악성메일이 프로세싱 타임을 늘게 만드는 것이다. 이 문제를 해결하기 위해서 다음과 같은 방법을 사용할 수 있다. 즉 최대 자식 프로세스 숫자를 높이고 각각 다른 제한을 가진 프로세스를 띄운다.

        /usr/sbin/sendmail -bd -ODeliveryMode=defer        /usr/sbin/sendmail -q10s -OQueueDirectory=/var/spool/mqueue \                           -OMaxDaemonChildren=96 \                           -OTimeout.initial=1m -OTimeout.connect=1m \                           -OTimeout.iconnect=1m -OTimeout.helo=1m \                           -OTimeout.mail=1m         /usr/sbin/sendmail -q1m -OQueueDirectory=/var/spool/mqueue \                           -OMaxDaemonChildren=16        /usr/sbin/sendmail -q10s -OQueueDirectory=/var/spool/mqueue2 \                           -OMaxDaemonChildren=32

mqueue2에는 2시간 안에 처리되지 못한 메일이 있으므로 악성메일이라고 판단하여 프로세스 수를 늘이지 않았다. 일차큐인 mqueue에는 두개의 각기 다른 데몬이 떠 있는데 첫번째 것은 96개까지 자식 프로세스를 만들어 낼 수 있고 두 번째 것은 16개 까지 만들어 낼 수 있다. 시스템에 생길 수 있는 총 메일서버 프로세스의 갯수는 수신 중계 전용(64+1), 일차큐(96+1, 16+1), 이차큐(32+1)로 212개이다. 이 때 쯤이면 각 경우에 맞추어 /etc/sendmail.cf의 변수를 조절해야 한다는 것은 스스로 알게 될 것이다. 지금은 아래와 같이 하면 된다.

  O QueueLA=256  O RefuseLA=256  O MaxDaemonChildren=64

mqueue에 실행되는 두 개의 각기 다른 큐전용 메일 프로세스의 차이는 무엇일까? 우선 한 개는 네임서버 그리고 상대편 메일서버와 교신하는 시간제한을 모두 1분으로 정하고 실행하도록 했다. RFC1123에 의하면 각각의 시간제한은 5분으로 설정하도록 되어 있지만 정상적인 메일은 거의 1분이 되기 전에 상대편과 교신하고 메일 본문 전송에 들어가게 되므로 초기 교신 과정에서 1분 이상의 시간 지연이 있으면 느린 네트웍에 있는 메일서버라고 판단하거나 상대편이 전송 불능 상태라고 간주하여 메일 전송을 중단하고 신속히 다음 메일을 처리하도록 한다.

이 프로세스는 10초 마다 한 개씩 자식을 만들게 되므로 메일이 쏟아져 들어오기 시작한 지 960초(16분)이 지나면 96개의 자식 프로세스가 전송이 되든 안되든 1분 안에 1개의 메일을 처리할 수 있으므로 한 시간에 들어오는 5000개의 메일과 거의 비슷한 양의 메일을 처리 할 수 있게 된다. 즉 각각의 메일을 큐에 쌓은 후에 반드시 한 번 이상의 전송 시도를 할 수 있다는 것이다. 악성 메일이 아니지만 상대편 메일서버의 속도가 느려서 1분 이상의 지연 후에 메일이 갈 수 있음에도 전송을 중단당한 메일이 쌓일 수 있는 문제가 있다. 이런 부적절한 처리를 해결하기 위해서 정상 대기 시간을 가진 16개의 메일 프로세스가 1분 대기 프로세스가 남겨둔 메일을 다시 전송 시도 하도록 하면 된다. 그 때문에 한 개의 큐 디렉토리를 대상으로 하는 두 개의 데몬을 띄운 것이다.

두 시간 동안 모든 메일은 최소한 한 번의 전송 시도를 할 수 있게 되며 그럼에도 전송되지 못하고 남겨진 악성 메일은 2차 큐로 이동된다. 일차큐는 항상 효율적으로 사용할 수 있다.

7.9 20만통의 메일

20만통의 메일을 한 개의 큐 디렉토리에 받게 되었을 때 시간당 약 1만통의 메일이 쌓인다. 일차큐에 있는 메일은 2시간 후에 이차큐로 옮겨지기 때문에 2시간 동안 약 2만통의 메일이 쌓이게 되고 메일 전송 효율이 70 퍼센트라면 일정 시점에 큐에 쌓이는 파일의 수는 약 6000개이다. 한 개의 메일은 dfxxxxxx라는 메일 본문과 qfxxxxxx라는 헤더 부분이 각각의 파일로 존재하므로 12000개의 파일이 한 개의 디렉토리에 생성되고 전송 중임을 나타내는 xfxxxxxx라는 파일이 최대 112개가 생긴다. 한 디렉토리에 12112개의 파일이 있다면 그 중에서 한 개의 파일을 열기 위해서는 허용하기 힘든 시간을 소모해야 한다. 지금 한 디렉토리에 10000개의 파일을 만들고 ls 라고 실행해 보기 바란다. 아마 10초 이상의 시간을 기다려야 겨우 그 결과를 볼 수 있을 것이다.

이제 큐에 쌓인 메일 파일의 갯수가 병목이 된다. 한 시간에 1만통의 메일이 쌓인다면 10분에 평균 1700개의 메일 즉 3400개의 실제 파일을 한 디렉토리에 생성하는 것이다. 물론 생성되는 순간에 즉시 전송 되는 경우가 많겠지만 여전히 프로세싱 타임은 한계를 넘어 가게 된다.

이를 위해서는 6개의 큐디렉토리를 새로 만들고 매 10분 마다 각각의 디렉토리에 파일을 옮겨서 전송을 시도하는 것이 좋다. 다음과 같이 할 수 있을 것이다.

        /usr/sbin/sendmail -bd -ODeliveryMode=defer        # 일차큐        /usr/sbin/sendmail -q10s -OQueueDirectory=/var/spool/mqueue \                           -OMaxDaemonChildren=32 \                           -OTimeout.initial=1m -OTimeout.connect=1m \                           -OTimeout.iconnect=1m -OTimeout.helo=1m \                           -OTimeout.mail=1m         /usr/sbin/sendmail -q1m -OQueueDirectory=/var/spool/mqueue \                           -OMaxDaemonChildren=4        # 이차 큐 1번        /usr/sbin/sendmail -q10s -OQueueDirectory=/var/spool/mqueue_1 \                           -OMaxDaemonChildren=16 \                           -OTimeout.initial=1m -OTimeout.connect=1m \                           -OTimeout.iconnect=1m -OTimeout.helo=1m \                           -OTimeout.mail=1m         /usr/sbin/sendmail -q1m -OQueueDirectory=/var/spool/mqueue_1 \                           -OMaxDaemonChildren=4        # 이차 큐 2,3,4,5번        ....        # 이차 큐 6번        /usr/sbin/sendmail -q10s -OQueueDirectory=/var/spool/mqueue_6 \                           -OMaxDaemonChildren=16 \                           -OTimeout.initial=1m -OTimeout.connect=1m \                           -OTimeout.iconnect=1m -OTimeout.helo=1m \                           -OTimeout.mail=1m         /usr/sbin/sendmail -q1m -OQueueDirectory=/var/spool/mqueue_6 \                           -OMaxDaemonChildren=4        # 3차 큐 : 2시간 지난 메일 처리        /usr/sbin/sendmail -q10s -OQueueDirectory=/var/spool/mqueue2 \                           -OMaxDaemonChildren=32

cron은 다음과 같이 구성할 수 있다.

 # crontab -e  0 * * * * /usr/sbin/re-mqueue.pl /var/spool/mqueue /var/spool/mqueue_1 600 10 * * * * /usr/sbin/re-mqueue.pl /var/spool/mqueue /var/spool/mqueue_2 600 20 * * * * /usr/sbin/re-mqueue.pl /var/spool/mqueue /var/spool/mqueue_3 600 30 * * * * /usr/sbin/re-mqueue.pl /var/spool/mqueue /var/spool/mqueue_4 600 40 * * * * /usr/sbin/re-mqueue.pl /var/spool/mqueue /var/spool/mqueue_5 600 50 * * * * /usr/sbin/re-mqueue.pl /var/spool/mqueue /var/spool/mqueue_6 600 1-50/10 * * * * /usr/sbin/re-mqueue.pl /var/spool/mqueue_1 /var/spool/mqueue2 7200 1-50/10 * * * * /usr/sbin/re-mqueue.pl /var/spool/mqueue_2 /var/spool/mqueue2 7200 1-50/10 * * * * /usr/sbin/re-mqueue.pl /var/spool/mqueue_3 /var/spool/mqueue2 7200 1-50/10 * * * * /usr/sbin/re-mqueue.pl /var/spool/mqueue_4 /var/spool/mqueue2 7200 1-50/10 * * * * /usr/sbin/re-mqueue.pl /var/spool/mqueue_5 /var/spool/mqueue2 7200 1-50/10 * * * * /usr/sbin/re-mqueue.pl /var/spool/mqueue_6 /var/spool/mqueue2 7200

각 디렉토리는 최대한 3000개의 정도의 메일을 보유하게 된다. 일차큐에서는 한 개의 메일에 대해서 최대 10분 동안 전송을 시도한 후에 전송에 실패했거나 미처 처리하지 못하고 남은 것은 각각 10분 단위로 다른 큐로 보내진다. 옮겨진 각 큐에서 2시간을 시도해 본 후에 전송이 되지 않았으면 6개의 이차큐에 남은 메일은 모두 mqueue2로 보내진다. 여기서 2시간 지난 후의 소위 악성 메일에 대한 또다른 처리는 고려하지 않았다. 모든 큐 디렉토리의 부하를 줄이기 위해서는 re-mqueue.pl을 사용하여 2,4,8시간 1,2,3,4일 단위의 큐를 따로 생성하는 것이 좋을 것이다.

위와 같이 했을 때 최대로 뜰 수 있는 메일 서버 프로세스의 갯 수는 268개이다. 이제 시스템에서 처리할 수 있는 프로세스 갯수와 열 수 있는 오픈 파일의 갯수가 문제가 된다. 기본적으로 한 개의 sendmail 프로그램이 기동하면서 여는 파일은 다음과 같다.

   0 -> /dev/null   1 -> /dev/null   2 -> /dev/null   3 -> /var/spool/mqueue/qfVAA14282   4 -> socket:[590]   5 -> /etc/mail/aliases.db   6 -> /etc/mail/access.db   7 -> /etc/mail/virtusertable.db   8 -> /etc/mail/domaintable.db   9 -> /etc/mail/genericstable.db  10 -> /etc/mail/mailertable.db  11 -> /var/spool/mqueue/xfVAA14282  12 -> /var/spool/mqueue/dfVAA14282  13 -> socket:[814754]

이 자료는 ps를 실행하고 현재 전송 중인 메일의 프로세스 번호(예를 들어 235번)에 따라 "ls -l /proc/235/fd" 라고 실행하면 볼 수 있다. 268개의 메일 프로세스가 각각 13개씩의 파일을 열면 모두 3484개의 파일이 열린다. 서버에는 메일 데몬만 떠 있는 것이 아니므로 실제로 열려 있게 되는 파일 수는 이 값을 훨씬 넘어 간다. 현재 리눅스에서 동시에 열 수 있는 파일의 디폴트값은 4096이다. 그 값은 아래의 파일에서 정의되어 있는데 이 것을 고치고 커널을 재컴파일 하면 변경 가능하다.

   /usr/src/linux/include/linux/fs.h     #define   NR_FILE    4096

같은 헤더 파일에 한 개의 프로세스가 열 수 있는 파일의 최대값(NR_OPEN)이 1024로 정해져 있는데 이 값은 변경하지 않아도 좋다. 물론 원하면 변경해도 된다. 그 결과는 각자 테스트 해 볼 것. NR_FILE과 NR_OPEN을 크게하면 주기억장치가 크지 않은(64M이하) 시스템의 경우에는 부팅도 불가능하게 되니 주의 할 것.

커널 컴파일이 귀찮다면 동적으로 이 값을 변경해 줄 수도 있다. /proc/sys/fs/file-max가 그 것인데 아래 명령으로 현재의 최대값과 할당된 값을 볼 수 있다.

   # cat /proc/sys/fs/file-max   4096   # cat /proc/sys/fs/file-nr   1143  274 4096   # cat /proc/sys/fs/inode-max   12288   # cat /proc/sys/fs/inode-nr   8340 34

이들 값의 의미와 읽는 방법은 /usr/src/linux/Documentation/proc.txt를 참고할 것. 커널 컴파일 없이 시스템에서 열 수 있는 최대값을 변경하기 위해서는 다음 명령을 사용하면 된다.

   echo 8192 >/proc/sys/fs/file-max   echo 24576 >/proc/sys/fs/inode-max

inode-max값은 file-max값의 3배수 이상으로 하라고 proc.txt에서 조언하고 있다. 항상 이렇게 하고 싶으면 /etc/rc.d/rc.local에 적어 두면 될 것이다.

메일서버가 200개 이상 뜨거나 웹서버가 동시에 400개 이상 떠있어야 하는 대형 사이트에서는 최대값을 크게 하는 것이 최종적인 해결책일 수 있다. 그러나 이렇게 최대값을 크게 하여 문제를 해결하기 이전에 가능한 현 상태에서 최적화에 우선 신경을 쓰는 것이 더 좋은 방법이다. 왜냐하면 최대값 증가는 더많은 메모리를 요구하고 더 많은 자원 할당을 요구하기 때문이다. 200개 이상의 sendmail을 위해서 쓸 수 있는 최적화 방법으로는 한 개의 sendmail이 여는 파일의 갯수를 줄이는 것이다. 위에서 보듯이 virtusertable.db등은 가상 도메인을 사용하지 않으면 전혀 필요가 없다. 그러나 사용하지 않는 빈 파일인 /etc/mail/virtusertable을 그대로 둔다면 sendmail이 기동하면서 db파일을 만들게 되고 모든 프로세스가 이 파일을 열어 두게 된다. 그러므로 사용하지 않는 파일을 아예 없애버리면 sendmail이 db파일을 만들지 않고, 그에 따라 각 프로세스는 이 파일을 위해 파일 핸들을 할당하지 않으니까 열린 파일 갯수가 줄어든다. 한 개의 열린 파일의 갯수를 줄이면 268개의 파일을 닫는 효과가 있다. 사용하지 않는 domaintable, access, genericsable, mailertable 5개의 파일을 지워버리면 1340개의 열린 파일 수를 절약할 수 있으며 한 프로세스의 열린 파일 갯수가 적어지면 메일을 체크할 때 이 파일을 뒤지지 않아도 되기 때문에 그 만큼 프로세싱 타임이 줄어 들 것이다.

큐에 쌓인 메일을 처리하는 sendmail 프로세스는 메일을 보내기 위해서 네임서버와 교신해야 한다. 메일 서버가 서브네트웍 바깥에 있다면 한 개의 메일을 보내기 위해서 외부까지 교신을 해야 하기 때문에 시간이 많이 걸린다. 한 시간에 1만번의 조회를 시도하면 아마 외부 메일서버도 견디지 못하고 다운될 확률이 있다. 또한 네트웍 자원은 네임서버와의 교신에 모두 소모되고 다른 사람들이 외부로 나가거나 들어오는 것초차 힘들게 된다. 네임서버가 로컬 네트웍의 다른 서버에 있어도 마찬가지이다. 내부 네트웍은 거의 네임서버 접속에 이용되므로 회사 전산망이 마비되고 네임서비스를 하는 서버가 다운된다. 실제로 필자가 내부 네트웍의 다른 서버에 네임서버를 두고 메일서버가 네임 조회를 이 서버 쪽으로 하도록 했었는데 네임서버에 메모리가 고갈되어 named, httpd, cron등이 죽었다. 그 후에 데몬이 죽은 것을 알고 named와 httpd만 살리고 cron이 죽은 것은 알지 못하고 재실행하지 않았더니 cron으로 돌던 log파일 처리 프로그램이 동작하지 않아 로그 파일이 커지는 바람에 시스템이 움직이지 않을 정도로 부하가 걸린 적이 있었다. 필자는 외부에 의한 해킹으로 의심하고 보안관련 문서를 뒤적이느라고 시간을 소비해야 했다. 이렇게 한 개의 메일서버가 연속적으로 다른 서버들에게 영향을 미칠 수 있음을 염두에 두어야 할 것이다.

그러므로 가능하면 메일서버 자체에 메일 전송을 위한 네임서버를 띄우는 것이 좋다. 이 때의 네임서버는 단순한 캐싱만을 하는 네임서버만으로 족하다. 처음에는 네임서버 자체가 외부로 조회를 해야 하기 때문에 시간이 걸리겠지만 계속 사용한다면 중복되는 IP는 같은 메모리 안에서 처리가 가능하기 때문에 외부에 영향을 주지 않으며, 로컬 네트웍의 tcp/ip 자원도 소모시키지 않고 신속한 조회가 이루어 질 수 있다. 캐싱만 하는 네임서버는 간단히 다음과 같이 만들 수 있다.


  /etc/named.conf    options {        directory "/var/named";        check-names master warn;         datasize 20M;  };  zone "." IN {        type hint;        file "root.hint";  };  zone "localhost" IN {        type master;        file "localhost";        check-names fail;        allow-update { none; };        allow-transfer { any; };  };  /var/named/root.hint    #dig >/var/named/root.hint  /var/named/localhost    @  IN  SOA  @ root (                  42              ; serial (d. adams)                  3H              ; refresh                  15M             ; retry                  1W              ; expiry                  1D )            ; minimum       NS     @    1   A     127.0.0.1  /etc/resolv.conf   nameserver 127.0.0.1

이렇게 최소한의 네임서버만으로 네트웍 자원의 낭비를 막을 수 있으므로 20만개의 메일을 처리하기 위해서는 회사내의 공식 네임서버가 있다고 해도 독립적으로 메일서버에 설치하는 것이 좋을 것이다.

7.10 100만통의 이메일 처리를 위하여

소규모 처리를 담당하는 서버에서 대규모 서버로 진화하기 위해서 어떤 것이 필요하고 그 과정에서 중요한 단계마다의 병목은 무었인지 그리고 이 것을 어떻게 해결할 수 있는지에 대해서 알아 보았다. 한 개의 서비스가 커지면 가능한 옵션을 모두 다시 검토하여야하고, 하드웨어 자원을 추가로 요구하며, 로그 파일 처리등의 관련 프로그램의 효율성이 증대되어야 하고, 네임서버와 같은 또다른 서비스까지 자신에게 맞추어 줄 것을 요구한다. 또한 한 개의 서버가 문제를 일으키면 주변의 다른 서버까지 문제가 파급된다는 것도 보았다. tcpdump같이 다른 컴퓨터 사이의 동작을 감시하는 프로그램에 대한 사용법도 익혀 줄것을 부탁한다. 이모두는 서로 보완적이므로 한 개의 서비스를 위해서 그 프로그램만을 들여다 보아서는 안되고 전체를 볼 줄 알아야 할 것이다.

이 글에서는 TCP/IP 포트 재지정에 의한 분산, 메일 전송 정보가 들어 있는 qf* 파일을 분석하여 각각의 전송 실패 이유에 따른 큐디렉토리 분산, 전송할 수 없는 메일에 대한 처리, sendmail.cf의 각각의 옵션에 대한 관찰등은 하지 않았다. 관심있는 독자들은 sendmail 책과 /var/spool/mqueue/qf* 파일에 대해 조사해 보기 바란다.

100만통의 메일을 하루에 처리할 수 있는 초대규모 메일서버는 한 개의 서버로는 한계가 있다. 각각 20만통의 메일을 처리하는 5대의 메일서버가 필요하게 될 것이다. 문제는 이들을 묶어서 단일한 서버로 보이게 하는 방법이 필요하게 된다. 수백대의 서버를 묶어 놓고 IP 라운드로빈 방법을 사용할 수 있다. IP 라운드 로빈은 1.2.3.4,1.2.3.5가 같은 a.b.c.d 도메인명을 가지도록 하고 네임서버 조회 때마다 한 번씩 다른 숫자 IP를 넘겨 주는 방법을 사용한다.

필자가 최종적인 해결책으로 보고 있는 것은 IP-tunneling을 사용한 리눅스 virtual-sever(vs)를 사용하는 것이다. 이 방법은 한 개의 frond-end가 각각의 접속을 받아서 실제 서비스를 하는 back-end 서버에게 접속을 넘겨 주는 것이다. 한 번 접속이 이루어 지고 나서는 client와 back-end간에 직접 접속이 이루어지게 되므로 frond-end는 바로 다음 접속을 처리할 수 있다. vs 리눅스를 개발하는 팀에 의하면 한 대의 frond-end가 1G 급의 부하를 처리할 수 있었다고 한다. 관심있는 사람은 vs홈페이지(http://proxy.iinchina.net/ wensong/ippfvs/)를 방문해 보기 바란다. 최근 외국의 개발업체에서 이 기능을 특화시킨 분산 서버를 제작해서 상업화 시켰다는 이야기도 들은 바가 있다.

이미 리눅스의 메일서버로서의 기능은 신뢰할 만하고 추가 비용이 전혀 필요 없다. 사용자 수 추가에 따라 비싼 라이센스 비용을 지불해야 하는 상용 서버가 설 자리가 없어 지고 있다. 여기에 더해서 사용자 인증, 삭제, 추가 기능을 간편하게 할 수 있는 프로그램이 개발되어 100만통의 메일을 처리할 수 있는 분산 서버와 결합하게 되면 인터넷의 거의 모든 메일서버는 리눅스가 점령하게 될 것이다.

7.11 이 달의 숙제

메일서버와 마찬가지로 웹서버도 많은 히트수를 기록하게 되면 로그 파일이 커질 것이다. /var/log/httpd에 가보았더니 access_log가 30M였다. sendmail을 위해서 설명한 logrotate.conf와 같이 설정 파일을 만들고 하는 것이 시간이 걸려서 잠시 미루고 일단 수동으로 로그 파일을 빨리 정리하고 싶다. 어떻게 하면 될까? 참고로 "rm access_log"라고 해도 로그 파일이 줄어 들지는 않는다. 이건 또 왜 그런 것일까?


다음 이전 차례

'OS > LINUX' 카테고리의 다른 글

한글 putty  (0) 2004.08.13
[펌] temp..정리하기전..  (0) 2004.08.11
[허접] 내부 IP MSN 차단 .... ㅡㅡ  (0) 2004.07.07
[펌] 프로세스죽이기  (0) 2004.07.07
간단하게 ftp 에 접속하는법  (0) 2004.07.06
Posted by tornado
|

####################################
#
# MSN 차단 목록  ...
#
####################################


iptables -t nat -A PREROUTING -s 192.168.1.190 -p tcp --dport 1863 -j DROP
iptables -t nat -A PREROUTING -s 192.168.1.190 -d 207.46.110.0/24 -p tcp --dport 1:65535  -j DROP
iptables -t nat -A PREROUTING -s 192.168.1.190 -p tcp -d 207.46.104.20 --dport 1:65535 -j DROP
iptables -t nat -A PREROUTING -s 192.168.1.190 -p tcp -d 61.100.182.0/25 --dport 1:65535 -j DROP



한줄로 막기...



# 65.54.131.249 <-- https 로  id 인증하는 서버

##### ---- 차단 일 : 2004-07-07 ---- ##########
iptables -t nat -A PREROUTING -s 192.168.1.190 -p tcp -d 65.54.131.249 --dport 443 -j DROP

'OS > LINUX' 카테고리의 다른 글

[펌] temp..정리하기전..  (0) 2004.08.11
[펌] 20만통 메일과 sendmail  (0) 2004.07.09
[펌] 프로세스죽이기  (0) 2004.07.07
간단하게 ftp 에 접속하는법  (0) 2004.07.06
[펌] rsync 의 미러링 기능을 이용한 백업  (0) 2004.07.05
Posted by tornado
|

프로세스 죽이는 몇 가지 방법

phoenix라는 자주 먹통이 되버리는 X-( 프로그램을 예로 들어서 설명하겠다.
phoenix는 ps 해보면 알겠지만 killall죽이기에는 명령어가 너무 길다
ddt       8469  8463  7 20:29 ?        00:01:03 /home/ddt/phoenix/phoenix-bin ddt       8471  8469  0 20:29 ?        00:00:00 /home/ddt/phoenix/phoenix-bin 
그럼 어떻게 죽이는지 알아보자.

초보


$ ps -ef |grep phoenix (눈으로 pid를 확인한다) $ kill pid 

중수


$ ps x |grep phoenix | awk '{print $1}' | xargs kill 

고수


$ pkill phoenix 

    물론 고수들이 이렇게 하는지 확인은 되지 않았다 ;)

초고수(?)

'killall phoenix-bin' 을 단축키로 등록

폐인(?)


# reboot ! 

컴맹(?)


Cool booting!
(본체의 Reset 버튼 즉시 누름.)

직장상사


'이봐, 좀비가 생겼으니 찾아서 죽이게!'
Posted by tornado
|

어디서 보긴 했는데 어디인지 모름 ㅡㅡ



간단하게 shell 에서 ftp 에 접근할 때 사용하기 좋음..


/tmp 디렉토리에 test.tar.gz 파일이 있을 경우 아래와 같은 스크립트를

만들어 두고 cron 에 등록하면 시간에 맞춰 ftp 에 업로드 됨.





#!/bin/bash


USERNAME=gildong
PASSWORD=1234
HOST=111.111.111.111

PUT_FILES=test.tar.gz


{
        echo user $USERNAME $PASSWORD
        echo bi
        echo prompt
        echo cd log_backup
        echo lcd /tmp
        echo put $FILE_NAME
        echo bye
} | ftp -n -v $HOST > /tmp/log


 

Posted by tornado
|

rsync 의 미러링 기능을 이용한 백업


/***************************************************************/
* rsync 백업 서버 구축에 대해서


rsync 는 원격에서 미러링 서버를 구축할때 사용되는 유틸이다.
옵션에 따라 파일의 수정 날짜를 비교해서 수정된 파일만 업데이트 할 수있기 때문에 처음 한 번만 풀 백업 해두면 그 다음 부턴 아주 빠른 속도로 업데이트 할 수있다.

서버에는 REDHAT 8.0 또는 REDHAT 7.x, REDHAT 9 가 설치되어있고,
백업 서버 역시 REDHAT8.0 이 설치되어있다.

우선 백업 계획은 서버들로부터 새벽 4시경에 1차 백업서버로 매일 백업을 받고,
1주 단위로 1차 백업 서버의 데이터를 일요일 새벽 5시에 2차 백업 서버로 전송받는다.

일단 백업 대상이 되는 서버들에 rsync 가 설치되어 있는지 확인해보고 없으면 rpm 바이너리를 받아서 설치한다.

]#rpm -qa rsync
rsync-2.5.7-0.8

참고로 rsync 에 최근 보안 결함이 발견 되었으니 반드시 최근 버전을 받아서 설치하도록...

http://updates.redhat.com/8.0/en/os/i386/rsync-2.5.7-0.8.i386.rpm

]#rpm -Uvh rsync-2.5.7-0.8.i386.rpm

rsync 는 ssh 를 이용한 방법과 873포트를 이용한 접속 방법이 있다.
나는 873 포트를 이용해서 xinetd 데몬으로 동작하도록 설정한다.
초기에는 default 로 xinetd 에서 rsync 가 disable 로 설정되어있으므로
아래와 같이 열어준다.
]#vi /etc/xinetd.d/

# default: off
# description: The rsync server is a good addition to am ftp server, as it \
# allows crc checksumming etc.
service rsync
{
disable = no => (요부분을 yes 로...)
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}


rsync 의 설정파일은 /etc/rsyncd.conf 인데 rsync 설치후에도 존재하지 않는다. 긴장하지 말고 생성해주면 된다.
백업할 대상은 /home 파티션과 /usr/local/mysql/data 디렉토리, 그리고 메일,proftp 등의 설정이 들어있는 /etc 전체로 했다.

]#vi /etc/rsyncd.conf
[www] =>rsync 에서 사용할 alias name
path = /home =>실제 디렉토리 절대 경로
comment = webservice-dir
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow = ***.***.***.*** =>접근을 허용할 백업 서버 ip
max connections = 1
timeout = 300

[mysql]
path = /usr/local/mysql/data
comment = mysqldata-dir
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow = ***.***.***.***
max connections = 1
timeout = 300

[etc]
path = /etc
comment = config-dir
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow = ***.***.***.***
max connections = 1
timeout = 300

이렇게 해서 저장하면 설정은 끝났다.

슈퍼 데몬을 재시작하고
]#/etc/rc.d/init.d/xinetd restart

포트가 열려있는지 netstat 이나 telnet 명령으로 873포트를 확인해본다.
]#telnet localhost 873
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
@RSYNCD: 26


]#netstat -na | grep LISTEN
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN
unix 2 [ ACC ] STREAM LISTENING 1285 /tmp/mysql.sock

873 포트가 보인다면 설정은 OK

이제 백업 당할 서버들의 설정은 끝났고, 1차 백업 서버를 세팅할 차례다.

백업할 서버 역시 rsync 가 설치 되어있는지 확인해보고 없으면 설치한다.

1차 백업 서버에 접속한 상태로 아까 세팅해 놓은 백업 당할 서버에 rsync

포트로 접속이 가능한지 테스트 해본다.
]#telnet ***.***.***.*** 873
Trying 127.0.0.1...
Connected to ***.***.***.***.
Escape character is '^]'.
@RSYNCD: 26

이렇게 대기 상태면 OK

만약 connect refuse 가 나오면 백업당할 서버의 세팅을 처음부터 다시 살펴본다.


이제 백업 과정을 기록할 로그 파일을 수동으로 만들것이다.

적당한 디렉토리( 예를 들면 /home/rsync-log)를 생성하고 파일을 기록할 수 있도록 권한을 조정한다.(좀 나은 방법이 있을텐데....허접한 관계로...)

cron 에 등록해서 하루에 1번 새벽 네시에 백업하기로 했으므로 우선
/etc/crontab 을 수정한다.

]#vi /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
01 4 * * * root run-parts /etc/cron.daily
00 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

/etc/cron.daily 디렉토리에 있는 놈들을 매일 새벽 4시1분에 실행 하도록 되었다.

이제 /etc/cron.daily 에 백업 스크립트만 생성하면 된다.

]#vi /etc/cron.daily/backup.sh
#!/bin/bash
startbackup=`date +%Y%m%d%H%M%S`
touch /home/rsync-log/$startbackup.start

rsync -avz ***.***.***.***::www /home/svr_92/www/
rsync -avz ***.***.***.***::mysql /home/svr_92/mysql/
rsync -avz ***.***.***.***::etc /home/svr_92/etc/

endbackup=`date +%Y%m%d%H%M%S`
touch /home/rsync-log/$endbackup.end

위의 설정은 백업을 시작할때 날짜를 이름으로 가지는 빈파일을 /home/rsync-log/ 에 생성하고 백업이 끝난후에 다시 같은 위치에 시간이 기록된 파일을 생성시켜서 나중에 백업에 걸린 시간을 비교할 수 있게 되어 있다.

-a는 아카이브 모드. 심볼릭 링크, 속성, 퍼미션, 소유권 등 보존
-v 전송 상태를 보여줌
-z 전송시 압축을 함.

rsync 에는 이 외에도 옵션이 많으므로 자세히 살펴볼 필요가 있다..!!


여기까지 해서 1차 백업 서버의 세팅이 끝났고, 이제 2차 백업 서버를 세팅할텐데........ 똑같으니까 생략한다.

참고로 내가 관리하는 20대의 서버에 40 GByte 정도의 데이터를 전송받는데

초기에 8시간 정도가 걸렸고, 그 이후 매일 실시되는 백업은 업데이트 과정이라서 매 5분 정도에 백업이 끝나는 것을 아까 백업하면서 기록한 rsync-log 로 확인 했다. 아마도 rsync 가 압축전송을 해서 이런 속도가 나오는것 같음..

5분만에 20대의 백업이 완료되다니....!!

/***********************************************************************/


* http://manblog.intizen.com/kjh0523/913370



 

'OS > LINUX' 카테고리의 다른 글

[펌] 프로세스죽이기  (0) 2004.07.07
간단하게 ftp 에 접속하는법  (0) 2004.07.06
[펌] 웹서버 동기화를 위한 rsync의 사용  (0) 2004.07.05
리눅스 서비스에 있던것들 종류..  (0) 2004.07.05
proftpd 로그 파일 지정  (0) 2004.07.05
Posted by tornado
|
1 장 : rsync의 소개와 설치

 
일반적으로 웹서비스를 시작하는 회사에서 사용자가 늘어감에 따라서 웹서버의 증설을 하는 경우 시스템 관리자가 첫번째로 맞닥뜨리는 문제중에 하나가, 각각의 웹서버에 있는 정보의 동기화입니다.

웹서버가 한대일경우는 이러한 문제로 고민할 필요가 없겠지만, 트래픽증가로 웹서버를 증설했을경우 각각의 웹서버로 매일 업데이트되는 정보를 일일이 올려준다면 정말 귀찮은 작업이 되겠죠?

그렇지만 걱정하지 마세요. 리눅스의 rsync가 이 문제를 간단하게 해결해 드릴테니까요.

눈치 빠른 분들은 rsync가 무엇인지 앞의 말들로 어느정도 이해 하셨으리라 봅니다. 간단하게 rsync는 여러대의 서버들이 동일한 정보를 가질수 있도록 해주는 서버동기화 프로그램이라고 할수있습니다.

NT를 접해보신 분들이라면 미러링(mirroring)에 대해서 아실겁니다. 로컬에서는 특정하드디스크나 파티션의 정보를 다른 하드디스크나 파티션으로 동일하게 복제해주는것이죠.

미러링의 개념은 NT에만 국한된것은 아닙니다. NT에서 자체제공하는 옵션으로 미러링을 제공하듯이 리눅스에서도 rsync나 기타 다른 프로그램으로 미러링을 지원하죠.

물론 rsync는 로컬에서 로컬로는 미러링을 할수없지만, 로컬과 원격지의 미러링을 지원합니다. 보통 anonymous ftp서버나 웹서버의 미러링에 많이 쓰이죠.

rsync의 개념이 대강 잡히시죠?

그럼 이제부터 rsync라는 녀석을 어떻게 설정해야할지, 또 어떻게 써야할지에 대하여 설명하겠습니다.

일반적으로 redhat배포판 6.2에는 rsync-2.4.1-2 버젼이, 또 7.1-kr에는 rsync-2.4.6-2버젼이 기본으로 깔려있습니다.

만약 없으시다면, http://rsync.samba.org/ftp/rsync/ 에서 최신판을 받아서 설치하세요.

우선 받으시면 컴파일을 하셔야겠죠?

 

 

# tar xvfz rsync-2.4.6.tar.gz

# ./configure

# make

# make install

 



위와같이 특정옵션 추가없이 간단하게 컴파일하셔도 됩니다. ( 물론 개인취향에 따라서 디렉토리위치같은 옵션을 정해주셔도되구요.)


rsync가 사용하는 프로토콜은 rsh나 ssh를 사용합니다.

또한 이것을 사용하길 원치 않는다면 873포트를 이용할수도 있죠.

rysnc가 rsh나ssh를 사용하느냐, 아니면 873포트를 사용하느냐를 결정하는것에 따라 설정내용이 약간 틀려집니다.



 

2 장 : rsync 설정과 사용 (873포트)

 
873포트를 사용한다면 /etc/inetd.conf(redhat7.0이전일경우)나 /etc/xinetd.d/rsync(redhat 7.0이후일경우)의 내용을 수정해주어야합니다.

또한 /etc/rsyncd.conf라는 파일을 만들어주어야하죠.

예) /etc/inetd.conf 수정내용 (redhat7.0이전일경우)

 

 

rsync stream tcp nowait root /usr/bin/rsync rsyncd --daemon

 



예) /etc/xinetd.d/rsync 수정내용 (redhat 7.0이후일경우)

 


 

service rsync
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}

 



보시다시피 실제적인 수정내용은 --daemon이죠.

rsync를 daemon모드로 작동시키겠다는 뜻입니다.

결국 rsync는 inetd나 xinetd에서 데몬모드로 작동하게 되죠. ( netstat -tap 해보시면 쉽게 확인하실수있습니다. ^^)

아! 그리고 파일수정후에는 /etc/rc.d/init.d/inetd or xinetd를 restart해주는거 잊지마시구요.

자 이제 /etc/rsyncd.conf파일을 만들어 주어야하겠죠?

예) /etc/rsyncd.conf

 


 

[www]
path = /home/www
comment = webserver1
uid = nobody
gid = nobody
use chroot = yes
read only = yes
hosts allow = 203.255.112.34
max connections = 3
timeout 600

 



생각보다 간단하죠?

그럼 위의 내용에대한 설명을 드리겠습니다.

 


 

[www] 서비스명

path 서비스할 디렉토리위치

comment 설명

uid 파일전송하는 사용자의 id. 기본값은 nobody

gid 파일전송하는 사용자의 그룹 id. 기본값은 nobody

use chroot 위의 path를 root 디렉토리로 사용. (보안상 필요합니다.)

read only 읽기전용 ( 클라이언트에서 서버로 올리는 경우에는 read only= no 로 설정을 해야됩니다. )

hosts allow 호스트별 접속허용. 기본값은 all host입니다. 접근을 허용할 호스트의 ip를 적어주시면됩니다.

max connections 동시접속자수.

timeout 클라이언트에서 접근시 타임아웃시간.
              anonymous 로 운영하는 경우 설정을 해야 클라이언트가 죽었을 때 서버에서 접속을 해체할 수 있습니다.

 



이렇게해서 873포트를 쓰는 rsync서버의 설정은 끝났습니다.

그럼 rsync클라이언트에서 자료를 가져오는 방법을 아셔야겠죠?

우선 위에 rsync서버설정이 된것을 webserver1(www1.yahoo.co.kr)이라고 하고, 그 서버로부터 정보를 가져와 동기화 시킬 서버를 webserver2(www2.yahoo.co.kr)라고 합시다.

webserver2의 /home/www로 webserver1의 /home/www내용을 가져오려구 한다면, 이렇게 하시면 됩니다.

예) webserver2에서

 


 

# rsync -avz www1.yahoo.co.kr::/home/www /home/www

 



간단하죠? -avz옵션은 아래와 같습니다.

 


 

-a는 archive mode (심볼릭 링크, 속성, 퍼미션, 소유권 등 보존).

-v verbose(상세하게 보여움).

-z compress(전송시 압축을 함).

 



휴~ 여기까지가 rsync서버가 873포트로 사용될경우 설정과 사용법입니다.
 



 

3 장 : rsync 설정과 사용 (rsh,ssh)

 
그럼 이제 두번째로 rsync서버가 rsh,ssh를 사용할 경우를 알아볼까요?

실제로 앞의 설정내용에서 크게 틀린점은 없습니다.

우선 inetd나 xinetd를 수정하지 않으셔도 되고, /etc/rsyncd.conf를 만들어 주지 않으셔도 되니까요.

결국 설명할 내용은 클라이언트에서의 사용법 밖에 없겠네요.

그럼 아까와 같이 rsync서버설정이 된것을 webserver1(www1.yahoo.co.kr)이라고 하고, 그 서버로부터 정보를 가져와 동기화 시킬 서버를 webserver2(www2.yahoo.co.kr)라고 합니다.

webserver2의 /home/www로 webserver1의 /home/www내용을 가져오려구 한다면, 이렇게 하시면 됩니다.

예) webserver2에서

 

 

# rsync -avz -e ssh www1.yahoo.co.kr:/home/www /home/www

 



-e 옵션은 rsh나 ssh를 사용할때 써주는 옵션입니다. ( rsh를 사용하실려면 -e rsh하시면 되겠죠.)

또 아까 위에서 873포트를 사용할때 :: 라고 했던거 기억하시죠?

rsh나 ssh를 사용할때는 : 한개만 써주시면됩니다.

ssh를 사용할경우 암호를 입력해야하는데, 이것은 암호파일을 따로 만들어서 암호를 직접입력하는 수고를 줄일수있습니다.

(--password-file 옵션을 사용하시면 암호파일의 위치를 지정해줄수있습니다.)

자 이렇게해서 rsync의 설정법과 사용법에 관한 애기가 끝났습니다.

실제로 웹서버간의 데이타동기화를 할경우는 아까 rsync클라이언트에서 썼던 명령을 cron으로 돌리셔야 합니다.

그래야 주기적으로 데이타동기화를 할수있겠죠.

cron에 대한 것은 테마리눅스에 강좌로 올라와 있으니 참고 바랍니다.(http://www.linux.co.kr/theme/index1.html?ca=200107)

Posted by tornado
|
  • amanda : 백업 클라이언트인 amanda 데몬
  • amandaidx : amanda 서버의 패키지 서비스 중 하나인 amandaidx 데몬
  • amd : auto mount daemon, 시스템의 요청이 있는 경우에 자동으로 장치와 NFS 호스트를 마운트해 주는 데몬. 네트워크의 설정이 잘못된 경우에는 부팅을 하는 도중에 문제를 일으킬수 있으므로 처음에서 꺼두는 것이 좋다.
  • amidxtape : amand 서버에 패키지 서비스 중 하나인 amidxtape 데몬
  • anacron : 시간에 따라 지정한 프로그램을 정기적으로 실행하는 데몬. cron과 같은 기능을 하지만 계속 켜두지 않는 컴터에서 사요하는 데몬
  • apmd : 베터리 상태를 감시하고 syslog(8)에 기록하며 시스템을 끄기도 하는 데몬
  • arpwatch : 이더넷 카드와 ip 어드레스의 설정 관계를 유지하는 데몬
  • atd : 특정 시간 또는 시스템 부하가 적을때 지정된 명령을 실행시키는 데몬
  • autofs : 파일 시스템을 사용하고자 할때 자동으로 마운트 시켜주는 데몬
  • chargen : chargen의 TCP 버전 서버
  • chargen-upd : chargen의 UDP 버전 서버
  • ciped : ip address를 암호화하는 CIPE 데몬
  • crond : cron을 실행시키는 데몬, cron은 지정한 프로그램을 특정 시간에 주기적으로 실행시키는 유닉스 표준 프로그램
  • daytime : daytime의 TCP 버전 서버. daytime은 클라이언트의 질의에 응답하여 아스키 형태로 현재 시간과 날짜를 출력하는 데몬. TCP 포트 13을 사용
  • daytime-udp : daytime의 UDP 버전 서버. UDP포트 13을 사용
  • dhcpd : Dynamic host configuration protocol server daemon. 동적 호스트 제어 프로토콜 서버 데몬. BOOTP와 DHCP가 포함된 데몬으로 클라이언트들이 부팅할때 자동으로 동적 IP 어드레스와 네트워크 정보를 가질수 있게 해줌.
  • echo : echo 의 TCP 버전 서버
  • echo-udp : echo 의 UDP 버전 서버
  • finger : finger 리퀘스트에 응답하는 서버. finger는 사용자에 대한 로그인 네임, 디렉토리, 쉘과 최종 로그인 시간에 대한 정보를 볼수 있게 하는 프로토콜
  • gated : gated(라우팅 데몬) 을 시작하거나 종료
  • gpm : MC(midnight command) 와 같은 텍스트 기반 리눅스용 애플리케이션에서 마우스를 쓸수 있게 해주는 데몬. 콘솔에서 마우스를 이용한 팝업 메뉴와 복사/ 붙이기 기능도 지원
  • httpd : 웹 서비스를 위한 아파치 데몬. html파일과 cgi를 사용가능하게 함
  • identd : 특별한 TCP 연결에서 사용자의 신원을 결정해 주는 데몬. TCP 포트번호를 주면 연결된 서버 시스템 소유자를 확인할수 있는 문자열을 돌려줌
  • imap : 원격 사용자가 imap 클라이언트(Pine, netscape communicator)를 이용하여 자신의 메일에 접근할수 있게 하는 서비스
  • imaps : 원격 사용자가 SSL을 지원하는 imap 클라이언트(netscape communicator, fetchmail 등)를 이용하여 자신의 메일에 접근할수 있게 하는 서비스
  • innd : 유즈넷 뉴스 서버를 이용하여 지역 뉴스 서버를 설정할수 있는 데몬
  • ipchains : 패킷 필터링 파이어월을 자동으로 실행하는 데몬
  • ipop2 : 원격 사용자가 pop2 클라이언트를 이용하여 메일에 접근할수 있게 하는 서비스
  • ipop3 : 원격 사용자가 pop3 클라이언트를 이용하여 메일에 접근할수 있게 하는 서비스
  • irda : irda 가 정상적으로 동작하도록 해 주는 데몬
  • keytable : /etc/sysconfig/keytable로 키보드 유형을 변환할수 있게 하는 서비스. 한텀에서 kbdconfig 프로그램을 실행하여 키보드 유형을 변환할수 있다. 대부분의 시스템에서 keytable 데몬은 실행시켜 두어야 한다.
  • kudzu : 부팅시 새롭게 추가된 하드웨어를 설정할 수 있게 hardware probe를 실행시키는 데몬
  • linuxconf : 시스템 설정을 유지하기 위해 부팅시에 다양한 태스크의 실행을 정렬시키는 데몬.
  • linuxconf-web : 웹을 통해 linuxconf를 실행할수 있게 연결을 허용하는 데몬
  • lpd : 프린터(line printer)가 정상적으로 동작하도록 해 주는 프린트 서비스 데몬
  • mars-nwe : netware IPX 프로토콜을 사용하는 클라이언트에게 리눅스 머신에서 파일과 프린트 서버를 호환시켜 주는 데몬
  • mcserv : midnight command(MC) 서버이다. MC끼리 네트워크를 공유한다
  • mysqld : 매우 빠르고 안정적인 mysql 데이타 베이스 서버 데몬이다
  • named : 도메인 네임과 ip어드레스를 해석하기 위한 DNS서버(BIND) 데몬. 로컬 호스트에서 DNS서버를 운영할때만 실행 시킨다.
  • netfs : 삼바, 네트워크 파일 시스템(NFS), NCP(netware)등의 마운트와 언마운트에 관여하는 데몬.
  • network : 네트워크 인터페이스의 설정을 시스템 부팅시 커널에 적재시키는 데몬.
  • nfs : TCP/IP 네트워크에서 파일을 공유할수 있게 하는 데몬. /etc/exports 파일에서 설정한 NFS 서버가 기동할수 있게 해 준다.
  • nfslock : NFS파일을 locking 한다.
  • nscd : NIS/NS 를 사용할수 있게 하는 데몬. nscd는 실행중인 프로그램의 그룹을 살피고 패스워드를 변경하거나 다음 질의를 위해 결과를 캐시하는 데몬이다.
  • ntalk : 서로 다른 시스템끼리 채팅이 가능하게 ntalk 연결을 허용하는 서버
  • ntpd : NTPv4데몬
  • pcmcia : 휴대용 PC에서 이더넷이나 모뎀을 쓸수 있게 하는 데몬.
  • pop3s : SSL을 지원하는 pop3클라이언트를 사용하여 메일에 접근할수 있게 하는 서비스이다.
  • portmap : RPC(NFS, NIS, mcsev등) 연결을 관리하기 위한 포트 매핑 데몬으로 RPC를 사용하는 프로그램을 실행하기 위해서는 반드시 선택하여야 하는 데몬.
  • postgresql : postgresql 디비에 관한 데몬
  • pppoe : adsl서비스에 연결시켜 주는 데몬
  • proftpd : 쉬운설정, 보안성, 단순성에 초점을 맞춘 개선된 ftp 서버 데몬
  • pxe : 부팅전 실행환경 서버. 다른 PXE기반 머신에 네트워크 부팅을 제공한다
  • random : 시스템에 필요한 난수 발생 및 저장 데몬
  • rawdevices : HDD 파티션과 같은 블론 디바이스를 위한 스크립트. /etc/sysconfig/rewdevices 파일을 편집하여 원시 디비아스를 블론 디바이스로 매핑할수 있다.
  • reconfig : /etc/reconfigSys 파일이 존재하면 재설정을 실행하는 데몬
  • rexec : rexec(3) 루틴을 위한 서버 데몬. 인증된 사용자 이름과 패스워드로 원격 실행을 제공하는 서버이다.
  • rlogin : rlogin 프로그램을 위한 서버 데몬. 신뢰할수 있는 호스트로부터 특권화된 포트 번호에 기반한 인증을 통해 원격 로그인을 제공한다.
  • routed : RIP 프로토콜을 통해 업데이트된 자동 IP 라우팅 테이블 설정 데몬
  • rsh : rshd 서버는 rcmd 루틴을 위한 서버이며 따라서 rsh 프로그램을 위한 서버이다. 신뢰할수 있는 호스트로부터 특권화된 포트번호에 기반한 인증 통해 원격 실행을 제공한다.
  • rstat : 네트워크에 연결된 사요자에게 그 네트워크 상의 머신에 대한 퍼포먼스 매트릭스를 회수할수 있게 해주는 프로토콜
  • rsync : 컴퓨터간 자료 공유를 위해서 사용되는 rsync에 대한 데몬이다.
  • rusersd : 네트워크에 특정 사용자가 있는 검색해 주는 데몬.
  • rwalld : 시스템에 동작중인 모든 터미널에 메시지를 표시할수 있게 해 주는 프로토콜
  • rwhod : 원격 접속자의 목록을 볼수 있게 해주는 데몬. finger와 비슷한 기능을 한다.
  • sendmail : 메일을 다른 호스트로 전송하는 메일 전송(Mail Transport Agent)데몬
  • smb : SMB 네트워크 서비스를 제공하기 위한 삼바 서버(smbd와 nmbd)데몬
  • snmpd : SNMP(Simple Network Management Protocol)데몬
  • squid : HTTP, FTP, gopher와 같은 프로토콜을 사용할때 캐싱 속도를 높이는 데몬.
  • sshd : openssh 서버 데몬
  • swat : 삼바 웹 관리 툴, 삼바 서버의 설정을 위해 swat를 사용하며, 웹 브라우저를 통해 901포트로 접속한다.
  • syslog : 많은 데몬들이 로그 메세지를 다양한 시스템 로그파일에 기록하는데 사용하는 데몬. syslog는 항상 실행되는 것이 좋다.
  • talk : 다른 시스템에 접속한 사용자로 부터 채팅 요구에 응답하여 터미널의 내용을 다른 사용자에게 보내서 대화할수 있게 하는 데몬.
  • telnet : telnet 세션을 제공하는 서버. 인증을 위해 사용자 이름과 패스워드를 사용한다.
  • tftp : 파일 전송을 위한 프로토콜. tftp프로토콜은 어떤 OS에서는 부팅 디스켓이 없는 워크스테이션이나 네트워크 인식 프린터를 위한 설정 파일의 다운로드, 설치 프로세스의 시작을 위해 가끔 이용된다.
  • time : rdate 데몬에 의해 사용되는 RFC 868 시간 서버의 TCP 버전
  • time-udp : rdate 데몬에 의해 사용되는 RFC 868시간 서버의 UDP 버전
  • webmin : webmin 관리자 서버 데몬
  • xfs : 부팅과 셧다운시 X 폰트 서버를 시작하거나 종료시키는 데몬
  • xinetd : inetd 데몬을 대체하는 강력한 데몬. telnet, ftp 등과 같은 서비스를 처리하는 슈퍼 데몬.
  • ypbind : NIS/YP 클라이언트에서 실행되는 데몬으로 NIS도메인을 바인드한다. NIS클라이언트로 동작하기 위해서는 glibc에 기반한 시스템에서 실행되어 한다. 그러나 NIS를 사용하지 않는 시스템에서는 실행하지 말아야 한다.
  • yppasswd : NIS클라이언트 사용자의 패스워드를 변경할수 있게 해 주는 데몬
  • ypserv : 표준 NIS/YP 네트워크 프로토콜 서버. 호스트 네임, 사용자 네임과 다른 정보 데이타베이스를 네트워크를 통하여 배포하는 것은 허용한다. ypserv데몬은 클라이언트에서는 필요하지 않으며 NIS 서버에서 실행된다.
  • Posted by tornado
    |

    Log 파일이 안남아서 첨에 당황함...

     

     

    proftpd.conf 파일에서...  아래의 부분을 <Global 영역에 설정한 후 로그 생성됨

     

     

    ExtendedLog      /var/log/proftpd.log ALL  

     

     

    ALL 은 포맷이당... proftpd 사이트 참고요함..

    Posted by tornado
    |

    현재 방화벽 환경 하에서 돌아가는 ftp 인데 "익명 계정" 은 접속을 처음부터 불허하고 있다.


    계정사용자만 사용하는데(iptables 에서 허가된 ip 에서만) ftp 에 처음 접속시


    로그인 창이 뜰때 까지 시간이 좀 걸리고,


    로그인 하고 파일 List 가 뜰때까지 시간이 좀 걸렸다.


    proftpd.conf 파일에서 아래와 같이 설정을 추가한 후, 데몬을 다시 시작하니 빨라짐 .. ^^




    UseReverseDNS                   off
    IdentLookups                    off



    Posted by tornado
    |

    FORWARD 로 막으니까 잘 됨..


    아직 iptables 에 대한 이해가 떨어져서... 스크립트가 지저분 함..

    msn 은 자료전송까지는 잘 되는데... 화상채팅 안되는듯...


    아래는 /etc/init.d/iptables 에 저장한 내용...


    # nat 로 내부 아이피 이용하기. (192.168.1.0 ~ 192.168.1.255)
    iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to-source 218.xxx.xxx.xx7


    # ftp 허용 (21 번포트)
    iptables -A FORWARD -p tcp --dport 21 -j ACCEPT
    iptables -A FORWARD -p tcp --sport 21 -j ACCEPT
    iptables -A FORWARD -p tcp --dport 20 -j ACCEPT
    iptables -A FORWARD -p tcp --sport 20 -j ACCEPT


    # ssh 허용 (22번 포트)
    iptables -A FORWARD -p tcp --dport 22 -j ACCEPT
    iptables -A FORWARD -p tcp --sport 22 -j ACCEPT


    # telnet 허용 (23 번 포트)
    #iptables -A FORWARD -p tcp --dport 23 -j ACCEPT
    #iptables -A FORWARD -p tcp --sport 23 -j ACCEPT


    # SMTP 허용 (25 번 포트)
    iptables -A FORWARD -p tcp --dport 25 -j ACCEPT
    iptables -A FORWARD -p tcp --sport 25 -j ACCEPT


    # Time 서버 포트 허용(37 번 포트)
    iptables -A FORWARD -p tcp --dport 37 -j ACCEPT
    iptables -A FORWARD -p tcp --sport 37 -j ACCEPT


    # NickName 허용(43 번 포트)
    iptables -A FORWARD -p tcp --dport 43 -j ACCEPT
    iptables -A FORWARD -p tcp --sport 43 -j ACCEPT


    # Domain 포트 허용(53 번 포트)
    iptables -A FORWARD -p tcp --dport 53 -j ACCEPT
    iptables -A FORWARD -p tcp --sport 53 -j ACCEPT

    iptables -A FORWARD -p udp --dport 53 -j ACCEPT
    iptables -A FORWARD -p udp --sport 53 -j ACCEPT

    # HTTP 허용 (80 번 포트)
    iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
    iptables -A FORWARD -p tcp --sport 80 -j ACCEPT


    # POP3 허용 (110 번 포트)
    iptables -A FORWARD -p tcp --dport 110 -j ACCEPT
    iptables -A FORWARD -p tcp --sport 110 -j ACCEPT


    # ntp 허용 (123 번 포트)
    iptables -A FORWARD -p tcp --dport 123 -j ACCEPT
    iptables -A FORWARD -p tcp --sport 123 -j ACCEPT


    # imap 허용 (143 번 포트)
    iptables -A FORWARD -p tcp --dport 143 -j ACCEPT
    iptables -A FORWARD -p tcp --sport 143 -j ACCEPT
     

    # snmp 허용 (161 번 포트)
    iptables -A FORWARD -p tcp --dport 161 -j ACCEPT
    iptables -A FORWARD -p tcp --sport 161 -j ACCEPT
     
     
    # https 허용 (443 번 포트)
    iptables -A FORWARD -p tcp --dport 443 -j ACCEPT
    iptables -A FORWARD -p tcp --sport 443 -j ACCEPT
     

    # rsync 허용 (873 번 포트)
    iptables -A FORWARD -p tcp --dport 873 -j ACCEPT
    iptables -A FORWARD -p tcp --sport 873 -j ACCEPT


    # imaps 허용 (993 번 포트)
    iptables -A FORWARD -p tcp --dport 993 -j ACCEPT
    iptables -A FORWARD -p tcp --sport 993 -j ACCEPT


    # pop3s 허용 (995 번 포트)
    iptables -A FORWARD -p tcp --dport 995 -j ACCEPT
    iptables -A FORWARD -p tcp --sport 995 -j ACCEPT


    # 네이트온 메신저 거부 (5004 번 포트)
    iptables -A FORWARD -p tcp --dport 5004 -j ACCEPT
    iptables -A FORWARD -p tcp --sport 5004 -j ACCEPT


    # MSN 서비스 제어.... 1863 포트
    iptables -A FORWARD -p tcp --dport 1863 -j ACCEPT
    iptables -A FORWARD -p tcp --sport 1863 -j ACCEPT
    iptables -A FORWARD -d 207.46.110.0/25 -j ACCEPT
    iptables -A FORWARD -d 207.46.104.20 -j ACCEPT


    # 연결된 상태에 대한 수신 허용
    # 이 부분 없애니까 FTP 송수신에 문제 생김... 반드시 RELATED 해줘야 함...

    # 특정 서비스와 연관된 포트는 허용하는 것 같음...
    iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT


    # 위에 열어준 서비스 이외의 모든 포트 막기.
    iptables -A FORWARD -p tcp -j DROP

    Posted by tornado
    |