Bandbreddsbegränsning i Debian GNU/Linux
Du behöver minst: Debian GNU/Linux 3.0 (unstable)
Jag har länge letat efter en metod för att begränsa bandbredd med Linux. Ett exempel kan vara när man har en linuxburk som gateway mot internet, alltså en maskin som agerar både brandvägg och internetdelare. Du kanske vill kunna surfa samtidigt som någon kompis laddar ner Debian GNU/Linux-ISOn från din Linuxserver. I vanliga fall tar den stora tankningen över det mesta av den tillgängliga bandbredden (i.a.f. om man har t.ex. internet i form av ADSL).
Det kan då vara väldigt praktiskt att begränsa bandbredden ut från sin FTP-server så att man kan surfa på sin vanliga burk som står "bakom" linux-servern.
Till slut hittade jag en relativt enkel metod för att begränsa bandbredden. Jag har inte hunnit testa den fullt ut, men jag har pillat så pass mycket så att jag vet att det fungerar. Det enda som är lite tråkigt med denna metod är att man endast kan begränsa utgående trafik. Med detta menar jag alltså endast trafik som den dator använder denna metod på skickar ut från sina nätverkskort. Detta kan bli lite tråkigt om man bara har t.ex. en FTP-server på servern, för då kan man inte begränsa om användare laddar upp filer till dig. Men om man använder sin server som internetdelare kan man begränsa trafik som går både ut och in, från och till de datorer som står "bakom" servern. Detta eftersom det finns två nätverkskort som används. För trafik som skall gå ut till internet begränsar man trafiken ut på internet-nätverkskortet och för trafik som skall in från internet begränsar man utgående trafik på det interna nätverkskortet. Ja, du förstår säkert vad jag menar...
Det finns mycket kul man kan göra om man väl får detta att fungera, mer om detta senare.
Nu till det tekniska. Programmet som skall användas heter "shaper" och är ett script som använder sig av CBQ (Class Based Queueing) som i sin tur använder sig av QoS-modulerna (Quality of Service) som finns i linuxkärnan. Detta betyder alltså att du måste ha stöd för QoS i kärnan för att detta skall fungera.
Om du inte redan har QoS inkompilerat (förmodligen har du inte det), måste du kompilera om kärnan. Jag har skrivit en guide om hur man gör detta på "Debian-vis" och den hittar du här. Du skall följa den guiden med tillägget att du skall välja ett antal moduler som man måste ha för att "shaper" skall fungera.
1. Kompilera in stöd för QoS i kärnan
Följ min kärn-kompileringsguide och när du skrivit make menuconfig skall du gå in under "Network options", och sedan "QoS and/or fair queueing".
Här kan du välja om du vill kompilera in modulerna direkt i kärnan, eller om du vill ha dem som lösa moduler. Du väljer med mellanslag, "*" för inkompilering i kärnan och "M" för modul. Personligen tycker jag att det är bra att kompilera in dessa moduler i kärnan direkt ("*") eftersom de kommer användas rätt ofta.
Markera alltså först kategorin "QoS and/or fair queueing", och sedan följande moduler:
När du har markerat alla dessa går du ur och sparar din konfiguration. OBS! Tänk på att det säkert är fler inställningar som måste göras till kärnan för att den skall fungera på din dator. Du har säkert ett ljudkort, nätverkskort eller någon annan hårdvara som du måste ha stöd för innan du börjar själva kompileringen.
Gå nu vidare i guiden och starta om så att du får en kärna som är klar att användas för bandbreddsbegränsning!
2. Installera och konfigurera Shaper
Nu över till installationen och konfigureringen av "shaper". "Shaper" är ett script som helt enkelt läser en konfigurationsfil som du skrivit och "översätter" den till lite mer avancerade kommandon som körs och ställer in
För att installera "shaper" skriver du:
apt-get install shaper
Vid installation skall du inte behöva välja något, utan tryck bara "ok" på de rutor som dyker upp. Installationsprogrammet kanske inte hittar de moduler du tidigare kompilerat in i kärnan, men om du gjort steget ovan korrekt, behöver du inte bry dig om denna ruta.
Nu har du installerat shaper! (Jag tycker om Debian! =)
Över till konfigurationen. Själva shaper-scriptet är filen /etc/init.d/shaper, alltså init-scriptet som är inställt så att det körs varje gång datorn startar. Så om du kör /etc/init.d/shaper start kommer scriptet att ladda in och direkt aktivera de regler som du specifierat. I början av denna scriptfil finns också bra dokumentation för hur konfigurationsfilerna skall vara uppbyggda. Dessa filer som används för att bestämma reglerna för utgående trafik skall läggas i /etc/shaper.
Filerna som ligger i katalogen /etc/shaper måste heta på ett visst sätt för att scriptet skall fungera. Du får dessutom inte lägga andra filer i den katalogen som inte har med trafikregler att göra, då kan det uppstå problem med scriptet eftersom den laddar in alla filer som ligger i katalogen.
Filnamen skall vara cbq-<id>.<namn>, där <id> är en siffra mellan 2 och 65535 och <namn> är ett namn på regeln, vilket som passar dig bäst. Ett exempel:
cbq-100.ftp_ut
I filen anger man reglerna för bandbreddsbegränsningen. Det finns en hel massa olika parametrar för dessa filer och jag kommer ta upp de viktigaste här nedan (som jag sagt tidigare finns väldigt bra dokumentation i /etc/init.d/shaper där alla dessa parametrar finns med)
Denna parameter är obligatorisk. <interface> specificerar vilket nätverksinterface regeln skall gälla för, ex. "eth1". I <bandbredd> anger du hur snabbt trafiken går som max, så om det är ett 100Mbits kort du skall lägga in en regel för, skriver du helt enkelt "100Mbit" där. <vikt> är en "trimmningsparameter" som skall vara proportionell till bandbredden du anger. En bra regel är att ta en 10-del av bandbredden, alltså <vikt> = <bandbredd> / 10.
<!-- Mer kommer! -->
/ Pierre Ingmansson, studerande vid KTH IsK.
Uppdaterad 030820