суббота, 19 февраля 2011 г.

QoS. Shaping. Двойной вариант.

В отличии от "Классического" варианта трафик перегруппируется два раза, что позволяет:
1.  разделить локальный и наружный потоки
2.  обезопасить пользователей от потребностей сервера
3.  обеспечить нормальное хождение служебного трафика



Скрипт составляет правила исходя из 2х внешних файлов:
1 - настройка скорости
2 - "приоритетные" IP
Результат работы отображается в лог файле, который сохраняется (rotate) самим скриптом.

Примеры заполнения:
- /etc/conf.d/speed.conf
# файл настройки скоростей
# входящая скорость в kbit
downsp 677
# исходящая скорость в kbit
upsp 382

- /etc/conf.d/iplist.conf
# list of prior`s IP
# список приоритетных IP
# Извесные люди
#user1
192.168.100.200/32
#user2
192.168.100.201/32
#user3
192.168.100.202/32
#user4
192.168.100.11/32
#user5
192.168.100.14/32
#user6
192.168.100.50/32

Сам скрипт:
/etc/init.d/shaping

#!/sbin/runscript

depend() {
    need net.ppp0
}

# переменные
totc="/sbin/tc"
ipi="/sbin/iptables"
inet_iface="ppp0"
inet_vlan="ifb0"
local_iface="eth1"
local_vlan="ifb1"
server_prio="prio 1"
normal_prio="prio 3"
medium_prio="prio 5"
lou_prio="prio 7"
local_speed_prio="prio 9"
local_speed="102400kbit"
local_full_speed="81920kbit"
local_half_speed="40960kbit"

# файл перечень приоритетных IP
IPFILE="/etc/conf.d/iplist.conf"
# файл настройки скорости соединения
SPFILE="/etc/conf.d/speed.conf"
# файл отчета о запуске шейпинга
LOGFILE="/var/log/shaping.log"

# число приоритетных IP
IPCOUNT="0"
IPLIST=""
ZAGR="85" # in %

full_in_rate=""
half_rate=""
start_rate=""

full_out_rate=""
half_out_rate=""
start_out_rate=""

curent_mark_num="10"
curent_classid="2"

#srv ip address
srv_ip1="192.168.100.1/32"

rotatelogfile () {
rotcount=7
  until [ $rotcount -le 1 ];
  do
  let "te=rotcount-1"
    if [ -f "$LOGFILE.$te" ]; then
    mv -f "$LOGFILE.$te" "$LOGFILE.$rotcount"
    fi
  let "rotcount-=1"
  done
mv -f "$LOGFILE" "$LOGFILE.1"
echo "" > $LOGFILE
}

mess_text (){
# функция помещения сообщения в лог
echo `date +%Y-%m-%d___%H:%M:%S`" "$1 >> $LOGFILE
}

# all completed
init_speed () {
# Чтение начатьных данных # begin
# начало лога
mess_text "###"
mess_text "Чтение начальных данных # begin"

# чтение скоростей # begin
UPSP=`cat /etc/conf.d/speed.conf | grep -i upsp | awk {'print $2'}`
mess_text "UPSP = $UPSP"
DOWNSP=`cat /etc/conf.d/speed.conf | grep -i downsp | awk {'print $2'}`
mess_text "DOWNSP = $DOWNSP"
# чтение скоростей # end

# первичное чтение списка # begin
# цель определение кол-ва записей и
# перегрузка в переменную.
for i in `( cat $IPFILE | grep -v "#" )`; do
   let "IPCOUNT+=1"
   IPLIST=$IPLIST" "$i
done
mess_text "IPCOUNT = $IPCOUNT"
# первичное чтение списка # end

# коррекция скоростей # begin
let "DOWNSP=(DOWNSP*ZAGR)/100"
full_in_rate=$DOWNSP"kbit"
let "half_rate=(DOWNSP*2)/4"
half_rate=$half_rate"kbit"
let "start_rate=DOWNSP/(IPCOUNT+6)"
start_rate=$start_rate"kbit"

let "UPSP=(UPSP*ZAGR)/100"
full_out_rate=$UPSP"kbit"
let "half_out_rate=UPSP/2"
half_out_rate=$half_out_rate"kbit"
let "start_out_rate=UPSP/(IPCOUNT+6)"
start_out_rate=$start_out_rate"kbit"

mess_text "(full_out_rate)Максимальная исход скорость = $full_out_rate"
mess_text "(half_out_rate)Cредняя исход скорость = $half_out_rate"
mess_text "(start_out_rate)Минимальная исход скорость = $start_out_rate"

mess_text "(full_in_rate)Максимальная вход скорость = $full_in_rate"
mess_text "(half_rate)Средняя вход скорость = $half_rate"
mess_text "(start_rate)Минимальная вход скорость = $start_rate"
# коррекция скоростей # end

#развертка списка из массива. проверка # begin
mess_text "Чтение из массива"
for i in `( echo $IPLIST)`;
do
  #echo $i  >> $LOGFILE
  mess_text "Load info IP:$i"
done
mess_text "Чтение массива завершено"
#развертка списка из массива. проверка # end

# Чтение начатьных данных # end
mess_text "# Чтение начатьных данных # end"
}

