참고 사이트

blog.naver.com/ncloud24/221598779041

idchowto.com/?p=41533

 

 

Mod_cband란?

 

Apache 사이트 상에서 VirtualHost의 접속량 및 트래픽 량을 체크 및 해당 VirtualHost를 통해

어떤 아이피가 접속하였는지 여부 확인 등을 진행하거나 해당 기록을 통해 사이트에 제한을 주는 용도로 사용되는 Apache의 Module입니다. Apache1에서는 mod_throttle를 사용합니다.

 

기능

* apache2 용 트래픽 제한 모듈

* 사용자별 대역폭 제한

* 가상호스트별 대역폭 제한

* 목적지별 대역폭 제한

* 다운로드 속도 제한

* 아이피대역별 제한

* 초당 요청수 제한

* 모니터링 또는 결과를 웹페이지에서 확인 가능

 

등 이정도가 있다고 볼수 있습니다.

 

Mod_cband 설치

 

# cd /usr/local/src

# wget https://fossies.org/linux/www/apache_httpd_modules/old/mod-cband-0.9.7.5.tgz

# tar zxvf mod-cband-0.9.7.5.tgz

# cd mod-cband-0.9.7.5

# ./configure --with-apxs=/usr/local/apache/bin/apxs

# make -j 8

 

make를 하면 오류가 나온다.

Make 도중 Error

 

src/mod_cband.c: In function 'mod_cband_get_dst':

src/mod_cband.c:1333:47: error: 'conn_rec' has no member named 'remote_ip'

     p.add.sin.s_addr = inet_addr(r->connection->remote_ip);

                                               ^

src/mod_cband.c: In function 'mod_cband_get_remote_host':

src/mod_cband.c:1362:10: error: 'struct conn_rec' has no member named 'remote_ip'

     if (c->remote_ip != NULL)

          ^

src/mod_cband.c:1363:20: error: 'struct conn_rec' has no member named 'remote_ip'

  addr = inet_addr(c->remote_ip);    

                    ^

src/mod_cband.c:1365:10: error: 'struct conn_rec' has no member named 'remote_addr'

  addr = c->remote_addr->sa.sin.sin_addr.s_addr;

          ^

src/mod_cband.c: In function 'mod_cband_update_speed':

src/mod_cband.c:1905:19: warning: variable 'time_last_request' set but not used [-Wunused-but-set-variable]

     unsigned long time_last_request;

                   ^

src/mod_cband.c: In function 'mod_cband_check_connections_speed':

src/mod_cband.c:2963:19: warning: variable 'time_now' set but not used [-Wunused-but-set-variable]

     unsigned long time_now;

                   ^

apxs:Error: Command failed with rc=65536

make: *** [src/.libs/mod_cband.so] 오류 1

# ll /usr/local/src/mod-cband-0.9.7.5/src/

-rw------- 1 root root 115749 11월 15  2006 mod_cband.c

 

# vi /usr/local/src/mod-cband-0.9.7.5/src/mod_cband.c

 

1333 번 라인 remote_ip -> client_ip

1342 번 라인 remote_ip -> client_ip

1362 번 라인 remote_ip -> client_ip

1363 번 라인 remote_ip -> client_ip

1365 번 라인 remote_addr -> client_addr

 

remote가 써있는 부분을 client를 바꿔줘야 한다.

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

# make install

# chmod 755 /usr/local/apache/modules/mod_cband.so

 

# vi /usr/local/apache/conf/httpd.conf

 

LoadModule cband_module modules/mod_cband.so

이렇게 모듈이 추가되어 있습니다.

맨 아래 하단에 설정 값 입력

<IfModule mod_cband.c>

 

 <Location /cband-status-me>

 SetHandler cband-status-me

 </Location>

 

 <Location /~*/cband-status-me>

 SetHandler cband-status-me

 </Location>

 

 <Location /cband-status>

 SetHandler cband-status

 Order deny,allow

 #Deny from all 

 #Allow from 접속을 허용할 IP

 Allow from all

 </Location>

