Linux Server Hack - hvordan man kan begrænse båndbredde med Linux, TC, og iproute2!

ved max på Torsdag 25 September, 2008

Husk, jeg gjorde en hurtig indlæg om hvordan man skriver en load-balancering script (eller båndbredde)?

Nå, i dag fandt jeg en anden cool script for begrænsning af båndbredde. Jeg tror, denne her, hvis mere kompliceret, men hvis du har brug for det, kan det være meget nyttigt.

Her er koden via Adamsinfo.com:


# Set some variables
#!/bin/bash
EXT_IFACE=”eth0″
INT_IFACE=”eth1″
TC=”tc”
UNITS=”kbit”
LINE=”10000″ #maximum ext link speed
LIMIT=”5000″ #maximum that we'll allow


# Set nogle variabler for de enkelte klasser, som vi skal bruge til at forme interne upload hastighed, dvs at forme eth0
CLS1_RATE = "200" # Høj prioritet trafik klasse har 200kbit
CLS2_RATE = "300" # Medium Prioritet klasse har 300kbit
CLS3_RATE = "4.500" # Bulk klasse har 4500kbit
# (Vi kommer til at definere, hvilke der kan låne, hvorfra senere)

# Set nogle variabler for de enkelte klasser, at vi skal bruge til at forme interne download-hastighed, dvs at forme eth1
INT_CLS1_RATE = "1000" # Prioritet
INT_CLS2_RATE = "4000" # Bulk

# Slet nuværende qdiscs. dvs rydde op
$ (TC) qdisc del dev $ (INT_IFACE) rod
$ (TC) qdisc del dev $ (EXT_IFACE) rod

# Vedhæft root qdiscs. Vi bruger HTB her, og vedhæfter denne qdisc til begge grænseflader. Vi vil mærke det "1:0"
$ (TC) qdisc add dev $ (INT_IFACE) rod håndtere 1:0 HTB
$ (TC) qdisc add dev $ (EXT_IFACE) rod håndtere 1:0 HTB

# Lav rod klasser, med de maksimale grænser defineret
# En for eth1
$ (TC) class add dev $ (INT_IFACE) forælder 1:0 classid 1:1 HTB kurs $ (LIMIT) $ (ENHEDER) ceil $ (LIMIT) $ (ENHEDER)
# En for eth0
$ (TC) class add dev $ (EXT_IFACE) forælder 1:0 classid 1:1 HTB kurs $ (LIMIT) $ (ENHEDER) ceil $ (LIMIT) $ (ENHEDER)

# Opret barn klasser
# Disse er for vores interne interface eth1
# Opret en klasse mærket "1:2", og giv den grænse defineret ovenfor
$ (TC) class add dev $ (INT_IFACE) forælder 1:1 classid 1:2 HTB kurs $ (INT_CLS1_RATE) $ (ENHEDER) ceil $ (LIMIT) $ (ENHEDER)
# Opret en klasse mærket "1:3", og giv den grænse defineret ovenfor
$ (TC) class add dev $ (INT_IFACE) forælder 1:1 classid 1:3 HTB kurs $ (INT_CLS2_RATE) $ (ENHEDER) ceil $ (INT_CLS2_RATE) $ (ENHEDER)

# EXT_IF (uploade) nu. Vi har også indstille hvilke klasser kan låne og låne.
# Denne klasse er garanteret 200kbit og kan sprænges op til 5000kbit hvis den er tilgængelig
$ (TC) class add dev $ (EXT_IFACE) forælder 1:1 classid 1:2 HTB kurs $ (CLS1_RATE) $ (ENHEDER) ceil $ (LIMIT) $ (ENHEDER)
# Denne klasse er garanteret 300kbit og kan sprænges op til 5000kbit-200kbit = 4800kbit hvis den er tilgængelig
$ (TC) class add dev $ (EXT_IFACE) forælder 1:1 classid 1:3 HTB kurs $ (CLS2_RATE) $ (ENHEDER) ceil `echo $ (LIMIT) - $ (CLS1_RATE) | bc` $ (ENHEDER)
# Denne klasse kan garanteres 4500kbit og kan ikke sprænge forbi (5000kbit-200kbit-300kbit = 4500kbit).
# Dvs. selvom vores bulk trafikken går skøre, de to klasser ovenfor er stadig garanteret tilgængelighed.
$ (TC) class add dev $ (EXT_IFACE) forælder 1:1 classid 1:4 HTB kurs $ (CLS3_RATE) $ (ENHEDER) ceil `echo $ (LIMIT) - $ (CLS1_RATE) - $ (CLS2_RATE) | bc` $ (ENHEDER)