#all completed
init_check () {
# следует добавить проверку наличия (загрузки)
mess_text "# следует добавить проверку наличия (загрузки) "
# необходимых модулей
mess_text "# необходимых модулей"
# проверка начальных условий # begin
mess_text "# проверка начальных условий # begin"
check=1 # indic value
#if [ $check = 1 ]; then
#echo "check = 1"
#else
#echo "check <> 1"
#fi

# 1 = iptables
if [ $check = 1 ]; then
mess_text "# 1 = iptables check"

  if [ -n "$(which iptables | grep -i iptables)" ];then
  mess_text "iptables installed"
  else
  mess_text "NO INSTALLED iptables"
  check=0
  fi

fi

# 2 = tc
if [ $check = 1 ]; then
mess_text "# 2 = tc check"
  if [ -n "$(which tc | grep -i tc)" ];then
  mess_text "iproute installed"
  else
  mess_text "NO INSTALLED iproute"
  check=0
  fi

fi

# 3 = IPFILE
if [ $check = 1 ]; then
mess_text "# 3 = IPFILE check"
  if [ -f "$IPFILE" ];then
  mess_text "$IPFILE check ok"
  else
  mess_text "IPFILE check faled no file $IPFILE"
  check=0
  fi

#else
#
fi

# 4 = SPFILE
if [ $check = 1 ]; then
mess_text "# 4 = SPFILE check"
  if [ -f "$SPFILE" ];then
  mess_text "$SPFILE check ok"
  else
  mess_text "SPFILE check faled no file $SPFILE"
  check=0
  fi

fi

return $check
# проверка начальных условий # end
mess_text "# проверка начальных условий # end"
}