</IfModule>

 

여기서 Allow from all 로 설정해놓고 확인할려면 #Deny from all를 주석을 풀고  Allow from all 를 주석을 해준다음 접속을 허용할 IP를 설정해준다.

 

# vi /usr/local/apache/conf/extra/httpd-vhosts.conf

 

<VirtualHost *>

 ServerAlias 도메인.tk

 ServerName  IP등록

 DocumentRoot /usr/local/apache/htdocs

 CBandLimit 100Mi

 CBandPeriod 1D

 CBandSpeed 1024 10 30

 CBandRemoteSpeed 20kb/s 3 30

 CBandExceededURL http://www.도메인.tk/traffic_exceeded.html

</VirtualHost>

 

위 설정은 도메인.tk에 하루에 100M의 트래픽을 설정, 100M를 초과시 CBandExceededURL에서 지정된 페이지가 뜨며, 지정하지 않았다면, 503 에러 페이지가 뜨게됩니다.

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

속도를 1024kbps 로 제한, 초당 10번 연결, 동시접속자를 30으로 제한

 

# /usr/local/apache/bin/apachectl -t

# systemctl restart apachectl

 

# vi /usr/local/apache/conf/extra/httpd-vhosts.conf

 

cband 단위 & 설정 설명

 

단위

 

전송 속도 단위

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

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

기본 값 : kbps

 

트래픽 제한 단위

K, M, G - bytes, 의미: 1000, 1000*1000, 1000*1000*1000 bytes 

Ki, Mi, Gi - bytes, 의미: 1024, 1024*1024, 1024*1024*1024 bytes 

기본 값: K

 

시간 단위 S, M, H, D, W - 초, 분, 시간, 일, 주. 의미: 1, 60, 3600, 86400, 604800 Seconds 

기본 값 : S

 

설정

 

     * 이름 : 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_connect]

            kbps - 초당 최대 전송속도

            rps - 초당 최대 요청수

            max_conn - 최대 동시 접속수

        예제: CBandRemoteSpeed 20kb/s 3 3

            호스트 접속자(ip)에 대해 1024kbps 전송속도로 제한하며,

            초당 10 개의 요청을 처리하고, 동시 접속을 30 개로 제한

 

      * 이름 : 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)

 

      * 이름 : CBandDefaultExceededURL

         설명 : 트래픽 제한을 초과했을때보여줄 URL (지정하지 않으면, 503 에러 페이지)

         설정시 :CBandDefaultExceededURL URL

 

      * 이름 : 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>

 

설정하는방법

 

<CBandUser 유저이름>

CBandUserLimit 100Mi

CBandUserPeriod 1D

</CBandUser>

 

<VirtualHost *>

ServerName test.com

Document /home/test/public_html

CBandUser 유저이름

</VirtualHost>

 

<VirtualHost *>

ServerName test1.kr

Document /home/test/public_html2

CBandUser 유저이름

</VirtualHost>

 

     * 이름 : 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 이렇게 나눠 처리 된다.

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

관리자모드 - https://도메인/cband-status

관리자모드(xml) - http://도메인/cband-status?xml

사용자모드 - http://도메인/cband-me

사용자모드(xml) - http://도메인/cband-status-me?xml

 

http://도메인/cband-status 접속

 

위에 나온 사진 표의 대한 내용

 

Virtual hosts

Virtual host name : 자신이 설정한 VHost 목록

reset all/reset : 모든 vhost에 대한 기록을 리셋/해당 vhost에 대한 기록을 리셋

time to refresh : 해당 시간이 지나면 갱신

Total Limit/Slice/Used : 해당 vhost의 트래픽 제한 / 나눈 기간에 따른 트래픽 / 지정된 기간동안의 트래픽 사용량

Class 0 Limit/Slice/Used : 해당 IP범위에 대한 트래픽 제한 / 나눈 기간에 따른 트래픽 / 해당 IP범위에서 사용된 트래픽

