강좌
클라우드/리눅스에 관한 강좌입니다.
해킹&보안 분류

CBQ를 이용한 QoS 구현

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

CBQ를 이용한 QoS 구현

 

모든 트래픽이 방화벽을 통과한다는 점을 이용한다면 패킷 필터링 외에도 여러 가지로 활용 방안이 있을 수 있는데, 이를테면 일부 공유기에서도 제공되는 기능으로 트래픽을 완전히 차단하거나 완전히 허용하지 않고 허용은 하되 일정정도 제한을 두어 그 이상으로는 허용하지 않도록 할 수 있을 것이다.

 

 

 

 

특히 IP별로 또는 프로토콜별로 정상적인 tcp, udp, icmp의 비율을 지정하거나 각 포트별 트래픽을 제한하여 일정정도 이상을 허용하지 않도록 할 수도 있다.

 

 

 

 

이는 QoS를 이용하면 쉽게 구현할 수 있는데, 아래와 같은 네트워크 구조라고 가정하고 구현 방도에 대해 살펴보도록 하자.

 

bb9ee6900e6224e7ab9290bfb5315a1d_1708061766_3411.png
[그림] 일반적인 사무실의 네트워크구조 

 

브리지나 NAT 방화벽을 이용할 때 패킷 필터링이 아닌 QoS 기능을 활용하여 특정 서비스의 트래픽 대역폭을 제한할 수 있다.

 

 

 

 

다른 장비도 마찬가지이지만 리눅스에서 네트워크 디바이스를 통하여 보내야 할 패킷들이 있을 때, 커널은 어떤 트래픽을 먼저 보내고, 어떤 트래픽을 지연(delay)시키거나 드롭(drop)할 것인지 선택하게 된다.

 

 

 

 

QoS"서비스의 질(Quality of Service)"이라는 말 그대로 제한된 대역폭 안에서 프로토콜이나 응용프로그램 또는 IP에 따라 적절한 대역폭을 할당해서 최고의 서비스 질을 이끌어내는 기술인데, 여러 스케줄링 알고리즘 중에서 쉬우면서도 다양한 기능을 제공하는 CBQ(Class Based Queueing)를 이용하는 방법에 대해 알아보도록 하자. CBQ를 사용하려면 먼저 커널에서 이 기능을 제공하여야 하는데, 이는 간단히 "Networking options ---> QoS and/or fair queueing --->[*] QoS and/or fair queueing" 및 이하의 메뉴를 모두 선택한 후 커널을 재컴파일 하여 적용하면 된다.

 

아울러 별도의 유저레벨 툴인 iproute2+tc 패키지를 설치하여야 하는데

이는 http://rpmfind.net에서 iproute2로 검색하여 다운로드 할 수 있다.

 

 

 

 

 

또는 http://developer.osdl.org/dev/iproute2/에서 직접 소스파일을 다운로드해도 된다.

 

이후에 CLI(Command Line Interface) 상에서 직접 트래픽 제어 정책에 따라 룰을 설정하여 사용할 수 있는데, 이 룰이나 문법이 생소하고 직관적이지 않아 어려우므로 쉽게 설정하거나 변경이 가능한 cbq.init라는 것을 이용하는 것이 좋다.

 

 

 

 

이 스크립트를 이용하면 간단한 설정파일을 만드는 것만으로도 원하는 대역폭 및 속도 제어가 가능하게 된다.

cbq.init project 홈페이지는 http://sourceforge.net/projects/cbqinit이며 스크립트도 사이트에서 직접 다운로드 가능하다.

 

 

 

 

다운로드 받은 스크립트 파일을 /etc/rc.d/init.d/ 디렉토리에 cbq.init 파일로 저장해 둔다.

 

 

 

 

그리고 설정파일은 /etc/sysconfig/cbq/ 디렉토리에

cbq-500.router-client와 같은 형식으로 생성하면 된다.

 

 

 

 

 

bb9ee6900e6224e7ab9290bfb5315a1d_1708061798_8936.png
 

[그림] cbqinit 홈페이지

 

설정파일은 설정을 원하는 룰만큼 여러 개 생성할 있으며 파일의 형식은

cbq-<clsid>.<name>와 같이 설정하면 되는데, 여기에서 classid16진수로 0002부터 FFFF까지의 값인데, 통상적으로 트래픽으로 사용할 대역폭의 값을 지정하면 된다.

 

 

 

 

그리고 name은 설정파일에 대한 간단한 설명을 지정하면 된다.

 

 

 

 

설정파일에서 지정하는 제어 형식을 간단히 살펴보면 다음과 같다.

 

 

 

 

 

 

형식 : DEVICE=<ifname>,<bandwidth>[,<weight>]

: DEVICE=eth1,100Mbit,10Mbit

 

<ifname>은 트래픽을 제어할 인터페이스 이름이다.

 

 

 

 

앞의 그림과 같이 라우터 쪽은 eth0이 연결되어있고 내부 스위치 쪽으로는 eth1이 연결되어 있는데 트래픽은 나가는 인터페이스를 기준으로 설정이 가능하다는 점에 유의하기 바란다.

 

 

 

 

