от Lucifer

И така … седя си аз на работа и се чудя как да се боря с големите лоши потребители, които ми заемата канала и не мога да си играя играта и да си точна порното. Ядосвам се! Писна ми да ги забранявам IP по IP. Зачетах се из интернет … добрия стар чичо Google ме препрати към lartc.org . Изтеглих си аз ръководството от там (препоръчвам го н а всички) и се хванах да го прочета. О очудване! То Правенето на shaper не било сложно!

Този shaper работи в моята мрежа. Не твърдя да е сложен, защото нямам нужда да се боря с хакери (потребителите ми са „многознайковци“ (вие представяте ли си идота който ми се развика защо нямал нет, като се оказа, че сам си е преинсталирал Windows-a  и не е сложил драйвери за дъно и LAN)).

Така, сега по същество:

Конструкция:

Имам 3 LAN мрежи:

192.168.0.0/24 – локална мрежа за администрацията, най-често използвана за служебни задължения, с изключение на 1 поттребител.

192.168.10.0/24 – локална мрежа за залата за обучение, която и трябва web, с изключение на 2-те машини зад които седя.

192.168.3.0/24 – Wi-Fi мрежа за гостите на хотела, която е отворена и безотчетна

Имам 12 Mbit/s biz download на 2Mbit/s upload от приятелите от БТК.

Slackware 12 машинка с 2 LAN карти (WAN и LAN)

Защо HTB?

HTB, ли? Ми защото се пише по-лесно от CBQ, а и в кернела-а на моя комп го има. Няма да ви лъжа, че е по-стабилен или по-напреднал. Аз съм си мързелив. Просто ми е най-лесен.

Лимитации.

За съжаление qdisc не се справя много добре с shape на igress трафик, за това се възползва от опцията на мрежовите протоколи да пращат само колкото бързо можеш да получиш. За това ще работим с egress трафика (изходящия).

Началото.

#/bin/sh
WAN=eth1
LAN=eth2

Дефинираме bash скрипта и дефинираме LAN картите. Тук е мястото тези от вас които си вдигат лан картите или правят специфични настройки като „ip a a“ да ги направят:

ifconfig $LAN 192.168.0.1 netmask 255.255.255.0
ifconfig $LAN:1 192.168.10.1 netmask 255.255.255.0
ifconfig $LAN:2 192.168.3.1 netmask 255.255.255.0
ip a a dev $WAN xx.xx.xx.xx

Препръчвам да правите всички мрежови настройки преди да започнете да правите shape-а. Започваме с орязване на входящия тряфик. Както казахме, всъщност не можем да го орежем, но можем да ограничим и контролираме изхода от картата към вътрешните мрежи (в случая $LAN).

tc qdisc del dev $LAN root
tc qdisc add dev $LAN root handle 1: htb default 30

Или преведено на човешки – изтрий всички устройства коит „висят“ на интерфейс $LAN и добави root „устройство“ закачено на $LAN с идентификатор 1: и използващо htb (честно казано не знам какво прави default и 30, но си ги търси). Следващата стъпка е да създадем „правила“ за устрйството.

tc class add dev $LAN parent 1: classid 1:1 htb rate 12000kbit ceil 12000kbit burst 15k
tc class add dev $LAN parent 1:1 classid 1:10 htb rate 5000kbit ceil 12000kbit burst 15k prio 1
tc class add dev $LAN parent 1:1 classid 1:20 htb rate 1000kbit ceil 2000kbit burst 15k prio 2

Обяснявам и тук – добавяме клас 1:1 с „родител“ 1: използвайки htb за контрол с минимална скорост 12000 kbit/s (винаги давайте по малки скорости от реалните) и максималан същата. Създаваме 2 „деца“ на този клас 1:10 и 1:20. Като 1:10 има запазени 5000 kbit/s и максимум от 12000 kbit/s (когато има други клиенти има гарантирани 5000, но когато останалия канал е свободен, може да го ползва целия), 1:20 е с осигурен 1000 kbit/s и максимум от 2000 kbit/s. Сега, нека пратим трафика по класовете – това става с tc filter.

