forcemax's

Traffic Control +2

Linux Traffic Control 2

Linux2008. 10. 13. 21:18

지난번에는 ingress policing을 구현하였는데 이번에는 egress shaping을 구현할 일이 생겼다.

구현할 내용은 local network에 대해서는 최대 트래픽을 사용하지만 internet으로 나가는 트래픽에 대해서는 제한을 두는 것이다.

#!/bin/bash

TC=/sbin/tc
DEV=bond0
MAX=2000
LIMIT=1000

case "$1" in
        start)
                $TC qdisc del dev $DEV root 2> /dev/null
                $TC qdisc add dev $DEV root handle 1: htb default 10
                # local network is unrestricted
                $TC class add dev $DEV parent 1: classid 1:10 htb rate ${MAX}mbit burst ${MAX}k quantum 1514
                $TC qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10
                $TC filter add dev $DEV parent 1:0 protocol ip prio 10 u32 match ip dst 192.168.5.0/24 flowid 1:10
                # internet traffic is limited
                $TC class add dev $DEV parent 1: classid 1:20 htb rate ${LIMIT}mbit ceil ${LIMIT}mbit burst ${LIMIT}k quantum 1514
                $TC qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10
                $TC filter add dev $DEV parent 1:0 protocol ip prio 20 u32 match ip src 0.0.0.0/0 flowid 1:20
                ;;
        stop)
                $TC qdisc del dev $DEV root 2> /dev/null
                ;;
        show)
                $TC qdisc show dev $DEV
                $TC -s class show dev $DEV
                $TC -s filter show dev $DEV
                ;;
        *)
                echo "Usage: $0 start|stop|show" >&2
                exit 3
                ;;
esac




일단 위의 스크립트 대로 적용하면 2Gbps의 bond0 인터페이스에서 외부로 나가는 트래픽중
'192.168.5.0/24' 대역에 걸리는 트래픽은 $MAX에 정해놓은 수치(위에는 2Gbps)로
그 외 '0.0.0.0/0' (전체 네트웍)으로 나가는 트래픽은 $LIMIT에 정해놓은 수치(위에는 1Gbps)로
나가도록 설정된다.


Linux Traffic Control

Linux2008. 6. 24. 10:02
일반적으로 저속의 상황을 시뮬레이션하기 위해서는 Client의 Traffic을 제한할 필요가 있다. QOS에 관련하여 알아보던 중 Incoming Traffic을 제한하는 방법은 Ingress Policing 밖에 없음을 알게되었다.

알게된 상황을 정리해 보면.

ingress policing : incoming traffic control
egress shaping : outgoing traffic control

ingress policing은 오직 한가지 방법만이 존재하며 다음 링크에서 살펴볼 수 있다.
http://blog.stevedoria.net/20050906/ingress-policing-with-linux-and-tc

내가 작성한 ingress policing script는 다음과 같다.

#!/bin/bash

TC=/sbin/tc
DEV=eth0
MAX=400

# clear all queuing on the device.
${TC} qdisc del dev ${DEV} root 2> /dev/null > /dev/null
${TC} qdisc del dev ${DEV} ingress 2> /dev/null > /dev/null

# Handle the speed of the traffic coming from network
# Add a limiter to the ingress
${TC} qdisc add dev ${DEV} handle ffff: ingress
# Set the maximum limit
${TC} filter add dev ${DEV} parent ffff: protocol ip prio 2 u32 match ip src 0.0.0.0/0 police rate ${MAX}kbps burst 100kb drop

위 스크립트는 ubuntu 8.04에서 잘 돌아간다. 내용은 incoming traffic의 속도를 400kbytes/sec로 제한하는 것이다.

debian etch에서는 위 스크립트로 동작이 안되는데 마지막 줄을 다음과 같이 수정한다.

${TC} filter add dev ${DEV} parent ffff: protocol ip prio 2 u32 match ip src 0.0.0.0/0 police rate ${MAX}kbps burst 100kb drop flowid :1