LINUX.ORG.RU
ФорумAdmin

Шейпинг исходящего трафика


2

3

Как нынче проще всего ограничить исходящий канал на интерфейсе?
Шейпинг не настраивал уж года три.
Раньше модно было htbinit, может теперь есть какие-то другие удобные штуки?

Дистрибутив - ubuntu 12.04.

★★☆☆

А я не настраивал лет пять. :)
Кто больше?

ЗЫ: CentOS, ядро 2.6


#!/bin/bash

# Name: shaping
# Date: 2008-01-29
#
# Description: Очередь пакетов для отправки через eth5 (к нему подключен тупой ZyXel с медной парой)
# Шейпим трафик, генерируемый самим роутером.
# Кроме того, шейпим транзитный трафик, проходящий форвардом.
# Для этого маркируем пакеты, проходящие через цепочку POSTROUTING таблицы mangle
# Туда попадают и транзитные пакеты, и пакеты, сгенерированные локально на роутере

TC=/sbin/tc
IPT=/sbin/iptables

ETH5=«dev eth5»
QDISC=«$TC qdisc add»
CLASS=«$TC class add»
FILTER=«$TC filter add»

# IPtables rules for mark packets
CHAIN_POST="-t mangle -A POSTROUTING"
MARK="-j MARK --set-mark"
JRET="-j RETURN"
TCP="-p TCP"
UDP="-p UDP"
ICMP="-p ICMP"

# лирика
RETVAL=0
prog=«traffic_shaper»

# Source function library.
. /etc/rc.d/init.d/functions

start()
{
# украшательство
echo -n $«Starting $prog: »

# очищаем от правил ВСЮ таблицу mangle
$IPT -t mangle -F

# Все пакеты, исходящие с интерфейса eth5
# маркируем пакеты цепочки POSTROUTING таблицы mangle: это трафик, уходящий на ХХХХХХХХХХ
$IPT $CHAIN_POST $ICMP -o eth5 $MARK 0x1
$IPT $CHAIN_POST $ICMP -o eth5 $JRET

$IPT $CHAIN_POST $TCP -o eth5 -m tcp --tcp-flags SYN,RST,ACK SYN $MARK 0x1
$IPT $CHAIN_POST $TCP -o eth5 -m tcp --tcp-flags SYN,RST,ACK SYN $JRET

$IPT $CHAIN_POST $UDP -o eth5 -m multiport --port 53 $MARK 0x1
$IPT $CHAIN_POST $UDP -o eth5 -m multiport --port 53 $JRET

$IPT $CHAIN_POST $UDP -o eth5 -m multiport --port 123 $MARK 0x1
$IPT $CHAIN_POST $UDP -o eth5 -m multiport --port 123 $JRET

$IPT $CHAIN_POST $TCP -o eth5 -m multiport --port 25 $MARK 0x2
$IPT $CHAIN_POST $TCP -o eth5 -m multiport --port 25 $JRET

$IPT $CHAIN_POST $TCP -o eth5 -m multiport --port 3128 $MARK 0x3
$IPT $CHAIN_POST $TCP -o eth5 -m multiport --port 3128 $JRET

$IPT $CHAIN_POST $TCP -o eth5 -m multiport --port 80 $MARK 0x3
$IPT $CHAIN_POST $TCP -o eth5 -m multiport --port 80 $JRET

$IPT $CHAIN_POST -o eth5 $MARK 0x4

# ==================================================================================
# ==================== настраиваем пропускную способность ====================
# ==================================================================================

# для пакетов, уходящих на ХХХХХХХХХХ:
# устанавливаем корневую htb; по-умолчанию все пакеты уходят в класс 1:40
$QDISC $ETH5 root handle 1: htb r2q 1 default 40
# и корневой класс с указанием тотальной пропускной способности (ограничена битрейтом ZyXel-а)
$CLASS $ETH5 parent 1: classid 1:1 htb rate 2048kbit ceil 2048kbit

# Расставляем приоритеты по типу трафика:
# ICMP,SYN,NTP,DNS prio 0
# SMTP prio 1
# HTTP,PROXY prio 2
# Остальное prio 3

# создаем подклассы со своими уставками пропускной способности и приоритетами
# классы с меньшим prio получают «излишек» канала первыми
$CLASS $ETH5 parent 1:1 classid 1:10 htb rate 512kbit ceil 2048kbit prio 0
$CLASS $ETH5 parent 1:1 classid 1:20 htb rate 512kbit ceil 2048kbit prio 1
$CLASS $ETH5 parent 1:1 classid 1:30 htb rate 512kbit ceil 2048kbit prio 2
$CLASS $ETH5 parent 1:1 classid 1:40 htb rate 512kbit ceil 2048kbit prio 3

# всем классам дадим дисциплину Stochastic Fairness
$QDISC $ETH5 parent 1:10 handle 10: sfq perturb 10
$QDISC $ETH5 parent 1:20 handle 20: sfq perturb 10
$QDISC $ETH5 parent 1:30 handle 30: sfq perturb 10
$QDISC $ETH5 parent 1:40 handle 40: sfq perturb 10

# классы, в которые попадают по признаку handle отмаркированные таблесами пакеты
$FILTER $ETH5 protocol ip parent 1:0 prio 0 handle 1 fw classid 1:10
$FILTER $ETH5 protocol ip parent 1:0 prio 1 handle 2 fw classid 1:20
$FILTER $ETH5 protocol ip parent 1:0 prio 2 handle 3 fw classid 1:30
$FILTER $ETH5 protocol ip parent 1:0 prio 3 handle 4 fw classid 1:40

# ------------------------------------------------------------------------------------------------------

# и это - украшательство
echo_success && echo

return 0
}

stop()
{
# украшательство
echo -n $«Shutting down $prog: »

# дропаем всю таблицу mangle - пакеты не маркируются
$IPT -t mangle -F
# дропаем корневую дисциплину - шейпинг прекращается
$TC qdisc del root dev eth5

# и это - украшательство
echo_success && echo

return 0
}

status()
{
echo «=== $prog ============= -t MANGLE STATISTICS:»
$IPT -L -v -t mangle
echo «=== $prog ============= QDISC STATISTICS:»
$TC -s qdisc show $ETH5
echo «=== $prog ============= CLASS STATISTICS:»
$TC -s class show $ETH5

return 0
}

case «$1» in
start)
start
RETVAL=$?
;;
stop)
stop
RETVAL=$?
;;
restart)
stop
start
;;
status)
status
RETVAL=$?
;;
*)
echo $«Usage: $0 {start|stop|status}»
exit 1
esac

exit $RETVAL

braindef ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.