tc filter add dev $LAN protocol ip parent 1: prio 1 u32 match ip dst 192.168.10.0/24 flowid 1:10
tc filter add dev $LAN protocol ip parent 1: prio 1 u32 match ip dst 192.168.0.0/24 flowid 1:10
tc filter add dev $LAN protocol ip parent 1: prio 2 u32 match ip dst 192.168.3.0/24 flowid 1:20

Използваме така наречените u32 match-ове. В случая изпозлваме ip dst или destination ip. u32 позволява да се фитрира по много показатели:

  • dst
  • src
  • dport
  • sport
  • tos
  • protcol*

*protocol филтъра взима променливите си от /etc/protcols, например ако icmp е 1, то match ip protocol 1 0xff

като могат да се правят n на брой комбинации.

И така какво имам до тук? Имаме едно „дърво“:

  1:
   |
  1:1
   /\
  /  \
 |    |
1:10 1:20

И филтри които да пращат към „клоните“. Това е за входящия трафик. Сега да направим същото за изходящия (извинете но тук няма да обяснявам, защото до сега го обясних достатъчно подробно). Та за $WAN интерфейса:

tc qdisc del dev $WAN root
tc qdisc add dev $WAN root handle 1: htb default 30
tc class add dev $WAN parent 1: classid 1:1 htb rate 2000kbit ceil 2000kbit burst 15k
tc class add dev $WAN parent 1:1 classid 1:10 htb rate 1000kbit ceil 2000kbit burst 15k prio 1
tc class add dev $WAN parent 1:1 classid 1:20 htb rate 512kbit ceil 1000kbit burst 15k prio 2
tc filter add dev $WAN protocol ip parent 1: prio 1 u32 match ip src 192.168.10.0/24 flowid 1:10
tc filter add dev $WAN protocol ip parent 1: prio 1 u32 match ip src 192.168.0.0/24 flowid 1:10
tc filter add dev $WAN protocol ip parent 1: prio 2 u32 match ip src 192.168.3.0/24 flowid 1:20

След този момент вече сте свободни да работите с iptables и да си направите колкото си искате правила за портове и настройки.

Отново подчертавам, че това е една малка и проста конструкция предиведна за SOHO мрежа. Както виждате има и слабо място, но смятам и това да изчистя. Когато го направя ще пиша още.

Ваш,

Lucifer


6 Отговори на “qdisc htb … или лесен за правене shaper”

    • Молба – Пиши на кирилица от тук на татък!

      Идеята на статията, както и на повечето статии от секция „HowTo“ е да знам къде да търся информацията когато ми потрябва пак, защото не помня повече от колкото ми трябва. Радвам се че ти е харесала.

  1. Може ли един тъп въпрос 🙂 просто съм новак.
    Статията е супер .
    Само ако може да разбера всички редове от сорта
    tc qdisc del dev $WAN root
    tc qdisc add dev $WAN root handle 1: htb default 30
    tc class add dev $WAN parent 1: classid 1:1 htb rate 2000kbit ceil 2000kbit burst 15k
    tc class add dev $WAN parent 1:1 classid 1:10 htb rate 1000kbit ceil 2000kbit burst 15k prio 1
    tc class add dev $WAN parent 1:1 classid 1:20 htb rate 512kbit ceil 1000kbit burst 15k prio 2
    tc filter add dev $WAN protocol ip parent 1: prio 1 u32 match ip src 192.168.10.0/24 flowid 1:10
    tc filter add dev $WAN protocol ip parent 1: prio 1 u32 match ip src 192.168.0.0/24 flowid 1:10
    tc filter add dev $WAN protocol ip parent 1: prio 2 u32 match ip src 192.168.3.0/24 flowid 1:20

    ги пиша в конзолатата или трябва да се поставят в някой файл и кой е той ако е във файл

    • Трябва да ги сложиш в изпълним file и не забравяй да дефинираш $WAN и $LAN.

      При мене файла се казва /etc/rc.d/rc.firewall

      За да може да се изпълнява при старт на машината, но ако дистрибуцията ти не е Slackware трябва да видиш къде ти стоя on boot процедурите

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

 

Този сайт използва Akismet за намаляване на спама. Научете как се обработват данните ви за коментари.

WordPress Appliance - Powered by TurnKey Linux