Автор Гілка: Допоможіть з командою tc  (Прочитано 7292 раз)

Відсутній sepultura.exp

  • Новачок
  • *
  • дописів: 25
  • Карма: +0/-0
  • I Love Music !!
Всім привіт!!

Недавно мені виникла потреба вивчити команду tc і написати скрипт для певної задачі.
Завдання було: обмежити трафік на певну ІР адресу, а весь остальний трафік розділити порівну між іншими комп'юторами.
Як ви знаєте команда tc - досить важка, і тому результат вийшов не такий як потрібно було.

Ось написаний скрипт:

#створив кореневу htb чергу для виділення смуг пропускання
tc qdisc add dev eth0 root handle 1: htb default 11

#створив самі ж полоси
#кореневу полосу
tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbit ceil 100kbit

#і підлеглі їй смуги
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 20kbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 80kbit

#створив фільтр для окремого клієнта
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dst 212.1.102.50/32 flowid 1:10

#створив черги реалізуючих класи
tc qdisc add dev eth0 parent 1:10 handle 20: pfifo limit 5
tc qdisc add dev eth0 parent 1:11 handle 30: pfifo limit 5

Результат досить цікавий. Трафік цей скрипт обмежує, але не так як тре!.
Швидкість на певну ІР мала бути 20 кбіт/с, а стала 70-85 кбайт/с.

Хто знає де я помилився - вкажіть мою помилку. Можу хто знає яким має бути скрипт для цієї задачі - напишіть приклад будьласка. Буду дуже вдячний!!!!

Відсутній Volodymyrko

  • Графоман
  • ****
  • дописів: 370
  • Карма: +0/-0
  • I Like FreeBSD !
Re: Допоможіть з командою tc
« Відповідей #1 : 2007-11-14 13:46:13 »
в цьому прикладі змніив тільки назву інтерфейсу і іп ...
так мене зарзу так рубануло ...  , правда не міряв жодним чином швидкість трафіку, але було відчутно і бех них : треба було чекати кілька сек.. шщоб виконати команду на tc del ..

Відсутній sepultura.exp

  • Новачок
  • *
  • дописів: 25
  • Карма: +0/-0
  • I Love Music !!
Re: Допоможіть з командою tc
« Відповідей #2 : 2007-11-14 16:37:27 »
в цьому прикладі змніив тільки назву інтерфейсу і іп ...
так мене зарзу так рубануло ...  , правда не міряв жодним чином швидкість трафіку, але було відчутно і бех них : треба було чекати кілька сек.. шщоб виконати команду на tc del ..
Та скрипт швидкість зменшувати зменшує, але зовсім не так як треба. От сьогодні знову цілий день сидів, експериментував - вже не знаю за що взятися...

Я пробував цей скрипт під UBUNTU, може ці черги по різному діють в залежності в якій *nix системі їх реалізуєш??

Може ще які є варіанти по обмеженню трафіка?? От часто в провайдерів купляєш пакет з певною швидкістю, а от яким чином вони його обмежують?
« Змінено: 2007-11-14 16:39:37 від sepultura.exp »

Відсутній Volodymyrko

  • Графоман
  • ****
  • дописів: 370
  • Карма: +0/-0
  • I Like FreeBSD !
Re: Допоможіть з командою tc
« Відповідей #3 : 2007-11-14 17:31:49 »
цікаво ..
ось це я вже перевіряв
#!/bin/sh
int=eth3
rate=20
src=192.168.18.33
ip=$src
/usr/sbin/tc qdisc del dev  $int root handle 1: htb  >/dev/null  2>&1
/usr/sbin/tc qdisc add dev  $int root handle 1: htb
/usr/sbin/tc class add dev  $int parent 1:1 classid 1:3 htb  prio 3 rate ${rate}kbit
/usr/sbin/tc filter add dev $int protocol ip parent 1:0 prio 2 u32  match ip dst ${ip}  flowid 1:3
тут швидкості не булонавіть 3Кбайт (що і є 20Кбіт).. так що працює ..
в мене Сусе .. але не думаю щол в інших лінуксам інше ...

якщо треаб тільки одній ІП обрізати трафік то можна зробити так як і я  тут описав .. не потрібно інших класів і т.д.


« Змінено: 2007-11-14 17:32:17 від vova07 »

Відсутній sepultura.exp

  • Новачок
  • *
  • дописів: 25
  • Карма: +0/-0
  • I Love Music !!
Re: Допоможіть з командою tc
« Відповідей #4 : 2007-11-15 16:35:19 »
цікаво ..
ось це я вже перевіряв
#!/bin/sh
int=eth3
rate=20
src=192.168.18.33
ip=$src
/usr/sbin/tc qdisc del dev  $int root handle 1: htb  >/dev/null  2>&1
/usr/sbin/tc qdisc add dev  $int root handle 1: htb
/usr/sbin/tc class add dev  $int parent 1:1 classid 1:3 htb  prio 3 rate ${rate}kbit
/usr/sbin/tc filter add dev $int protocol ip parent 1:0 prio 2 u32  match ip dst ${ip}  flowid 1:3
тут швидкості не булонавіть 3Кбайт (що і є 20Кбіт).. так що працює ..
в мене Сусе .. але не думаю щол в інших лінуксам інше ...