, 내부에서 다운로드에 대한 트래픽을 제어하려면 eth1, 업로드 관련 트래픽을 제어하려면 eth0을 지정하면 된다.

 

<bandwidth>는 트래픽을 제어할 물리적 대역폭이다.

 

 

 

 

대부분 이더넷 환경이므로 10Mbit 혹은 100Mbit로 지정하면 된다.

 

 

 

 

 

 

<weight><bandwidth>에 비례하는 파라미터로서 간단히 다음과 같이 <weight> = <bandwidth> / 10으로 계산하여 설정하면 된다.

 

 

 

 

 

 

형식 : RATE=<speed>

: RATE=5Mbit

 

얼마를 단위로 트래픽을 제어할 것인가 지정하는 것인데, 단위는 Kbit, Mbit 혹은 bps, Kbps, Mbps 모두 가능하다.

 

 

 

 

그러나 실제로 운영해 보면 지정한 단위로 정확하게 속도제어가 되지는 않으므로 경험적으로 확인해 본 후에 적당한 수치를 지정하기 바란다.

 

 

 

 

 

 

형식 : WEIGHT=<speed>

: WEIGHT=500Kbit

 

이 값은 그냥 WEIGHT = RATE / 10으로 계산해서 입력한다.

 

형식 : PRIO=<1-8> 기본값 5

: PRIO=5

 

이는 트래픽의 우선순위로서 숫자가 높을수록 우선순위가 낮다.

 

 

 

 

보통 5정도로 설정한다.

 

형식 : RULE=[[saddr[/prefix]][:port[/mask]]],[daddr[/prefix]][:port[/mask]]

 

이는 트래픽의 규칙을 어떤 IP또는 포트에 대해 설정할 것인가를 지정하는 부분인데, 좌측이 소스 주소 또는 포트이며 우측이 목적지 주소 또는 포트이다.

 

 

 

 

 

 

이를테면 RULE=10.5.5.5:80은 소스 호스트가 10.5.5.5인 서버의 80번 포트에서 오는 트래픽을 말하며 RULE=10.1.1.0/24:80은 목적지가 네트워크 10.1.1.0/24내 포트80으로 가는 트래픽을 말한다.

 

 

 

 

이 외에도 시간대별로 제어할 수 있는 등 다양한 기능이 있으므로 세부적인 기능은 cbq.init 스크립트를 참고하기 바란다.

 

예를 들면 FTP로 동영상을 자주 다운로드받는 사이트에서 속도가 매우 느려질 경우 속도저하의 주범인 211.47.65.12FTP 다운로드하는 속도를 28Kbit 이하로만 제한하도록 설정을 하는 예는 다음과 같다.

 

 

 

 

 

#cbq-28.ftpdown

DEVICE=eth1,100Mbit,10Mbit

RATE=28Kbit

WEIGHT=2Kbit

PRIO=5

RULE=:20,211.47.65.12

 

그리고 역시 불필요한 파일 업로드를 자주 하는 211.47.65.11이 업로드시 사용할 수 있는 트래픽을 128Kbit로 제한하는 예는 다음과 같다.

 

 

 

 

 

 

#cbq-128.upload

DEVICE=eth0,100Mbit,10Mbit

RATE=128Kbit

WEIGHT=10Kbit

PRIO=5

RULE=211.47.65.11,

 

마지막으로 특정 IP 대역(211.47.66.0/27)에 대해서 총 사용가능한 트래픽을 500Kbit로 제한하도록 설정하는 예는 다음과 같다.

 

 

 

 

 

 

#cbq-500.router-client

DEVICE=eth1,100Mbit,10Mbit

RATE=500Kbit

WEIGHT=50Kbit

PRIO=5

RULE=211.47.66.0/27

 

이후 실제 적용을 하기 위해서는 /etc/rc.d/init.d/cbq.init start로 하며, 적용을 멈추려면 start 대신 stop을 실행하면 된다.

 

 

 

 

옵션 없이 cbq.init만 실행하면 아래와 같이 함께 실행할 수 있는 여러 옵션이 보인다.

 

# /etc/rc.d/init.d/cbq.init

Usage: cbq.init {start|compile|stop|restart|timecheck|list|stats}

 

cbq.init 실행 전에 확인해 볼 사항이 있는데, 만약 앞에서 커널 설정시 QoS 기능을 모듈로 지정하지 않고 static 하게 포함하였을 경우에는 아래 두 줄을 삭제하거나 주석 처리하여야 한다.

 

 

 

 

 

 

변경 전)

CBQ_PROBE="sch_cbq sch_tbf sch_sfq sch_prio"

CBQ_PROBE="$CBQ_PROBE cls_fw cls_u32 cls_route"

 

변경 후)

#CBQ_PROBE="sch_cbq sch_tbf sch_sfq sch_prio"

#CBQ_PROBE="$CBQ_PROBE cls_fw cls_u32 cls_route"

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,034 명
  • 현재 강좌수 :  35,791 개
  • 현재 접속자 :  96 명