私はRaspberry Piを持っていて、そこからビットコインを実行したいと思います。これは時々出てくる帯域幅を多く消費するので、ビットコインデータが20KB/sを超えないようにしたいと思います。
ビットコインプロトコルは接続にポート8333を使用しているため、送信元ポートまたは宛先ポートが8333であることを確認するだけで接続を簡単に識別できると思いました。
Linuxでポート8333に入出力するデータが20KB / sを超えないようにするための一連のコマンドは何ですか?
答え1
tc
ネットワークアドレスまたはタグ付きパケットに基づいて帯域幅使用率を「調整」できます。昔は、IPTablesにパケットを表示するいくつかのオプションがありましたが、tc
それが何であるか覚えていません。私のものではないiptables --help
ので、彼らが持って行ったかもしれません。これはpidまたは所有者に基づいている可能性があるため、良いです。 PIDはリサイクルされ、所有者があまりにもあいまいです。ネットワークアドレスの一般的な範囲を知っていれば、tc
他の地域でも役に立つ可能性があるので、より良いでしょう。そうでなければ、アプリケーション自体が安定して使用できる唯一の標準である可能性があります。
かなり最新のカーネルを使用している場合は、cgroupを使用してアプリケーションの帯域幅使用量を制限できます。ここcgroupを設定する方法の簡単な例を示す別の答えです。
fork
とexecve
'は新しい子プロセスをキャプチャするので、すべての子プロセスが同じcgroupに追加されるため、cgroupが優先されます。そのため、私がリンクした答えはシェルのpidだけを追加しても機能します(cgroupはbash
呼び出しをキャプチャしexecve
、同じcgroupにPIDを追加します)。
答え2
次のコマンドセットは、宛先IPがローカルネットワーク上にない限り、送信元ポートまたは宛先ポート8333を使用して発信されるトラフィック速度を160kbit / sに制限します。
#network interface on which to limit traffic
IF="eth0"
#limit of the network interface in question
LINKCEIL="1gbit"
#limit outbound Bitcoin protocol traffic to this rate
LIMIT="160kbit"
#delete existing rules
tc qdisc del dev ${IF} root
#add root class
tc qdisc add dev ${IF} root handle 1: htb default 10
#add parent class
tc class add dev ${IF} parent 1: classid 1:1 htb rate ${LINKCEIL} ceil ${LINKCEIL}
#add our two classes. one unlimited, another limited
tc class add dev ${IF} parent 1:1 classid 1:10 htb rate ${LINKCEIL} ceil ${LINKCEIL} prio 0
tc class add dev ${IF} parent 1:1 classid 1:11 htb rate ${LIMIT} ceil ${LIMIT} prio 1
#add handles to our classes so packets marked with <x> go into the class with "... handle <x> fw ..."
tc filter add dev ${IF} parent 1: protocol ip prio 1 handle 1 fw classid 1:10
tc filter add dev ${IF} parent 1: protocol ip prio 2 handle 2 fw classid 1:11
#limit outgoing traffic to and from port 8333. but not when dealing with a host on the local network
# --set-mark marks packages matching these criteria with the number "2"
# these packages are filtered by the tc filter with "handle 2"
# this filter sends the packages into the 1:11 class, and this class is limited to ${LIMIT}
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 8333 ! -d 192.168.0.0/16 -j MARK --set-mark 0x2
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 8333 ! -d 192.168.0.0/16 -j MARK --set-mark 0x2