# all completed
output_from_local_iface (){
# local_iface -> LAN
mess_text "Start rules for local_iface ($loacl_iface) -> LAN"
# траффик для пользователей за сервером
mess_text "траффик для пользователей за сервером"
# Траффик исходящий с локальных интерфейсов
mess_text "Траффик исходящий с локальных интерфейсов"
# Глобально входящий пользователю трафик
mess_text "# Глобально входящий пользователю трафик"

# создаем htb-очередь для выделения полос пропускания
mess_text "# создаем htb-очередь для выделения полос пропускания"
$totc qdisc add dev $local_iface root handle 1:  htb
mess_text "$totc qdisc add dev $local_iface root handle 1:  htb"
# начальные (корневые) классы
mess_text "# начальные (корневые) классы"
$totc class add dev $local_iface parent 1: classid 1:1 htb rate $local_speed ceil $local_speed
mess_text "$totc class add dev $local_iface parent 1: classid 1:1 htb rate $local_speed ceil $local_speed"
curent_classid="2"
mess_text "statrt curent_classid=2"
# Откусываем локальный корень и траффик
mess_text "# Откусываем локальный корень и траффик"
$totc class add dev $local_iface parent 1:1 classid 1:$curent_classid htb rate $local_half_speed ceil $local_half_speed $local_speed_prio
mess_text "$totc class add dev $local_iface parent 1:1 classid 1:$curent_classid htb rate $local_half_speed ceil $local_half_speed $local_speed_prio"
#filter
$totc filter add dev $local_iface protocol ip parent 1: prio 1 u32 match ip src $srv_ip1 flowid 1:$curent_classid
mess_text "$totc filter add dev $local_iface protocol ip parent 1: prio 1 u32 match ip src $srv_ip1 flowid 1:$curent_classid"
# очередь
$totc qdisc add dev $local_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $local_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10"
# запоминаем корень локального траффика
mess_text "# запоминаем корень локального траффика"
mem_local_root_local_iface="1:$curent_classid"
mess_text "mem_local_root_local_iface="1:$curent_classid""

let " curent_classid+=1 "
# откусываем инетовский корень
mess_text "# откусываем инетовский корень"
$totc class add dev $local_iface parent 1:1 classid 1:$curent_classid htb rate $full_in_rate ceil $full_in_rate
mess_text "$totc class add dev $local_iface parent 1:1 classid 1:$curent_classid htb rate $full_in_rate ceil $full_in_rate"
# запоминаем инетовский корень
mess_text "# запоминаем инетовский корень"
mem_inet_root_local_iface="1:$curent_classid"
mess_text "mem_inet_root_local_iface=1:$curent_classid"


let " curent_classid+=1 "
### for GRE 
mess_text "rule for GRE class = $curent_classid"
# class 
$totc class add dev $local_iface parent $mem_inet_root_local_iface  classid 1:$curent_classid htb rate $start_rate ceil $half_rate $server_prio
mess_text "$totc class add dev $local_iface parent $mem_inet_root_local_iface  classid 1:$curent_classid htb rate $start_rate ceil $half_rate $server_prio"
#filter
$totc filter add dev $local_iface protocol ip parent 1: prio 1 u32 match ip protocol 47 0xff flowid 1:$curent_classid
mess_text "$totc filter add dev $local_iface protocol ip parent 1: prio 1 u32 match ip protocol 47 0xff flowid 1:$curent_classid"
# очередь
$totc qdisc add dev $local_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $local_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10"


let " curent_classid+=1 "
### for ICMP  (all trafic)
mess_text "rule for ICMP classid = $curent_classid"
# class 
$totc class add dev $local_iface parent $mem_inet_root_local_iface  classid 1:$curent_classid htb rate $start_rate ceil $half_rate $normal_prio
mess_text "$totc class add dev $local_iface parent $mem_inet_root_local_iface  classid 1:$curent_classid htb rate $start_rate ceil $half_rate $normal_prio"
#filter
$totc filter add dev $local_iface protocol ip parent 1: prio 1 u32 match ip protocol 1 0xff flowid 1:$curent_classid
mess_text "$totc filter add dev $local_iface protocol ip parent 1: prio 1 u32 match ip protocol 1 0xff flowid 1:$curent_classid"
# очередь
$totc qdisc add dev $local_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $local_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10"
mess_text "начальное формирование для local_iface ($local_iface) завершено"


### users
mess_text "Чтение из массива"
for i in `( echo $IPLIST)`;
do
#обработка массива IP # begin
#увеличиваем счетчик класса
let " curent_classid+=1 "
mess_text "Work with IP: $i start"

# class (классификатор)
mess_text "# class (классификатор) for IP = $i"
$totc class add dev $local_iface parent $mem_inet_root_local_iface  classid 1:$curent_classid htb rate $start_rate ceil $full_in_rate $normal_prio
mess_text "$totc class add dev $local_iface parent $mem_inet_root_local_iface  classid 1:$curent_classid htb rate $start_rate ceil $full_in_rate $normal_prio"
mess_text "Для подобностей по классу :"
mess_text "$totc -s -d class show dev $local_iface classid 1:$curent_classid"

# filter (фильтр, отбор)
mess_text "# filter (фильтр, отбор) for IP = $i"
$totc filter add dev $local_iface protocol ip parent 1: prio 3 u32 match ip dst $i flowid 1:$curent_classid
mess_text "$totc filter add dev $local_iface protocol ip parent 1: prio 3 u32 match ip dst $i flowid 1:$curent_classid"
mess_text "Для подобностей по фильтру :"
mess_text "# tc filter show dev $local_iface prio 3 ????"

# queue (очередь)
mess_text "# queue (очередь) for IP = $i"
$totc qdisc add dev $local_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $local_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10"
mess_text "Для подобностей по очереди :"
mess_text "????"

mess_text "Work with IP: $i finish"
#обработка массива IP # end"
done
mess_text "Чтение массива завершено"

let " curent_classid+=5 "
### for all other trafic (default)
mess_text "classid = $curent_classid ### for all other trafic (default)"
# class
$totc class add dev $local_iface parent 1:1 classid 1:$curent_classid htb rate $start_rate ceil $full_in_rate $lou_prio
mess_text "$totc class add dev $local_iface parent 1:1 classid 1:$curent_classid htb rate $start_rate ceil $full_in_rate $lou_prio"
#filter
$totc filter add dev $local_iface protocol ip parent 1: prio 99 u32 match ip dst 0.0.0.0/0 flowid 1:$curent_classid
mess_text "$totc filter add dev $local_iface protocol ip parent 1: prio 99 u32 match ip dst 0.0.0.0/0 flowid 1:$curent_classid"
# нет так как заглушка.
# очередь
$totc qdisc add dev $local_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $local_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10"
}

