mod_cband 모듈은 apache2 버전 에서 홈페이지의 히트(hit)수 제한 및 도메인별 대역폭제한등 트래픽을 관리하기 위해 사용하는 모듈 입니다.


제일 하단의 [주석-운영트러블 해결] 부분을 읽고 오세요.


설치방법 설명


1. 소스 다운 및 설치 예제

[root@i-swear.com]# cd /usr/local/src/

[root@i-swear.com]# wget http://hosting.i-swear.com/download/mod-cband-0.9.7.5.tgz 

[root@i-swear.com]# tar xvfpz mod-cband-0.9.7.5.tgz 

[root@i-swear.com]# cd mod-cband-0.9.7.5

[root@i-swear.com]# ./configure --with-apxs=/usr/local/apache2/bin/apxs

[root@i-swear.com]# make

[root@i-swear.com]# make install


cband.linux.pl 사이트가 접속이 되지 않아 제 사이트에 업로드후 링크를 대신합니다.

apxs 의 경우 설치된 경로에 따라 다를수 있으니,

모를 경우 which apxs 를 하시면 됩니다.



2. 설치확인

  - httpd.conf 파일에서 모듈부분에 아래와 같이 줄이 추가된것을 볼 수 있습니다.

     LoadModule cband_module       modules/mod_cband.so

  - apache2/modules 디렉토리에서도  mod_cband.so  파일이 추가 된 것을 볼수 있습니다.


3. 기본 설정 및 예제 (apache2/conf/httpd.conf)

====================================

  <Location /cband-status> 

     SetHandler cband-status

     Order deny,allow

     Deny from all

     Allow from 허용 아이피(예: 192.168.100.10)

  </Location>

  <Location /cband-status-me> 

    SetHandler cband-status-me

  </Location>

<VirtualHost *>

   ServerName testmydomain.co.kr    

   Document /home/testmydomain/public_html

   CBandLimit 100Mi

   CBandPeriod 1D

   CBandExceededURL http://testmydomain.co.kr/traffic-over.html

</VirtualHost>

======================================

위 설정파일은 testmydomain.co.kr 도메인에 하루에 100M의 트래픽을 설정하는 예제입니다.

하루에 100M를 초과했다면, CBandExceededURL에서 지정된 페이지가 뜨며, 지정하지 않았다면, 503 에러 페이지가 뜨게됩니다.

참고로 제한을 하지 않고 보기만 한다면, CBandPeriod 부분만 있으면 됩니다.

4. 속도 제한 설정 예

==============================

<VirtualHost *>

   ServerName file.testmydomain.co.kr   

   Document /home/testmydomain/file

   CBandSpeed 1024 10 30

   CBandRemoteSpeed 20kb/s 3 30

</VirtualHost>

==============================

위 설정은 file.testmydomain.co.kr 도메인에 대해서 속도를 1024kbps 로 제한, 초당 10번 연결, 동시접속자를 30으로 제한하는 예제


5. 사용량 확인.

   http://도메인/cband-status

   http://도메인/cband-status-me