якщо требa тільки одній ІП обрізати трафік то можна зробити так як і я  тут описав .. не потрібно інших класів і т.д.

Я спробував по цьому скрипту зробити, результат той самий і в результаті кількох експериментів у мене виникло кілька питань:
- перевіряв за допомогою команди ping -s [підставляв різні значення], - от по пінгах справді видно що воно обмежує трафік, любі зміни до дрібниць відчутно і видно зразу. (При пінгах обження 100% таке як і треба). А от коли починаю скачувати файл з сервера, швидкість менша ніж без черги, але більша від обмеження   (20 кбіт/с, 70-85 кбайт/с. - про це я розказував вище)
- я помітив що у тебе інтерфейс в скрипті eth3 - значить виходить висновок що експерименти ти робив на серваку?
- на скільки я знаю трафік обмежується тільки вихідний, яким чином ти тестував це? за допомогою цього 192.168.18.33 комп'ютера?
- я це все робив на комп'ютері з одним мережевим інтерфейсом eth0, може бути варіант що саме зза цього воно так дивно обмежує трафік? Бо мій комп"ютер не сервер, а клієнт. І перш ніж рушити до сервера, я роблю експерименти на ПК з одною мережевою картою.

« Змінено: 2007-11-15 16:37:30 від sepultura.exp »

Відсутній Volodymyrko

  • Графоман
  • ****
  • дописів: 370
  • Карма: +0/-0
  • I Like FreeBSD !
Re: Допоможіть з командою tc
« Відповідей #5 : 2007-11-15 17:11:34 »
Цитата
значить виходить висновок що експерименти ти робив на серваку?
так на сервері робочому, клієнтом була  виндова машина, на якій я  скачуввав великий файл по http .. з іншого веб-серверу  ,
тобто умови справжні ..
Цитата
на скільки я знаю трафік обмежується тільки вихідний, яким чином ти тестував це? за допомогою цього 192.168.18.33 комп'ютера?
так обмежуєть вихідний .. стосовно серверу, через який той трафік проходить, трафік і буде вихідним ..
так за  допомогою 192.168.18.33 ,  скачував великий файл з веб-серверу,  доступ до якого проходить через лінукс ,
і сам explorer показував ~2-3КБ і trafshow на сервері також ..

Цитата
я це все робив на комп'ютері з одним мережевим інтерфейсом eth0,
-- не зовсім понятно,
« Змінено: 2007-11-15 17:12:57 від vova07 »

Відсутній sepultura.exp

  • Новачок
  • *
  • дописів: 25
  • Карма: +0/-0
  • I Love Music !!
Re: Допоможіть з командою tc
« Відповідей #6 : 2007-11-16 08:49:39 »
Цитата
я це все робив на комп'ютері з одним мережевим інтерфейсом eth0,
 
-- не зовсім понятно,

Пояснюю: я експерименти робив на звичайному клієнтському ПК (на ньому ж запускав цей скрипт) в якого тільки один мережевий інтерфейс eth0, а не на сервері з кількома мережевими інтерфейсами (eth0, eth1, eth2, eth3). Виходить я пробував на комп'юторі на якому працював поставити на нього самого обмеження. І в результаті успішності експериментів перейти на сервер і ставити обмеження вже на ньому.

І виходить що в мене трафік на цьому експериментальному ПК був тільки вхідний, а не вихідний. Можливо тому обмеження каналу так дивно працюють??

Ще одне питання, якщо я створю чергу для певної ip адреси, інший трафік виходить буде ділитись порівну між всіма іншими комп'ютерами без всяких обмежень?

Відсутній Volodymyrko

  • Графоман
  • ****
  • дописів: 370
  • Карма: +0/-0
  • I Like FreeBSD !
Re: Допоможіть з командою tc
« Відповідей #7 : 2007-11-16 09:52:08 »
Цитата
Виходить я пробував на комп'юторі на якому працював поставити на нього самого обмеження.
може бути і через це.. там  якщо то і клієнт і сервер  то один компютер -- то трафік може іти через lo ..
я пропоную зарзу на сервері пробувати..  цим скриптом (якщо лишнього не добавляти) нічого поганого не зробиш ..

Цитата
інший трафік виходить буде ділитись порівну між всіма іншими комп'ютерами без всяких обмежень?
так обмежень не буде ... але ділитись не буде порівно - а скільки хто собі увірве
« Змінено: 2007-11-16 09:52:39 від vova07 »