# all completed
output_from_inet_vlan (){
# ppp0 -> SRV
mess_text "# ppp0 -> SRV"
# траффик из инета предснятие на входе сервера
mess_text "# траффик из инета предснятие на входе сервера"

# арифметические переменные
curent_classid="2"
mess_text "reset curent_classid=2"
# modprobe ifb
ip link set $inet_vlan up
mess_text "ip link set $inet_vlan up"

 # Перенаправить все IP пакеты, приходящие в ppp0, на ifb0
mess_text "# Перенаправить все IP пакеты, приходящие в ppp0, на ifb0"
$totc  qdisc add dev $inet_iface handle ffff: ingress
mess_text "$totc  qdisc add dev $inet_iface handle ffff: ingress"
$totc filter add dev $inet_iface parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev $inet_vlan
mess_text "$totc filter add dev $inet_iface parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev $inet_vlan"

$totc qdisc add dev $inet_vlan root handle 1:  htb
mess_text "$totc qdisc add dev $inet_vlan root handle 1:  htb"

# начальные (корневые) классы
mess_text "# начальные (корневые) классы"
$totc class add dev $inet_vlan  parent 1:  classid 1:1 htb rate $full_in_rate ceil $full_in_rate
mess_text "$totc class add dev $inet_vlan  parent 1:  classid 1:1 htb rate $full_in_rate ceil $full_in_rate"

let " curent_classid+=1 "
### for ssh trafic
mess_text "### for ssh trafic"
# class
$totc class add dev $inet_vlan parent 1:1 classid 1:$curent_classid htb rate $start_rate ceil $full_in_rate $server_prio
mess_text "$totc class add dev $inet_vlan parent 1:1 classid 1:$curent_classid htb rate $start_rate ceil $full_in_rate $server_prio"
#filter
$totc filter add dev $inet_vlan protocol ip parent 1: prio 1 u32 match ip dport 22 0xffff flowid 1:$curent_classid
mess_text "$totc filter add dev $inet_vlan protocol ip parent 1: prio 1 u32 match ip dport 22 0xffff flowid 1:$curent_classid"
$totc filter add dev $inet_vlan protocol ip parent 1: prio 1 u32 match ip sport 22 0xffff flowid 1:$curent_classid
mess_text "$totc filter add dev $inet_vlan protocol ip parent 1: prio 1 u32 match ip sport 22 0xffff flowid 1:$curent_classid"
# очередь
$totc qdisc add dev $inet_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $inet_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10"

let " curent_classid+=1 "
### for www trafic
mess_text "### for www trafic "
# class
$totc class add dev $inet_vlan parent 1:1 classid 1:$curent_classid htb rate $start_rate ceil $full_in_rate $normal_prio
mess_text "$totc class add dev $inet_vlan parent 1:1 classid 1:$curent_classid htb rate $start_rate ceil $full_in_rate $normal_prio"
#filter
$totc filter add dev $inet_vlan protocol ip parent 1: prio 1 u32 match ip sport 80 0xffff flowid 1:$curent_classid
mess_text "$totc filter add dev $inet_vlan protocol ip parent 1: prio 1 u32 match ip sport 80 0xffff flowid 1:$curent_classid"
$totc filter add dev $inet_vlan protocol ip parent 1: prio 1 u32 match ip sport 443 0xffff flowid 1:$curent_classid
mess_text "$totc filter add dev $inet_vlan protocol ip parent 1: prio 1 u32 match ip sport 443 0xffff flowid 1:$curent_classid"
# очередь
$totc qdisc add dev $inet_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $inet_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10"

let " curent_classid+=1 "
### for VPN trafic (tcp (1723) + gre)
mess_text "### for VPN trafic (tcp (1723) + gre)"
# class
$totc class add dev $inet_vlan parent 1:1 classid 1:$curent_classid htb rate $start_rate ceil $half_rate $server_prio
mess_text "$totc class add dev $inet_vlan parent 1:1 classid 1:$curent_classid htb rate $start_rate ceil $half_rate $server_prio"
#filter
$totc filter add dev $inet_vlan protocol ip parent 1: prio 1 u32 match ip sport 1723 0xffff flowid 1:$curent_classid
mess_text "$totc filter add dev $inet_vlan protocol ip parent 1: prio 1 u32 match ip sport 1723 0xffff flowid 1:$curent_classid"
$totc filter add dev $inet_vlan protocol ip parent 1: prio 1 u32 match ip protocol 47 0xff flowid 1:$curent_classid
mess_text "$totc filter add dev $inet_vlan protocol ip parent 1: prio 1 u32 match ip protocol 47 0xff flowid 1:$curent_classid"
# очередь
$totc qdisc add dev $inet_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $inet_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10"

let " curent_classid+=1 "
### for ICMP trafic
mess_text "### for ICMP trafic"
# class
$totc class add dev $inet_vlan parent 1:1 classid 1:$curent_classid htb rate $start_rate ceil $half_rate $normal_prio
mess_text "$totc class add dev $inet_vlan parent 1:1 classid 1:$curent_classid htb rate $start_rate ceil $half_rate $normal_prio"
#filter
$totc filter add dev $inet_vlan protocol ip parent 1: prio 1 u32 match ip protocol 1 0xff flowid 1:$curent_classid
mess_text "$totc filter add dev $inet_vlan protocol ip parent 1: prio 1 u32 match ip protocol 1 0xff flowid 1:$curent_classid"
# очередь
$totc qdisc add dev $inet_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $inet_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10"

let " curent_classid+=5 "
### for all other trafic (default)
mess_text "### for all other trafic (default)"
# class
$totc class add dev $inet_vlan parent 1:1 classid 1:$curent_classid htb rate $start_rate ceil $full_in_rate $medium_prio
mess_text "$totc class add dev $inet_vlan parent 1:1 classid 1:$curent_classid htb rate $start_rate ceil $full_in_rate $medium_prio"
#filter
$totc filter add dev $inet_vlan protocol ip parent 1: prio 99 u32 match ip dst 0.0.0.0/0 flowid 1:$curent_classid
mess_text "$totc filter add dev $inet_vlan protocol ip parent 1: prio 99 u32 match ip dst 0.0.0.0/0 flowid 1:$curent_classid"
# очередь
$totc qdisc add dev $inet_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $inet_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10"
}

