Que conjunto de comandos limitará a taxa de dados de saída a X kbps para o tráfego da ou para a porta Y?

5

Eu tenho um Raspberry Pi e gostaria de ter o bitcoind rodando nele. Isso consome muito da minha largura de banda de saída, por vezes, então eu gostaria de ter certeza de que nunca usa mais de 20 KB / s para os dados do Bitcoin.

O protocolo Bitcoin usa a porta 8333 para conexões, então acho que deve ser possível identificar conexões facilmente apenas olhando se a porta de origem ou de destino é igual a 8333.

No Linux, qual conjunto de comandos garantirá que os dados de e para a porta 8333 não excedam 20 KB / s?

    
por runeks 20.05.2013 / 21:41

2 respostas

1

O seguinte conjunto de comandos limitará a taxa de saída do tráfego com uma porta de origem ou destino de 8333 a 160 kbit / s, a menos que o IP de destino esteja na rede local.

#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
    
por 02.06.2013 / 21:47
1

Você pode usar tc para "formatar" a utilização da largura de banda com base em endereços de rede ou pacotes marcados. Era uma vez uma opção no IPTables para marcação de pacotes, usando tc Não me lembro o que é. Não está no meu iptables --help em qualquer lugar, então eles podem tê-lo retirado. O que é bom porque provavelmente é baseado em pid ou dono. O PID é reciclado e o dono seria muito vago. Se você conhece a grande quantidade de endereços de rede, tc pode ser preferível, pois o aprendizado pode ser compensado em outras áreas. Se você não puder, o próprio aplicativo pode ser o único critério que você pode usar com segurança.

Se você tem um kernel razoavelmente atual, você pode limitar o uso da largura de banda de um aplicativo via cgroups. Aqui é outra resposta que mostra um pequeno exemplo de como configurar o cgroup.

Os cgroups são preferíveis porque fork e execve capturam os novos filhos, portanto, qualquer processo filho é adicionado ao mesmo cgroup. É por isso que a resposta que associei funciona mesmo que eles só adicionem o pid do seu shell (o cgroup pega bash da chamada de execve e adiciona o PID ao mesmo cgroup).

    
por 21.05.2013 / 02:26

Tags