Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: [FAQ] Ограничение скорости для клиентов на Ubuntu-Server (htb.init)  (Прочитано 321046 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн SFireMan

  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Блин КАК мне зашейпить исходящий траффик от клиентов к серверу. Иначе если клиент задумает загружать файлы, он весь канал завалит!

Оффлайн gard

  • Любитель
  • *
  • Сообщений: 84
  • -=:area51:=-
    • Просмотр профиля
Напишите класс ограничивающий скорость, для передачи ему управления напишите фильтр, который выбирает пакеты по IP либо по маркеру. Маркер присваивайте в iptables что то типа "все кроме ланки" ! 192.168.1.0/24. В какой цепочке.. хм.. я думаю в POSTROUTING. А на шейпере эти маркированные пакеты просто в DROP. Прммо в фильтре залимитируйте, что пока скорость до такой то то продолжать, выше - drop.
gard.area51@jabber.ru..

Оффлайн Stiff

  • Активист
  • *
  • Сообщений: 677
    • Просмотр профиля
Блин КАК мне зашейпить исходящий траффик от клиентов к серверу. Иначе если клиент задумает загружать файлы, он весь канал завалит!
Зашейпить его не получится, ограничивай полисингом. Это нужно копать в сторону ingress qdisc
вот небольшой пример
tc qdisc add dev $DEVICE handle ffff: ingress
tc filter add dev $DEVICE parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate ${UP}Kbit buffer $[7000+$UP*40] drop flowid :1
этот код подойдёт, если клиент подключается по vpn или pppoe, соответственно $DEVICE - имя интерфейса (eth1, ppp2, ...), $UP - скорость. Если он подключается напрямую, то следует изменить 0.0.0.0/0 на ip клиента или делать отбор по метке.

Оффлайн gard

  • Любитель
  • *
  • Сообщений: 84
  • -=:area51:=-
    • Просмотр профиля
Подумал и решил что патчить ядро да еще и сырцы iptables и потом как то все это ставить я не сумею просто, не хочу терять систему. Наткнулся на такую статью: ftp://ftp.muug.mb.ca/pub/fedora/linux/core/ там говорится об IFB - аналоге IMQ. Пиводится пример ограничения. Сделал как по примеру по аналогии дисциплину с классами. Вот что вышло:
#!/bin/bash
# СБРОС ПРАВИЛ  -----------------------------
 tc qdisc del dev eth0 root
 tc qdisc del dev eth0 ingress

 tc qdisc del dev ifb0 root
 tc qdisc del dev ifb0 ingress


#ТУТ НУЖНО ПЕРЕЗАПУСТИТЬ IPTABLES!!!!!!!!!!!
# ------------------------------------------


# IFB включение ----------------------------
 modprobe ifb
 ip link set dev ifb0 up
# ------------------------------------------

## ПОЛЕЗНЫЕ КОМАНДЫ-------------------------
 tc -s filter show parent ffff: dev eth0
 tc -s qdisc
 ifconfig ifb0
 tc -s filter show dev ifb0 parent 1:
 tc -s qdisc show dev ifb0


######################################################
# ПРИМЕР ограничения входящего трафика
# маркировка IPTABLES недоступна
######################################################

### IFB --------------------------------------------------------------
 tc qdisc add dev ifb0 root handle 1: htb default 12

tc class add dev ifb0 parent 1: classid 1:1 htb rate 1000kbit ceil 1000kbit
tc class add dev ifb0 parent 1:1 classid 1:11 htb rate 140kbit ceil 160kbit
tc class add dev ifb0 parent 1:1 classid 1:12 htb rate 860kbit ceil 1000kbit

## выделили закачку исходников ядра
## wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.gz
 tc filter add dev ifb0 parent 1:1 protocol ip prio 1 u32 match ip src 204.152.191.37/32 flowid 1:11

## выделили закачку исходников fedora core 6
## wget ftp://ftp.muug.mb.ca/pub/fedora/linux/core/6/i386/iso/FC-6-i386-DVD.iso
 tc filter add dev ifb0 parent 1: protocol ip prio 2 u32 match ip src 130.179.31.46/32 flowid 1:12


### eth0 --------------------------------------------------------------
 # перенаправлять входящие пакеты с eth0 в ifb0
 tc qdisc add dev eth0 ingress
 tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0

## TESTING -------------------------------------------------------------
##оцените скорость и т.д.
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.gz

Оно запускается, кажется работает но. .скорость не ограничивает. Возможно потому что я не перестартую iptables? Как это сделать в Ubuntu? Верна ли дисциплина? Ох запарился я как и никто не помогает практически.
gard.area51@jabber.ru..

Оффлайн SFireMan

  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Stiff, огромное спасибо...
Насколько я понял делается очередь из приходящих пакетов, те что не убираются - дропаются...
Выходит канал то все равно используется на полную(или я не прав?), толк от такого шейпинга не большой.

Оффлайн Stiff

  • Активист
  • *
  • Сообщений: 677
    • Просмотр профиля
Насколько я понял делается очередь из приходящих пакетов, те что не убираются - дропаются...
Выходит канал то все равно используется на полную(или я не прав?), толк от такого шейпинга не большой.
Делается очередь, при этом считается скорость прихода пакетов. Если поток привысил заданную скорость, то пакеты, которые идут сверх скорости уничтожаются и если скорость указана грамотно, то канал по полной не используется.

Оффлайн SFireMan

  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Ну вот и замечательно. Теперь все расставилось по полочкам ;)
