포트 Y를 오가는 트래픽의 송신 데이터 속도를 Xkbps로 제한하는 명령 세트는 무엇입니까?

포트 Y를 오가는 트래픽의 송신 데이터 속도를 Xkbps로 제한하는 명령 세트는 무엇입니까?

나는 Raspberry Pi를 가지고 있고 거기에서 비트코인을 실행하고 싶습니다. 이는 때때로 나가는 대역폭을 많이 소모하므로 비트코인 ​​데이터가 20KB/s를 초과하지 않도록 하고 싶습니다.

비트코인 프로토콜은 연결에 포트 8333을 사용하므로 소스 또는 대상 포트가 8333인지 확인하는 것만으로도 연결을 쉽게 식별할 수 있을 것이라고 생각했습니다.

Linux에서 포트 8333에 들어오고 나가는 데이터가 20KB/s를 초과하지 않도록 보장할 수 있는 명령 세트는 무엇입니까?

답변1

tc네트워크 주소 또는 태그가 지정된 패킷을 기반으로 대역폭 활용도를 "조정" 할 수 있습니다 . 옛날에는 IPTables에 패킷을 표시하는 몇 가지 옵션이 있었는데, tc그것이 무엇인지 기억이 나지 않습니다. 내 것이 아니므 iptables --help로 그들이 가져갔을 수도 있습니다. 이는 pid 또는 소유자를 기반으로 할 수도 있으므로 좋습니다. PID는 재활용되며 소유자가 너무 모호합니다. 네트워크 주소의 일반적인 범위를 알고 있으면 tc다른 영역에서도 도움이 될 수 있으므로 더 나을 것입니다. 그렇지 않다면 애플리케이션 자체가 안정적으로 사용할 수 있는 유일한 표준일 수 있습니다.

상당히 최신 커널을 사용하고 있다면 cgroup을 통해 애플리케이션의 대역폭 사용량을 제한할 수 있습니다.여기cgroup을 설정하는 방법에 대한 간단한 예를 보여주는 또 다른 답변입니다.

forkexecve'는 새로운 하위 프로세스를 캡처하므로 모든 하위 프로세스가 동일한 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

관련 정보