Linux Traffic Shaping За 5 Минут При Помощи htb.init

Posted by Alexey Kovyrin under Networks · english

Если у Вас есть Ваша собственная домашняя сеть с двумя или более компьютерами и она подключена к интернету, вы точно знаете о тех проблемах с одновременным доступом к сети, которые практически неизбежны при таком подключении. Самой большой и раздражающей проблемой является разделение ширины канала между всеми участниками сети: когда вы пытаетесь работать серез ssh с удаленным сервером, а в этот момент ваша wife/брат/друг решает поглядеть новый и очень классный видео клип с Google Video или YouTube, Ваше соединение замирает и вы можете забыть о комфортабельной работе . В этой маленькой статье я дам вам простое решение этой проблемы, которое позволит вам делать все, что угодно не думая о проблемах разделения трафика!

Для начала замечу, что Ваша сеть должна быть подключена к Internet при помощи Linux сервера. Если Вы подключены через какой-то тупой аппаратный маршрутизатор, то Вам сильно не повезло и вы не сможете воспользоваться приведенным примером.

Если же Ваш сервер работает под управлением Linux, тогда используйте слудеющие ниже интсрукции чтобы сделать вашу жизнь проще. Замечу, что у меня интернет подключен к интерфейсу eth0, а локальная сеть – к eth1, канал у меня – симметричное подслючение на 512Kbit/s, потому все примеры будут очновываться на этих параметрах:

  1. Скачайте скрипт htb.init с сайта sourceforge.
  2. Распакуйте его и положите в /sbin/htb.init, сменив ему аттрибуты, чтобы сделать его исполнимым:

    # chmod +x /sbin/htb.init
    

  3. Создайте каталоги для конфигурации и кеша htb.init:

    # mkdir -p /etc/sysconfig/htb
    # mkdir -p /var/cache/htb.init
    

  4. Перейдите в каталог коныигурации htb.initи создайте следующие конфигурационные файлы для исходящего трафика:
    • Файл ‘eth0′ со следующим содержимым:

      DEFAULT=30
      R2Q=100
      

    • Файл ‘eth0-2.root’ со следующим содержимым:

      # root class containing outgoing bandwidth
      RATE=512Kbit
      

    • Файл ‘eth0-2:10.ssh’ со следующим содержимым:

      # class for outgoing ssh
      RATE=256Kbit
      CEIL=512Kbit
      LEAF=sfq
      RULE=*:22
      PRIO=10
      

    • И, наконец, файл ‘eth0-2:30.default’ со следующим содержимым:

      # default class for outgoing traffic
      RATE=256Kbit
      CEIL=512Kbit
      LEAF=sfq
      PRIO=30
      

  5. Теперь, создайте набор файлов для управления входящим трафиком:
    • Файл ‘eth1′ со следующим содержимым:

      DEFAULT=30
      R2Q=100
      

    • Файл ‘eth1-2.root’ со следующим содержимым:

      # root class containing incoming bandwidth
      RATE=512Kbit
      

    • Файл ‘eth1-2:10.ssh’ со следующим содержимым:

      # class for incoming ssh
      RATE=256Kbit
      CEIL=512Kbit
      LEAF=sfq
      RULE=*:22,
      PRIO=10
      

    • Файл ‘eth1-2:20.mytraf’ для конфигурирования параметров канала на Ваш компьютер:

      # class for my incoming traffic
      RATE=256Kbit
      CEIL=512Kbit
      LEAF=sfq
      RULE=192.168.0.2 # this is my ip
      PRIO=20
      

    • И файл ‘eth1-2:30.default’ для параметров канала по умолчанию для остальных со следующим содержимым:

      # default class for outgoing traffic
      RATE=256Kbit
      CEIL=512Kbit
      LEAF=sfq
      PRIO=30
      

  6. Последний шаг – запуск системы контроля трафика при помощи следующей команды:

    # /sbin/htb.init start
    #
    

Если все шаги были выполнены правльно и успешно, Вы можете использовать Ваш канал для работы через ssh, для скачивания файлов или для простого серфинга… Ваше соединение будет честно делиться между всеми участниками домашней сети. Если вы находитесь в сети один, Вы будете использовать всю ширину канала. Как только ваши соседи захотят что-то скачать, ширина канала будет разделена между вами поровну, но ваша работа будет настолько же комфортной, как и в тот момент, когда Вы были одни.

Если хотите узнать больше, используйте следующие ресурсы:


Related posts:

  1. Как настроить IP-IP-тунель между FreeBSD и Linux
  2. Обзор Неофициальных Репозитариев Пакетов Для Дистрибутива Debian GNU/Linux
  3. Linux User in Solaris 10 Survival Guide
  4. Настройка и оптимизация Red Hat Enterprise Linux для баз данных Oracle 9i и 10g
  5. Включение поддержки NCQ Queing на чипсетах ICH7 Chipsets под Linux

11 Responses to this entry

_Andrey_ says:

Огромное спасибо за столь познавательную статью. Но, к сожалению, для меня этот способ не применим – у меня один интерфейс и для локалки, и для выхода в интернет.
Как можно ограничить трафик для “локальщиков” (от меня забирают по ftp)?
Система Gentoo Linux.

newbie says:

Это можно сделать используя iproute2. Документ описывающий детали: Linux Advanced Routing & Traffic Control Howto. Доступен бесплатно :) Видел и в е-донкей сети и в и-нете, только не помню где.

pilson66 says:

Один знакомый нарисовал вот такую штуку…
мож кому поможет :)

