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
반응형
'OS > Linux' 카테고리의 다른 글
Linux - 라우팅 테이블 구조와 route 명령어 (0) | 2024.06.19 |
---|---|
Linux - 캐시 메모리 비우기 (0) | 2024.05.30 |
Linux - SELinux 끄는 방법 (0) | 2024.05.15 |
Linux - Vi editor에서 문자열 치환(replace) 방법 (0) | 2024.05.10 |
Linux - 서버에 ping 요청 차단하기 / icmp 차단 (0) | 2024.05.09 |