구글와이드(336x280)_상단 2개


inetd 와 stand alone 방식의 서버 IT, 네트워크 보안

출처 카페 > 해킹&정보보안,사이버수사기법.. | 이쁠란다
원문 http://cafe.naver.com/systemnetwork/47

1절. inetd 와 stand alone 방식의 차이

telnet, ftp 와 같은 인터넷 서비스 프로그램을 만들경우 2가지 방식이 사용된다. 하나는 자체적으로 port 를 만들어서 클라이언트의 연결을 기다리는 stand alone 방식이고, 다른 하나가 inetd 라고 불리우는 "인터넷 서비스 데몬" 을 이용하는 방식이다.
이번 장에서는 이러한 2가지 인터넷 서비스 방식의 차이점과 inetd 프로그래밍 방식에 대해서 알아 볼것이다.

1.1절. stand alone 방식

우리말로 번역하자면 "홀로서기" 정도가 될것이다. 실제로 stand alone 방식으로 제작된 프로그램은 단독으로 인터넷 서비스가 가능하다. 즉 스스로 서비스 port를 할당하고 서비스 port 에 대한 클라이언트 연결을 받아들여서 서비스를 하게 된다. stand alone 방식의 서버프로그램은 다중의 클라이언트 를 받아들 이기 위해서 fork, select, poll, thread 등을 프로그래밍 기법을 사용 한다.
                            +---------------------------------------+
                            | Server                                | 
 +---------+                | +-+     +--------+         +--------+ |
 | client1 | <------------> | |P|<--->| accept |<------->| 처리 1 | |
 +---------+                | |O|     |        |    |    +--------+ |
 +---------+                | |R|     |        |    |    +--------+ |
 | client2 | <------------> | |T|     |        |    +--->| 처리 2 | |
 +---------+                | +-+     +--------+         +--------+ |
                            +---------------------------------------+
위의 그림은 Stand alone 방식의 서버 프로그램이 client1 의 요청을 처리하는 전형적인 방식이다. 다중의 클라이언트를 받아들이기 위해서 Server 은 accetp 한후 fork 등의 기술을 사용하여서 각 클라이언트의 요청을 처리한다.
지금까지 이 사이트에서 예로 들었던 모든 인터넷 서버 프로그램들은 바로 stand alone 방식을 이용해서 만들어졌다.

1.2절. inetd 방식

반면 inetd 방식을 사용하는 인터넷 서비스 프로그램의 경우는 모든것을 처리하는 방식이 아니다. 해당 포트에 대기 해서 클라이언트로 부터 연결을 받아들이는 일을 외부 데몬프로그램인 inetd 에 맡기고 실제 서비스 프로그램은 연결된 클라이언트의 요청을 처리하는 일만 한다.
inetd 데몬은 시스템이 시작될때 시작되어서, 종료될때까지 계속적으로 시스템에 떠있게 된다. 이 프로그램은 /etc/services 파일과 서비스 설정파일인 /etc/inetd.conf (레뎃 7.x 의 경우에는 /etc/xinetd.d) 를 참고하여서, 해당 포트에 연결을 대기 하고 있다가 클라이언트로 부터 연결이 들어오면 자식프로세스를 fork 시킨다음에 inetd.conf 에 설정된 서버 프로그램을 exec 시키게 되고, exec 된 서버 프로그램이 클라이언트의 요청을 처리하게 된다.
 -->> : fork & exec
 +---------+            +-------+         +----------+
 | client1 | ---------> | inetd | ----->> | Server 1 |
 +---------+            |       |         +----------+
 +---------+            |       |         +----------+
 | client1 | ---------> |       | ----->> | Server 2 |
 +---------+            +-------+         +----------+
fork시 보통 부모 프로세스의 열린 파일 지시자들도 자식 프로세스로 복사된다. 또한 exec 할때도 열린 파일 지시자들은 새로운 프로세스로 복사된다. 그러므로 inetd 에서 새로운 클라이언트를 받아서 fork 할때는 소켓 연결 지시자를 넘겨줘야 하므로, 소켓 연결 지시자를 표준입력(0)으로 복사한다. 최종적으로 exec 된 Server는 표준입력을 통해서 client 와 통신하게 된다.

