Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2010-05-27 07:34:11

  Ziom - Nowy użytkownik

Ziom
Nowy użytkownik
Zarejestrowany: 2010-05-27

Kształtowanie ruchu z podsieciami na osobnych interfejsach HTB/IFB

Przywitam się najpierw bo nowy jestem - Cześć ;)

Do rzeczy...

Router ma 5 sieciówek: eth0 - DSL, eth1 - podsieć 1, eth2 - podsieć 2, itd...

Skonfigurowałem sobie ładnie ogniościankę i co się ma dogadywać to się dogaduje a co nie to nie.

Żeby sprawiedliwości stało się za dość, starym zwyczajem dodaję kształtowanie ruchu. I tu pojawia się problem. Do tej pory miałem jedną sieciówkę na LAN i ograniczanie downloadu dla userów odbywało się standardowo: HTB+SFQ. Dodam tylko, że nie jestem generalnie biegły w temacie shapingu. Wiem co i gdzie wetknąć ale nie oczekujcie ode mnie wyjaśnień dlaczego to działa ;) Mając 4 podsieci na 4 sieciówkach, musiałbym - na chłopski rozum, do każdej z nich przypisać 0,5 Mbit, żeby się nie zapchało. Oczywiście nie jest to rozwiązanie więc szukam czegoś co pozwoli mi zarządzać ruchem na wszystkich 4 sieciówkach razem. Mówią, że Google wie wszystko no to zapytałem. Przebąknęło coś o IMQ i IFB. Jeśli dobrze zrozumiałem oba te pomysły polegają na utworzeniu sztucznego interfejsu do którego wpuszcza się dowolny ruch, na nim odbywa się "magia" a potem wszystko wraca tam gdzie było, czy tak? IMQ jeśli dobrze rozumiem wiąże się z paczowaniem jaja. Nie jest to dla mnie tragedia ale wyczytałem, że z IFB tego problemu nie ma więc wolałbym IFB. Skonfigurowałem jajko i mam ifb.

Byłbym wdzięczny za naprowadzenie mnie na odpowiednie tory. Szczególnie interesuje mnie składnia utworzenia odpowiednich kolejek i przypisania ruchu z eth1, 2, 3 i 4 do ifb0, bo rozumiem, że tak miałoby to mniej więcej wyglądać, nie?

Offline

 

#2  2010-05-27 07:47:37

  Graffi - Użytkownik

Graffi
Użytkownik
Skąd: Sulejówek
Zarejestrowany: 2005-10-03
Serwis

Re: Kształtowanie ruchu z podsieciami na osobnych interfejsach HTB/IFB

tutaj jest taka "magia" opisana
http://forum.dug.net.pl/viewtopic.php?pid=112994#p112994
wiesz co, tylko ja tego nie ogarniam gdzieś swoim rozumem, próbowałem to swego czasu odpalić i mi nie działało, jak będziesz tak dobry i podzielisz się najprostszą ale działającą wersją to będę wdzięczny - bo na pewno mi się przyda :)

Offline

 

#3  2010-05-27 08:47:06

  Ziom - Nowy użytkownik

Ziom
Nowy użytkownik
Zarejestrowany: 2010-05-27

Re: Kształtowanie ruchu z podsieciami na osobnych interfejsach HTB/IFB

Z tego co widzę Graffi to pod tym linkiem jest jeszcze inniejsza magia. Jak mi userzy trochę zejdą z sieci to poeksperymentuję. Dam znać jak wyszło i ciągle czekam na wszelkie sugestie :)

Offline

 

#4  2010-05-27 08:52:57

  mariaczi - Użytkownik

mariaczi
Użytkownik
Zarejestrowany: 2007-10-02

Re: Kształtowanie ruchu z podsieciami na osobnych interfejsach HTB/IFB

Tutaj znajdziesz co i jak z IFB http://www.linuxfoundation.org/collaborate/workgroups/networking/ifb#IFB_Usage
Aby ruch był przekierowany, to głównie chodzi o kawałek

Kod:

tc filter add dev eth0 parent ffff: protocol ip prio 10 u32 \
  match u32 0 0 flowid 1:1 \
  action mirred egress redirect dev ifb0

Ten redirect powyżej nakazuje na przeniesienie ruchu na IFB.

Offline

 

#5  2010-05-27 22:14:47

  Ziom - Nowy użytkownik

Ziom
Nowy użytkownik
Zarejestrowany: 2010-05-27

Re: Kształtowanie ruchu z podsieciami na osobnych interfejsach HTB/IFB

Dobra... Trochę drgnęło. Połowy ciągle nie rozumiem ale udało mi się podnieść interfejs ifb0, ustawić na nim kolejki i przekierować ładnie ruch. Widzę po statystykach interfejsu w TC, że ruch jest ograniczany innymi słowy regułki działają... Problem polega na tym, że to wszystko dzieje się na ifb0... Nie ma to ŻADNEGO wpływu na wszystkie eth... Może to zabrzmi głupio ale jak ja mam ten uporządkowany i poprzycinany ruch wrzucić z powrotem na poszczególne fizyczne interfejsy eth1, eth2, et3, itd...? Czuję, że jestem blisko :) Tak jakby brakowało mi ostatniego klocka do układanki, która pozwoliłaby mi na rozpoczęcie myślenia o myśleniu o jakim takim zakumaniu tego tematu ;)