# all completed
output_from_inet_iface (){
# ppp0 -> inet
# траффик из инета предснятие на входе сервера

# арифметические переменные
curent_mark_num="10"
mess_text "reset curent_mark_num=10"
curent_classid="2"
mess_text "reset curent_classid=2"
# создаем htb-очередь для выделения полос пропускания
$totc qdisc add dev $inet_iface root handle 1:  htb

# начальные (корневые) классы
mess_text "# начальные (корневые) классы"
$totc class add dev $inet_iface parent 1:  classid 1:1 htb rate $full_out_rate ceil $full_out_rate
mess_text "$totc class add dev $inet_iface parent 1:  classid 1:1 htb rate $full_out_rate ceil $full_out_rate"

let " curent_classid+=1 "
### for ssh trafic
mess_text "### for ssh trafic "
# class
$totc class add dev $inet_iface parent 1:1 classid 1:$curent_classid htb rate $start_out_rate ceil $full_out_rate $server_prio
mess_text "$totc class add dev $inet_iface parent 1:1 classid 1:$curent_classid htb rate $start_out_rate ceil $full_out_rate $server_prio"
#filter
$totc filter add dev $inet_iface protocol ip parent 1: prio 1 u32 match ip dport 22 0xffff flowid 1:$curent_classid
mess_text "$totc filter add dev $inet_iface protocol ip parent 1: prio 1 u32 match ip dport 22 0xffff flowid 1:$curent_classid"
$totc filter add dev $inet_iface protocol ip parent 1: prio 1 u32 match ip sport 22 0xffff flowid 1:$curent_classid
mess_text "$totc filter add dev $inet_iface protocol ip parent 1: prio 1 u32 match ip sport 22 0xffff flowid 1:$curent_classid"
# очередь
$totc qdisc add dev $inet_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $inet_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10"

let " curent_classid+=1 "
### for VPN trafic (tcp (1723) + gre)
mess_text "### for VPN trafic (tcp (1723) + gre)"
# class
$totc class add dev $inet_iface parent 1:1 classid 1:$curent_classid htb rate $start_out_rate ceil $half_out_rate $server_prio
mess_text "$totc class add dev $inet_iface parent 1:1 classid 1:$curent_classid htb rate $start_out_rate ceil $half_out_rate $server_prio"
#filter
$totc filter add dev $inet_iface protocol ip parent 1: prio 1 u32 match ip dport 1723 0xffff flowid 1:$curent_classid
mess_text "$totc filter add dev $inet_iface protocol ip parent 1: prio 1 u32 match ip dport 1723 0xffff flowid 1:$curent_classid"
$totc filter add dev $inet_iface protocol ip parent 1: prio 1 u32 match ip protocol 47 0xff flowid 1:$curent_classid
mess_text "$totc filter add dev $inet_iface protocol ip parent 1: prio 1 u32 match ip protocol 47 0xff flowid 1:$curent_classid"
# очередь
$totc qdisc add dev $inet_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $inet_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10"

let " curent_classid+=1 "
### for ICMP trafic
mess_text "### for ICMP trafic"
# class
$totc class add dev $inet_iface parent 1:1 classid 1:$curent_classid htb rate $start_out_rate ceil $half_out_rate $normal_prio
mess_text "$totc class add dev $inet_iface parent 1:1 classid 1:$curent_classid htb rate $start_out_rate ceil $half_out_rate $normal_prio"
#filter
$totc filter add dev $inet_iface protocol ip parent 1: prio 1 u32 match ip protocol 1 0xff flowid 1:$curent_classid
mess_text "$totc filter add dev $inet_iface protocol ip parent 1: prio 1 u32 match ip protocol 1 0xff flowid 1:$curent_classid"
# очередь
$totc qdisc add dev $inet_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $inet_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10"

let " curent_classid+=1 "
let " curent_mark_num+=2 "
### for srv trafic
mess_text "### for srv trafic"
# class
$totc class add dev $inet_iface parent 1:1 classid 1:$curent_classid htb rate $start_out_rate ceil $full_out_rate $normal_prio
mess_text "$totc class add dev $inet_iface parent 1:1 classid 1:$curent_classid htb rate $start_out_rate ceil $full_out_rate $normal_prio"
#filter
$ipi -t mangle -A OUTPUT -s 0/0 -j MARK --set-mark $curent_mark_num
mess_text "$ipi -t mangle -A OUTPUT -s 0/0 -j MARK --set-mark $curent_mark_num"
$totc filter add dev $inet_iface protocol ip parent 1: prio 3 handle $curent_mark_num fw flowid 1:$curent_classid
mess_text "$totc filter add dev $inet_iface protocol ip parent 1: prio 3 handle $curent_mark_num fw flowid 1:$curent_classid"
# очередь
$totc qdisc add dev $inet_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $inet_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10"

### for users
mess_text "Чтение из массива"
for i in `( echo $IPLIST)`;
do
#обработка массива IP # begin
#увеличиваем счетчик класса
let " curent_classid+=1 "
let " curent_mark_num+=2 "
mess_text "Work with IP: $i start"

# class (классификатор)
mess_text "Класс для траффика от $i "
$totc class add dev $inet_iface parent 1:1 classid 1:$curent_classid htb rate $start_out_rate ceil $full_out_rate $normal_prio
mess_text "$totc class add dev $inet_iface parent 1:1 classid 1:$curent_classid htb rate $start_out_rate ceil $full_out_rate $normal_prio"

# filter (фильтр, отбор)
mess_text "filter for $i"
# предворительное маркирование
mess_text "# предворительное маркирование"
$ipi -t mangle -A FORWARD -s $i -o $inet_iface -j MARK --set-mark $curent_mark_num
mess_text "$ipi -t mangle -A FORWARD -s $i -o $inet_iface -j MARK --set-mark $curent_mark_num"
$ipi -t mangle -A FORWARD -s $i -o $inet_iface -j RETURN
mess_text "$ipi -t mangle -A FORWARD -s $i -o $inet_iface -j RETURN"
# отбор траффика по метке
$totc filter add dev $inet_iface protocol ip parent 1: prio 3 handle $curent_mark_num fw flowid 1:$curent_classid
mess_text "$totc filter add dev $inet_iface protocol ip parent 1: prio 3 handle $curent_mark_num fw flowid 1:$curent_classid"

# queue (очередь)
mess_text "очередь для $i"
$totc qdisc add dev $inet_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $inet_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10"

mess_text "Work with IP: $i finish"
#обработка массива IP # end"
done
mess_text "Чтение массива завершено"

let " curent_classid+=5 "
### for all other trafic (default)
mess_text "### for all other trafic (default) classid = $curent_classid"
# class
$totc class add dev $inet_iface parent 1:1 classid 1:$curent_classid htb rate $start_out_rate ceil $full_out_rate $medium_prio
mess_text "$totc class add dev $inet_iface parent 1:1 classid 1:$curent_classid htb rate $start_out_rate ceil $full_out_rate $medium_prio"
#filter
$totc filter add dev $inet_iface protocol ip parent 1: prio 9 u32 match ip dst 0.0.0.0/0 flowid 1:$curent_classid
mess_text "$totc filter add dev $inet_iface protocol ip parent 1: prio 9 u32 match ip dst 0.0.0.0/0 flowid 1:$curent_classid"
# очередь
$totc qdisc add dev $inet_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $inet_iface parent 1:$curent_classid handle $curent_classid: sfq perturb 10"
}