Получается что htb.init вообще не понятно кому нужное изобретение, через tc напрямую все намного проще делается + офигенная гибкость в конфигурации.

Оффлайн SFireMan

  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Ну и чтобы добить все это, задам еще пару вопросов.
Хотелось бы для исходящей скорости клиентов настроить ряд политик на сервере по приоритетам, также как и для входящей информации к клиентам.
Подключены при помощи одного лишь NAT'a...
Возможно ли также создать классы чтобы те передвали друг другу скорость?
« Последнее редактирование: 14 Ноября 2008, 17:46:37 от SFireMan »

Оффлайн gard

  • Любитель
  • *
  • Сообщений: 84
  • -=:area51:=-
    • Просмотр профиля
Можно конечно попробовать IMQ. А вообще смотря к какой точке вход./выход. интерфейса подклбчать. Можно и для исходящей в инет все сделать.
gard.area51@jabber.ru..

Оффлайн Enlighten

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
Всем постигающим азы шейпинга - ПРИВЕТ!!!
Я на Ubuntu 8.04 уже целых 3 недели!  :) Вот решил поделиться своими попытками реализовать нормальный шейпер.
Главная проблема шейпера на Ubuntu(да и вообще на Linux) - это отсутствие возможности ограничить скорость для самого роутера(сервера, шейпера - у кого как...)
Т.е. без дополнительных модулей ограничить общую скорость входящего трафика на роутере нельзя!
Передо мной стояли следующие задачи:
1) Реализовать общее ограничение скорости, дабы не забивать канал у провайдера.
2) Ограничить скорость у каждого компьютера в локальной сети и у роутера в том числе.
3) Динамически распределить скорость между всеми пользователями+роутер.
4) Организовать приоритет для некоторых видов трафика (SSH, telnet, HTTP).

