Я использую 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 в стандартный вывод (перенаправляется в журнал), и если использование превышает лимит, жестко закодированный в файл в верхней части, соединение прерывается. Он не особенно надежен (в частности, в нем нет обработки ошибок), но он должен служить поставленной цели.