#all completed
output_from_local_vlan () {
#
# loacl_iface -> SRV
# траффик от сервера и из инета предснятие на выходе сервера

# init of ifb module

ip link set $local_vlan up
mess_text "Подъем виртуального интерфейса"
mess_text "ip link set $local_vlan up"

 # Перенаправить все IP пакеты, приходящие в local_iface, на ifb1
mess_text "# Перенаправить все IP пакеты, приходящие в local_iface, на ifb1"
$totc  qdisc add dev $local_iface handle ffff: ingress
mess_text "$totc  qdisc add dev $local_iface handle ffff: ingress"
$totc filter add dev $local_iface parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev $local_vlan
mess_text "$totc filter add dev $local_iface parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev $local_vlan"

# создаем htb-очередь для выделения полос пропускания
mess_text "# создаем htb-очередь для выделения полос пропускания"
$totc qdisc add dev $local_vlan root handle 1:  htb
mess_text "$totc qdisc add dev $local_vlan root handle 1:  htb"

# начальные (корневые) классы
mess_text "# начальные (корневые) классы"
$totc class add dev $local_vlan  parent 1:  classid 1:1 htb rate $local_full_speed ceil $local_full_speed
mess_text "$totc class add dev $local_vlan  parent 1:  classid 1:1 htb rate $local_full_speed ceil $local_full_speed"

curent_classid="2"
mess_text "reset curent_classid=2"
# ssh
#выделяем ssh
mess_text "#выделяем ssh"
$totc class add dev $local_vlan parent 1:1 classid 1:$curent_classid htb rate $start_out_rate ceil $half_out_rate $server_prio
mess_text "$totc class add dev $local_vlan parent 1:1 classid 1:$curent_classid htb rate $start_out_rate ceil $half_out_rate $server_prio"
#filter
$totc filter add dev $local_vlan protocol ip parent 1: prio 1 u32 match ip sport 22 0xffff flowid 1:$curent_classid
mess_text "$totc filter add dev $local_vlan protocol ip parent 1: prio 1 u32 match ip sport 22 0xffff flowid 1:$curent_classid"
$totc filter add dev $local_vlan protocol ip parent 1: prio 1 u32 match ip dport 22 0xffff flowid 1:$curent_classid
mess_text "$totc filter add dev $local_vlan protocol ip parent 1: prio 1 u32 match ip sport 22 0xffff flowid 1:$curent_classid"
# очередь
$totc qdisc add dev $local_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $local_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10"

let " curent_classid+=1 "
### for GRE  (all trafic)
mess_text "### for GRE  (all trafic)"
# class 
$totc class add dev $local_vlan parent 1:1 classid 1:$curent_classid htb rate $start_out_rate ceil $half_out_rate $server_prio
mess_text "$totc class add dev $local_vlan parent 1:1 classid 1:$curent_classid htb rate $start_out_rate ceil $half_out_rate $server_prio"
#filter
$totc filter add dev $local_vlan protocol ip parent 1: prio 1 u32 match ip protocol 47 0xff flowid 1:$curent_classid
mess_text "$totc filter add dev $local_vlan protocol ip parent 1: prio 1 u32 match ip protocol 47 0xff flowid 1:$curent_classid"
# очередь
$totc qdisc add dev $local_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $local_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10"

let " curent_classid+=1 "
### for ICMP  (all trafic)
mess_text "### for ICMP  (all trafic)"
# class 
$totc class add dev $local_vlan parent 1:1  classid 1:$curent_classid htb rate $start_out_rate ceil $half_out_rate $server_prio
mess_text "$totc class add dev $local_vlan parent 1:1  classid 1:$curent_classid htb rate $start_out_rate ceil $half_out_rate $server_prio"
#filter
$totc filter add dev $local_vlan protocol ip parent 1: prio 1 u32 match ip protocol 1 0xff flowid 1:$curent_classid
mess_text "$totc filter add dev $local_vlan protocol ip parent 1: prio 1 u32 match ip protocol 1 0xff flowid 1:$curent_classid"
# очередь
$totc qdisc add dev $local_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $local_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10"

#################
# local_dest
mess_text "for # local_dest"
let " curent_classid+=1 "
# Откусываем локальный траффик
mess_text "# Откусываем локальный траффик"
$totc class add dev $local_vlan parent 1:1 classid 1:$curent_classid htb rate $local_half_speed ceil $local_full_speed $local_speed_prio
mess_text "$totc class add dev $local_vlan parent 1:1 classid 1:$curent_classid htb rate $local_half_speed ceil $local_full_speed $local_speed_prio"
#filter
$totc filter add dev $local_vlan protocol ip parent 1: prio 1 u32 match ip dst $srv_ip1 flowid 1:$curent_classid
mess_text "$totc filter add dev $local_vlan protocol ip parent 1: prio 1 u32 match ip dst $srv_ip1 flowid 1:$curent_classid"
# очередь
$totc qdisc add dev $local_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $local_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10"


let " curent_classid+=5 "
### for all other trafic (default)
mess_text "### for all other trafic (default)"
# class
$totc class add dev $local_vlan  parent 1:1 classid 1:$curent_classid htb rate $start_out_rate ceil $full_out_rate $normal_prio
mess_text "$totc class add dev $local_vlan  parent 1:1 classid 1:$curent_classid htb rate $start_out_rate ceil $full_out_rate $normal_prio"

#filter
$totc filter add dev $local_vlan protocol ip parent 1: prio 9 u32 match ip dst 0.0.0.0/0 flowid 1:$curent_classid
mess_text "$totc filter add dev $local_vlan protocol ip parent 1: prio 9 u32 match ip dst 0.0.0.0/0 flowid 1:$curent_classid"

# очередь
$totc qdisc add dev $local_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10
mess_text "$totc qdisc add dev $local_vlan parent 1:$curent_classid handle $curent_classid: sfq perturb 10"

}

