본문 바로가기

OS/Linux

Linux - TC를 이용하여 QoS 설정하기

728x90

 

1. QoS란?

QoS(Quality of Service)는 네트워크에서 데이터 전송의 품질을 보장하기 위한 기술입니다. 네트워크 트래픽에 우선순위를 부여하고 대역폭을 관리하며 지연 시간 및 패킷 손실을 최소화하여 중요한 트래픽의 품질을 보장하는 기술입니다.

 

2. tc란?

tc는 "Traffic Control"의 약자로, 눅스 커널에서 제공하는 네트워크 트래픽을 관리하고 제어하는 명령어입니다.

다양한 형태의 트래픽 쉐이핑, 큐잉, 필터링 등을 설정할 수 있습니다.

 

3. tc는 왜 사용하는가?

  • 대역폭 관리 : 특정 서비스나 애플리케이션에 대해 대역폭을 제한하거나 할당합니다.
  • QoS(Quality of Service) : 중요도가 높은 트래픽에 우선순위를 부여하여 네트워크 성능을 보장합니다.
  • 네트워크 성능 최적화 : 네트워크 혼잡을 줄여서 패킷 손실 방지 및 지연 시간 최소화합니다.
  • 트래픽 시뮬레이션 : 개발 빛 테스트 환경에서 네트워크 트래픽 시뮬레이션할 수 있습니다.

 

4. tc를 사용할 경우 장·단점

장점

  • 유연성 : 다양한 트래픽 제어 시나리오 지원합니다.
  • 다양한 기능 : 대역폭 제한, 우선순위 큐잉, 트래픽 필터링 등 다양한 기능 제공합니다.
  • 오픈 소스 : 무료..

단점

  • 복잡성 : 설정이 복잡하여 초보자 사용이 어렵습니다.
  • CLI : GUI가 없어 명령어로만 사용해야 하기에 불편합니다.

 

5. tc를 이용한 QoS 설정 예시

5.1 기본 큐잉 디스플린 설정

# eth0 인터페이스에 HTB 큐잉 디스플린을 설정
sudo tc qdisc add dev eth0 root handle 1: htb default 10

 

5.2 클래스 추가

# 루트 클래스(1:1)에 최대 대역폭 100Mbps 설정
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit

# 서브 클래스(1:10)에 최대 대역폭 10Mbps 설정
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 10mbit ceil 10mbit

# 서브 클래스(1:20)에 최대 대역폭 20Mbps 설정
sudo tc class add dev eth0 parent 1:1 classid 1:20 htb rate 20mbit ceil 20mbit

 

5.3 필터 설정

# 특정 IP 트래픽을 클래스 1:10으로 필터링
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.1.100 flowid 1:10

# 특정 포트 트래픽을 클래스 1:20으로 필터링
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:20

위의 예시는 eth0 인터페이스에 HTB 큐잉 디스플린을 설정하고, 트래픽을 두 개의 클래스로 나누어 관리합니다.

첫 번째 클래스(classid 1:10)는 IP 주소 192.168.1.100으로 향하는 트래픽을 관리하고,

두 번째 클래스(classid 1:20)는 포트 80으로 향하는 트래픽을 관리합니다.

 

6. tc와 유사하게 사용할 수 있는 툴 등

네트워크 트래픽 제어 툴

  • iproute2 : tc와 함께 사용되는 툴로 네트워크 설정 및 관리 가능
  • iptables : 주로 패킷 필터링 및 NAT(Network Address Translation)에 사용되나 트래픽 제어도 가능
  • nftables : iptables의 후속으로 더 많은 네트워크 트래픽 제어 기능 제공
  • netem : tc의 연장선으로 네트워크 지연, 패킷 손실 등 네트워크 환경 시뮬레이션 가능

 

7. tc를 이용한 쉘 스크립트

#!/bin/bash
#
# shaping       This shell script takes care of starting and stopping
#               Network Traffic Control.
#
# chkconfig: - 60 30
# description: Shaping is a traffic control for network.
#

# tc uses the following units when passed as a parameter.
# kbit: Kilobits per second
# mbit: Megabits per second
#

# Name of the traffic control command.
TC=/sbin/tc
# The network interface we're planning on limiting bandwidth.
DEV=eno4
# Upload limit (unit kbit, mbit)
UPLIMIT=150mbit
DNLIMIT=150mbit

start() {
    # Root qdisc 설정
    ${TC} qdisc add dev ${DEV} root handle 1: htb default 1
    
    # 클래스 설정
    ${TC} class add dev ${DEV} parent 1: classid 1:1 htb rate ${DNLIMIT} ceil ${DNLIMIT}
    ${TC} class add dev ${DEV} parent 1: classid 1:2 htb rate ${UPLIMIT} ceil ${UPLIMIT}
    
    # Ingress 트래픽 제한
    ${TC} qdisc add dev ${DEV} handle ffff: ingress
    ${TC} filter add dev ${DEV} parent ffff: protocol ip prio 2 u32 match ip src 0.0.0.0/0 police rate ${DNLIMIT} burst 100kb drop flowid :1
}

stop() {
    # Stop the bandwidth shaping.
    ${TC} qdisc del dev ${DEV} root
    ${TC} qdisc del dev ${DEV} ingress
}

restart() {
    # Self-explanatory.
    stop
    sleep 1
    start
}

show() {
    # Display status of traffic control status.
    ${TC} -s qdisc ls dev ${DEV}
}

case "$1" in
  start)
    echo -n "Starting bandwidth shaping: "
    start
    echo "done"
    ;;
  stop)
    echo -n "Stopping bandwidth shaping: "
    stop
    echo "done"
    ;;
  restart)
    echo -n "Restarting bandwidth shaping: "
    restart
    echo "done"
    ;;
  show)
    echo "Bandwidth shaping status for ${DEV}:"
    show
    echo ""
    ;;
  *)
    echo "Usage: tc.bash {start|stop|restart|show}"
    ;;
esac
exit 0

eno4 인터페이스로 서버에 접근하는 모든 트래픽(업로드 및 다운로드)을 150Mbps로 제한합니다.

 

  • TC : tc 명령어 경로를 설정합니다.
  • DEV : tc 명령어로 제한할 네트워크 인터페이스를 설정합니다.
  • UPLIMIT : 업로드 대역폭을 설정합니다.
  • DNLIMIT : 다운로드 대역폭을 설정합니다.
  • U32 : u32 필터를 추가하기 위한 기본 명령어입니다.
  • qdisc add : htb 큐잉 디스플린을 루트로 추가하여 트래픽 제어를 시작합니다.
  • class add : 트래픽을 위한 클래스(1:1, 1:2)를 추가하고 대역폭을 설정합니다.
  • qdisc del : 네트워크 인터페이스에서 트래픽 제어를 삭제합니다.
728x90
반응형