6. 지시자 및 단위 설명

  1) 단위.

    * 전송속도 단위

          o kbps, Mbps, Gbps - bits per second: 1024, 1024*1024 , 1024*1024*1024 bps

          o kb/s, Mb/s, Gb/s - bytes per second:  1024, 1024*1024, 1024*1024*1024 b/s

          o 기본 : kbps

    * 트래픽 쿼터 단위

          o K, M, G - bytes: 1000, 1000*1000 ,1000*1000*1000 bytes

          o Ki, Mi, Gi - bytes: 1024, 1024*1024, 1024*1024*1024 bytes

          o 기본 : K

    * 시간(기간) 단위 

          o S, M, H, D, W - 초, 분, 시간, 일, 주

          o 기본 : S

 

  2) 지시자들

     * 이름 : CBandDefaultExceededCode

         설명 : 제한을 초과했을시 보여줄 에러 코드

         문맥 : Server config

         문법 : CBandDefaultExceededCode HTTP_CODE

         예제 : CBandDefaultExceededCode 509 


     * 이름 : CBandScoreFlushPeriod

         설명 : scoreboard 파일에 기록할 요청수, mod_cband 의 성능에 영향을 준다.

         기본값 : 1

         문맥 : Server config

         문법 : CBandScoreFlushPeriod 요청수

         예제 : CBandScoreFlushPeriod 100  ( 매 100번의 요청에 한번씩 scoreboard 파일에 기록)

     * 이름 : CBandSpeed

         설명 : 가상호스트 도메인의 최대 속도, 요청수, 접속수  설정

         문맥 : <Virtualhost>

         문법 : CBandSpeed kbps rps max_conn

                kbps - 초당 최대 전송속도

                rps - 초당 최대 요청수

                max_conn - 최대 동시 접속수 

         예제 : CBandSpeed 1024 10 30

                 최대 1024kbps전송속도로 제한, 초당 10개의 요청 처리, 동시 접속을 30개로 제한.

     * 이름 : CBandRemoteSpeed

         설명 : 접속자(IP)의 최대속도, 요청수, 접속수 제한 (CBandSpeed와 비슷하지만, 접속자당 설정)

         문맥 : <Virtualhost>

         문법 : CBandRemoteSpeed kbps rps max_conn

                  kbps - 초당 최대 전송속도

                  rps - 초당최대 요청수

                  max_conn - 최대 동시 접속수

         예제 : CBandRemoteSpeed 20kb/s 3 3

                  접속자(ip)에대해 최대 20kb/s , 초당 3개의 요청, 동시 접속 3개로 제한.

      * 이름 : CBandClassRemoteSpeed

         설명 : 정의한 class(ip 범위)에 대해 최대속도, 요청수, 접속수 제한

         문맥 : <Virtualhost>

         문법 : CBandClassRemoteSpeed class_name kbps rps

                  class_name - 이미 정의한 클래스 이름 (IP범위)

                  kbps - 초당 최대 전송속도

                  rps - 초당 최대 요청수

                  max_conn - 최대 동시 접속수

         예제 : <CBandClass googlebot_class>

                    CBandClassDst 66.249.64/24

                    CBandClassDst 66.249.65/24

                    CBandClassDst 66.249.79/24

                  </CBandClass>

                        CBandClassRemoteSpeed googlebot_class 20kb/s 2 3

                        위에서 정의한 클래스(googlebot_class)의 요청에는 20kb/s 의 전송속도, 

                       초당 3개의 요청, 동시 접속 3개로 제한.

     *   이름 : CBandRandomPulse

         설명 : 속도 제한을 위해서 임의의 파형을 생성한 다음 처리하는 mod_cband의 처리 방법이다.

                   부하가 많을때는 자동 Off된다.

         문맥 : Global

         문법 : CBandRandomPulse On/Off

     *  이름 : CBandLimit

         설명 : 제한할 전송량을 설정한다. (기간은 CBandPeriod 에서 설정)

         문맥 : <Virtualhost>

         문법 : CBandLimit limit

                  limit - 전송량, 사용단위: K (kilo), M (mega), G (giga), Ki (kibi), Mi (mebi), Gi (gibi)

         예제 : CBandLimit 10M

                    전송양을 10M(10*1000*1000bytes)로 제한한다.

                  CBandLimit 10Mi

                    전송양을 10M(10*1024*1024bytes)로 제한한다.

     *  이름 : CBandClassLimit

         설명 : 정의한 class(ip범위)에 대해 제한할 전송량 설정.

         문맥 : <Virtualhost>

         문법 : CBandClassLimit class_name limit

                  class_name - 이미 정의한 클래스 이름(ip범위)

                  limit - 전송량, 사용단위: K (kilo), M (mega), G (giga), Ki (kibi), Mi (mebi), Gi (gibi)

      * 이름 : CBandExceededURL

         설명 : 제한을 초과했을시 보여줄 URL, 지정하지 않으면 503 에러 발생 ( 가상호스트에서 ) 

         문맥 : <Virtualhost>

         문법 : CBandExceededURL URL

      * 이름 : CBandExceededSpeed

         설명 : 전송양을 초과했을시 , 전송속도 제한 설정.

         문맥 : <Virtualhost>

         문법 : CBandExceededSpeed kbps rps max_conn

                  kbps - 초당 최대 전송속도

                  rps - 초당 최대 요청수

                  max_conn - 최대 동시 접속수

       * 이름 : CBandScoreboard

         설명 : 가상호스트의 scoreboard 파일 지정. (성능향상을 위해 필요)

         문맥 : <Virtualhost>

         문법 : CBandScoreboard path 

                  (path는 아파치(nobody또는 apache)권한으로 쓰기가능해야 함)

      * 이름 : CBandPeriod

         설명 : 용량제한기간(이 기간이 지나면, 측정되었던 용량은 삭제됨)

         문맥 : <Virtualhost>

         문법 : CBandPeriod period

                  period - 사용단위: S (초), M (분), H (시간), D (일), W (주)

         예제 : CBandPeriod 1W  (1주일)

                  CBandPeriod 14D  (14일)

                  CBandPeriod 60M  (60분)

      * 이름 : CBandPeriodSlice

         설명 : 기간이 길때는 나눌 기간을 명시한다. 

         기본값 : slice_len = limit

         문맥 : <Virtualhost>

         문법 : CBandPeriodSlice slice_length

         예제 : CBandLimit 100G

                  CBandPeriod 4W

                  CBandPeriodSlice 1W

                   4주는 1주일 단위로 나뉜다(4W/1W = 4). 용량은 100G/4=25G 

                   1주에 25G, 2주째 50G 이렇게 나눠 처리 됨.

      * 이름 : <CBandUser>

         설명 : 새로운 cband 가상 사용자 설정

         문맥 : Server config

         문법 : <CBandUser user_name>

     * 이름 : CBandUserSpeed

         설명 : cband 가상 사용자의 속도, 요청수, 동시 접속수 제한 

         문맥 : <CBandUser>

         문법 : CBandUserSpeed kbps rps max_conn

                  kbps - 초당 최대 전송속도

                  rps - 초당 최대 요청수

                  max_conn - 최대 동시 접속수

         예제 : CBandUserSpeed 100kb/s 10 5


     * 이름 : CBandUserLimit

         설명 : cband 가상 사용자의 저송 용량 제한.

         문맥 : <CBandUser>

         문법 : CBandUserLimit limit

                  limit - 사용용량, 사용단위: K (kilo), M (mega), G (giga), Ki (kibi), Mi (mebi), Gi (gibi)

         예제 : CBandUserLimit 10M

                  CBandUserLimit 10Mi

     * 이름 : CBandUserClassLimit

         설명 : cband 가상 사용자의 정의한 class(ip범위)에 대해 제한할 전송량 설정

         문맥 : <CBandUser>

         문법 : CBandUserClassLimit class_name limit

                  class_name - 지정한 class(IP범위)이름

                  limit -사용용량, 사용단위: K (kilo), M (mega), G (giga), Ki (kibi), Mi (mebi), Gi (gibi)

      * 이름 : CBandUserExceededURL

         설명 : cband 가상 사용자의, 제한을 초과했을시 보여줄 URL,

                   지정하지 않으면 503 에러 발생 ( 가상호스트에서 ) 

         문맥 : <CBandUser>

         문법 : CBandUserExceededURL URL

     * 이름 : CBandUserExceededSpeed

         설명 : cband 가상 사용자의, 전송양을 초과했을시 , 전송속도 제한 설정.

         문맥 : <CBandUser>

         문법 : CBandUserExceededSpeed kbps rps max_conn

                  kbps - 초당 최대 전송속도

                  rps - 초당 최대 요청수

                  max_conn - 최대 동시 접속수

     * 이름 : CBandUserScoreboard

         설명 : cband 가상 사용자의, scoreboard 파일 지정.

         문맥 : <CBandUser>

         문법 : CBandUserScoreboard path

                  (path는 아파치(nobody또는 apache)권한으로 쓰기가능해야 함)

    *  이름 : CBandUserPeriod

         설명 : cband 가상 사용자의, 용량제한기간(이 기간이 지나면, 측정되었던 용량은 삭제됨.)

         문맥 : <CBandUser>

         문법 : CBandUserPeriod period

                  period - 사용단위: S (초), M (분), H (시간), D (일), W (주)

         예제 : CBandUserPeriod 1W

                  CBandUserPeriod 14D

                  CBandUserPeriod 60M

      * 이름 : CBandUserPeriodSlice

         설명 : cband 가상 사용자의, 기간을 나눌 기간 명시

         기본값 : slice_len = limit

         문맥 : <CBandUser>

         문법 : CBandUserPeriodSlice slice_length

         예제 : CBandUserLimit 100G

                  CBandUserPeriod 4W

                  CBandUserPeriodSlice 1W

                   4주는 1주일 단위로 나뉜다(4W/1W = 4). 용량은 100G/4=25G 

                   1주에 25G, 2주째 50G 이렇게 나눠 처리 된다.


[주석-운영트러블 해결]

위처럼 운영하게 될 경우,

CBandExceededURL, CBandDefaultExceededURL 에서 지정된 URL 로 이동되는데, 이때 이동되는 HTTP Response CODE 가 301 입니다.

이는 영구적인 페이지 이동을 뜻하는데, 트래픽을 리셋하여도 301 응답을 받고 지정된 URL 로 이동이 되어,

원래 홈페이지로 접속을 못하게 됩니다. 뜨아!!

CBandDefaultExceededCode 를 이용하여 사용하지 않는 HTTP Response CODE 를 이용하여,

ErrorDocument [CODE] http://~ 를 이용하여 넘기게 될 경우 HTTP 301 이 아니므로 캐시가 되지 않습니다.

이렇게 사용하셔도 되고,

깔끔하게 하시려면, moc_cband.c 소스를 수정하시면 됩니다.

수정하는 내역은 HTTP 301 을 HTTP 302 로 변경하는 것입니다.

원본 소스는 손대지 않았으니, 아래처럼 수정하신후 작업하시면 됩니다.


mod_cband.c 3106 라인

return HTTP_MOVED_PERMANENTLY; 

위 부분을

return HTTP_MOVED_TEMPORARILY;

이렇게 변경해줍니다.


3114 라인도

return HTTP_MOVED_TEMPORARILY;

로 변경해줍니다.


이렇게 한 뒤 다시 재설치 과정을 거치시면 됩니다.


변경전 트래픽 초과시 HTTP 응답 부분 캡쳐



변경후 트래픽 초과시 HTTP 응답 부분 캡쳐



php_flag register_globals 0

php_flag short_open_tag 0

php_value default_charset utf-8


RewriteEngine On


RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d

RewriteRule .* rewrite.php [L,QSA]




출처 : PHPSCHOOL 송효진님

http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/InetDaemonMake


inetd 데몬 제작

윤 상배

dreamyun@yahoo.co.kr


차례
1절. 소개
2절. my_inetd 제작
2.1절. 작동 프로세스
2.2절. 자료구조
2.3절. 코딩
2.4절. 테스트

1절. 소개

우리는 지난번에 inetd 프로그래밍 를 통하엿 inetd 데몬의 작동방식과 inetd 를 이용한 서버프로그래밍 방법에 대해서 알아보았다.