2절. inetd 프로그래밍 하기

2.1절. inetd 방식 프로그래밍 예제

그러면 간단한 예를 통해서 inetd 방식의 서버 프로그램을 하나 만들어 보도록 하겠다.(stand alone 방식은 지금까지 자주 사용되어 왔음으로 생략)
예제 프로그램은 지금까지 자주 사용했던 fork 버젼의 zipcode_multi.c 를 inetd 방식으로 변경된 버젼이다. zipcode_multi.c 의 예제 파일은 다중연결서버 만들기 (1)을 참고하기 바란다.
예제: zipcode_inetd.c
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>

int main(int argc, char **argv)
{
    struct sockaddr *clientaddr; 
    char buf[255];
    char line[255];
    char myline[255];
    FILE *fp;
    int  length;

    clientaddr = (struct sockaddr *)malloc(128);
    length = 128;

    if (getpeername(0, clientaddr, &length) < 0)
    {
        perror("socket failure: ");         exit(0);
    }

    if ((fp=fopen("/etc/zipcode.txt", "r")) == NULL)
    {
        perror("file open error : ");         exit(0);
    }
    while(1)
    {
        if (read(0, buf, 255) <= 0)
            break;
        if (strncmp(buf, "quit", 4) == 0)
        {
            write(0, "byebye\n", 8); 
            break;
        }

        while(fgets(line,255,fp) != NULL)
        {
            if (strstr(line, buf) != NULL)
            {
                write(0, line, 255);
            }
        }
        write(0, "end\n", 4);         rewind(fp);
    }

    close(0);     fclose(fp);     exit(0); }
쏘쓰를 보면 알겠지만, 예전의 zipcode_multi.c 에 비해서 매우 간단해 졌음을 알수 있다. 이는 socket, bind, listen, accetp 로 이어지는 일련의 통신 초기화 과정을 inetd 데몬에서 담당하기 때문에 zipcode_inetd 에서는 실제 통신 부분만을 코딩에 신경쓰면 되기 때문이다.
위의 코드에서 신경쓸 부분은 getpeername 정도일 것이다. 이 함수를 호출해서 첫번째 인자로 주어진 값이 사용가능한 소켓인지 알아낼수 있다.

2.1.1절. inetd(xinetd) 데몬 재가동하기

zipcode_inetd 프로그램을 작성하고 컴파일 완료 했다면, inetd 설정파일인 /etc/inetd.conf 를 수정하고 inetd 데몬을 다시 실행시켜줘야 한다. 그러나 앞에서 말했다 시피, 레드헷 7.x 이상에서부터는 inetd 대신에 xinetd 를 사용한다. 필자가 테스트한 Linux 가 레드헷 7.2 이므로 xinetd 를 기준으로 설명할것이다. inetd 설정에 대한 내용은 The inetd Supper-Server을 참고하기 바란다.
xinetd 데몬은 /etc/xinetd.d 밑에 각 서비스 별로 설정파일을 둔다. xinetd.d 디렉토리 아래에 다음과 같은 내용을 가지는 zipcode 라는 파일을 만들도록 하자.
service zipcode
{
    socket_type = stream
    protocol = tcp
    wait = no
    user = root
    server = /usr/local/bin/zipcode
    port = 12345
}
tcp 프로토콜을 사용하며 12345 포트를 사용한다. 그리고 연결을 받아들였을경우 /usr/local/bin/zipcode 라는 프로그램을 실행시키도록 설정하였다. 위의 컴파일된 zipcode_inetd 실행파일은 /usr/local/bin 에 zipcode 라는 파일이름으로 복사하도록 하자.
이제 모든 준비는 끝났다. 바뀐 내용을 적용시키기 위해서 xinetd 데몬을 다시 실행시키도록 하자. xinetd 데몬의 pid 를 알아내서 SIGHUP 신호를 보내는 방법과 xinetd 시동 스크립트를 가동시키는 방법이 있다.
[root@localhost root]$ /etc/rc.d/init.d/xinetd restart
xinetd 를 정지함:                                          [  확인  ]
xinetd (을)를 시작합니다:                                  [  확인  ]
[root@localhost root]# 