# Tilføj pfifo. Læs mere om pfifo andre steder, det er uden for rammerne af denne howto.
$ (TC) qdisc add dev $ (INT_IFACE) forælder 1:2 håndtag 12: pfifo højst 10
$ (TC) qdisc add dev $ (INT_IFACE) forælder 1:3 håndtag 13: pfifo højst 10
$ (TC) qdisc add dev $ (EXT_IFACE) forælder 1:2 håndtag 12: pfifo højst 10
$ (TC) qdisc add dev $ (EXT_IFACE) forælder 1:3 håndtag 13: pfifo højst 10
$ (TC) qdisc add dev $ (EXT_IFACE) forælder 1:4 håndtag 14: pfifo højst 10

# # # Færdig med at tilføje alle de klasser, nu nedsat nogle regler! # # #
# INT_IFACE
# Bemærk 'Sommertid' retning. Trafik, der går ud af vores interne grænseflade og vores servere er ude serverens download-hastighed, så SOME_IMPORTANT_IP er afsat til 1:2 klasse til download.
$ (TC) filter add dev $ (INT_IFACE) forælder 1:0 protocol ip prio 1 u32 match ip dst SOME_IMPORTANT_IP/32 flowid 1:2
$ (TC) filter add dev $ (INT_IFACE) forælder 1:0 protocol ip prio 1 u32 match ip dst SOME_OTHER_IMPORTANT_IP/32 flowid 1:2
# Alle andre servere download hastighed går til 1:3 - ikke så vigtig som de to ovennævnte
$ (TC) filter add dev $ (INT_IFACE) forælder 1:0 protocol ip prio 1 u32 match ip dst 0.0.0.0 / 0 flowid 1:3

# EXT_IFACE
# Prioriter DNS-anmodninger
$ (TC) filter add dev $ (EXT_IFACE) forælder 1:0 protocol ip prio 1 u32 match ip src IMPORTANT_IP/32 match ip sport 53 0xffff flowid 1:2
# SSH er vigtigt
$ (TC) filter add dev $ (EXT_IFACE) forælder 1:0 protocol ip prio 1 u32 match ip src IMPORTANT_IP/32 match ip sport 22 0xffff flowid 1:2
# Our exim SMTP-server er også vigtigt
$ (TC) filter add dev $ (EXT_IFACE) forælder 1:0 protocol ip prio 1 u32 match ip src 217.10.156.197/32 match ip sport 25 0xffff flowid 1:3
# Hovedparten
$ (TC) filter add dev $ (EXT_IFACE) forælder 1:0 protocol ip prio 1 u32 match ip src 0.0.0.0 / 0 flowid 1:4

Hyppighed

1 Star2 Stars3 Stars4 Stars5 Stars
Loading ... Loading ...



Site Sponsors Den NYE Flip ULTRA
20.000 GPS POI's $ 9,99



Relaterede nyheder og Ressourcer

  • Yaron
    Hej,
    Great forklarer, det fungerer meget godt:).
    Jeg har et spørgsmål:
    Hvad sker der med de vandløb, der allerede eksisterer? vil filteret tælle dem?
    (siden sport og dport var allerede ændret, før anvendelse af filter)

    For eksempel:
    $ (TC) filter add dev $ (EXT_IFACE) forælder 1:0 protocol ip prio 1 u32 match ip src 217.10.156.197/32 match ip sport 25 0xffff flowid 1:3

    kilden havn måske ikke være 25 for en forbindelse, der allerede var begyndt.
blog comments powered by Disqus
Hvis du kan lide dette indlæg så kan du abonnere på min fulde feed RSS.

Du kan også abonnere via e-mail ved at udfylde dit navn og e-mail nedenfor:

Navn: E-mail:


Fik et nyt hack, DIY, howto, eller gadget? Tip os her.

Prøv Goohack at finde en ny Hack:


Featured Sites From Zedomax Blog Network