이번 기사는 inetd 데몬과 비슷한 프로그램을 직접 구현하는 방법에 대해서 소개하고 있다.


2절. my_inetd 제작

이번에 만들 프로그램의 이름은 my_inetd 라고 명명하도록 할것이다. 쏘쓰파일의 이름은 my_inetd.cpp 가 될것이다.


2.1절. 작동 프로세스

my_inetd 의 작동 프로세스는 기본적으로 inetd 와 같은 방식을 취하게 될것이다.

즉 설정파일을 읽어서, 해당 포트에서 accept 대기를 하다가 포트에 연결이 들어오면, 포트에 연결된 프로그램을 fork&exec 방식으로 실행시키게 될것이다. fork 하면서 accept 시 만들어진 소켓을 stdin(0) 으로 복사(dup2) 하게 된다. 그러므로 자식 프로세스는 stdin(0) 을 이용해서 클라이언트와 통신을 할수 있게 된다.

            +-------+
| 시작 |
+-------+
|
+---------------+
| 설정파일 읽기 | <------ 설정파일
+---------------+
|
|
+---------+
| accept |
| | <-------------------------+
+---------+ |
| |
| client 로부터 연결이 들어오면 |
| |
+---------+ fork() > 0 |
| fork | -------------------------+
+---------+
|
| fork() == 0
+------------------+
| 소켓 지정 번호를 |
| stdin 으로 복사 |
+------------------+
|
| exec
+--------------------+
| stdin 을 이용 | <--------------------> Client
| 클라이언트와 통신 |
+--------------------+
my_inetd 는 시작하면 우선 설정파일을 읽어들이는데, 설정파일의 내용은 다음과 같은 포멧을 가진다.
4444,/usr/local/bin/zipcode
5555,/usr/local/bin/zipcode2
각 필드는 ',' 로 구분되며 첫번째 필드는 port 번호, 2번째 필드는 port 로 연결이 들어왔을때 실행시킬 서버프로그램의 이름이 된다.

일단 설정파일을 통해서 읽어들인 port 의 수만큼 socket 를 만들어 준다. 그후 각 socket 지정번호에 대한 연결을 기다리게 된다. 이때 각 소켓 지정번호의 accept 에서 block 되면 안되므로 polling 을 이용해서 accept 이벤트를 검사하도록 한다.

특정 소켓 지정번호에 연결이 들어오면 fork 시킨후 port 에 지정된 서버프로그램을 exec 실행시킨다. exec 실행하기 전에, 서버프로그램에 클라이언트와 통신할 소켓 지정번호를 전달 시켜줘야 하므로 dup2 함수를 이용해서 소켓지정번호를 0번으로 복사하도록 한다. 복사한후 기존의 소켓지정번호는 close 시키도록 한다.


2.2절. 자료구조

소켓지정번호와 poll 그리고 port 에 대한 실행서버 이름을 저장하게 되는 자료구조와 연관관계는 아래와 같다.

 
+--------+ +--------+ +------------------------------------------+
| sockfd | | poll | | vector<struct s_info> |
| +---+ | | +---+ | | +---+---------------+ +-------------+ |
| | 4 |--|---|-| 0 |--|---->| 0 | struct s_info |-->| int port | |
| +---+ | | +---+ | | +---+---------------+ | string proc | |
| | 5 |--|---|-| 1 |--|---->| 1 | struct s_info | +-------------+ |
| +---+ | | +---+ | | +---+---------------+ |
| | 6 |--|---|-| 2 |--|---->| 2 | struct s_info | |
| +---+ | | +---+ | | +---+---------------+ |
| | 7 |--|---|-| 3 |--|---->| 3 | struct s_info | |
| +---+ | | +---+ | | +---+---------------+ |
+--------+ +--------+ +------------------------------------------+
sockfd 는 소켓지정번호가 저장되는 단순한 배열이다. 설정파일에 있는 서비스 리스트의 크기와 동일한 크기를 가지게 될것이다. poll 은 소켓지정번호에 대한 polling 검사를 하게될 poll 구조체의 일반 배열 이다. 마지막 vector<struct s_info> 는 s_info 구조체를 vector 화 시킨 것이다. s_info 구조체에는 해당 포트번호에 대해서 실행해야할 프로그램에 관한 정보가 들어있다.

3개의 자료구조들은 첨자번호로 서로를 참조할수 있다. 즉 sockfd 4 에 대한 연결 event(POLLIN) 는 poll 0 을 이용해서 검사할수 있으며, 연결 event가 발생했다면, vector<struct s_info> 의 0번 원소를 참조해서 어떤 프로그램을 실행시켜야 하는지(proc) 결정할수 있게 된다.

위에서는 자료구조를 vector 로 사용했지만 배열을 사용해도 전혀 문제 없을 것이다.


2.3절. 코딩

위의 프로세스를 보면 알겟지만, my_inetd 를 만들기 위해서 어떤 특별한 기술을 필요로 하는건 아니다. 기존의 알고 있는 지식을 이용한 구현이다. 그러므로 아래의 예제 프로그램을 이해하는데 별 어려움은 없을것이다.

프로그래밍 언어로 C++을 사용하였다. 이유는 vector와 string 를 사용하기 위함이다. string 를 사용한 이유는, 문자열을 좀더 쉽게 사용하기 위함이며, vector 를 사용한 이유는 설정파일에서 읽어들인 내용을 저장하기 위한 자료구조를 좀더 쉽게 구현하기 위해서이다. 다른 방법으로 구현해도 물론 상관은 없다. 필자의 경우 코딩시간을 단축시키기 위해서 vector와 string 를 사용했을 뿐이다. 그렇지만 string 와 vector 을 사용한 외에는 C 스타일의 코딩기법을 따르고 있다.

예제: my_inetd.cpp