2.1.2절. 테스트 하기

이제 클라이언트를 이용해서 테스트 하기만 하면 된다. 클라이언트는 셈플로 알아보는 소켓프로그래밍에 있는 zipcode_cli.c 를 그대로 사용하면 된다.

2.2절. inetd 방식과 stand alone 방식중 어느걸 선택해야 하나

결론 부터 말하자면 서비스할 서버의 환경에 따라서 적당한 방식을 채택하면 된다.(너무 뻔한 답변인것 같지만 --;)

2.2.1절. inetd

각각 적당한 용도가 있다. 일단 inetd 방식의 경우 위에서 보았겠지만 코딩량이 많이 줄어든다. 또한 에러발생확률도 줄어든다. inetd 데몬 자체가 검증된 프로그램이기 때문이다. 또한 다중의 클라이언트를 받아들이기 위해서 사용하는 fork, select, poll 등에 대해서 신경쓸필요가 없다. 보통 이들 fork, select, poll 은 꽤 까다로운 프로그래밍 작업을 요구하며, 이는 많은 오류를 발생시키기도 한다.
inetd 방식은 telnet, ftp, pop 서비스와 같은 빈번한 요구가 발생하지 않거나, 일단 요청을 받아들이면 꽤 오랜시간 작업을 수행하는 서비스에 적당하다. 반면 http 서비스와 같이 초기 반응속도가 중요시하거나 매우 빈번한 요청이 일어나는 서비스에는 적당한 방법이 아니다.
그리고 에러를 표준출력시킬수 없으므로 약간 디버깅이 까다로와 질수 있다는 단점을 가지고 있다. 디버깅을 원한다면 에러로그를 파일로 저장하는 방법을 사용해야 할것이다.

2.2.2절. inetd

stand alone 방식은 http와 같은 반응속도가 중요하거나, 매우 빈번한 요청이 일어나는 서비스에 적당하다.
예를들어 서버가 oracle 에 연결해서 데이타를 가져오는 일을한다고 했을때 inetd 방식을 사용하면 클라이언트의 연결이 들어올때 마다 oracle DB로의 연결을 수행해야 할것이다. 이는 엄청난 자원의 비효율성을 증가 시킬수 있다. 그러나 stand alone 방식으로 했을때는 최초에 한번만 oracle DB로 연결하고, 새로운 클라이언트가 연결되더라도 이미 연결된 oracle DB로 작업을 할수 있을것이다.
그러나 코드량이 많아지고, 신경써야할 부분들이 매우 많아진다는 단점을 가지고 있다.
출처: http://www.joinc.co.kr/modules/moniwiki/wiki.php/article_inetd_%C7%C1%B7%CE%B1%D7%B7%A1%B9%D6

null



바보들의 영문법 카페(클릭!!)

오늘의 메모....

시사평론-정론직필 다음 카페
http://cafe.daum.net/sisa-1

바보들의 영문법 다음 카페
http://cafe.daum.net/babo-edu/

티스토리 내 블로그
http://earthly.tistory.com/

내 블로그에 있는 모든 글들과 자료에 대한 펌과 링크는 무제한 허용됩니다.
(단, 내 블로그에 덧글쓰기가 차단된 자들에게는 펌, 트랙백, 핑백 등이 일체 허용되지 않음.)

그리고 내 블로그 최근글 목록을 제목별로 보시려면....
바로 아래에 있는 이전글 목록의 최근달을 클릭하시면 됩니다.
그러면 제목을 보고 편하게 글을 골라 보실 수 있습니다.

그리고 내 블로그내 글을 검색하시려면 아래 검색버튼을 이용하시면 됩니다.


가가챗창

flag_Visitors

free counters