Linux: recupera contatori di pacchetti inviati / ricevuti per interfaccia (ethernet, ipv4, ipv6)
-
20-08-2019 - |
Domanda
Su Linux, come posso recuperare (a livello di codice) i seguenti contatori in base all'interfaccia :
- Frame ethernet inviati / ricevuti,
- Pacchetti IPv4 inviati / ricevuti,
- Pacchetti IPv6 inviati / ricevuti.
Soluzione
Dovresti essere in grado di farlo utilizzando iptables
regole e contatori di pacchetti, ad esempio
# input and output must be accounted for separately
# ipv4, eth0
iptables -I INPUT -i eth0
iptables -I OUTPUT -o eth0
# ipv6, eth0
ip6tables -I INPUT -i eth0
ip6tables -I OUTPUT -o eth0
E per visualizzare le statistiche, analizza l'output di questi:
iptables -L -vxn
ip6tables -L -vxn
Dovresti anche cercare il -Z
flag quando vuoi resettare i contatori.
Altri suggerimenti
Sul mio sistema, ci sono file in /sys/class/net/eth0/statistics
, che forniscono varie statistiche sulle interfacce di rete.
Questo presuppone un Linux vagamente recente con /sys
(sysfs) montato.
cat /proc/net/dev
Dovrebbe contenere contatori, statistiche e informazioni.
Puoi sempre analizzare tu stesso i vari file di stato del kernel, penso che sia quello che fanno strumenti come netstat
.
La pagina man suggerisce:
-
/proc/net/raw
- Informazioni socket RAW -
/proc/net/tcp
- Informazioni socket TCP -
/proc/net/udp
- Informazioni sul socket UDP
Suppongo che ci dovrebbe essere un modo non proc per farlo, forse anche in /sys
? Ho dato una rapida occhiata ma non ho trovato nulla.
Analizza semplicemente l'output di netstat -i
. Oppure strace netstat -i
e utilizzalo per capire dove cerca le informazioni.
ifconfig
indica la quantità di dati trasferiti (byte e pacchetti).
I seguenti comandi forniscono statistiche ipv4 / ipv6 mantenute a livello di sistema:
netstat --statistics
nstat -z
cat /proc/net/dev_snmp6/eth0 gives ipv6 stats per interface
Puoi stampare statistiche complete su Ethernet con ethtool :
ethtool -S eth1
Puoi farlo facilmente in C # in monodevelop:
using System.Net.NetworkInformation;
foreach (NetworkInterface ni in interfaces)
{
// perform your calculations
}