#include <string>
#include <vector>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/poll.h>
struct s_info
{
int port;
string proc;
};
int main(int argc, char **argv)
{
FILE *fp;
char buf[80];
char port[6];
char exec_proc[80];
char comma[1];
int *sockfd;
int state;
socklen_t clilen;
int pid;

struct sockaddr_in clientaddr, serveraddr;
struct pollfd *client;
struct s_info service_info;

int i;
vector<struct s_info> info_list;

// 설정파일을 읽어들여서 info_list 자료구조에
// push 한다.
fp = fopen("my_inetd.cfg", "r");
while(fgets(buf, 80, fp) != NULL)
{
printf("%s", buf);
sscanf(buf, "%[0-9]%[,]%s", port,comma,exec_proc);
service_info.port = atoi(port);
service_info.proc = exec_proc;
info_list.push_back(service_info);
}

// 설정파일의 내용을 토대로 sockfd 의 크기와
// polling 에 사용될 client poll 구조체의 크기를 결정한다.
sockfd = (int *)malloc(info_list.size());
client = (struct pollfd *)malloc(info_list.size());

// 설정파일에 설정된 port 만큼 socket 를 만든다.
for (i = 0; i < info_list.size(); i++)
{
if ((sockfd[i] = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket error : ");
exit(0);
}
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons(info_list[i].port);
state = bind(sockfd[i], (struct sockaddr *)&serveraddr,
sizeof(serveraddr));

if (state == -1)
{
perror("bind error : ");
exit(0);
}
state = listen(sockfd[i], 5);
if (state == -1)
{
perror("bind error : ");
exit(0);
}

// 만들어진 socket 지정번호는 polling 을 위해서
// poll 구조체에 입력한다.
client[i].fd = sockfd[i];
client[i].events = POLLIN;

}
clilen = sizeof(clientaddr);
for(;;)
{
int nread;
int client_sockfd;

// 만들어진 socket 에 대해서 폴링한다.
// 만약 client poll 구조체에 읽기가 발생하면(POLLIN)
// block 이 해제 되고 다음 코드로 넘어간다.
nread = poll(client, info_list.size(),-1);
for (i = 0; i < info_list.size(); i++)
{
// 어떤 client 멤버에서 POLLIN이 발생했는지 검사한후
// fork 시키고 나서 해당 port 에 대해 실행시키려고 설정해둔
// 서버 프로그램을 exec 실행시킨다.
client[i].fd = sockfd[i];
client[i].events = POLLIN;
if (client[i].revents & POLLIN)
{
client_sockfd = accept(client[i].fd,
(struct sockaddr *)&clientaddr,
&clilen);
if (client_sockfd > 0)
{
pid = fork();
if (pid == 0)
{
// exec 실행시키기 전에 client_sockfd 를 dup2 를 이용 표준입력으로
// 복사한다.
dup2(client_sockfd, 0);
execl(info_list[i].proc.c_str(),
info_list[i].proc.substr(info_list[i].proc.rfind("/")+1).c_str(), 0);
}
}
// 열린 소켓이 부모 프로세스에서는 필요 없음으로
// close 한다.
close(client_sockfd);
}
}
}
}

코드는 전체적으로 정리되지 않은 모습을 보여준다. 이유는 어디까지나 "이렇게 구현이 가능하다" 라는걸 보여주기 위해서 코드가 만들어졌기 때문이다. 부족한 기능을 보충하는것과, 코드 최적화및 에러처리는 각자의 몫으로 남겨 놓도록 하겠다.


2.4절. 테스트

우선 inetd 방식의 서버프로그램을 준비해야 한다. 이것은 inetd 프로그래밍에 있는 zipcode_inetd.c 를 그대로 이용 하도록 한다. 이것을 /usr/local/bin/zipcode 로 복사하도록하자. 그다음 my_inetd 를 실행시키고 셈플로 알아보는 소켓프로그래밍(1)의 zipcode_cli.c 를 이용해서 테스트 하면 된다.

[root@localhost test]# cp zipcode_inetd /usr/local/bin/zipcode 
[root@localhost test]# ./my_inetd
...
[root@localhost test]# ./zipcode_cli 4444
지역이름 입력 : 서울
서울시 강남구 역삼동:100-500
서울시 강남구 삼성동:108-508
서울시 송파구 동해동:212-789
서울시 강북구 인천동:911-200
...

보통 telnet 서비스는 23번 포트로 이루어지며 텔넷 서비스 요청이 있을경우 inetd 가 /usr/sbin/in.telnetd 를 fork&exec 로 실행시킨다. 이제 우리가 만든 my_inetd 가 과연 telnet 서비스도 가능한지를 테스트 해보도록 하자. 테스트 전에 기존에 떠있는 telnet 서비스를 disable 상태로 만들도록 하자. xinetd 방식이라면 /etc/xinetd.d 밑에 있는 telnet 파일을 열어서 "disable = yes" 로 바꾸면 될것이다. 만약 inetd 방식이라면 /etc/inetd.conf 파일을 열어서 "telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd" 부분을 주석처리 하면 된다. 주석 처리후 xinetd 와 inetd 데몬을 재 실행 시키도록 한다.

[root@localhost test]# ps -ax | grep xinetd
4616 ? S 0:00 xinetd -stayalive -reuse -pidfile /var/run/xinetd.pid
[root@localhost test]# kill -HUP 4616

이제 telnet 서비스가 disable 상태로 되어 있을것이다. 정말로 disable 상태가 되어있는지 확인을 원한다면 nmap 과 같은 포트스캐너 도구를 사용하면 된다.

[root@localhost xinetd.d]# !nmap
nmap 127.0.0.1

Starting nmap V. 2.54BETA22 ( www.insecure.org/nmap/ )
Interesting ports on localhost (127.0.0.1):
(The 1538 ports scanned but not shown below are in state: closed)
Port State Service
7/tcp open echo
22/tcp open ssh
110/tcp open pop-3
위는 필자의 컴퓨터를 스캐너 한건데, telnet 서비스가 되고 있지 않음을 알수 있다.

이제 my_inetd.cfg 에 다음과 같은 내용을 추가시키도록 하자.

23,/usr/sbin/in.telnetd
그다음 my_inetd 프로그램을 다시 실행시킨후 telnet 연결을 해보도록 하자.
 
[root@localhost test]# ./inetd
4444,/usr/local/bin/zipcode
5555,/usr/local/bin/zipcode2
23,/usr/sbin/in.telnetd
...
[root@localhost test]# telnet 127.0.0.1
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HancomLinux release 2.2
Kernel 2.4.13-1hl on an i686
login:
매우 놀랍게도 telnet 서비스가 제대로 됨을 알수 있다(정말 놀랍다).

그러나 위의 my_inetd 프로그램이 모든 서비스 (smtp, pop3)와 같은 서비스를 실행시킬수는 없을것이다. telnet 같은 경우에는 아규먼트가 없이 실행되므로 my_inetd.c 의 코드로 문제없이 exec 시킬수 있으나, pop3, smtp 같은 경우에는 아규먼트를 필요로 하는경우가 있다. 그런데 우리의 코드는 이러한 것까지 지원하지는 않는다. 이것은 약간만 수정하면 지원하도록 할수 있으니 시간이 남으면 수정해 보도록 하자.

이 글은 스프링노트에서 작성되었습니다.

.

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Code/C/makedaemon

설명

프로세스를 데몬화 하는 간단한 프로그램이다. 데몬 프로세스에 대한 내용은 [http]Damon 프로세스에 대한 이해 를 참조하기 바란다.

인자로 mode가 주어지는데 이것은 데몬프로세스를 디버깅모드로 돌릴 것인지를 결정하기 위해서 사용한다. 만약 0이 아니라면 디버깅 모드로 작동하며 여러가지 메시지를 출력한다.

사용방법

int main()
{
makedaemon(debug);
}

코드

void makedaemon(int mode)
{
pid_t pid;
if ((pid = fork()) < 0)
exit(0);

else if (pid != 0)
exit(0);

if (mode == 0)
{
close(0);
close(1);
}
setsid();
}

이 글은 스프링노트에서 작성되었습니다.

.

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

아파치 rewrite rule 존재하지 않는 파일 403 forbidden 을 router.php 로.  (0) 2012.12.05
3. InetDaemon 만들기  (0) 2012.08.10
2. 데몬 프로세스 만들기  (0) 2012.08.10
1. 데몬 프로그램에 대한 소개  (0) 2012.08.10
RAID  (0) 2012.08.10
MIME 규격  (0) 2012.08.10

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/system_programing/process/daemon


Daemon 프로그램은 보통 telnet, httpd, mysql 과 같은 각종 서버를 background 상태에서 돌아가는 프로그램을 말한다. 그러나 background 프로그램과 Daemon 프로그램은 엄연한 차이가 있다.

일반적인 background 프로그램은 터미널을 가지지만, Daemon 프로그램은 터미널을 가지지 않는다.
왜냐하면 보통 데몬프로그램은 특별한 일이 없는한 사용자와 상호대화할 필요 없이 아무도 모르게 실행되어야 하기 때문이다.
또한 모든 데몬 프로그램은 PPID 즉 부모 프로세스가 1번으로 세팅되며, 이는 데몬 프로그램의 관리프로세스는 1번 pid 를 가지는 init 가 담당함을 의미한다.

[yundream@huhu loging_server]$ ./my_server
[yundream@huhu loging_server]$ ps -efjc
UID PID PPID PGID SID CLS PRI STIME TTY TIME CMD

yundream 4314 4219 4314 4175 - 30 15:36 ttyp0 00:00:00 ./my_server
[yundream@huhu loging_server]$ ./my_server -D
[yundream@huhu loging_server]$ ps -efjc
UID PID PPID PGID SID CLS PRI STIME TTY TIME CMD
yundream 4319 1 4319 4319 - 30 15:37 ? 00:00:00 ./my_server

위의 화면은 my_server 란 프로그램을 백그라운드 모드로 실행시켰을 경우와 -D 옵션을 줘서 데몬모드로 실행시켰을때의 ps 정보를 보여준다.

데몬 프로세스의 경우를 보면 알겠지만, PPID가 1로 세팅되어 있으며 TTY 즉 터미널을 가지지 않음을 알수 있다. 그래고 SID 역시 자신의 PID와 같다는것을 알수 있다.


그럼 이제 실질적으로 데몬 프로그램을 만들도록 해보자, 데몬 프로그램을 만드는 핵심은 바로위에서 설명한대로 터미널을 가지지 않으며 PPID가 1인 프로세스를 만드는 것으로 아래와 같은 코딩 규칙을 이용해서 작성가능하다.
1. 우선 fork 를 호출해서 자식프로세스를 생성시킨 다음 부모프로세스를 종료시킨다.
2. setsid 를 이용하여 새로운 세션을 만들고, 현재프로세스(자식)의 PID가 세션의 제어권을 가지도록 한다.
3. chdir 을 이용하여 프로세스가 루트디렉토리에서 작업을 수행하도록 변경시켜준다.

1번을 이해하려면 fork에 대한 이해가 필요한데, 기본적으로 부모프로세스가 자식프로세스를 fork 했을경우 해당 자식프로세스의 PPID 는 부모프로세스의 ID 가된다. 그런데 자식이 죽기전에 부모프로세스가 죽어버리면 자식프로세스의 PPID 는 (다시말해서 자식프로세스의 소유 프로세스) 누가될까 ?
부모 프로세스는 이미 죽었음으로 PPID가 될수 없을것이다.
이럴 경우 자동적으로 자식프로세스의 관리 프로세스는 PID 1 번인 init 가 담당하게 된다.

2번의 setsid 는 새로운 새션을 생성하기 위해서 사용한다. 보통 세션은 자신의 세션을 위한 tty 를 가져야 되는데, 새로운 세션을 생성하면 여기에 tty 를 부여해 주어야 한다. 그렇지 않게 될경우 터미널을 가지지 않은 세션이 생성되게 된다. 세션(Session)에 대한 논의는 다른 문서를 참고하기 바라고, 간단히 생각해서 세션이란 프로그램 그룹의 모음이라고 일단은 생각해주길 바란다.
어쨋든 이렇게 해서 프로세스는 자신만의 독자적인 길을 걷게 된다.

3번은 선택사항이다. 굳이 해주지 않아도 되지만, 데몬 프로그램에서 여러가지 파일을 읽고 쓰는 작업을 할때 상대경로를 명시함으로써 일어나는 혼동을 피하기 위해서 권장하는 방법이라고 생각하면 될것이다.

데몬프로세스의 위의 3가지 조건만 만족시켜주면 된다. 그럼 에제를 통해서 실제 데몬 프로그램을 만들어서 실행시키고, 그 결과를 확인해 보도록 하자.

예제 daemon.c

#include <sys/types.h> 
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>

int main()
{
pid_t pid;

if (( pid = fork()) < 0)
exit(0);

// 부모프로세스를 종료한다.
else if(pid != 0)
exit(0);

//setsid();
chdir("/");

// 여기에 프로그램 본체를 넣는다.
setsid();
while(1)
{
sleep(1);
}
}

아주아주 간단하게 데몬프로그램을 만들수 있음을 알수 있다.
이제 결과를 한번 확인해 보도록 하자

[yundream@localhost test]$ ./daemon
[yundream@localhost test]$ ps -efjc | grep daemon
UID PID PPID PGID SID CLS PRI STIME TTY TIME CMD
yundream 18710 1 18710 18710 - 30 23:42 ? 00:00:00 ./daemon

PPID가 1로 되어 있고 SID가 자신의 PID로 되어있으며 tty 를 가지지 않은 프로세스가 만들어졌음을 알수 있을것이다.
모든 프로그램에 위의 코드만 추가시켜주면 어렵지 않게 데몬프로그램을 제작할수 있을것이다.

이 글은 스프링노트에서 작성되었습니다.

.

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

3. InetDaemon 만들기  (0) 2012.08.10
2. 데몬 프로세스 만들기  (0) 2012.08.10
1. 데몬 프로그램에 대한 소개  (0) 2012.08.10
RAID  (0) 2012.08.10
MIME 규격  (0) 2012.08.10
트래픽 제한 (mod_throttle)  (0) 2012.08.10

 1. 리눅스에서 지원하는 소프트웨어 raid 레벨



1)raid-Linear : 간단히 여러개의 파티션을 하나로 묶는 역활

