Bash Script - Traffic Shaping

1

Ei, eu estava pensando se você poderia dar uma olhada no meu roteiro e me ajudar a adicionar algumas coisas,

  1. Como obtenho para descobrir quantas portas Ethernet ativas eu tenho? e como faço para filtrar mais de uma porta ethernet
  2. Como obtenho isso para fazer um intervalo de endereços IP?
  3. Depois de ter algumas portas ethenet, preciso adicionar o controle de tráfego a cada uma delas
#!/bin/bash

# Name of the traffic control command.
TC=/sbin/tc

# The network interface we're planning on limiting bandwidth.

IF=eth0 # Network card interface

# Download limit (in mega bits)
DNLD=10mbit # DOWNLOAD Limit

# Upload limit (in mega bits)
UPLD=1mbit # UPLOAD Limit

# IP address range of the machine we are controlling
IP=192.168.0.1 # Host IP

# Filter options for limiting the intended interface.
U32="$TC filter add dev $IF protocol ip parent 1:0 prio 1 u32"

start() {

    # Hierarchical Token Bucket (HTB) to shape bandwidth

    $TC qdisc add dev $IF root handle 1: htb default 30 #Creates the root schedlar
    $TC class add dev $IF parent 1: classid 1:1 htb rate $DNLD #Creates a child schedlar to shape download
    $TC class add dev $IF parent 1: classid 1:2 htb rate $UPLD #Creates a child schedlar to shape upload
    $U32 match ip dst $IP/24 flowid 1:1 #Filter to match the interface, limit download speed
    $U32 match ip src $IP/24 flowid 1:2 #Filter to match the interface, limit upload speed
}


stop() {

    # Stop the bandwidth shaping.
    $TC qdisc del dev $IF root

}

restart() {

    # Self-explanatory.
    stop
    sleep 1
    start

}

show() {

    # Display status of traffic control status.
    $TC -s qdisc ls dev $IF

}

case "$1" in

    start)

        echo -n "Starting bandwidth shaping: "
        start
        echo "done"
        ;;

    stop)

        echo -n "Stopping bandwidth shaping: "
        stop
        echo "done"
        ;;

    restart)

        echo -n "Restarting bandwidth shaping: "
        restart
        echo "done"
        ;;

    show)

        echo "Bandwidth shaping status for $IF:"
        show
        echo ""
        ;;

    *)

        pwd=$(pwd)
        echo "Usage: tc.bash {start|stop|restart|show}"
        ;;

esac

exit 0

obrigado

    
por Craig-Aaron 02.03.2011 / 22:12

2 respostas

1

Se eles não tiverem sido renomeados, você poderá encontrar todos os dispositivos Ethernet procurando diretórios correspondentes a eth* in /sys/class/net/ . Para aplicar essas operações a várias NICs e endereços IP, consulte os laços . Aqui está um exemplo

#!/bin/bash  

ADDRESSES="192.0.2.1 192.0.2.2"  

for I in /sys/class/net/eth*  
do  
    I=$(basename $I)  
    for A in $ADDRESSES  
    do  
        echo $I $A  
    done  
done

Em um sistema com dois dispositivos ethernet, isso produziria

eth0 192.0.2.1
eth0 192.0.2.2
eth1 192.0.2.1
eth1 192.0.2.2

    
por 02.03.2011 / 23:16
1

Obtenha uma lista de links de ethernet:

/sbin/ip link

Obtenha uma lista de links Ethernet conectados:

/sbin/ip link | grep 'UP'

Não consigo entender o resto da sua pergunta.

    
por 02.03.2011 / 23:45