¿Cómo puedo configurar el tráfico en Linux por IP?

15

Tenemos una configuración de proxy transparente. Intenté buscar la configuración del tráfico en Linux, y todo lo que pude encontrar en línea fue limitar el tráfico por interfaz (eth0 / eth1 ...).

Necesito limitar el ancho de banda (sin exceder nunca un límite específico) por dirección IP o rangos de IP y no puedo encontrar una manera de hacerlo.

¿Hay alguna forma de hacer eso?

Osama ALASSIRY
fuente

Respuestas:

17

La capa de configuración del tráfico del núcleo es, básicamente, un programador de paquetes conectado a su tarjeta de red. Por lo tanto, una política de configuración de tráfico se aplica a una tarjeta de red.

Lo que puede hacer, en su caso, es crear una lista de IP y ancho de banda adjunto, y luego, para cada IP, cree:

  • Una regla de modelado de tráfico identificada por un classid
  • Una regla de netfilter que marcará los paquetes a un valor de marca específico
  • Un filtro que unirá esas marcas de paquetes al classid, aplicando así la regla de control de tráfico a los paquetes especificados.

El ejemplo dado por @Zoredache funciona, pero personalmente prefiero usar la capacidad de Netfilter en lugar de TC para filtrar paquetes, y HTB en lugar de CBQ para el algoritmo de modelado. Entonces puede intentar algo como esto (requiere Bash 4 para matrices asociativas):

#! /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

- editar: olvidó la clase predeterminada y propagar las marcas al final del guión.

Julien Vehent
fuente
umm ... ¿cómo agregar un límite de ancho de banda predeterminado para aquellos que no están en la lista?
Kokizzu
Usaste $ mark como definición de prio. ¿No sería mejor usar la misma prioridad para todos?
motobói
si cambio "iptables -t mangle -A INPUT" a "iptables -t mangle -A OUTPUT", ¿podría controlar la velocidad de mi servidor a una IP en particular?
Frank Barcenas
¿Cómo restauro la configuración después de esto?
Stefan Rogin
Parece que esto no funciona, escribiendo comandos manualmente sin bucle para una sola ip.
Adones Pitogo
5

Algo como esto me funcionó para limitar la cámara web de un contratista a una cantidad limitada de ancho de banda. Consulte la página de manual de tc para obtener más detalles.

#!/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
Zoredache
fuente
3
CBQ está un poco abandonado ... encontraría que HTB es mucho más fácil de usar y obtendría el mismo resultado
Julien Vehent
1
No es necesario exportar DEV si solo se usa en este script ...
Gert van den Berg
1

No estoy seguro de entender tu pregunta correctamente.

El proxy transparente (como en Squid para HTTP) se usa para controlar principalmente los datos entrantes. Mientras que la configuración del tráfico se utiliza para controlar los datos salientes.

Necesita proporcionar más detalles. Si tiene muchas estaciones de trabajo detrás de un proxy HTTP y está tratando de limitar sus velocidades de descarga, será mejor que elija algo como Squid + grupos de retraso.

halp
fuente