Предел ежедневной загрузки

Я ищу способ создать ежедневный интернет-лимит для моего Ubuntu Server. Весь исходящий трафик оставляет Eth2, usb dongle, это предоплачено, и дети едят его быстро. Мне нужно разделить мою предоплаченную сумму, обычно 12 ГБ, на ежедневные выделения и остановить трафик на следующий день после достижения этой суммы. Может быть, с веб-страницей, в которой говорилось, что превышение ежедневного лимита.

Предпочтительно что-то из CLI. Это безголовый зверь с единственным доступом SSH.

VNSTAT, похоже, делает то, что мне нужно, у меня просто нет навыков написания скриптов, чтобы он управлял командой ifdown.

Благодарю.

Мое предложение – это следующий скрипт, который будет получать данные входящего и исходящего трафика из имени ifconfig interface-name и будет сравнивать сумму с предопределенным предельным значением. Это действие будет повторяться каждые 5 секунд (например).

Когда количество трафика (доход + результат) становится равным или превышает лимит, скрипт отключит целевой интерфейс и выйдет. Максимальное несоответствие между фактическим значением, при котором интерфейс будет отключен, и предельным значением будет равен 5s x MaxSpeed .

Сценарий может выполняться заданием Cron. Таким образом, вы сможете установить разные задания для каждого дня недели и т. Д. Кроме того, когда предел достигнут, вы можете запустить скрипт вручную с дополнительным количеством трафика.

Имя сценария должно быть traffic-watch , иначе вы должны изменить его 5-ю строку. Мое предложение состоит в том, чтобы поместить его в /usr/local/bin , таким образом, он будет доступен как команда оболочки. Не забудьте сделать его исполняемым: chmod +x /usr/local/bin/traffic-watch .

Сценарий должен выполняться как root ( sudo ). Он создает файл журнала: /tmp/traffic-watch-interface-name.log , где вы можете проверить последнее действие. Сценарий имеет две входные переменные:

  • $1 = $LIMIT – значение ограничения трафика в МБ – значение по умолчанию – 400 .
  • $2 = $IFACE – имя целевого сетевого интерфейса – значением по умолчанию является eth0 .
  • Если вы хотите переопределить эти значения во время выполнения скрипта, используйте следующие форматы:

     traffic-watch "250" "enp0s25" traffic-watch "250" traffic-watch "" "enp0s25" 

Используйте «трафик-часы» с «crontab». Если вы хотите запустить скрипт каждое утро в 6:30 , откройте root Crontab ( sudo crontab -e ) и добавьте эту строку:

 30 6 * * * /usr/local/bin/traffic-watch 2>/dev/null 

Используйте «трафик-часы» вручную. Чтобы запустить скрипт с правами root и нажмите его в фоновом режиме, мы будем использовать sudo -b :

 sudo -b traffic-watch "150" 2>/dev/null 

Содержание сценария «Traffic-Watch»:

 #!/bin/bash # Initialize [ -z "${1}" ] && LIMIT="400" || LIMIT="$1" # Set the total traffic daily limit in MB [ -z "${2}" ] && IFACE="eth0" || IFACE="$2" # Set the name of the target interface LOG="/tmp/traffic-watch-$IFACE.log" # Set the log file name LANG=C # Set envvar $LANG to `C` due to grep, awk, etc. IPPT='[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' # Set IP address match pattern #IPPT='[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' NIC="$(/sbin/ethtool -i "$IFACE" | awk 'FS=": " {print $2; exit}')" # Get the $IFACE (NIC) driver # Function: Get the current traffic get_traffic(){ RX="$(/sbin/ifconfig "$IFACE" | grep -Po "RX bytes:[0-9]+" | sed 's/RX bytes://')" # Get the incoming traffic TX="$(/sbin/ifconfig "$IFACE" | grep -Po "TX bytes:[0-9]+" | sed 's/TX bytes://')" # Get the outgoing traffic XB=$(( RX + TX )) # Calculate the total traffic XM=$(( XB / ( 1000 * 1000 ) )) # Convert the total traffic in MB } # Functions: Disable the interface interface_down(){ /sbin/ifconfig "$IFACE" down 2>/dev/null && exit; } # Function: Reset the traffic and enable the interface reset_traffic_interface_up(){ /sbin/modprobe -r "$NIC" 2>/dev/null && /sbin/modprobe "$NIC" 2>/dev/null && /sbin/ifconfig "$IFACE" up 2>/dev/null; } # Function: Get the IP address get_ip(){ /sbin/ifconfig "$IFACE" 2>/dev/null | grep -Po "${IPPT}" | head -1; } # --- The main program --- reset_traffic_interface_up # Wait until the IP address is obtained until [[ "$(get_ip)" =~ ${IPPT} ]]; do sleep 1; done # While the interface has IP address == while it is up; check if it is up on every 5 seconds (the `time` of the cycle is about 75 ms) while [[ "$(get_ip)" =~ ${IPPT} ]]; do get_traffic # Start logging printf '\n%s\n\nI-face:\t%s\nDriver:\t%s\nIP:\t%s\n' "$(date)" "$IFACE" "$NIC" "$(get_ip)" > "$LOG" printf '\nRX:\t%s\nTX:\t%s\nXB:\t%s\nXM:\t%s\n' "$RX" "$TX" "$XB" "$XM" >> "$LOG" if (( XM >= LIMIT )); then printf '\nThe daily limit of %s MB was reached.' "$LIMIT" >> "$LOG" printf ' The interface %s was disabled!\n\n' "$IFACE" >> "$LOG" interface_down else printf '\n%s MB remains on %s.\n\n' "$(( LIMIT - XM ))" "$IFACE" >> "$LOG" fi # Debug: cat "$LOG" sleep 5 ## *Adjust this value* ## done; interface_down 

Заметки:

  • Отключите скрипт при обновлении и обновлении системы! Недостаток интернета может быть причиной сломанных пакетов.

  • Рекомендуется попытаться убить предыдущий экземпляр скрипта (на всякий случай его предел не достигнут) перед запуском нового:

     sudo pkill traffic-watch sudo -b traffic-watch "150" 2>/dev/null 
     29 6 * * * /usr/bin/pkill traffic-watch 2>/dev/null 30 6 * * * /usr/local/bin/traffic-watch 2>/dev/null 
  • Вероятно, 2>/dev/null не обязательно, потому что, я думаю, все, ошибки перенаправляются на /dev/null самим скриптом.

  • Чтобы удаленно проверить оставшийся трафик, вы можете использовать эту команду:

     ssh user@host.or.ip tail -n3 /tmp/traffic-watch-eth0.log 

    Спасибо @Dessert за эту идею! (Замените eth0 на используемый интерфейс).

  • Чтобы вернуть свой сетевой интерфейс UP: сначала укажите ifconfig -a чтобы найти его имя. Затем sudo ifconfig INTERFACE up .

  • Этот скрипт можно воссоздать для работы с iptables вместо ifconfig - up/down . Это будет мощное решение.

  • Сценарий доступен как репозиторий GitHub по адресу: https://github.com/pa4080/traffic-watch

  • Другой сценарий, основанный на текущем, который будет получать только трафик в течение определенного периода времени, приводится здесь: Как получить текущий сетевой трафик через командную строку в простом формате .

Рекомендации:

  • Как сбросить счетчики ifconfig?
  • выполнить сценарий, когда сетевой интерфейс
  • Подробнее о расчетах
  • Как получить байты TX / RX без ifconfig