« Linkai | Main | Klausimas »

AltQ

Tai vat - kažkam buvo sunku pergraužt OpenBSD ALTQ
tai paėmiau ir pergraužiau pats. Dabar adminas man stato alaus :)

Gabaliukas iš manualo:

OpenBSD palaiko dviejų rūšių paketų rūšiavimą eilėmis:
* Class Based Queueing
* Priority Queueing

Class Based Queueing

CBQ dalina interneto linijos greitį dar kelioms eilėms arba klasėms. Kiekviena
paketų eilė, kurią identifikuoja tam tikras portas, ip adresas ar protokolas
gauna tam tikrą trafiką. Kiekvienai paketų eilei suteikiamas prioritetas.
Paketų eiles galima rikiuoti medžio principu. T.y. kiekvieną paketų eilę gali dar
sudaryti kelios paketų eilės. Kiekviena paketų eilė gali "skolintis" dalį greičio
iš savo "tėvo" jeigu kiti tėvo vaikai to greičio nevalgo.
CBQ eilės taip pat gali turėt prioritetus. Kuo didesnis eilės prioritetas tuo sparčiau
ji apdorojama.

Priority Queueing

Čia paprasta. Eilės pagal prioritetus negali turėt vaikų. Taip pat jos gali būt prisegtos
tik prie tinklo interfeiso.

Random Early Detection (RED)

Algoritmas leidžiantis išvengti tam tikros eilės perpildymo. Grubiai kaip aš supratau to
algoritmo veikimą: yra du rėžiai, skaičiuojamas ateinančios eilės dydžio vidurkis, jei
dydžio vidurkis mažiau už minimumą - nauji paketai statomi į eilę, jei daugiau už minimumą,
bet mažiau už maksimumą (patenka į intervalą) - nauji paketai nepriimami į eilę, jei
viršija maksimumą - algoritmas atsitiktiniu būdu numeta paketus.

Explicit Congestion Notification (ECN)

Algoritmas dirba kartu su RED'u. Jo paskirtis palaikyti bendravimą tarp dviejų hostų -
t.y. jis į paketus prisega tam tikros informacijos, kuri klientui praneša, kada gali būti
atmesti jo paketi. T.y. mol: "neviršyk trafiko".

O dabar konfigų teorija:

altq on - įjungiam altq, sintaksė:
altq on _interfeisas_ _rūšiavimo_būdas_ _greitis_ _eilės_dydis_ _kibirėlio_dydis_ {_vaikučiai_}

_interfeisas_ - tinklo interfeisas
_rūšiavimo_būdas_ - cbq || priq
_greitis_ - šlangos greitis b, Kb, Mb, Gb arba procentais
_eilės_dydis_ - eilės dydis paketais (default=50)
_kibirėlio_dydis_ - nesupratau kas čia per daiktas
_vaikučiai_ - eilės vaikučiai

Eilės dydžio galima ir nenurodyt. Kibirėlio dydžio (kas per daiktas yra bucket regulator in bytes?)
galima irgi nenurodyt. Tada OBSD detektina pagal tinklo interfeisą.

Eilės aprašomos maždaug taip:

queue vardas [on _interfeisas_] _greitis_ [priority _pri_] [qlimit _qlim_] \
_rūšiavimo_būdas_ (_parametrai_) {vaikučiai}

_interfeisas_ - tinklo interfeisas
_greitis_ - šlangos greitis b, Kb, Mb, Gb arba procentais,
(turi prasmės tik tada, kai naudojamas CBQ)
_pri_ - prioritetai (CBQ:0..7;PriQ:0..15)
_qlim_ - eilės dydis (žr. aukščiau), nebūtinas
_rūšiavimo_būdas_ - cbq || priq
_parametrai_ - rūšiavimo būdo parametrai:
default - nurodo default eilę; į ją bus kraunami paketai,
kurie netiks į kitas eiles; bent 1 tokia eilė būtina
red - žr. aukščiau
rio - red in/out (tingėjau aiškintis smulkiau)
ecn - žr. aukščiau
borrow - nustato, kad eilutė gali skolintis iš tėvo

Kaip visa tai įjungti OpenBSD:

buvo:
pass out on fxp0 from any to any port 22

darom:
pass out on fxp0 from any to any port 22 queue ssh

Truputėlis magijos:

altq on fxp0 cbq bandwidth 2Mb queue { std, ftp }
queue std cbq(default)
queue ftp bandwidth 1.5Mb

pass in on dc0 from any to any port 21 queue ftp

Ant interfeiso dc0 altq neįjungtas, bet jeigu į tą interfeisą paketai ateina iš fxp0 - jie
bus sustatyti į ftp eilę.

Dabar pasiskaitom manus, po to žiūrim grubų pvz.:

altq on dc0 cbq bandwidth 256Kb queue { std_in, shefas_in }
#jungiam altq ant vidinio interfeiso

queue std_in cbq(default)
queue shefas_in bandwidth 80Kb cbq(borrow)
#shefas gauna 80 švarių Kbps ir dar gali skolintis iš kitų

shefas = "10.46.0.2"
local_net = "10.46.0.0/24"

block in on dc0 all
pass in on dc0 from $local_net
#iš lokalaus tinklo leidžiam pasižiūrėt servą

block out on dc0 all
pass out on dc0 from any to $local_net
pass out on dc0 from any to $shefas queue shefas_in
#ir šefas turi savo greitį ir neverkia

Comments

heh galingas daikciukas ;-)

Hmm saunuolis reikalingas straipsnis