# all completed
init_iptab(){
# Очистка правил маркирования пакетов
$ipi -t mangle -F
$ipi -t mangle -X
$ipi -t mangle -Z
$ipi -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
mess_text "iptabl init scr"
}

# all completed
start (){
rotatelogfile
# проверка предустановок
init_check
ret_val=$?
if [ "$ret_val" = "1" ]; then
    # начальное заполнение
    echo "128" > /proc/sys/net/ipv4/ip_default_ttl
    echo "1" > /proc/sys/net/ipv4/ip_forward
    echo "1" > /proc/sys/net/ipv4/ip_dynaddr
    # начальная настройка iptables mangle FORWARD
    init_iptab
    # пересчет скоростей
    init_speed
    # настройка исходящего с локального интерфейса траффика
    output_from_local_iface
    # настройка входящего с интернет интерфейса траффика
    output_from_inet_vlan
    # настройка входящего с локального интерфейса траффика
    output_from_local_vlan
    # настройка исходящего с интернет интерфейса траффика
    output_from_inet_iface
    mess_text "shaping started"
fi
}

# all completed
stop(){
# настройка IPtables
init_iptab
# начальное заполнение
echo "128" > /proc/sys/net/ipv4/ip_default_ttl
echo "0" > /proc/sys/net/ipv4/ip_forward
echo "0" > /proc/sys/net/ipv4/ip_dynaddr
# удаление всех корневых очередей
mess_text "$totc qdisc del dev $local_iface root"
$totc qdisc del dev $local_iface root
mess_text "$totc qdisc del dev $local_iface ingress"
$totc qdisc del dev $local_iface ingress
mess_text "$totc qdisc del dev $local_vlan root"
$totc qdisc del dev $local_vlan root
mess_text "$totc qdisc del dev $inet_iface root"
$totc qdisc del dev $inet_iface root
mess_text "$totc qdisc del dev $inet_iface ingress"
$totc qdisc del dev $inet_iface ingress
mess_text "$totc qdisc del dev $inet_vlan root"
$totc qdisc del dev $inet_vlan root

# остановка дополнительных интерфейсов
ip link set $inet_vlan down
mess_text "ip link set $inet_vlan down"
ip link set $local_vlan down
mess_text "ip link set $local_vlan down"
mess_text "shaping stoped"
}

2 комментария:

  1. заметка.
    1. Необходимо пересмотреть кол-во бронируемых типовых потоков.

    ОтветитьУдалить
  2. заметка:
    1. возможно имеет смысл дописать проверку необходимых ПО и ядерных модулей.

    ОтветитьУдалить