Во первых, чтобы не задавать лишних вопросов прочтите это http://gazette.linux.ru.net/rus/articles/taleLinuxTC.html
Главный вывод - нам нужен IMQ (Intermediate queueing device). Это псевдо устройство поможет сделать общее ограничение скорости и ограничение скорости для каждого в отдельности.
Альтернатив IMQ нет! :( Более новый модуль IFB, примеры есть тут (http://www.opennet.ru/tips/info/1421.shtml), у вас скорее всего уже включен в ядро - можете порадоваться! Только вот он почему-то не работает с NAT, а IMQ работает, причем замечательно!
IMQ в ядро не включен! И, видимо, не будет включен никогда... Чтобы IMQ у нас работало нам надо пропатчить ядро и пропатчить iptables.

1. Установка IMQ на Ubuntu 8.04:
NB - Не пинайте сильно, я все делал от root'а... Просто в лом каждый раз писать sudo :-\
Для начала скачаем патч для ядра и для iptables - http://www.linuximq.net/patches.html.
Чтобы узнать версию своего ядра пишем:
uname -rЧтобы узнать версию iptables пишем:
iptables --versionТеперь качаем исходники ядра:
apt-get install linux-sourceНасколько я помню, после того как исходники скачались, они появяться в папке /usr/src/. Если их там нет, то копируйте их туда.
Теперь копируйте linux-2.6.24-imq.diff(у меня ядро 2.6.24-server) в папку /usr/src/.
Пишем:
cd /usr/src
tar -xjf linux-source-2.6.24.tar.bz2
cd linux-source-2.6.24
Да-да, именно в этой папке лежат исходники вашего ядра! :)
Для дальнейших действий нам понадобятся следующие пакеты - build-essential ncurses-dev fakeroot libqt3-mt-dev kernel-package:
apt-get install build-essential ncurses-dev fakeroot libqt3-mt-dev kernel-packageЗатем:
patch -p1 < ../linux-2.6.17-imq1.diffЧтобы сохранить все текущие настройки ядра, нужно скопировать из папки /boot/ файл config-2.6.24-21-server(повторюсь - у меня ядро 2.6.24-server):
cp /boot/config-2.6.24-21-server /usr/src/linux-2.6.24/.configЗатем пишем:
make oldconfig - Тут мы все принимаем по умолчанию. Просто тупо жмем "Enter"
Теперь настройка ядра:
make menuconfigПосле этой команды у Вас появиться меню настройки ядра. Чтобы войти в раздел - жмем "Enter", чтобы выйти - 2 раза "Esc". Настраиваем IMQ(источник настройки):
1. Идем в Device Drivers --> Network device support ->
Установить
IMQ (intermediate queueing device) support <M>
IMQ behavior (PRE/POSTROUTING) (IMQ AB) //Тут обязательно AB!!!
Number of IMQ devices (4) // Можно до 16

2. Идем в Networking ---> Networking options ---> Network packet filtering framework (Netfilter) ---> IP: Netfilter Configuration --->
Установить
<M> IMQ target support

3. Идем в Networking ---> Networking options ---> Network packet filtering framework (Netfilter) ---> IPv6: Netfilter Configuration (EXPERIMENTAL) --->
Установить
<M> IMQ target support

4.Идем в Networking support ---> Networking options ---> Network packet filtering framework (Netfilter)
Установить
[ ] Network packet filtering debugging (убрать звезду)

После установки такого ядра у меня отвалился звук. Чтобы этого не произошло и у вас делаем следующее:
1. Идем в Device Drivers --> Sound --> Advanced Linux Sound Architecture --> PCI devices
Устанавливайте <M> на своей звуковухе. Если не знаете какая ставьте везде <M> :)
Теперь аккуратьненько жмем по 2 раза "Esc" до тех пор пока не вернемся в главное меню. И там внизу ищем "Save an Alternate Configuration File" жмем "Enter", "Enter" и  2 раза "Esc" :)
Теперь компилируем ядро:
make-kpkg --append-to-version imq1 --initrd kernel_imageИдем пить чай...
После компиляции в папке /usr/src должен появиться deb-пакет "linux-image-2.6.24.3imq1_2.6.24.3imq1-10.00.Custom_i386.deb". Пишем:
cd /usr/src
dpkg -i linux-image-2.6.24.3imq1_2.6.24.3imq1-10.00.Custom_i386.deb
Перезагружаемся. Если Ubuntu загрузилась и работает, то переходим к следующему этапу, для меня оказавшемуся самым сложным.
Главная проблема в том, что у меня почему-то не получалось откомпилировать даже чистые исходники iptables, без патча IMQ... Почему-то при компиляции iptables у меня появлялось два deb'а. Один - iptables-dev_1.3.8.0debian1-1ubuntu2_i386.deb, другой - iptables_1.3.8.0debian1-1ubuntu2_i386.deb. Но ни тот ни другой не были пропатчены... :(
Как я выяснил, для того чтобы в iptables можно было подключать IMQ командой "-j IMQ --todev 0", в папке /lib/iptables должен быть "libipt_IMQ.so" и "libip6t_IMQ.so". Частично как это сделать нашел тут(http://elessar.one.pl/article_kernel2.6.php)
Скомпилить эти файлы можно так(больше не знаю как):
cd /usr/src
apt-get source iptables
apt-get build-dep iptables #(Зачем - не знаю...)
Копируйте iptables-1.3.x-imq.diff в папку /usr/src. Затем:
cd /usr/src/iptables-1.3.8.0debian1/iptables
patch -p1 <../../iptables-1.3.x-imq.diff
chmod +x extensions/.IMQ-test*
make
cd ..
dpkg-buildpackage -us -uc -nc
cd /usr/src/iptables-1.3.8.0debian1/debian/build/iptables_profectio/extensions
ls|grep IMQ
Если видите файлы libip6t_IMQ.so и libipt_IMQ.so, то все отлично:
cp *IMQ.so /lib/iptables/
cd /usr/src/
Ура!!! На данном этапе у нас стоит IMQ и работает.

2. Проверка работы IMQ в Ubuntu 8.04:
Проверить можно так:
modprobe imq numdevs=4Мы подключили модуль imq. Теперь поднимем устройство imq0:
ip link set imq0 up
ifconfig|grep imq
Если увидели - "imq0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00", то все норм.
Чтобы проверить работу iptables пишем:
iptables -t mangle -A PREROUTING -i eth0 -j IMQ --todev 0Если ошибок нет, то все ок. Чтобы удалить это правило введите:
iptables -t mangle -D PREROUTING -i eth0 -j IMQ --todev 0
После всех этих манипуляций можно настраивать дисциплины на интерфейсе imq0. Я настраивал все с помощью HTB. Пример можно посмотреть тут.
Уфф!

Информация по IMQ(может кому пригодиться): http://wiki.nix.hu/cgi-bin/twiki/view/IMQ/ImqFaq.

Всем кто вытерпел до конца - спасибо! Всем кому помог - можете и мне сказать спасибо!  ;)
« Последнее редактирование: 02 Декабря 2008, 18:30:12 от Enlighten »

