나는 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