2)raid-0 : 여러개의 파티션을 하나로 묶어 스트라이핑기술을 이용하여 처리속도가 빨라진다.

디스크 오류에 대한 안전성은 없다는 단점

3)raid-1 : 미러링 기술을 이용하여 여러개의 디스크에 정확하게 복사본을 만들어 준다.

오류가 발생하면 복사해둔 이미지로 복구하게된다.

4)raid-3 : 패리티정보를 모아 별도의 디스크에 저장한다.이 패리티정보를 이용하여 오류가

발생한 디스크의 데이터를 복구한다. 안정성은 있으나 디스크성능이 감소한다.

5)raid-5 : raid -3 와 비슷하게 패리티정보를 이용하나 디스크에 저장하지는 않는다.

안전성도 제공하고 raid-3 에 비해 디스크의 성능저하가 일어나지 않는다.



2.RAID 관련 예제파일

1)레드햇 9.0 이후로는 /usr/share/doc/raidtools-1.00.3 디렉토리 밑에 예제가있다.

없을경우 rpm -ql raidtools 로 검색한다.



2)cp /usr/share/doc/raidtools-1.00.3/raidtab.sample /etc/raidtab

-> 해당 샘플파일을 /etc/raidtab 이란 화일로 복사한다.



3.raid - 0 구성하기



raid - 0 으로 구성해서 속도를 높이고 /raidtest 로 마운트시키려고 한다.

여유하드가없으므로 자체하드의 남은 공간을 1GB * 2 로 설정해본다.



1) FDISK 로 1GB 를 두개 추가로 나눈다. (FDISK 는 현 블로그 FDISK 참조)

2) 나눠진 파티션은 /dev/hda8 과 /dev/hda9 라고 예를 든다.

3) /etc/raidtab 열어 설정한다.

#vi /etc/raidtab

raiddev /dev/md0 //raid 디바이스명 지정

raid-level 0 //raid 레벨 지정

nr-raid-disks 2 //raid 갯수 지정

persistent-superblock 1 //기본셋팅지정

chunk-size 4



device /dev/hda8 //디바이스명

raid-disk 0 //raid 디스크 넘버로 0부터 설정

device /dev/hda9

raid-disk 1


4)raid device 를 생성

#mkraid /dev/md0

handling MD device /dev/md0

analyzing super-block

disk 0 : /dev/hda8, 875511KB, raid superblock at 875392KB

disk 1 : /dev/hda9, 875511KB, raid superblock at 875392KB

5)raid를 작동 시킨다.

#raidstart /dev/md0