Оффлайн Vetal_krot

  • Новичок
  • *
  • Сообщений: 37
    • Просмотр профиля
Возможно ли с помощью htb ограничивать скорость на виртуальном интерфейсе, к примеру ограничивать на eth1:1 независимо от eth1???
kubuntu desctop 8.04, ubuntu server 8.04

Оффлайн InkVisitor

  • Участник
  • *
  • Сообщений: 190
  • Nikopol, Ukraine
    • Просмотр профиля
Возможно ли с помощью htb ограничивать скорость на виртуальном интерфейсе, к примеру ограничивать на eth1:1 независимо от eth1???

Для системы всё равно, реальный он, или виртуальный. А скорость можно резать на исходящий IP, а не на интерфейс.

Оффлайн Vetal_krot

  • Новичок
  • *
  • Сообщений: 37
    • Просмотр профиля
Цитировать
А скорость можно резать на исходящий IP, а не на интерфейс.
А можно здесь поподробней, как ето реализовать, маркировать пакеты?
Когда пытаюсь создать правило для виртуального интерфейса пишет: RTNETLINK answers: File exists

А вообще у меня следующая задача: на одном интерфейсе крутися фтп сервак, игровой сервак и еще всякая ерунда, и етот же интерфейс является шлузом в нет и на иму висит билинг, проблема в том что скорость скачивания с нета и локальных ресурсов на етом интерфейсе одинакова,  нужно что б с инета шол трафик шейпеный, а с всего остального нет, подскажите как ето реализовать?
Шейпить по портам не хочу.
 
« Последнее редактирование: 05 Декабря 2008, 22:55:52 от Vetal_krot »
kubuntu desctop 8.04, ubuntu server 8.04

Оффлайн InkVisitor

  • Участник
  • *
  • Сообщений: 190
  • Nikopol, Ukraine
    • Просмотр профиля
А можно здесь поподробней, как ето реализовать?

Пжалста, стр. 1...4 этой темы.

А можно здесь поподробней, как маркировать пакеты?

Пжалста, стр. 5...7 этой темы.

И вообще, при таких вопросах данная тема ОБЯЗАТЕЛЬНА для прочтения ПОЛНОСТЬЮ!

Оффлайн Vetal_krot

  • Новичок
  • *
  • Сообщений: 37
    • Просмотр профиля
Цитировать
А можно здесь поподробней, как маркировать пакеты?

Пжалста, стр. 5...7 этой темы.

И вообще, при таких вопросах данная тема ОБЯЗАТЕЛЬНА для прочтения ПОЛНОСТЬЮ!

Вопрос стоял не в том как маркировать пакеты, внимательней читайте вопросы!

Перелопатил всю тему, нигде не нашол ничего подобного.

Пробовал маркировать все пакеты идущие с виртуального интерфейса и заганял их в правило с CEIL на 100Мбит , не работает. Кто что еще может предложить?
« Последнее редактирование: 06 Декабря 2008, 01:13:24 от Vetal_krot »
kubuntu desctop 8.04, ubuntu server 8.04

 

Страница сгенерирована за 0.02 секунд. Запросов: 21.