Výsledky 1 až 6 z 6

Téma: Traffic shaping - problem s markovanim

  1. #1

    Standardní Traffic shaping - problem s markovanim

    Zdravim.
    Muj problem je nasledujici: iptables-1.2.11(p-o-m), kernel-2.4.31. Mam stroj se dvema interfacy, bezi na nem shaping pomoci HTB+SFQ. Na tom by nic nebylo, kdyby to ale s nize uvedenymi zmenami fungovalo. Cely problem, jak jsem zjistil, je v pravdepodobne markovani paketu.

    Na stroji totiz bezi shaper, ktery znaci pakety a shapuje. Ukazka:

    Kód:
    /sbin/tc qdisc del dev eth1 root
    /sbin/tc qdisc del dev eth0 root
    /sbin/iptables -t mangle -A FORWARD -d 10.0.0.0/8 -o eth0 -j ACCEPT
    /sbin/iptables -t mangle -A POSTROUTING -s 10.0.0.0/8 -o eth1 -j ACCEPT
    /sbin/tc qdisc add dev eth1 root handle 1: htb default 2
    /sbin/tc class add dev eth1 parent 1: classid 1:2 htb rate 100Mbit ceil 100Mbit burst 0k
    /sbin/tc class add dev eth1 parent 1:2 classid 1:1 htb rate 800kbit ceil 800kbit burst 0k
    /sbin/tc qdisc add dev eth0 root handle 1: htb default 2
    /sbin/tc class add dev eth0 parent 1: classid 1:2 htb rate 100Mbit ceil 100Mbit burst 0k
    /sbin/tc class add dev eth0 parent 1:2 classid 1:1 htb rate 190kbit ceil 190kbit burst 0k
    /sbin/tc class add dev eth1 parent 1:1 classid 1:160 htb rate 800kbit ceil 800kbit burst 0k
    /sbin/tc class add dev eth0 parent 1:1 classid 1:160 htb rate 200kbit ceil 200kbit burst 0k
    /sbin/tc class add dev eth1 parent 1:160 classid 1:60 htb rate 160kbit ceil 800kbit burst 0k
    /sbin/tc class add dev eth0 parent 1:160 classid 1:60 htb rate 40kbit ceil 200kbit burst 0k
    /sbin/tc class add dev eth1 parent 1:60 classid 1:30 htb rate 60kbit ceil 800kbit burst 0k
    /sbin/tc class add dev eth0 parent 1:60 classid 1:30 htb rate 15kbit ceil 200kbit burst 0k
    Timto vytvori hlavni tridy pro obe rozhrani.
    Kód:
    /sbin/iptables -t mangle -A POSTROUTING -d 10.30.1.90/32 -o eth1 -j MARK --set-mark 2095
    /sbin/iptables -t mangle -A POSTROUTING -d 10.30.1.90/32 -o eth1 -j ACCEPT
    /sbin/iptables -t mangle -A FORWARD -s 10.30.1.90/32 -o eth0 -j MARK --set-mark 2095
    /sbin/iptables -t mangle -A FORWARD -s 10.30.1.90/32 -o eth0 -j ACCEPT
    /sbin/tc class add dev eth1 parent 1:60 classid 1:2095 htb rate 60kbit ceil 400kbit burst 0k
    /sbin/tc qdisc add dev eth1 parent 1:2095 handle 2095 sfq perturb 10
    /sbin/tc filter add dev eth1 parent 1:0 protocol ip handle 2095 fw flowid 1:2095
    /sbin/tc class add dev eth0 parent 1:60 classid 1:2095 htb rate 15kbit ceil 100kbit burst 0k
    /sbin/tc qdisc add dev eth0 parent 1:2095 handle 2095 sfq perturb 10
    /sbin/tc filter add dev eth0 parent 1:0 protocol ip handle 2095 fw flowid 1:2095
    Toto uz je klient #1

    Kód:
    /sbin/iptables -t mangle -A POSTROUTING -d 10.30.255.254/32 -o eth1 -j MARK --set-mark 2094
    /sbin/iptables -t mangle -A POSTROUTING -d 10.30.255.254/32 -o eth1 -j ACCEPT
    /sbin/iptables -t mangle -A FORWARD -s 10.30.255.254/32 -o eth0 -j MARK --set-mark 2094
    /sbin/iptables -t mangle -A FORWARD -s 10.30.255.254/32 -o eth0 -j ACCEPT
    /sbin/tc class add dev eth1 parent 1:60 classid 1:2094 htb rate 60kbit ceil 100kbit burst 0k
    /sbin/tc qdisc add dev eth1 parent 1:2094 handle 2094 sfq perturb 10
    /sbin/tc filter add dev eth1 parent 1:0 protocol ip handle 2094 fw flowid 1:2094
    /sbin/tc class add dev eth0 parent 1:60 classid 1:2094 htb rate 15kbit ceil 25kbit burst 0k
    /sbin/tc qdisc add dev eth0 parent 1:2094 handle 2094 sfq perturb 10
    /sbin/tc filter add dev eth0 parent 1:0 protocol ip handle 2094 fw flowid 1:2094
    Klient #2 atd atd..

    ************************************************** **********

    Az do teto chvile funguje vse 0K. Pak ale chci na vyssi tridu 1:60 (pod kterou jsou klienti) navesit dalsi tridu (skript nize), do ktere by spadaly pakety vyhodnocene jako odpovidajici. To chci resit timto:

    Kód:
    IPT="/sbin/iptables"
    LANDEV="eth1"     #lokalni nic
    INETDEV="eth0"    #ISP
    MAXDOWNRATE="100kbit"
    MINDOWNRATE="50kbit"
    MAXUPRATE="50kbit"
    MINUPRATE="50kbit"
    
    $IPT -t mangle -A PREROUTING -m tcp -j CONNMARK --restore-mark
    $IPT -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
    $IPT -t mangle -A PREROUTING -m ipp2p --ipp2p -j MARK --set-mark 9999
    $IPT -t mangle -A PREROUTING -m mark --mark 9999 -j CONNMARK --save-mark
    #
    #vytvorit novou tridu na lokalnim NIC
    /sbin/tc class add dev $LANDEV parent 1:60 classid 1:9999 htb rate $MINDOWNRATE ceil $MAXDOWNRATE burst 0k
    /sbin/tc qdisc add dev $LANDEV parent 1:9999 handle 9999 sfq perturb 10
    /sbin/tc filter add dev $LANDEV parent 1:0 protocol ip handle 9999 fw flowid 1:9999
    #
    #vytvorit novou tridu na inet NIC
    /sbin/tc class add dev $INETDEV parent 1:60 classid 1:9999 htb rate $MINUPRATE ceil $MAXUPRATE burst 0k
    /sbin/tc qdisc add dev $INETDEV parent 1:9999 handle 9999 sfq perturb 10
    /sbin/tc filter add dev $INETDEV parent 1:0 protocol ip handle 9999 fw flowid 1:9999

    Trida 1:9999 na obou rozhranich se vytvori, funguje bezproblemu (odzkouseno). Ale kdyz se podivam zda-li do nich neco tece, jsou prazdne.


    Timto se dostavam konecne k me otazce: pravdepodobne to markovani nejakym zpusobem koliduje s predchozimi pravidly pro klienty, ale kde? Co delam spatne?

    K tomuto jsem dospel diky "vyhozeni" shaperu a vytvoreni vlastnich hlavnich trid, na ktere jsem povesil 1:9999 (viz. vyse) - pak vse fungovalo - shapovani up/down podle znacky (9999). Docela mne to zarazi..

    Kod vyse je jen ukazka, chci ho implementovat do shaperu ke kazdemu klientovi/adrese.
    amd64 x86_64 AMD Athlon(tm) 64 Processor 3000+ GNU/Linux
    Největší zábavou bývají ty počítačové úlohy, které jsou v praxi naprosto k ničemu

  2. #2
    Administrátor mince Avatar uživatele Jezevec
    Založen
    08.10.2002
    Bydliště
    Teplice
    Příspěvky
    6 738
    Vliv
    300

    Standardní

    Trochu nechapu, ale pokusim se.

    Predevsim si uvedom, ze na paketu je vzdy POSLEDNI mark => zalezi na poradi tech pravidel v iptables, coz z toho neni jasny. Predpokladam teda, ze ty pravidla jsou za sebou tak, jak si to navkladal.

    A)
    Kód:
    /sbin/iptables -t mangle -A FORWARD -d 10.0.0.0/8 -o eth0 -j ACCEPT
    /sbin/iptables -t mangle -A POSTROUTING -s 10.0.0.0/8 -o eth1 -j ACCEPT
    Toto je blbost, patri to do filter, FORWARD + OUTPUT + INPUT (kdyz uz).

    B) ted znackujes dle IP, ale dal bych to komplet do FORWARD, POSTROUTING netreba. Ono, mezi nami, markovat prichozi traffic je <>ina, jelikoz tu ip znas a muzes ji napsat rovnou do shapovacich pravidel. Jen tim v tomhle pripade zbytecne zatezujes CPU.

    C) mno a tady mas to markovani pred routovanim => to je prvni mark na paketu => pokud paket vyhovi jeste nejakymu dalsimu pravidlu (jako ze asi neznamy IP by se v siti moc vyskytovat nemely => urcite vyhovi), tak se mark zmeni !
    IMPROBE AMOR, QUID NON MORTALIA PECTORA COGIS - krutá jsi, lásko, kam až ty doženeš smrtelná srdce -- Vergilius
    Mnoho je prostředků, které léčí lásku, ale žádný není spolehlivý.
    S tím, čeho se na nás dopustili druzí se už nějak vyrovnáme. Horší je to s tím, čeho jsme se na sobě dopustili sami.
    -- Francois La Rochefoucauld
    Nabídnout přátelství tomu, kdo chce lásku, je jako dát chleba tomu, kdo umírá žízní.

  3. #3

    Standardní

    Predevsim si uvedom, ze na paketu je vzdy POSLEDNI mark => zalezi na poradi tech pravidel v iptables, coz z toho neni jasny. Predpokladam teda, ze ty pravidla jsou za sebou tak, jak si to navkladal.
    Tohle jsem potreboval vedet. Zajimalo me, zda se uklada jen prvni, nebo se prepise apod.

    A)
    Kód:
    /sbin/iptables -t mangle -A FORWARD -d 10.0.0.0/8 -o eth0 -j ACCEPT
    /sbin/iptables -t mangle -A POSTROUTING -s 10.0.0.0/8 -o eth1 -j ACCEPT
    Toto je blbost, patri to do filter, FORWARD + OUTPUT + INPUT (kdyz uz).
    Urcite ne, cekni man iptables.

    B) ted znackujes dle IP, ale dal bych to komplet do FORWARD, POSTROUTING netreba. Ono, mezi nami, markovat prichozi traffic je <>ina, jelikoz tu ip znas a muzes ji napsat rovnou do shapovacich pravidel. Jen tim v tomhle pripade zbytecne zatezujes CPU.
    Ono to uz ve forwardu je, iptables -t mangle -A FORWARD -d 10.0.0.0/8 -o eth0 -j .......

    C) mno a tady mas to markovani pred routovanim => to je prvni mark na paketu => pokud paket vyhovi jeste nejakymu dalsimu pravidlu (jako ze asi neznamy IP by se v siti moc vyskytovat nemely => urcite vyhovi), tak se mark zmeni !
    Ok, pokusim se to ceknout. Zatim dik za info.
    amd64 x86_64 AMD Athlon(tm) 64 Processor 3000+ GNU/Linux
    Největší zábavou bývají ty počítačové úlohy, které jsou v praxi naprosto k ničemu

  4. #4
    Administrátor mince Avatar uživatele Jezevec
    Založen
    08.10.2002
    Bydliště
    Teplice
    Příspěvky
    6 738
    Vliv
    300

    Standardní

    k A), urcite jo, tabulka mangle slouzi prave ke znackovani paketu a podobne, rozhodne ne k filtrovani provozu (tim netvrdim, ze to nefunguje).

    Jakykoli filtrovani provozu (zajima te predevsim routovanej provoz) patri do filter FORWARD. Filtrovat neco v postrouting je navic uplnej nesmysl, ty to nejdriv odroutujes a teprve pak rozhodnes o tom, jestli to pustis dal ? Proto to patri do forward.

    k B) ale kdeze, mas tam:

    Kód:
    iptables -t mangle -A FORWARD -d 10.0.0.0/8 -o eth0 -j ACCEPT
    a pak
    Kód:
    iptables -t mangle -A POSTROUTING -d 10.30.255.254/32 -o eth1 -j MARK --set-mark 2094
    iptables -t mangle -A POSTROUTING -d 10.30.255.254/32 -o eth1 -j ACCEPT
    => ty na FORWARDu akceptujes routovani na 10.x sit, ale pak jeste znackujes pakety podle IP po routovani. Jenze jak sem rek, ty tu IP muzes napsat primo do pravidel, protoze ji znas, nemeni se.

    Kdezto pri odchozim provozu se IP meni => na shaper ti prijde paket, kterej ma jako source IP vnejsi (verejnou) adresu => nevic od koho ten paket je => proto si ho oznacis jeste pred NATem.

    zkratka sem
    Kód:
    tc filter add dev eth0 parent 1&#58;0 protocol ip handle 2094 fw flowid 1&#58;2094
    misto handle nacpes primo IP adresu.
    Kód:
    tc filter add dev eth0 parent 1&#58;0 protocol ip u32 match ip dst 10.30.255.254 ...
    usetris tim docela dost, pokud by tech IP melo byt desitky a mozna stovky, tak se to uz kua projevi.
    IMPROBE AMOR, QUID NON MORTALIA PECTORA COGIS - krutá jsi, lásko, kam až ty doženeš smrtelná srdce -- Vergilius
    Mnoho je prostředků, které léčí lásku, ale žádný není spolehlivý.
    S tím, čeho se na nás dopustili druzí se už nějak vyrovnáme. Horší je to s tím, čeho jsme se na sobě dopustili sami.
    -- Francois La Rochefoucauld
    Nabídnout přátelství tomu, kdo chce lásku, je jako dát chleba tomu, kdo umírá žízní.

  5. #5

    Standardní

    Takze pokud jsem to spravne pochopil, staci misto markovani jedne adresy pro up/down tridy:
    Kód:
    /sbin/iptables -t mangle -A POSTROUTING -d 10.30.1.79/32 -o eth1 -j MARK --set-mark 2078
    /sbin/iptables -t mangle -A POSTROUTING -d 10.30.1.79/32 -o eth1 -j ACCEPT
    /sbin/iptables -t mangle -A FORWARD -s 10.30.1.79/32 -o eth0 -j MARK --set-mark 2078
    /sbin/iptables -t mangle -A FORWARD -s 10.30.1.79/32 -o eth0 -j ACCEPT
    dat:

    Kód:
    iptables -t filter -A FORWARD  -d 10.30.x.x/32 -j MARK --set-mark %d
    iptables -t filter -A FORWARD -d 10.30.x.x/32 -j ACCEPT
    iptables -t filter -A FORWARD -s 10.30.x.x/32 -j MARK --set-mark %d 
    iptables -t filter -A FORWARD -s 10.30.x.x/32 -j ACCEPT

    Cely uryvek kodu by pak mel vypadat takto:

    Kód:
     
       /* -------------------------------------------------------- mark down/up */
      
      sprintf&#40;str,"%s -t filter -A %s -d %s -j  MARK --set-mark %d",iptables,chain_forward,ip->addr,ip->mark&#41;;
      safe_run&#40;str&#41;;
    
      sprintf&#40;str,"%s -t filter -A %s -d %s -j ACCEPT",iptables,chain_forward,ip->addr&#41;;
      safe_run&#40;str&#41;;
    
    sprintf&#40;str,"%s -t filter -A %s -s %s -j  MARK --set-mark %d",iptables,chain_forward,ip->addr,ip->mark&#41;;
      safe_run&#40;str&#41;;
      
      sprintf&#40;str,"%s -t filter -A %s -s %s -j ACCEPT",iptables,chain_forward,ip->addr&#41;;
      safe_run&#40;str&#41;;
    
    
      if&#40;ip->min&#41;
      &#123;
       /* -------------------------------------------------------- download class */
       printf&#40;"&#40;down&#58; %d k - %d k ", ip->min, ip->max&#41;; 
    
       sprintf&#40;str,"%s class add dev %s parent 1&#58;%d classid 1&#58;%d htb rate %dkbit ceil %dkbit burst %dk", tc, lan, ip->min, ip->mark,ip->min,ip->max, burst&#41;;
       safe_run&#40;str&#41;;
    
       sprintf&#40;str,"%s qdisc add dev %s parent 1&#58;%d handle %d sfq perturb 10", tc, lan, ip->mark, ip->mark&#41;;
       safe_run&#40;str&#41;;
    	
       sprintf&#40;str,"%s filter add dev %s parent 1&#58;0 protocol ip u32 match ip dst %s", tc, lan, ip->addr&#41;;
       safe_run&#40;str&#41;;
       
    
       /* -------------------------------------------------------- upload class */
       printf&#40;"up&#58; %d k - %d k&#41;\n", ip->min/asymetry_ratio-asymetry_fixed, ip->max/asymetry_ratio-asymetry_fixed&#41;; //upload podleha asymetry ratio!
    
       sprintf&#40;str,"%s class add dev %s parent 1&#58;%d classid 1&#58;%d htb rate %dkbit ceil %dkbit burst %dk",tc, wan, ip->min, ip->mark,ip->min/asymetry_ratio-asymetry_fixed,ip->max/asymetry_ratio-asymetry_fixed, burst&#41;;
       safe_run&#40;str&#41;;
    
       sprintf&#40;str,"%s qdisc add dev %s parent 1&#58;%d handle %d sfq perturb 10",tc, wan, ip->mark, ip->mark&#41;;
       safe_run&#40;str&#41;;
    		
       sprintf&#40;str,"%s filter add dev %s parent 1&#58;0 protocol ip handle %d fw flowid 1&#58;%d",tc, wan, ip->mark, ip->mark&#41;;
       safe_run&#40;str&#41;;
    Krapet se to zkratilo, ale snad je to takhle ok. V noci vyzkousim .
    amd64 x86_64 AMD Athlon(tm) 64 Processor 3000+ GNU/Linux
    Největší zábavou bývají ty počítačové úlohy, které jsou v praxi naprosto k ničemu

  6. #6
    Administrátor mince Avatar uživatele Jezevec
    Založen
    08.10.2002
    Bydliště
    Teplice
    Příspěvky
    6 738
    Vliv
    300

    Standardní

    Ne, pochopils to spatne (ja sem to taky nenapsal zrovna nejlip, nevsim sem si toho ACCEPT v mangle u kazdy IP).

    Markuje s v mangle, to je OK. Do filter patri jen ty pravidla, kteryma nejak omezujes provoz (v tvym pripade ten ACCEPT na 10.x sit).

    takhle
    Kód:
    iptables -t mangle -A FORWARD -s 10.30.x.x/32 -j MARK --set-mark %d
    iptables -t filter -A FORWARD -s 10.30.x.x/32 -j ACCEPT
    => MARK je v mangle, ACCEPT je ve filter. Otazka jeste zni, zda je potreba davat ACCEPT na kazdou IP zvlast, je to spousta pravidel => zatez. Kdyz uz, udelal bych to asi jeste jinac:

    Kód:
    iptables -t filter -N addressok
    iptables -t ilter -A FORWARD -j addressok
    iptables -t filter -A addressok -s 10.30.x.x/32 -j ACCEPT
    je lepsi si do vzdycky takhle hodit zvlast, protoze mas prehled co kam cpes a proc, nez kdyz to tlacis primo a navic muzes ve forward jeste urcit ktery pakety se maji/nemaji vubec do ty skupiny cpat.

    Pokud mas pomalou default tridu pro shaping, tak dej ACCEPT na celej rozsah, kdyz si nekdo prideli nejakou neexistujici IP, tak mu to holt pojede par kbit.

    => do mangle budes davat jen pravidla pro IP a odchozi provoz (lepsi varianta je nako logicky si to dal rozdelit, aby v tom pak nebyl chaos, trebas podle baraku, pater, ...).

    Pr: tohle je markovani v mangle:
    Kód:
     iptables -t mangle -N marking
    iptables -t mangle -A FORWARD -j marking
    iptables -t mangle -A marking -s 10.30.x.x/32 -j MARK --set-mark %d
    mno a do filter trebas toto:
    Kód:
    iptables -t filter -P FORWARD DROP
    iptables -t filter -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -t filter -A FORWARD -i eth0 -j ACCEPT
    coz zahodi defaultne veskerej provoz kterej neni schvalenej v pravidlech a pravidlem 1. povolis provoz uz navazanych spojeni, pravidlem 2. povolis provoz z vnitrni site (bez omezeni IP adres, ale to pro zmenu pokud neni povoleny pasmo spadne do default HTB => stejne dostane jen par kbit). Ja na svym routeru FORWARD neomezuju vubec, ono neni vlastne ani duvod, protoze vyse uvedeny pravidla si nahradi NAT.

    Pokud chces nakej protokol omarkovat jinak, pak zkraka musis zajistit aby se paket markoval az jako posledni, pripadne any se vubec nedostal do markovani dle IP.
    IMPROBE AMOR, QUID NON MORTALIA PECTORA COGIS - krutá jsi, lásko, kam až ty doženeš smrtelná srdce -- Vergilius
    Mnoho je prostředků, které léčí lásku, ale žádný není spolehlivý.
    S tím, čeho se na nás dopustili druzí se už nějak vyrovnáme. Horší je to s tím, čeho jsme se na sobě dopustili sami.
    -- Francois La Rochefoucauld
    Nabídnout přátelství tomu, kdo chce lásku, je jako dát chleba tomu, kdo umírá žízní.

Informace o tématu

Users Browsing this Thread

Toto téma si právě prohlíží 1 uživatelů. (0 registrovaných a 1 anonymních)

Pravidla přispívání

  • Nemůžete zakládat nová témata
  • Nemůžete zasílat odpovědi
  • Nemůžete přikládat přílohy
  • Nemůžete upravovat své příspěvky
  •