EDIT:
Czy może potem w skrypcie ogniościanki mam operować już na ifb0? Tylko musiałbym odpalać go PO skrypcie to kształtowania ruchu... Ech... Czapka mi się gotuje...

Ostatnio edytowany przez Ziom (2010-05-27 22:17:23)

Offline

 

#6  2010-05-29 10:31:02

  Ziom - Nowy użytkownik

Ziom
Nowy użytkownik
Zarejestrowany: 2010-05-27

Re: Kształtowanie ruchu z podsieciami na osobnych interfejsach HTB/IFB

Dobra rozkminiłem temat. Tak mi się wydaje przynajmniej.

[b]PROBLEM:[/b]

Rozdzielenie pasma pobierania dla komputerów w 4 podsieciach obsługiwanych przez 4 osobne sieciówki.

[b]PLAN SYTUACYJNY:[/b]

Piątkowy poranek, lekka mgła snuje się za oknem. Rześki zapach trawy przypomina że... im szybciej się z tym uporam tym szybciej wyjdę na zewnątrz ;)

Router - Debian Lenny z jajem 2.6.34
Łącze - DSL 2 Mbit (eth0)
Sieć - 4 podsieci na 4 sieciówkach (interfejsy i adresacja: eth1 - 192.168.1.0/24, eth2 - 192.168.2.0/24, eth3 - 192.168.3.0/24, eth4 - 192.168.4.0/24)

Relatywnie standardowy firewall z NAT. Nic szczególnego.

[b]DISKLEJMER:[/b]

[u][b]Nie byłem, nie jestem i nigdy nie będę adminem z prawdziwego zdarzenia więc proszę o wyrozumiałość.
[/b][/u]
[b]AKCJA:[/b]

Naczytałem się, nasłuchałem, nagóglałem i znalazłem mało konkretów i dużo śmieci. Po kilku próbach zaadaptowania tego co znalazłem - nieco na chybił trafił, postanowiłem że wezmę się z tematem za bary i spróbuję to rzeczywiście zrozumieć.
Cel osiągnięty połowicznie - działa ale nie łapię wszystkiego w 100%. Podzielę się jednak tym co mam - może komuś się przyda.

Z racji tego, że normalnie w HTB wszystko odbywa się na konkretnym interfejsie ograniczenie downloadu z DSL (eth0) na poszczególne podsieci (eth1, eth2, eth3, eth4) jest niejako logicznie/fizycznie nie możliwe. Wyjściem lamerskim byłoby ograniczenie każdego interejsu do 1/4 szerokości pasma i udawanie, że tak miało być ;)
Trzeba wykorzytać IFB - co to takiego poczytajcie sobie na góglach. W dużym uproszczeniu - wirtualny interfejs, do którego można wpuścić ruch i mając go w jednym miejscu, kształtować do woli.

Zakładam, że kształtowanie ruchu przy użyciu HTB, SFQ znasz (jeśli nie - gógle).

Wszytkie szerokości pasma ustawiłem sobie na 98% możliwości - tak dla pewności, żeby się nie pozatykało jakby co. Kształtowanie odbywa się per user (albo raczej per podsieć) a nie per usługa.

Skrpt bash odpalany po firewallu:

Kod:

#!/bin/sh

IFBD="ifb0"
DSL="eth0"
SZLACHTA="eth1"
SLUZBA="eth2"
MIESZCZANIE="eth3"
PLEBS="eth4"

# 100 mbit = 102400 kbit (98% = 100352 kbit)
# 2 mbit = 2048 kbit (98% = 2008 kbit)
# 100352 kbit - 2008 kbit = 98344 kbit

# IFB

# Podnosimy interfejs IFB
ifconfig $IFBD up

# Tworzymy główną kolejkę dla IFB
tc qdisc add dev $IFBD root handle 1:0 htb

# ...i klasy
tc class add dev $IFBD parent 1:0 classid 1:1 htb rate 2008kbit ceil 2008kbit

tc class add dev $IFBD parent 1:1 classid 1:11 htb rate 502kbit ceil 2008kbit prio 1
tc class add dev $IFBD parent 1:1 classid 1:12 htb rate 502kbit ceil 2008kbit prio 3 
tc class add dev $IFBD parent 1:1 classid 1:13 htb rate 502kbit ceil 2008kbit prio 2 
tc class add dev $IFBD parent 1:1 classid 1:14 htb rate 502kbit ceil 2008kbit prio 3

# ...i filtry
tc filter add dev $IFBD parent 1:0 protocol ip u32 match ip dst 192.168.1.0/24 flowid 1:11 
tc filter add dev $IFBD parent 1:0 protocol ip u32 match ip dst 192.168.2.0/24 flowid 1:12 
tc filter add dev $IFBD parent 1:0 protocol ip u32 match ip dst 192.168.3.0/24 flowid 1:13 
tc filter add dev $IFBD parent 1:0 protocol ip u32 match ip dst 192.168.4.0/24 flowid 1:14 

