Narzędzia użytkownika

Narzędzia witryny


tc

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

tc [2013/01/15 00:00]
tc [2013/01/15 00:00] (aktualna)
Linia 1: Linia 1:
 +===6.2.10. Tc (HTB)===
  
 +==6.2.10.1. Opis==
 +
 +Moduł generujący skrypt zawierający polecenia iptables i tc służące do ograniczania przepływności i limitowania połączeń klientom. Regułki dla komputerów można dowolnie zdefiniować i wykorzystać nie tylko do "​traffic control"​. Zasada działania skryptu przedstawia się następująco:​ Najpierw z bazy pobierane są dane dla wszystkich klientów. Obliczane są sumy ograniczeń (uprate, downrate, upceil, downceil, limity połączeń) dla każdego klienta Następnie wykonywana jest pętla ze sprawdzeniem przynależności do grupy klientów i sieci (jeśli określono). Jeśli wartości ograniczeń są różne od zera następuje zapis reguł do pliku z podmianą zmiennych. W regułkach można stosować następujące zmienne: %name - nazwa hosta, %i - adres IP, %m - MAC, %if - interfejs, %uprate, %downrate, %upceil, %downceil, %plimit, %climit, %o1, %o2, %o3, %o4 - kolejne oktety adresu IP, %h1, %h2, %h3, %h4 - kolejne oktety adresu IP w zapisie szesnastkowym oraz %x - licznik o wartości początkowej 100 zwiększany o jeden dla każdego komputera (lub klienta, w zależności od ustawienia opcji one_class_per_host).
 +
 +Domyślna polityka tworzenia klas htb zakłada utworzenie jednej klasy dla wszystkich komputerów klienta. Może to być zmienione za pomocą opcji '​one_class_per_host'​.
 +
 +Konfiguracja domyślna zakłada, że twój system jest przystosowany do zastosowania htb oraz iptables z modułami limit, connlimit, mark i ipp2p.
 +
 +==6.2.10.2. Konfiguracja==
 +
 +Masz do dyspozycji standardowe parametry takie jak customergroups,​ file, command, networks i dodatkowo opcje definiujące treść regułek tc i firewalla. Domyślna konfiguracja przeznaczona jest dla łącz 512/128 kbit i 100mbit.
 +
 +  * file
 +
 +Lokalizacja pliku tymczasowego. Domyślnie: /​etc/​rc.d/​rc.htb.
 +
 +    Przykład: file = /tmp/rc.htb
 +
 +  * command
 +
 +Polecenie powłoki wykonywane po utworzeniu pliku. Domyślnie: "sh /​etc/​rc.d/​rc.htb start"​.
 +
 +    Przykład: command = "chmod 700 /​tmp/​rc.htb;​ /tmp/rc.htb start"
 +
 +  * begin
 +
 +Nagłówek skryptu. Domyślnie:
 +
 +<​code>​
 +    "#​!/​bin/​sh
 +    IPT=/​usr/​sbin/​iptables
 +    TC=/sbin/tc
 +    LAN=eth0
 +    WAN=eth1
 +    BURST="​burst 30k"
 +
 +    stop ()
 +    {
 +    $IPT -t mangle -D FORWARD -i $WAN -j LIMITS >/​dev/​null 2>&1
 +    $IPT -t mangle -D FORWARD -o $WAN -j LIMITS >/​dev/​null 2>&1
 +    $IPT -t mangle -F LIMITS >/​dev/​null 2>&1
 +    $IPT -t mangle -X LIMITS >/​dev/​null 2>&1
 +    $IPT -t mangle -F OUTPUT
 +    $IPT -t filter -F FORWARD
 +    $TC qdisc del dev $LAN root 2> /dev/null
 +    $TC qdisc del dev $WAN root 2> /dev/null
 +    }
 +
 +    start ()
 +    {
 +    stop
 +    $IPT -t mangle -N LIMITS
 +    $IPT -t mangle -I FORWARD -i $WAN -j LIMITS
 +    $IPT -t mangle -I FORWARD -o $WAN -j LIMITS
 +    # incomming traffic
 +    $IPT -t mangle -A OUTPUT -j MARK --set-mark 1
 +    $TC qdisc add dev $LAN root handle 1:0 htb default 3 r2q 1
 +    $TC class add dev $LAN parent 1:0 classid 1:1 htb rate 99000kbit ceil 99000kbit quantum 1500
 +    $TC class add dev $LAN parent 1:1 classid 1:2 htb rate   ​500kbit ceil   ​500kbit
 +    $TC class add dev $LAN parent 1:1 classid 1:3 htb rate 98500kbit ceil 98500kbit prio 9 quantum 1500
 +    $TC qdisc add dev $LAN parent 1:3 esfq perturb 10 hash dst
 +    # priorities for ICMP, TOS 0x10 and ports 22 and 53
 +    $TC class add dev $LAN parent 1:2 classid 1:20 htb rate 50kbit ceil 500kbit $BURST prio 1 quantum 1500
 +    $TC qdisc add dev $LAN parent 1:20 esfq perturb 10 hash dst
 +    $TC filter add dev $LAN parent 1:0 protocol ip prio 2 u32 match ip sport 22 0xffff flowid 1:20
 +    $TC filter add dev $LAN parent 1:0 protocol ip prio 2 u32 match ip sport 53 0xffff flowid 1:20
 +    $TC filter add dev $LAN parent 1:0 protocol ip prio 1 u32 match ip tos 0x10 0xff flowid 1:20
 +    $TC filter add dev $LAN parent 1:0 protocol ip prio 1 u32 match ip protocol 1 0xff flowid 1:20
 +    # serwer -> LAN
 +    $TC filter add dev $LAN parent 1:0 protocol ip prio 4 handle 1 fw flowid 1:3
 +
 +    # outgoing traffic
 +    $TC qdisc add dev $WAN root handle 2:0 htb default 11 r2q 1
 +    $TC class add dev $WAN parent 2:0 classid 2:1 htb rate 120kbit ceil 120kbit
 +    # priorities for ACK, ICMP, TOS 0x10, ports 22 and 53
 +    $TC class add dev $WAN parent 2:1 classid 2:10 htb rate 60kbit ceil 120kbit prio 1 quantum 1500
 +    $TC qdisc add dev $WAN parent 2:10 esfq perturb 10 hash dst
 +    $TC filter add dev $WAN parent 2:0 protocol ip prio 1 u32 match ip protocol 6 0xff \
 +    match u8 0x05 0x0f at 0 match u16 0x0000 0xffc0 at 1 match u8 0x10 0xff at 33 flowid 2:10
 +    $TC filter add dev $WAN parent 2:0 protocol ip prio 1 u32 match ip dport 22 0xffff flowid 2:10
 +    $TC filter add dev $WAN parent 2:0 protocol ip prio 1 u32 match ip dport 53 0xffff flowid 2:10
 +    $TC filter add dev $WAN parent 2:0 protocol ip prio 1 u32 match ip tos 0x10 0xff flowid 2:10
 +    $TC filter add dev $WAN parent 2:0 protocol ip prio 1 u32 match ip protocol 1 0xff flowid 2:10
 +    # serwer -> Internet
 +    $TC class add dev $WAN parent 2:1 classid 2:11 htb rate 30kbit ceil 120kbit prio 2 quantum 1500
 +    $TC qdisc add dev $WAN parent 2:11 esfq perturb 10 hash dst
 +    $TC filter add dev $WAN parent 2:0 protocol ip prio 3 handle 1 fw flowid 2:11
 +    $TC filter add dev $WAN parent 2:0 protocol ip prio 9 u32 match ip dst 0/0 flowid 2:11
 +</​code>​
 +    Przykład: begin = "#​!/​bin/​bash\n$TC=/​usr/​local/​sbin/​tc\n"​
 +
 +  * end
 +
 +Stopka skryptu. Domyślnie:
 +<​code>​
 +    }
 +
 +    case "​$1"​ in
 +        '​start'​)
 +    start
 +        ;;
 +        '​stop'​)
 +    stop
 +        ;;
 +        '​status'​)
 +    echo "WAN Interface"​
 +    echo "​============="​
 +    $TC class show dev $WAN | grep root
 +    $TC class show dev $WAN | grep -v root | sort | nl
 +    echo "LAN Interface"​
 +    echo "​============="​
 +    $TC class show dev $LAN | grep root
 +    $TC class show dev $LAN | grep -v root | sort | nl
 +        ;;
 +        *)
 +    echo -e "​\nUsage:​ rc.htb start|stop|status"​
 +        ;;
 +    esac
 +</​code>​
 +    Przykład: end = ""​
 +
 +  * one_class_per_host
 +
 +Określa politykę tworzenia klas htb. W ustawieniu domyślnym wszystkie komputery klienta zostaną wrzucone do jednej klasy. Ustawienie tej opcji na '​true'​ spowoduje, że reguły określone w host_htb_up i host_htb_down zostaną wygenerowane dla wszystkich komputerów klienta (z inną wartością '​%x'​). Reguły z host_mark_down,​ host_mark_up,​ host_plimit i host_climit generowane są dla każdego komputera niezależnie od ustawień tej zmiennej. Domyślnie: false
 +
 +    Przykład: one_class_per_host = 1
 +
 +  * limit_per_host
 +
 +Określa politykę tworzenia limitów połączeń/​pakietów dla komputerów. W ustawieniu domyślnym limit połączeń/​pakietów jest dzielony przez ilość komputerów klienta. Włączenie tej opcji spowoduje, że reguły określone w host_climit i host_plimit zostaną wygenerowane dla wszystkich komputerów klienta z wartością $climit i %plimit zdefiniowaną w taryfie (nie podzieloną przez ilość komputerów). Domyślnie: false
 +
 +    Przykład: limit_per_host = 1
 +
 +  * host_mark_up
 +
 +Reguła markująca dla każdego komputera. Domyślnie:
 +
 +<​code>​
 +    # %n
 +    $IPT -t mangle -A LIMITS -s %i -j MARK --set-mark %x
 +</​code>​
 +    Przykład: host_mark_up = ""​
 +
 +  * host_mark_down
 +
 +Reguła markująca dla każdego komputera. Domyślnie:
 +
 +    $IPT -t mangle -A LIMITS -d %i -j MARK --set-mark %x
 +
 +    Przykład: host_mark_down = ""​
 +
 +  * host_htb_down
 +
 +Zestaw reguł dla każdego komputera, wykonywanych gdy uprate i downrate są różne od zera. Domyślnie:
 +
 +<​code>​
 +    $TC class add dev $LAN parent 1:2 classid 1:%x htb rate %downratekbit ceil %downceilkbit $BURST prio 2 quantum 1500
 +    $TC qdisc add dev $LAN parent 1:%x esfq perturb 10 hash dst
 +    $TC filter add dev $LAN parent 1:0 protocol ip prio 5 handle %x fw flowid 1:%x
 +</​code>​
 +    Przykład: host_htb_down = ""​
 +
 +  * host_htb_up
 +
 +Zestaw reguł dla każdego komputera, wykonywanych gdy uprate i downrate są różne od zera. Domyślnie:
 +
 +<​code>​
 +    $TC class add dev $WAN parent 2:1 classid 2:%x htb rate %upratekbit ceil %upceilkbit $BURST prio 2 quantum 1500
 +    $TC qdisc add dev $WAN parent 2:%x esfq perturb 10 hash dst
 +    $TC filter add dev $WAN parent 2:0 protocol ip prio 5 handle %x fw flowid 2:%x
 +</​code>​
 +    Przykład: host_htb_up = ""​
 +
 +  * host_climit
 +
 +Regułka z ograniczeniem ilości równoczesnych połączeń tcp. Wykonywana gdy climit w bazie jest różny od zera. Domyślnie:
 +
 +    $IPT -t filter -I FORWARD -p tcp -s %i -m connlimit --connlimit-above %climit -m ipp2p --ipp2p -j REJECT
 +
 +    Przykład: host_climit = "$IPT -t filter -I FORWARD -p tcp -s %i -m connlimit --connlimit-above -j REJECT"​
 +
 +  * host_plimit
 +
 +Regułka z ograniczeniem ilości pakietów w jednostce czasu (tutaj sekunda). Wykonywana gdy plimit w bazie jest różny od zera. Domyślnie:
 +
 +<​code>​
 +    $IPT -t filter -I FORWARD -p tcp -d %i -m limit --limit %plimit/s -m ipp2p --ipp2p -j ACCEPT
 +    $IPT -t filter -I FORWARD -p tcp -s %i -m limit --limit %plimit/s -m ipp2p --ipp2p -j ACCEPT
 +</​code>​
 +
 +    Przykład: host_plimit = ""​
 +
 +  * networks
 +
 +Lista nazw sieci, które mają być brane pod uwagę. Wielkość liter nie ma znaczenia. Domyślnie: pusta (wszystkie sieci).
 +
 +    Przykład: networks = "lan1 lan2"
 +
 +  * customergroups
 +
 +Lista nazw grup klientów, które mają być brane pod uwagę. Wielkość liter nie ma znaczenia. Domyślnie: pusta (wszystkie grupy).
 +
 +    Przykład: customergroups = "​grupa1 grupa2"​
tc.txt · ostatnio zmienione: 2013/01/15 00:00 (edycja zewnętrzna)