我有一个 Raspberry Pi,我想在上面运行 bitcoind。这有时会消耗我大量的传出带宽,因此我想确保它对比特币数据的使用永远不会超过 20 KB/s。
比特币协议使用端口 8333 进行连接,因此我认为只需查看源端口或目标端口是否等于 8333 就可以轻松识别连接。
在 Linux 上,哪组命令可以确保进出端口 8333 的数据不会超过 20 KB/s?
答案1
您可以tc
根据网络地址或标记的数据包来“调整”带宽利用率。曾几何时,IPTables 中有一些用于标记数据包的选项,然后使用tc
我不记得它是什么。它不在我的iptables --help
任何地方,所以他们可能已经把它拿走了。这也很好,因为它可能基于 pid 或所有者。 PID 会被回收,所有者也太模糊了。如果您知道网络地址的大致范围,tc
可能会更好,因为了解它可以在其他领域得到回报。如果不能,那么应用程序本身可能是您可以可靠使用的唯一标准。
如果您有一个相当最新的内核,您可以通过 cgroup 限制应用程序的带宽使用。这里是另一个答案,显示了如何设置 cgroup 的简短示例。
cgroup 更可取,因为fork
's 和execve
's 捕获新的子进程,因此任何子进程都会添加到同一个 cgroup 中。这就是为什么我链接的答案有效,即使他们只添加了 shell 的 pid(cgroup 捕获 的bash
调用execve
并将 PID 添加到同一个 cgroup)。
答案2
以下命令集会将源或目标端口为 8333 的流量的传出速率限制为 160 kbit/s,除非目标 IP 位于本地网络上。
#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