Linux: recupera contadores de paquetes enviados / recibidos por interfaz (ethernet, ipv4, ipv6)
-
20-08-2019 - |
Pregunta
En Linux, ¿cómo puedo (programáticamente) recuperar los siguientes contadores por interfaz :
- Tramas de Ethernet enviadas / recibidas,
- Paquetes IPv4 enviados / recibidos,
- Paquetes IPv6 enviados / recibidos.
Solución
Debería poder hacerlo utilizando iptables
reglas y contadores de paquetes, por ejemplo
# 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
Y para ver las estadísticas, analice el resultado de estas:
iptables -L -vxn
ip6tables -L -vxn
También debe buscar la bandera -Z
cuando desee restablecer los contadores.
Otros consejos
En mi sistema, hay archivos debajo de /sys/class/net/eth0/statistics
, que ofrecen varias estadísticas sobre las interfaces de red.
Esto supone un Linux vagamente reciente que ha montado /sys
(sysfs).
cat /proc/net/dev
Debe contener contadores, estadísticas e información.
Siempre puede analizar los diversos archivos de estado del núcleo usted mismo, creo que esto es lo que hacen las herramientas como netstat
.
La página del manual sugiere:
-
/proc/net/raw
- Información del socket RAW -
/proc/net/tcp
- Información del socket TCP -
/proc/net/udp
- Información del socket UDP
Supongo que debería haber una forma no proc de hacer esto, ¿quizás también en /sys
? Eché un vistazo rápido pero no encontré nada.
O simplemente analiza la salida de netstat -i
. O strace netstat -i
, y úselo para averiguar dónde busca la información.
ifconfig
le indica la cantidad de datos transferidos (bytes y paquetes).
Los siguientes comandos dan estadísticas de ipv4 / ipv6 mantenidas en todo el sistema:
netstat --statistics
nstat -z
cat /proc/net/dev_snmp6/eth0 gives ipv6 stats per interface
Puede imprimir estadísticas completas de Ethernet con ethtool :
ethtool -S eth1
Puede hacerlo fácilmente en C # en monodevelop:
using System.Net.NetworkInformation;
foreach (NetworkInterface ni in interfaces)
{
// perform your calculations
}