->최근에는 mkraid 하면 자동으로 start가 이루어진다.또한 재부팅시에도 자동으로시작된다

6)파일시스템을 생성한다

#mkfs -t ext3 /dev/md0

7)마운트할 디렉토리 생성

#mkdir /raidtest

8)마운트

#mount -t ext3 /dev/md0 /raidtest

9)raid 상태 확인

#lsraid -p

이 글은 스프링노트에서 작성되었습니다.

.

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

2. 데몬 프로세스 만들기  (0) 2012.08.10
1. 데몬 프로그램에 대한 소개  (0) 2012.08.10
RAID  (0) 2012.08.10
MIME 규격  (0) 2012.08.10
트래픽 제한 (mod_throttle)  (0) 2012.08.10
트래픽 제한 (bandwidth)  (0) 2012.08.10


컨텐트 형식으로 본 MIME Type

Type/sub-type Extension
application/envoy evy
application/fractals fif
application/futuresplash spl
application/hta hta
application/internet-property-stream acx
application/mac-binhex40 hqx
application/msword doc
application/msword dot
application/octet-stream *
application/octet-stream bin
application/octet-stream class
application/octet-stream dms
application/octet-stream exe
application/octet-stream lha
application/octet-stream lzh
application/oda oda
application/olescript axs
application/pdf pdf
application/pics-rules prf
application/pkcs10 p10
application/pkix-crl crl
application/postscript ai
application/postscript eps
application/postscript ps
application/rtf rtf
application/set-payment-initiation setpay
application/set-registration-initiation setreg
application/vnd.ms-excel xla
application/vnd.ms-excel xlc
application/vnd.ms-excel xlm
application/vnd.ms-excel xls
application/vnd.ms-excel xlt
application/vnd.ms-excel xlw
application/vnd.ms-outlook msg
application/vnd.ms-pkicertstore sst
application/vnd.ms-pkiseccat cat
application/vnd.ms-pkistl stl
application/vnd.ms-powerpoint pot
application/vnd.ms-powerpoint pps
application/vnd.ms-powerpoint ppt
application/vnd.ms-project mpp
application/vnd.ms-works wcm
application/vnd.ms-works wdb
application/vnd.ms-works wks
application/vnd.ms-works wps
application/winhlp hlp
application/x-bcpio bcpio
application/x-cdf cdf
application/x-compress z
application/x-compressed tgz
application/x-cpio cpio
application/x-csh csh
application/x-director dcr
application/x-director dir
application/x-director dxr
application/x-dvi dvi
application/x-gtar gtar
application/x-gzip gz
application/x-hdf hdf
application/x-internet-signup ins
application/x-internet-signup isp
application/x-iphone iii
application/x-javascript js
application/x-latex latex
application/x-msaccess mdb
application/x-mscardfile crd
application/x-msclip clp
application/x-msdownload dll
application/x-msmediaview m13
application/x-msmediaview m14
application/x-msmediaview mvb
application/x-msmetafile wmf
application/x-msmoney mny
application/x-mspublisher pub
application/x-msschedule scd
application/x-msterminal trm
application/x-mswrite wri
application/x-netcdf cdf
application/x-netcdf nc
application/x-perfmon pma
application/x-perfmon pmc
application/x-perfmon pml
application/x-perfmon pmr
application/x-perfmon pmw
application/x-pkcs12 p12
application/x-pkcs12 pfx
application/x-pkcs7-certificates p7b
application/x-pkcs7-certificates spc
application/x-pkcs7-certreqresp p7r
application/x-pkcs7-mime p7c
application/x-pkcs7-mime p7m
application/x-pkcs7-signature p7s
application/x-sh sh
application/x-shar shar
application/x-shockwave-flash swf
application/x-stuffit sit
application/x-sv4cpio sv4cpio
application/x-sv4crc sv4crc
application/x-tar tar
application/x-tcl tcl
application/x-tex tex
application/x-texinfo texi
application/x-texinfo texinfo
application/x-troff roff
application/x-troff t
application/x-troff tr
application/x-troff-man man
application/x-troff-me me
application/x-troff-ms ms
application/x-ustar ustar
application/x-wais-source src
application/x-x509-ca-cert cer
application/x-x509-ca-cert crt
application/x-x509-ca-cert der
application/ynd.ms-pkipko pko
application/zip zip
audio/basic au
audio/basic snd
audio/mid mid
audio/mid rmi
audio/mpeg mp3
audio/x-aiff aif
audio/x-aiff aifc
audio/x-aiff aiff
audio/x-mpegurl m3u
audio/x-pn-realaudio ra
audio/x-pn-realaudio ram
audio/x-wav wav
image/bmp bmp
image/cis-cod cod
image/gif gif
image/ief ief
image/jpeg jpe
image/jpeg jpeg
image/jpeg jpg
image/pipeg jfif
image/svg+xml svg
image/tiff tif
image/tiff tiff
image/x-cmu-raster ras
image/x-cmx cmx
image/x-icon ico
image/x-portable-anymap pnm
image/x-portable-bitmap pbm
image/x-portable-graymap pgm
image/x-portable-pixmap ppm
image/x-rgb rgb
image/x-xbitmap xbm
image/x-xpixmap xpm
image/x-xwindowdump xwd
message/rfc822 mht
message/rfc822 mhtml
message/rfc822 nws
text/css css
text/h323 323
text/html htm
text/html html
text/html stm
text/iuls uls
text/plain bas
text/plain c
text/plain h
text/plain txt
text/richtext rtx
text/scriptlet sct
text/tab-separated-values tsv
text/webviewhtml htt
text/x-component htc
text/x-setext etx
text/x-vcard vcf
video/mpeg mp2
video/mpeg mpa
video/mpeg mpe
video/mpeg mpeg
video/mpeg mpg
video/mpeg mpv2
video/quicktime mov
video/quicktime qt
video/x-la-asf lsf
video/x-la-asf lsx
video/x-ms-asf asf
video/x-ms-asf asr
video/x-ms-asf asx
video/x-msvideo avi
video/x-sgi-movie movie
x-world/x-vrml flr
x-world/x-vrml vrml
x-world/x-vrml wrl
x-world/x-vrml wrz
x-world/x-vrml xaf
x-world/x-vrml xof



파일 확장자로 본 Mime Types

Extension Type/sub-type
  application/octet-stream