Class 1 Limit/Slice/Used : 해당 IP범위에 대한 트래픽 제한 / 나눈 기간에 따른 트래픽 / 해당 IP범위에서 사용된 트래픽

Class 2 Limit/Slice/Used : 해당 IP범위에 대한 트래픽 제한 / 나눈 기간에 따른 트래픽 / 해당 IP범위에서 사용된 트래픽

kbps Limit/Current : 초당 최대 전송 속도 / 측정된 전송 속도

rps Limit/Current : 초당 최대 요청수 / 측정된 요청 수

Connections Limit/Current : 최대 동시 접속자 수 / 현재 동시 접속자 수

user : 지정된 유저

 

Remote Client

Remote IP : 접속자 IP 주소

Virtualhost : 접속한 vhost 명

Connections Limit/Current : 해당 IP에 대한 접속자 수 제한 / 해당 IP의 접속자 수

Last speed/conn [kbps] : 마지막 접속자의 속도

 

Server summary

Server uptime : 서버의 가동 시간

Total virtualhosts : 총 vhost의 개수

Total users : 총 user 수

Total connections : 총 커넥션의 수

Total traffic : 총 트래픽

Current speed : 측정된 속도

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

통계화면에 아파치 인증 걸기

 

통계화면의 제한은 IP의 형태로 제한을 하는게 좋습니다

그러나 IP가 자주 변경되는 분들은 매번 IP를 변경해주는것도 하나의 일이 될 수 있습니다.

따라서 이런 경우에는 아파치 인증을 걸어서 사용하시면 편리할 것입니다.

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

# vi /etc/httpd/conf/httpd.conf

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

<IfModule mod_cband.c>

 

  <Location /cband-status-me>

   SetHandler cband-status-me

   Order deny,allow

   Deny from all

   Allow from all

  </Location>

 

  <Location /~*/cband-status-me>

   SetHandler cband-status-me

   Order deny,allow

   Deny from all

   Allow from all

  </Location>

 

  <Location /cband-status>

   SetHandler cband-status

   AuthName "Traffic Adminstrator Page"

   AuthType Basic

   AuthUserFile /usr/local/apache/htdocs/.htpasswd

   require valid-user

 

   #Order deny,allow

   #Deny from all 

   #Allow from 접속을 허용할 IP

   #Allow from all

  </Location>

 

</IfModule>

 

 

이렇게 변경해준다.

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

 

htaccess 파일생성하기

 

# vi /usr/local/apache/htdocs/.htaccess

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

  AuthName "login"

  AuthType Basic

  AuthUserFile /usr/local/apache/htdocs/.htpasswd

  AuthGroupFile /dev/null

  require valid-user

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

AuthName                  //인증창 이름

AuthType                    //인증타입으로 보통 Basic 입력

AuthUserFile             //인증패스워드를 기록할 파일명

AuthGroupFile          //그룹인증을 위한 파일명

                                           예제에서는 /dev/null 을 입력하여 그룹인증을 하지 않는 상태

require                         //valid-user 를 입력하여 인증된 사용자만 접속하도록 설정

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

.htpasswd 파일 생성 (처음 계정생성시)

cd /usr/local/apache/htdocs/

htpasswd -c /usr/local/apache/htdocs/.htpasswd [생성할 아이디 입력]

New password: [비밀번호 입력]

Re-type new password: [비밀번호 입력]

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

.htpasswd 파일 생성 (처음 생성이후 새로운 사용자를 추가할 경우)

 

htpasswd -c /usr/local/apache/htdocs/.htpasswd [생성할 아이디 입력]

New password: [비밀번호 입력]

Re-type new password: [비밀번호 입력]

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

'WEB&WAS > Apahce' 카테고리의 다른 글

Apache 기본페이지 설정 및 디렉토리 리스팅 설정  (0) 2022.02.18
Apache mod_url 설정  (0) 2022.01.09
Alma Linux 8 apache 소스설치  (0) 2021.04.22
Oracle Linux8 apache 소스설치  (0) 2021.04.13
buypass_SSL인증서  (0) 2021.01.15
Posted by returnrisk
,