# ...i dzielimy "po równo" ;)
tc qdisc add dev $IFBD parent 1:11 handle 1:110 sfq perturb 10 2>/dev/null 
tc qdisc add dev $IFBD parent 1:12 handle 1:120 sfq perturb 10 2>/dev/null 
tc qdisc add dev $IFBD parent 1:13 handle 1:130 sfq perturb 10 2>/dev/null 
tc qdisc add dev $IFBD parent 1:14 handle 1:140 sfq perturb 10 2>/dev/null  

# SZLACHTA

# Tworzymy główną kolejkę dla SZLACHTY
tc qdisc add dev $SZLACHTA root handle 1:0 htb 

# ...i klasy
# pierwsza linijka oznacza całą szerokość dla połączeń z LAN (98% ze 100 Mbit)
tc class add dev $SZLACHTA parent 1:0 classid 1:1 htb rate 100352kbit ceil 100352kbit quantum 100 
# druga linijka to szerokość dla połączeń z LAN obcięta o potencjalnie całe pasmo z DSL
tc class add dev $SZLACHTA parent 1:1 classid 1:2 htb rate 98344kbit ceil 98344kbit prio 2 quantum 100 
# trzecia linijka to szerokość pasma dla pełnej rury z DSL (prio 1 jest po to, żeby jak ktoś podczas downloadowania pornosów, zacznie kopiować po LAN, nie obcięło prędkości z DSL)
tc class add dev $SZLACHTA parent 1:1 classid 1:3 htb rate 2008kbit ceil 2008kbit prio 1 quantum 100 

# ...i filtry
# tutaj przekierowujemy cały ruch z DSL do podsieci do IFB
tc filter add dev $SZLACHTA parent 1:0 protocol ip u32 match ip dst 192.168.1.0/24 flowid 1:3 action mirred egress redirect dev $IFBD 1>/dev/null 
# tutaj cały ruch z wszystkich podsieci kierujemy do koryta 1:2 czyli (98% z 100Mbit) - 2008kbit na DSL
tc filter add dev $SZLACHTA parent 1:0 protocol ip u32 match ip src 192.168.0.0/16 flowid 1:2

Teraz regułki SZLACHTY należy powielić dla każdej z podsieci zmieniając odpowiedni interfejs: $SLUZBA, $MIESZCZANIE, $PLEBS i stosowną adresację 192.168.x.0 gdzie trzeba.

[b]EFEKT:[/b]

Jest taki, że całe pasmo z DSL jest ładnie dzielone między poszczególne podsieci. Na razie mi to wystarczy. Głównym problemem był dla mnie podział na podsieci. Można oczywiście pójść dalej i rozdzielić to na poszczególne komputery - to już wedle uznania.

Kod powyżej tworzy wszystkie regułki. Kod poniżej czyści wszystko:

Kod:

tc qdisc del root dev $IFBD 2>/dev/null 
ifconfig $IFBD down

tc qdisc del root dev $SZLACHTA 2>/dev/null 
tc qdisc del root dev $SLUZBA 2>/dev/null 
tc qdisc del root dev $MIESZCZANIE 2>/dev/null 
tc qdisc del root dev $PLEBS 2>/dev/null

I jeszcze mały bonus. Skrypt "iflive" do podglądania klas i filtrów "LIVE".

Kod:

#!/bin/sh
for (( ; ; )) 
do
clear
echo $1
echo ""
echo "QDISC --------------------------------"
tc -s qdisc show dev $1
echo "CLASS --------------------------------"
tc -s class show dev $1 | grep rate
echo "FILTER --------------------------------"
tc -s filter show dev $1 | grep rule
sleep 1
done

Odpalamy go z interfejsem jako parametrem np. iflive ifb0
Co sekundę mamy snapthot stanu kształtowania interfejsu.

To Tyle. Mam nadzieję, że oszczędzi to komuś trochę czasu. Muszę jeszcze dorobić kształtowanie uploadu ale to już później.

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)

[ Generated in 0.011 seconds, 12 queries executed ]

Informacje debugowania

Time (s) Query
0.00010 SET CHARSET latin2
0.00004 SET NAMES latin2
0.00262 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.12.149.174' WHERE u.id=1
0.00087 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.12.149.174', 1730418597)
0.00047 SELECT * FROM punbb_online WHERE logged<1730418297
0.00066 DELETE FROM punbb_online WHERE ident='185.191.171.4'
0.00054 SELECT topic_id FROM punbb_posts WHERE id=148700
0.00009 SELECT id FROM punbb_posts WHERE topic_id=16938 ORDER BY posted
0.00084 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=16938 AND t.moved_to IS NULL
0.00011 SELECT search_for, replace_with FROM punbb_censoring
0.00194 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=16938 ORDER BY p.id LIMIT 0,25
0.00080 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=16938
Total query time: 0.00908 s