323 text/h323
acx application/internet-property-stream
ai application/postscript
aif audio/x-aiff
aifc audio/x-aiff
aiff audio/x-aiff
asf video/x-ms-asf
asr video/x-ms-asf
asx video/x-ms-asf
au audio/basic
avi video/x-msvideo
axs application/olescript
bas text/plain
bcpio application/x-bcpio
bin application/octet-stream
bmp image/bmp
c text/plain
cat application/vnd.ms-pkiseccat
cdf application/x-cdf
cer application/x-x509-ca-cert
class application/octet-stream
clp application/x-msclip
cmx image/x-cmx
cod image/cis-cod
cpio application/x-cpio
crd application/x-mscardfile
crl application/pkix-crl
crt application/x-x509-ca-cert
csh application/x-csh
css text/css
dcr application/x-director
der application/x-x509-ca-cert
dir application/x-director
dll application/x-msdownload
dms application/octet-stream
doc application/msword
dot application/msword
dvi application/x-dvi
dxr application/x-director
eps application/postscript
etx text/x-setext
evy application/envoy
exe application/octet-stream
fif application/fractals
flr x-world/x-vrml
gif image/gif
gtar application/x-gtar
gz application/x-gzip
h text/plain
hdf application/x-hdf
hlp application/winhlp
hqx application/mac-binhex40
hta application/hta
htc text/x-component
htm text/html
html text/html
htt text/webviewhtml
ico image/x-icon
ief image/ief
iii application/x-iphone
ins application/x-internet-signup
isp application/x-internet-signup
jfif image/pipeg
jpe image/jpeg
jpeg image/jpeg
jpg image/jpeg
js application/x-javascript
latex application/x-latex
lha application/octet-stream
lsf video/x-la-asf
lsx video/x-la-asf
lzh application/octet-stream
m13 application/x-msmediaview
m14 application/x-msmediaview
m3u audio/x-mpegurl
man application/x-troff-man
mdb application/x-msaccess
me application/x-troff-me
mht message/rfc822
mhtml message/rfc822
mid audio/mid
mny application/x-msmoney
mov video/quicktime
movie video/x-sgi-movie
mp2 video/mpeg
mp3 audio/mpeg
mpa video/mpeg
mpe video/mpeg
mpeg video/mpeg
mpg video/mpeg
mpp application/vnd.ms-project
mpv2 video/mpeg
ms application/x-troff-ms
mvb application/x-msmediaview
nws message/rfc822
oda application/oda
p10 application/pkcs10
p12 application/x-pkcs12
p7b application/x-pkcs7-certificates
p7c application/x-pkcs7-mime
p7m application/x-pkcs7-mime
p7r application/x-pkcs7-certreqresp
p7s application/x-pkcs7-signature
pbm image/x-portable-bitmap
pdf application/pdf
pfx application/x-pkcs12
pgm image/x-portable-graymap
pko application/ynd.ms-pkipko
pma application/x-perfmon
pmc application/x-perfmon
pml application/x-perfmon
pmr application/x-perfmon
pmw application/x-perfmon
pnm image/x-portable-anymap
pot, application/vnd.ms-powerpoint
ppm image/x-portable-pixmap
pps application/vnd.ms-powerpoint
ppt application/vnd.ms-powerpoint
prf application/pics-rules
ps application/postscript
pub application/x-mspublisher
qt video/quicktime
ra audio/x-pn-realaudio
ram audio/x-pn-realaudio
ras image/x-cmu-raster
rgb image/x-rgb
rmi audio/mid
roff application/x-troff
rtf application/rtf
rtx text/richtext
scd application/x-msschedule
sct text/scriptlet
setpay application/set-payment-initiation
setreg application/set-registration-initiation
sh application/x-sh
shar application/x-shar
sit application/x-stuffit
snd audio/basic
spc application/x-pkcs7-certificates
spl application/futuresplash
src application/x-wais-source
sst application/vnd.ms-pkicertstore
stl application/vnd.ms-pkistl
stm text/html
svg image/svg+xml
sv4cpio application/x-sv4cpio
sv4crc application/x-sv4crc
swf application/x-shockwave-flash
t application/x-troff
tar application/x-tar
tcl application/x-tcl
tex application/x-tex
texi application/x-texinfo
texinfo application/x-texinfo
tgz application/x-compressed
tif image/tiff
tiff image/tiff
tr application/x-troff
trm application/x-msterminal
tsv text/tab-separated-values
txt text/plain
uls text/iuls
ustar application/x-ustar
vcf text/x-vcard
vrml x-world/x-vrml
wav audio/x-wav
wcm application/vnd.ms-works
wdb application/vnd.ms-works
wks application/vnd.ms-works
wmf application/x-msmetafile
wps application/vnd.ms-works
wri application/x-mswrite
wrl x-world/x-vrml
wrz x-world/x-vrml
xaf x-world/x-vrml
xbm image/x-xbitmap
xla application/vnd.ms-excel
xlc application/vnd.ms-excel
xlm application/vnd.ms-excel
xls application/vnd.ms-excel
xlt application/vnd.ms-excel
xlw application/vnd.ms-excel
xof x-world/x-vrml
xpm image/x-xpixmap
xwd image/x-xwindowdump
z application/x-compress
zip application/zip


이 글은 스프링노트에서 작성되었습니다.

.

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

1. 데몬 프로그램에 대한 소개  (0) 2012.08.10
RAID  (0) 2012.08.10
MIME 규격  (0) 2012.08.10
트래픽 제한 (mod_throttle)  (0) 2012.08.10
트래픽 제한 (bandwidth)  (0) 2012.08.10
웹 DOS 공격 막기  (0) 2012.08.10

 mod_throttle

우아..이놈때문에 고생을 하두 많이해서..ㅠㅠ
이놈은 접속자가 많은 사이트에서는 쥐약이다. 프로세스 수가 이유없이 증가한다.
무슨 이유인지는 모른다. 여튼 접속자가 많은곳에서는 사용 금지!!
  이놈은 사용량을 제한 하는 것 보다는, 어느정도 사용하는지 확인 하는 정도로 사용할 것이다.


0. 아파치의 추가 모듈들을 정리해서 올릴것이다.
이놈들은 아파치 정식 모듈이 아니니.. DSO모드로 올렸다가. 이상하면 내린다.^^;


1. 가상 호스트 별 접속량 제한 (mod_throttle) 1.3.X 에만 사용가능
(1) 개념
   가상 호스트별로 접속량을 기록하여, 일정량 이상이 되면, 접속 못하게 하는
  모듈인데... 정확한 개념은 모르겠당.^^;
 

(2) 설치
   - 먼저 모듈을 구한다. 어디서 ?? 개발자 사이트에서

     http://snert.com/Software/mod_throttle/index.shtml

   - 근데... 멀리갈필요 있남^^; 받아 두었는걸.~
    http://ftp.superuser.co.kr/pub/etc/mod_throttle312.tgz

   - 설치
tar xvfz mod_throttle312.tgz
rm -rf mod_throttle312.tgz
cd mod_throttle-3.1.2

    /usr/local/apache/bin/apxs -i -a -c mod_throttle.c
 
   ## 옵션 설명.
      -i : 라이브러리 디렉토리에 so 파일 복사하라는 옵션
      -a : httpd.conf 파일에 LoadModule 설정을 하라는 옵션
      -c : 컴파일 하라는 옵션

(3) 설정
    - httpd.conf 파일을 열어서 다음과 같이 설정한다.

## 사용자별 트래픽 모니터링 하기 위한 모듈을 로드한다. (접속자 많을때는 하지말것)
LoadModule throttle_module    libexec/mod_throttle.so

#예) 전체 설정을 1일 300G 로 한다면, 아래와같다.
#ThrottlePolicy Volume 300G 1d // 1일 300 M 로 제한

          # 전체적인 상황을 보는 페이지
   
Order deny,allow
Deny from all
## 특정 ip만 열어준다.
Allow from 61.78.240.22 210.114.223.150
SetHandler throttle-status
 

  ## 사용자 자신의 접속량 점검
 
SetHandler throttle-me
 
 
SetHandler throttle-me
 
         ## 통계결과를 3초에 한번씩 갱신하여 보여준다.((기본은 60)
ThrottleRefresh 10
## 접속하는 ip들을 1000개 까지 보여주면 통계를 구하기 위해 제한을 두지 않았다.
ThrottleClientIP 1000 none
## 아이피/~doly 으로 접속을 10초에 10번으로 제한하였다.
ThrottleUser doly Request 10 10

       
## 정책들
None : 아무 정책이 없고, 단지 모니터링 용도로 사용할때 사용
Concurrent : 동시접속수를 제한하기위한 것인데.. 별루당
              (ThrottleClientIP, ThrottleRemoteUser와 같이 쓸수 없다.)
Document 요청제한수 기간 : Request와 비슷 단, html 형식의 문서만 카운트 한다.(그림파일 제외)
Idle 쉬는시간 기간 : 요청간에 쉬는 시간을 준다?? 왜???

