Question Limite de téléchargement quotidienne


Je cherche un moyen de créer une limite Internet quotidienne pour mon serveur Ubuntu. Tout le trafic sortant quitte Eth2, un dongle USB, celui-ci est prépayé et les enfants le mangent rapidement. Je dois diviser mon montant prépayé, généralement de 12 Go, en allotissements quotidiens et arrêter le trafic le lendemain de ce montant. Peut-être avec une page Web lancée en disant limite quotidienne dépassée.

De préférence quelque chose de la CLI. C'est une bête sans tête avec seulement un accès SSH.

VNSTAT semble faire ce dont j'ai besoin, je ne dispose pas des compétences nécessaires pour créer une commande ifdown.

Merci.


5
2017-10-10 05:35


origine


askubuntu.com/questions/328140/… et sourceforge.net/projects/netramon - Rinzwind
Nice, il semble que NTM ferait le travail, ne ressemble pas à sa CLI cependant :( - A.Adverse
Comment accéder au serveur depuis le réseau local - via l'interface eth2 ou par une autre interface? Je veux dire - est-il correct de désactiver cette interface par programmation lorsque la limite quotidienne est atteinte. - pa4080
J'ai eth0, local Gb, et eth1 local Mb ethernets, et wlan0 tous générant du trafic acheminé vers eth2. Il n'y a pas de problème à désactiver eth2 une fois la limite de trafic atteinte. - A.Adverse
@ pa4080 Je n'utilise pas vraiment votre script, il me semblait trop compliqué. Cependant, cela m'a donné suffisamment d'idées pour arriver là où je voulais aller. J'ai un script probablement très correct, qui coupe la sortie de vnstat et si sa valeur dépasse 480 Mo, supprime eth2. J'en avais aussi un qui réinitialisait l'interface à minuit, mais désactivait cela, car il y avait beaucoup d'utilisation d'arrière-plan, qui rongeait l'indemnité de jours alors que l'interface était en service mais pas utilisée autrement. - A.Adverse


Réponses:


Ma suggestion est le script suivant qui obtiendra les données du trafic entrant et sortant de ifconfig interface-name et comparera la somme avec une valeur limite prédéfinie. Cette action sera répétée toutes les 5 secondes (par exemple).

Lorsque la quantité de trafic (revenu + résultat) devient égale ou supérieure à la limite, le script désactive l'interface cible et quitte. L'écart maximal entre la valeur réelle à laquelle l'interface sera désactivée et la valeur limite sera égale à 5s X MaxSpeed.

Le script peut être exécuté par le travail Cron. Vous pourrez donc définir un travail différent pour chaque jour de la semaine, etc. En outre, lorsque la limite est atteinte, vous pouvez exécuter le script manuellement avec une quantité de trafic supplémentaire.

Le nom du script doit être traffic-watch, sinon vous devriez changer sa 5ème ligne. Ma suggestion est de le placer dans /usr/local/bin, il sera donc disponible en tant que commande shell. N'oubliez pas de le rendre exécutable: chmod +x /usr/local/bin/traffic-watch.

Le script doit être exécuté en tant que root (sudo). Il crée un fichier journal: /tmp/traffic-watch-interface-name.log, où vous pouvez vérifier la dernière action. Le script a deux variables d'entrée:

  • $1=$LIMIT - la valeur de la limite de trafic en Mo - la valeur par défaut est 400.
  • $2=$IFACE - le nom de l'interface réseau cible - la valeur par défaut est eth0.
  • Si vous souhaitez remplacer ces valeurs lors de l'exécution du script, utilisez ces formats:

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

Utilisez 'watch-watch' avec 'crontab'. Si vous voulez exécuter le script tous les matins à 6:30, ouvrez la racine de Crontab (sudo crontab -e) et ajoutez cette ligne:

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

Utilisez la surveillance du trafic manuellement. Pour exécuter le script en tant que root et le pousser en arrière-plan, nous utiliserons sudo -b:

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

Le contenu du script 'watch-watch' est:

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

Remarques:

  • Désactivez le script lorsque vous mettez à jour et mettez à niveau le système! Le manque d'internet pourrait être la cause de paquets cassés.

  • C'est une bonne idée d'essayer de tuer l'instance précédente du script (juste au cas où sa limite n'est pas atteinte) avant d'exécuter une nouvelle:

    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 
    
  • Probablement 2>/dev/null n'est pas obligatoire, car je pense que toutes les erreurs sont redirigées vers /dev/null par le script lui-même.

  • Pour vérifier le trafic restant à distance, vous pouvez utiliser cette commande:

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

    Merci à @Dessert pour cette idée! (Remplacer eth0 avec l'interface en cours d'utilisation.)

  • Pour récupérer votre interface réseau UP: First ise ifconfig -apour trouver son nom. alors sudo ifconfig INTERFACE up.

  • Ce script pourrait être recréé pour fonctionner avec iptables au lieu deifconfig - up/down. Ce sera une solution puissante.

  • Le script est disponible sous la forme d'un dépôt GitHub à l'adresse suivante: https://github.com/pa4080/traffic-watch

  • Un autre script, basé sur le courant, ne sera disponible que pour un certain temps: Comment obtenir le trafic réseau actuel via la ligne de commande dans un format simple.

Les références:


5
2017-10-10 13:20



$1=LIMIT détient la valeur de la limite de trafic dans MiBn'est-ce pas? Sinon changer à XM=$(( XB / ( 1000 * 1000 ) )). - dessert
Woot, merci à tous - A.Adverse
Pour exécuter une commande sudo en arrière-plan, utilisation sudo -b. En outre, avez-vous l'intention de tronquer le journal au début de chaque boucle? - muru
@muru, oui, avec un nouvel enregistrement toutes les 5 secondes, le journal grandira rapidement et personne ne lira l'historique de ce journal. L'information importante est la suivante: combien de trafic reste, et l'interface est désactivée. sudo -b est nouveau pour moi, merci! - pa4080
@muru, dois-je utiliser nohup avec sudo -b? - pa4080