Como posso reduzir uma interface quando a quantidade de dados transferidos atingir um limite predefinido?

1

Estou usando uma caixa Linux como um roteador entre duas de suas interfaces de rede para rotear o tráfego local de e para a Internet. A conexão à Internet em questão tem uma permissão de dados definida, e exceder isso é caro.

Idealmente, gostaria que a caixa do Linux monitorasse a quantidade de dados sendo transferidos pela interface voltada para a Internet (como a soma dos dados recebidos e transmitidos) e diminuísse a interface quando esse limite fosse excedido. Não consegui encontrar uma ferramenta pronta para esse fim. Como eu faria melhor isso?

    
por Nick Kennedy 18.11.2015 / 12:30

1 resposta

2

Uma opção é usar um trabalho root cron que é executado a cada minuto com o seguinte script (com saída anexada a um arquivo de log):

#!/bin/bash
USAGE=$(awk '/wlan0/ {print $2+$10}' /proc/net/dev)
USAGEMIB=$(echo "$USAGE" | awk '{printf "%0.1f", $1 / 1024 / 1024}')
LIMIT=500
ABOVELIMIT=$(echo "$USAGEMIB" "$LIMIT"| awk '$1 > $2 {print "1"}')
echo -e $(date)"\t"$USAGE"\t"$USAGEMIB" MiB"
if [ "$ABOVELIMIT" == "1" ]
  then
    echo "Limit reached."
    /sbin/ifdown wlan0
fi

Isso soma os bytes recebidos e transferidos na entrada relevante em /proc/net/dev , imprime como bytes e MiB para stdout (redirecionado para um log) e se o uso exceder o limite que é codificado no arquivo próximo ao top traz a conexão. Não é particularmente robusto (em particular, não tem nenhum tratamento de erros), mas deve servir ao propósito pretendido.

    
por 18.11.2015 / 12:30