Jak mogę kształtować ruch w systemie Linux przez IP?


16

Mamy przejrzystą konfigurację proxy. Próbowałem szukać kształtowania ruchu w Linuksie i wszystko, co mogłem znaleźć w Internecie, to ograniczenie ruchu według interfejsu (eth0 / eth1 ...).

Muszę ograniczyć przepustowość (nigdy nie przekraczając określonego limitu) według adresu IP lub zakresów IP i nie mogę znaleźć sposobu, aby to zrobić.

Czy istnieje jakiś sposób, aby to zrobić?

Odpowiedzi:


18

Warstwa kształtująca ruch w jądrze to w zasadzie harmonogram pakietów dołączony do karty sieciowej. Tak więc jedna zasada kształtowania ruchu dotyczy jednej karty sieciowej.

W twoim przypadku możesz utworzyć listę adresów IP i podłączonej przepustowości, a następnie dla każdego adresu IP utworzyć:

  • Jedna reguła kształtowania ruchu zidentyfikowana przez classid
  • Jedna reguła filtru sieciowego, która będzie oznaczać pakiety do określonej wartości
  • Jeden filtr, który powiąże znaczniki pakietów z identyfikatorem klasy, a tym samym zastosuje regułę kontroli ruchu do określonych pakietów.

Przykład podany przez @Zoredache działa, ale ja osobiście wolę używać funkcji Netfilter zamiast TC do filtrowania pakietów, a HTB zamiast CBQ dla algorytmu kształtowania. Możesz więc spróbować czegoś takiego (wymaga Bash 4 dla tablic asocjacyjnych):

#! /bin/bash
NETCARD=eth0
MAXBANDWIDTH=100000

# reinit
tc qdisc del dev $NETCARD root handle 1
tc qdisc add dev $NETCARD root handle 1: htb default 9999

# create the default class
tc class add dev $NETCARD parent 1:0 classid 1:9999 htb rate $(( $MAXBANDWIDTH ))kbit ceil $(( $MAXBANDWIDTH ))kbit burst 5k prio 9999

# control bandwidth per IP
declare -A ipctrl
# define list of IP and bandwidth (in kilo bits per seconds) below
ipctrl[192.168.1.1]="256"
ipctrl[192.168.1.2]="128"
ipctrl[192.168.1.3]="512"
ipctrl[192.168.1.4]="32"

mark=0
for ip in "${!ipctrl[@]}"
do
    mark=$(( mark + 1 ))
    bandwidth=${ipctrl[$ip]}

    # traffic shaping rule
    tc class add dev $NETCARD parent 1:0 classid 1:$mark htb rate $(( $bandwidth ))kbit ceil $(( $bandwidth ))kbit burst 5k prio $mark

    # netfilter packet marking rule
    iptables -t mangle -A INPUT -i $NETCARD -s $ip -j CONNMARK --set-mark $mark

    # filter that bind the two
    tc filter add dev $NETCARD parent 1:0 protocol ip prio $mark handle $mark fw flowid 1:$mark

    echo "IP $ip is attached to mark $mark and limited to $bandwidth kbps"
done

#propagate netfilter marks on connections
iptables -t mangle -A POSTROUTING -j CONNMARK --restore-mark

- edit: zapomniałem domyślnej klasy i rozpropagowałem znaki na końcu skryptu.


umm .. jak dodać domyślny limit przepustowości dla tych, których nie ma na liście?
Kokizzu

Użyłeś znaku $ jako definicji prio. Czy nie byłoby lepiej zastosować ten sam priorytet dla wszystkich?
motobói

jeśli zmienię „iptables -t mangle -A WEJŚCIE” na „iptables -t mangle -A WYJŚCIE” czy mogę kontrolować szybkość z mojego serwera do konkretnego adresu IP?
Frank Barcenas,

jak potem przywrócić ustawienia?
Stefan Rogin

Wydaje się, że Cant nie działa, pisząc polecenia ręcznie bez pętli dla pojedynczego adresu IP.
Adones Pitogo

5

Coś takiego działało dla mnie w celu ograniczenia kamery internetowej wykonawcy do ograniczonej przepustowości. Sprawdź stronę podręcznika dla tc, aby uzyskać szczegółowe informacje.

#!/bin/bash
set -x

DEV=eth0
export DEV

tc qdisc del dev $DEV root
tc qdisc del dev $DEV root
tc qdisc add dev $DEV root handle 1: cbq avpkt 1000 bandwidth 100mbit

# setup a class to limit to 1500 kilobits/s
tc class add dev $DEV parent 1: classid 1:1 cbq rate 1500kbit \
   allot 1500 prio 5 bounded isolated

# add traffic from 10.2.1.37 to that class
tc filter add dev $DEV parent 1: protocol ip prio 16 u32 \
   match ip src 10.2.1.37 flowid 1:1

3
CBQ jest trochę porzucony ... HTB byłby znacznie łatwiejszy w użyciu i
uzyskałby

1
Nie trzeba eksportować DEV, jeśli jest on używany tylko w tym skrypcie ....
Gert van den Berg

1

Nie jestem pewien, czy dobrze rozumiem twoje pytanie.

Przezroczyste proxy (jak w Squid dla HTTP) służy do kontroli większości przychodzących danych. Podczas gdy kształtowanie ruchu służy do kontroli danych wychodzących.

Musisz podać więcej szczegółów. Jeśli masz wiele stacji roboczych za proxy HTTP i próbujesz ograniczyć ich prędkość pobierania, lepiej wybierz coś takiego jak pule opóźnień Squid +.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.