web-dev-qa-db-ja.com

帯域幅を制御するためのTC(トラフィック制御)

ポートの発信帯域幅を制限するためにしばらく使用している帯域幅スクリプトに問題があります。

発信ポートの速度を変更するまで、最初は問題なく動作しました。より大きな数値(200mbitから400mbit)に切り替えて、スクリプトを再起動しました。何らかの理由で、新しい帯域幅制限は適用されず、古い制限はまだ存在しています。スクリプトをinitサービスとして設定しています。これは、コードの一部がどのように見えるかです。

# Interface
interface=eth0

# Define the upload, follow units can be
upload_limit=400mbit

start() {
    # Start the tc configuration and set all packets default to 10
    /sbin/tc qdisc add dev $interface root handle 1:0 htb default 10

    # Set default speed for all packets
    /sbin/tc class add dev $interface parent 1:0 classid 1:10 htb rate 1000mbit ceil 1000mbit prio 0
    # Set speeds for packets marked with 20
    /sbin/tc class add dev $interface parent 1:0 classid 1:20 htb rate $upload_limit ceil $upload_limit prio 0

    # Mark packets for port 182 to 20 so that tc can handle the traffic.
    /sbin/iptables -A OUTPUT -t mangle -p tcp --sport 182 -j MARK --set-mark 20
    /sbin/service iptables save

    # Assign it to appropriate qdisc
    tc filter add dev $interface parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
}

stop() {
    /sbin/tc qdisc del dev $interface root
}

誰かが私に何か提案をすることができますか?

4
Elise Crane

IMHO、古いルールがまだ適用されている理由は、「魔法」を引き起こすiptablesルールがまだ存在しているためです。これは、追加する行があり、削除する行がないためです。 iptablesルールファイルを確認してください。 「iptables-DOUTPUT -t mangle -p tcp --sport 182 -j MARK --set-mark20」の古いバージョン(ポート)に似た行がたくさんあるはずです。 (スクリプトが実行されるたびに、新しいスクリプトを作成して後で保存します)

マングルテーブルのルールをクリーンアップするために、stop()関数にIptablesコマンドを配置してみてください。次のようなもの:/ sbin/iptables -D OUTPUT -t mangle -p tcp --sport 182 -j MARK --set-mark 20/sbin/service iptables save

1
JucaPirama