Назад | Перейти на главную страницу

Как я могу вывести интерфейс из строя, когда объем переданных данных достигнет предопределенного предела?

Я использую Linux-сервер в качестве маршрутизатора между двумя его сетевыми интерфейсами для маршрутизации локального трафика в Интернет и из Интернета. У рассматриваемого интернет-соединения есть определенный объем данных, превышение которого обходится дорого.

В идеале я бы хотел, чтобы Linux-система отслеживала объем данных, передаваемых через интерфейс с выходом в Интернет (как сумму полученных и переданных данных), и отключал интерфейс при превышении этого лимита. Мне не удалось найти для этого готового инструмента. Как мне лучше всего это сделать?

Один из вариантов - использовать корень cron задание, которое выполняется каждую минуту со следующим сценарием (вывод которого добавляется в файл журнала):

#!/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

Это суммирует полученные и переданные байты в соответствующей записи в /proc/net/dev, печатает его как байты и MiB в стандартный вывод (перенаправляется в журнал), и если использование превышает лимит, жестко закодированный в файл в верхней части, соединение прерывается. Он не особенно надежен (в частности, в нем нет обработки ошибок), но он должен служить поставленной цели.