web-dev-qa-db-ja.com

Bashスクリプト-トラフィックシェーピング

やあ、みんな、私のスクリプトを見て、それにいくつかのことを追加するのを手伝ってくれないかと思っていました。

  1. 持っているアクティブなイーサネットポートの数を見つけるにはどうすればよいですか?複数のイーサネットポートをフィルタリングするにはどうすればよいですか
  2. ある範囲のIPアドレスを実行するにはどうすればよいですか?
  3. いくつかのイーサネットポートができたら、それぞれにトラフィック制御を追加する必要があります

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

ありがとう

1
Craig-Aaron

名前が変更されていない場合は、eth*/sys/class/net/に一致するディレクトリを探すことですべてのイーサネットデバイスを見つけることができます。これらの操作を複数のNICおよびIPアドレスに適用するには、 forループ を調べてください。これが例です

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

2つのイーサネットデバイスを備えたシステムでは、これは次のように出力されます。

eth0 192.0.2.1
eth0 192.0.2.2
eth1 192.0.2.1
eth1 192.0.2.2

1
sciurus

イーサネットリンクのリストを取得します。

/sbin/ip link

接続されているイーサネットリンクのリストを取得します。

/sbin/ip link | grep 'UP'

私はあなたの質問の残りを理解することができません。

1
JeffG