Pregunta Medición de estadísticas de red acumulativas por usuario o por proceso


He estado buscando en Google durante horas: en Linux, quiero saber los bytes acumulados enviados y recibidos por el usuario o por el proceso en todos los protocolos IP. Lo mejor que he encontrado en mis búsquedas es que es posible usar iptables para marcar paquetes para un usuario, por ejemplo:

iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner test -j MARK --set-mark 1

Parece que "tc" puede dar forma al tráfico con eso, pero solo quiero la estadística, no quiero darle forma al tráfico. Quiero algo como: "el usuario U ha transmitido XMB usados ​​desde la época Y". No puedo averiguar cómo obtener estadísticas de estos paquetes marcados. Además, he visto nethogs pero parecen medir el flujo instantáneo y necesito conteos acumulativos. ¿Alguien tiene ideas?


6
2018-02-29 21:23


origen


Mira esto nethogs.sourceforge.net, Creo que hace lo que tu quieres. - Diego Woitasen


Respuestas:


El truco de propietario de iptables -m solo puede rastrear paquetes contra un usuario que se envían enlazados (por definición). No se puede utilizar para rastrear paquetes recibidos para ese usuario.

Admito que, desde lo alto de mi cabeza, no veo ninguna forma agradable de hacer esto. En una puñalada en la oscuridad, implicará aplicar un parche en el nivel del kernel, por ejemplo, solo permitirá que usuarios específicos se unan a determinados rangos de puertos en la pila de la red (similar a la idea de que solo la raíz puede vincularse a sockets de red). en el puerto 1024 e inferior). Luego, puede aplicar el registro de tráfico de iptables en estos rangos de puertos y saber con certeza que cualquier tráfico es para, y solo para, el usuario correspondiente que tiene permiso para enlazar a esos puertos. El inconveniente es que esto causará estragos en las aplicaciones de los usuarios que no son conscientes de estas limitaciones, cuando luego deciden intentar vincularse a un puerto y el kernel dice que no.

También puede ser posible hacer esto con SE Linux, pero sospecho que tiene el potencial de convertirse en una pesadilla de mantenimiento del administrador del sistema: http://www.linuxquestions.org/questions/linux-server-73/how-can-i-restrict-ports-for-users-to-bind-to-667153/


2
2018-03-16 10:12





Si usa -j CONNMARK en la cadena de SALIDA, y luego hace coincidir con -m connmark en la cadena de ENTRADA, podrá recuperar esa información.

Aquí hay un ejemplo para rastrear el tráfico entrante / saliente para el usuario nobody (id 65534):

# iptables -I OUTPUT -m owner --uid-owner 65534 \
                     -m comment --comment 'out - user nobody - uid 65534' \
                     -j CONNMARK --set-mark 65534
# iptables -I INPUT -m connmark --mark 65534 \
                    -m comment --comment 'in - user nobody - uid 65534'


Como resultado, puede obtener los valores del contador (primero en la línea) ejecutando iptables-save -c:

# iptables-save -c | grep 'uid 65534'
[2585:3797434] -A INPUT -m connmark --mark 0xfffe -m comment --comment "in - user nobody - uid 65534"
[1166:63139] -A OUTPUT -m owner --uid-owner 65534 -m comment --comment "out - user nobody - uid 65534" -j CONNMARK --set-xmark 0xfffe/0xffffffff

2
2018-04-29 17:44



Me gusta esta solución. Lo probé anoche y, de hecho, funciona, por eso lo he votado. Gracias por la perspicacia! :) - parkamark


Para la contabilidad: puede dejar de lado -j completamente y no proporcionar un objetivo. Como dice la página del manual:

-j, --jump target ... If this option is omitted in a rule (and -g  is
    not used), then matching the rule will have no effect on the
    packet's fate, but the counters on the rule will be incremented.

1
2017-12-06 22:12





Quizás lo más fácil de hacer, dependiendo de cuánto tiempo desee conservar esos datos, es simplemente observar los recuentos de paquetes / bytes correspondientes para sus reglas de marca con iptables -t mangle -L OUTPUT -v. Verá dos columnas a la izquierda de la salida que indican estas métricas.

Si desea un recuento diario, siempre puede programar un iptables -t mangle -Z OUTPUT Para borrar los conteos a medianoche.


0
2018-03-01 05:00





Si puede marcarlo, significa que puede registrarlo. Verifique la extensión de destino de LOG en las páginas de manual de iptables. Aquí una simple introducción: http://www.cyberciti.biz/tips/force-iptables-to-log-messages-to-a-different-log-file.html

Supongo que puede agregar una entrada de rotación de registro para esto y usarla para activar una secuencia de comandos que resume las entradas de registro y elimina el archivo. tal vez cada hora?


0
2018-03-28 11:30