#!/bin/sh
# \$speedrate=1+(92*SPEED_OUT)/100;
# Arg Name Example
# $1 $PPP_IFACE Interface name ppp0
# $2 $PPP_TTY The tty ttyS1
# $3 $PPP_SPEED The link speed 38400
# $4 $PPP_LOCAL Local IP number 12.34.56.78
# $5 $PPP_REMOTE Peer IP number 12.34.56.99
# $6 $PPP_IPPARAM Optional “ipparam” value foo

echo ‘ UP ‘ `date` Local $PPP_LOCAL, Remote $PPP_REMOTE, Iface $PPP_IFACE, IPParam $PPP_IPPARAM, Speed $PPP_SPEED>> /var/log/pptp.log

TCC=”/usr/bin/tcng”

shaper () {
INTERFACE=${1}
RATE_IN=${2}
RATE_OUT=${3}
# CEIL_OUT=${4}
IPADDR=${4}
echo ‘ ‘ `date` “!!! SHAPER !!! $INTERFACE-$IPADDR { $RATE_IN / $RATE_OUT }”>> /var/log/pptp.log
# echo ‘ ‘ `date` “!!! SHAPER !!! $INTERFACE-$IPADDR { $RATE_IN / $RATE_OUT-$CEIL_OUT }”>> /var/log/pptp.log

subscript () {
INTERFACE=${1}
RATE_IN=${2}
RATE_OUT=${3}
# CEIL_OUT=${4}
IPADDR=${4}
echo ”
#define IFACE $INTERFACE
#define IPADDR $IPADDR
#define SPEED1_IN $RATE_IN
#define SPEED1_OUT $RATE_OUT

#define R2Q 7

dev IFACE {

/* ЙУИПДСЭЙК ФТБЖЙЛ */
egress {
\$speedceil=SPEED1_OUT;
\$speedrate=\$speedrate=1+(92*SPEED1_OUT)/100;
class ( );
drop if 1 ;
htb ( r2q R2Q ) {
class ( rate \$speedrate kbps, ceil \$speedceil kbps ) {
\$police = class ( rate \$speedrate kbps, ceil \$speedceil kbps ) { sfq ( perturb 10s ); }
}
}
}

/* ЧИПДСЭЙК ФТБЖЙЛ */
\$p = bucket(rate SPEED_IN kbps,burst 10kB);
ingress {
class (1) if conform \$p && count \$p;
drop if 1;
}

}
” | $TCC | sed “s/drop\/\(drop\|pass\)/drop/”
}
SHAPER=$( subscript $INTERFACE $RATE_IN $RATE_OUT $IPADDR )
IFS_OLD=$IFS
IFS=$’\n’
for TC_CMD in $SHAPER; do
echo $TC_CMD >> /var/log/pptp.cmd.log
eval $TC_CMD
done
IFS=$IFS_OLD
}
echo “0″ > /proc/sys/net/ipv4/conf/$PPP_IFACE/send_redirects
echo “0″ > /proc/sys/net/ipv4/conf/$PPP_IFACE/accept_redirects
echo “1″ > /proc/sys/net/ipv4/conf/$PPP_IFACE/secure_redirects
echo “0″ > /proc/sys/net/ipv4/conf/$PPP_IFACE/accept_source_route
echo “0″ > /proc/sys/net/ipv4/conf/$PPP_IFACE/bootp_relay
echo “0″ > /proc/sys/net/ipv4/conf/$PPP_IFACE/proxy_arp
echo “0″ > /proc/sys/net/ipv4/conf/$PPP_IFACE/log_martians
echo “1″ > /proc/sys/net/ipv4/conf/$PPP_IFACE/rp_filter

if [ "$PPP_IFACE" = "ppp99" ]; then
# обработка для внешнего канала
# shaper $PPP_IFACE 1024 128
else
# обработка для внутреннего канала
shaper $PPP_IFACE 64 256 $PPP_REMOTE
fi

redrumor says:

2_Andrey_
можно сделать средствами фтп сервера, например добавив в конфиг такую строку (proftpd)

TransferRate RETR,STOR,APPE 15 user !root

В данном случае мы ограничиваем закачку и скачивание всем пользователям на 15k кроме рута

подробнее http://andry.mine.nu/wordpress/?p=19

inn3r says:

Thank you for a good traffic shapping guide, but I couldn’t understand what does eth1-2:10 mean? I mean that “10″. I’ve red about It. It’s about priority…But could someone explain It easily?

thanks

stels88 says:

Please help – shaper for upload from IP
Плизз нужен шейпер чтоб можно было не только даунлоад резать но и аплоад…

Kostyantyn says:

Данное описание содержит ошибки:
Проблема 1:
При запуске
# /sbin/htb.init start
Получаем:
./htb.init: line 757: /var/cache/htb.init: Is a directory
**HTB: failed to compile HTB configuration!

Решение: Ошибка состоит в том, что мы создали папку /var/cache/htb.init а этого не следовало делать !!! Поскольку # /sbin/htb.init start пытается создать файл с таким же именем в данной папке и не может.

Проблема 2:
Все файлы которые мы создаем: eth0 и т.д. необходимо создавать не в папке /var/cache/htb.init а в папке # mkdir -p /etc/sysconfig/htb

Проблема 3:
может возникнуть предупреждение об ошибке типа:
find: warning: you have specified the -maxdepth option after a non-option argument (, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.
В данном случае зайдите в файл htb.init и уберите знак # в строке HTB_BASIC=”yes”. В моей версии это была 412-я строка.