Відсутній sepultura.exp

  • Новачок
  • *
  • дописів: 25
  • Карма: +0/-0
  • I Love Music !!
Re: Допоможіть з командою tc
« Відповідей #8 : 2007-11-16 10:49:46 »
може бути і через це.. там  якщо то і клієнт і сервер  то один компютер -- то трафік може іти через lo ..
я пропоную зарзу на сервері пробувати..  цим скриптом (якщо лишнього не добавляти) нічого поганого не зробиш ..

На разі дякую, буду пробувати на сервері. Результати напишу.

Відсутній sepultura.exp

  • Новачок
  • *
  • дописів: 25
  • Карма: +0/-0
  • I Love Music !!
Re: Допоможіть з командою tc
« Відповідей #9 : 2007-11-16 15:41:36 »

Ура!! Вихідний трафік обмежує так як і потрібно. Дуже вдячний!!! 8-)

Але яким чином обмежити трафік з тої ж самої ip і в другу сторону?
На сервері - два мережевих інтерфейси - eth0 та eth1.

Ось структура:
                                                                    ip окремого пк
                                             --------                  xxx.xxx.xxx.xxx ...
Зовнішній канал ----- eth1-| linux |-eth0 -------------[локальна мережа]
                                             --------
Чи для цього щоб обмежити швидкість і в другу сторону треба запустити той самий скрипт, тільки змінити мережевий інтерфес на інтерфейс із вхідного каналу?
« Змінено: 2007-11-16 15:57:36 від sepultura.exp »

Praporshic

  • Гість
Re: Допоможіть з командою tc
« Відповідей #10 : 2007-11-16 17:29:12 »
Чи для цього щоб обмежити швидкість і в другу сторону треба запустити той самий скрипт, тільки змінити мережевий інтерфес на інтерфейс із вхідного каналу?
Саме так. До речі, раджу htb.init - приємна річ коли треба створювати багацько правил.

Відсутній miwa

  • Літератор
  • ******
  • дописів: 1111
  • Карма: +0/-0
Re: Допоможіть з командою tc
« Відповідей #11 : 2007-11-17 09:57:09 »

Ура!! Вихідний трафік обмежує так як і потрібно. Дуже вдячний!!! 8-)

Але яким чином обмежити трафік з тої ж самої ip і в другу сторону?
Щось я зранку не дуже добре думаю, але все ж вхідний трафік (я вірно зрозумів процитований текст?) в загальному випадку на мережевій карті обмежити неможливо.
Читайте документацію - вона кермує.

Відсутній sepultura.exp

  • Новачок
  • *
  • дописів: 25
  • Карма: +0/-0
  • I Love Music !!
Re: Допоможіть з командою tc
« Відповідей #12 : 2007-11-19 09:19:25 »

Ура!! Вихідний трафік обмежує так як і потрібно. Дуже вдячний!!! 8-)

Але яким чином обмежити трафік з тої ж самої ip і в другу сторону?
Щось я зранку не дуже добре думаю, але все ж вхідний трафік (я вірно зрозумів процитований текст?) в загальному випадку на мережевій карті обмежити неможливо.
Я вже наекспериментував. Трафік тре обмежувати на сервері а не на звичайному ПК в якого тільки карта мережева. На одному мережевому інтерфесу обмежити вхідний і вихідний трафік звичайно що не можна, тільки вихідний. А щоб обмежити в другу і вхідний треба шаманити з іншим мережевим інтерфейсом(мережевою картою).
« Змінено: 2007-11-19 09:42:30 від sepultura.exp »

Відсутній Volodymyrko

  • Графоман
  • ****
  • дописів: 370
  • Карма: +0/-0
  • I Like FreeBSD !
Re: Допоможіть з командою tc
« Відповідей #13 : 2007-11-19 09:20:17 »
Цитата
Чи для цього щоб обмежити швидкість і в другу сторону треба запустити той самий скрипт, тільки змінити мережевий інтерфес на інтерфейс із вхідного каналу?
залежно від умов ..
в тебе напевно НАТ, тому не так просто .. (а якщо нема НАТ-у то так тільки назву інерфейсу поміняти)
треба викорситовувати iptables+mark,

Відсутній sepultura.exp

  • Новачок
  • *
  • дописів: 25
  • Карма: +0/-0
  • I Love Music !!
Re: Допоможіть з командою tc
« Відповідей #14 : 2007-11-19 10:09:20 »
Цитата
Чи для цього щоб обмежити швидкість і в другу сторону треба запустити той самий скрипт, тільки змінити мережевий інтерфес на інтерфейс із вхідного каналу?
залежно від умов ..
в тебе напевно НАТ, тому не так просто .. (а якщо нема НАТ-у то так тільки назву інерфейсу поміняти)
треба викорситовувати iptables+mark,
Так, в мене NAT. І виходить без маркування пакетів ніяк не обійтись?