이 글은 스프링노트에서 작성되었습니다.

.

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

RAID  (0) 2012.08.10
MIME 규격  (0) 2012.08.10
트래픽 제한 (mod_throttle)  (0) 2012.08.10
트래픽 제한 (bandwidth)  (0) 2012.08.10
웹 DOS 공격 막기  (0) 2012.08.10
압축전송  (0) 2012.08.10

 아파치에 접속하는 사용자들의 대역폭을 제한한다. mod_throttle 와 비슷하지만, 용도가 다르다.
이놈들은 아파치 정식 모듈이 아니니.. DSO모드로 올렸다가. 이상하면 내린다.^^;

1. 개념
  한 접속당 일정양(Byte/Sec)을 정해 놓고, 그 양이 넘으면 delay 시켜 일정한 트래픽을 유지한다.

2. 설치
  (1) 먼저 모듈을 구한다. 어디서 ?? 개발자 사이트에서
     http://www.cohprog.com/v3/bandwidth/intro-en.html
   
     wget ftp://ftp.cohprog.com/pub/apache/module/1.3.0/mod_bandwidth.c
  (2) 컴파일 및 설치 (apxs 를 사용하여 한방에 끝낸다.)
     /usr/local/apache/bin/apxs -i -a -c mod_bandwidth.c
     ## 옵션 설명.
      -i : 라이브러리 디렉토리에 so 파일 복사하라는 옵션
      -a : httpd.conf 파일에 LoadModule 설정을 하라는 옵션
      -c : 컴파일 하라는 옵션

3. 설정
  (1) httpd.conf 파일을 열어서 다음과 같이 설정한다.

## 1인 트래픽 제한 모듈 로딩.
LoadModule bandwidth_module   libexec/mod_bandwidth.so

  아파치가 실행할때의 사용자권한(nobody 또는 apache )으로 읽기,쓰기,실행권한이 있는 디렉토리가 있어야 한다.
  기본적으로 /tmp/apachebw , /tmp/apachebw/link , /tmp/apachebw/master 이렇게 생성한다.
  변경하려면 BandWidthDataDir 지시자를 이용한다.
  (위 디렉토리에 문제가 있으면 error로그 파일에 남기고 ,기능은 비활성화 된다.)


지시자:
* BandWidth 에서 사용할 임시 디렉토리 지정 (기본:/tmp/apachebw)
BandWidthDataDir 디렉토리:
  Context : server

* BandWidthModule 사용 여부 (기본 Off)
BandWidthModule On 또는 Off
  Context : server,
가상호스트 안에 사용할경우 가상호스트 마다 BandWidthModule On 설정을 하여야 하며,
  지시자 안에 넣을때는 따로 넣어주지 않아도 된다.

* BandWidth 에서 지연할 시간 설정 (microsecond 단위)
BandWidthPulse
  Context : server
  예전에는 지연시간이 1초로 고정되어 있었다. 이 말은 512Bit/sec 라면. 1KBit 를 보내려면,
  1KBit을 보낸후에 2초 기다린후 512Bit 을 보냈다. 그렇지만, "BandWidthPluse 1000000" (1초)를 설정하면,
  512Bit을 보내고 1초 기다린후 512Bit을 보낸다.
   이 값을 설정하면, 보다 부드럽게 제한하면서 보낼수 있다. 설정값을 (1/5 초) 이상 사용하길 권장한다.
  장점 : 부드럽게 트래픽을 제한할 수 있다.
  단점 : 패킷의 양이 많아지며, 값이 적을수록 서버에 부하를 많이 준다.

* BandWidth 를 통한 대역폭 제한
BandWidth 
  Context : Directory
  domain,ip등은 접속하는 사용자의 ip및 도메인이다. ip 는 넷마스크를 적용할 수 있다.
  rate : 바이트 단위 초당 대역폭, 0은 제한을 두지 않음.

* 큰 파일만 대역폭 제한
LargeFileLimit 
  Context : Directory
  filesize : filesize 는 파일크기(KByte)이 파일 크기 이상에멘 rate 적용
  rate : 바이트 단위 초당 대역폭(Byte/Sec), 0은 무제한

* 최대 연결수 제한 (기본 0 제한없음)
MaxConnection
  Context : Directory
  동시연결수가 connections 이상이면 연결을 거부한다.
  (가상 호스트별 최대 동시 연결수 제한에 좋을것 같음^^;)

* 최소 대역폭 설정 (기본 255Byte/Sec , 0을 설정해도 255 이다., -1을 넣으면 최소대역폭은 0이 된다.)
MinBandWidth 
(BandWidth, LargeFileLimit 보다 우선한다.)


예))  가상호스트 속에 들어간다.
BandWidthModule On
## 50M 넘는 파일은 100KByte/Sec 으로 제한 한다.
LargeFileLimit 51200 102400
## 동시에 5개의 접속을 허용한다.
MaxConnection 5


((주의))
mkdir -p /tmp/apachebw/master/
mkdir -p /tmp/apachebw/link
chown -R nobody:nobody /tmp/apachebw

이렇게 만들어주어야 한다. 그렇지 않으면 작동하지 않으면서 error 로그에 로그를 남긴다.

이 글은 스프링노트에서 작성되었습니다.

.

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

MIME 규격  (0) 2012.08.10
트래픽 제한 (mod_throttle)  (0) 2012.08.10
트래픽 제한 (bandwidth)  (0) 2012.08.10
웹 DOS 공격 막기  (0) 2012.08.10
압축전송  (0) 2012.08.10
아파치 보안  (0) 2012.08.10

 문제?
  특정 IP에서 너무 많은 접속이 일어난다?? 비정상적인것 같은데... 어떻게 해결을 할까?
 DOS공격인것 같은데..

해결책!
 1. iptables 를 이용한 방법
 iptables를 이용하시는것이 근본적이고 효과적 이다.  iptables의 connlimit 모듈을 이용한다.


 iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 -j DROP

   한 IP에서 50개의 연결이 있으면 그 IP를 차단한다.!! 영원히~~ flush 시키기 전까지는.. 캑.ㅠㅠ

 2. mod_dosevasive 모듈 사용.
  아파치에 올려서 사용하고, 일반적으로 많이 알려져 있지만, 문제점은,
 접속자가 많은 사이트에 올려두면, 서버가 견디지 못해 아파치까지 죽어버리는 현상이 발생한다.


다른 것...
1. 어떤놈이 접속을 많이 해 있나??
  netstat -an | grep "=>80" | awk -F: '{print $8}' | sort | uniq -c

위와같이 하면, ... 접속 ip와 .. 접속한 수까지 나온다..^^; 대충 이렇게 통계값을 얻은 다음 위 50이라는 수를 유도적으로 변경한다.!!

나는.... RHEL 4를 사용했다... 위와같이 했더니 안된다...
에러는 즉...
=======================================
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 -j DROP
iptables: No chain/target/match by that name
=======================================



http://ftp.fi.muni.cz/pub/linux/people/milan_kerslager/RHEL-4/stable/
위 사이트에서 패치를 받아 설치하면^^; OKey~

이유는... 모듈이 올라가 있지 않아서 이람스..ㅠㅠ

이 글은 스프링노트에서 작성되었습니다.

.

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

트래픽 제한 (mod_throttle)  (0) 2012.08.10
트래픽 제한 (bandwidth)  (0) 2012.08.10
웹 DOS 공격 막기  (0) 2012.08.10
압축전송  (0) 2012.08.10
아파치 보안  (0) 2012.08.10
아파치 로그 자동백업  (0) 2012.08.10

+ Recent posts

티스토리 툴바