¿Cómo monitorear el ancho de banda de red por usuario en el servidor Ubuntu?

12

Tengo algunos usuarios de shell en un servidor con 300 GB de transferencia de datos mensual. ¿Cómo puedo monitorear el uso de ancho de banda por usuario?

Pedram
fuente
¿Es esto posible? Parece que, en teoría, sería más complicado de lo que vale, porque técnicamente tendría que hacer que cada proceso que usa Internet identifique quién lo está ejecutando, y luego descubra el uso combinado del ancho de banda. ¿Alguna razón específica que desee monitorear por usuario, aparte de los usuarios de shell que tiene? Debido a que con datos de entrada / salida mensuales de 300 GB, parece poco probable que supere esa cantidad: /
Thomas Ward
Debe ser posible, de lo contrario, ¿cómo limitan los ISP el ancho de banda por usuario?
djeikyb
@EvilPhoenix Quiero monitorear el uso por usuario. 300 GB no es tanto para un servidor con al menos 20 usuarios que usan este servidor como servidor proxy.
Pedram
1
Parece que tiene una excelente respuesta práctica de Kees Cook, pero si todavía está buscando métodos, me pregunto si formular la pregunta de manera diferente podría ayudar. Encontré esta guía buscando "cómo limitar el ancho de banda del usuario en Linux": faqs.org/docs/Linux-HOWTO/Bandwidth-Limiting-HOWTO.html
djeikyb

Respuestas:

13

Como root, al menos podría medir el tráfico saliente por usuario utilizando el módulo "propietario" de iptables. Si se encuentran todos los usuarios que desea monitorear /root/list-of-users.txt, puede hacer lo siguiente:

for login in $(cat /root/list-of-users.txt);
do
    iptables -N out_user_$login
    iptables -A OUTPUT -m owner --uid-owner $(id -u $login) -j out_user_$login
done

Y luego, los conteos de paquetes y bytes para el tráfico saliente de cada usuario son visibles:

iptables -L OUTPUT -n -v | grep out_

Esto podría extenderse aún más con CONNMARK para rastrear el lado entrante también.

Kees Cook
fuente
Gracias, es genial. Hice esto, pero ¿por qué no puedo usar el mismo método para INPUT?
Pedram
1
El propietario del paquete no es conocido por los paquetes entrantes porque, desde la perspectiva del núcleo, proviene del exterior de la máquina. CONNMARK podría usarse para vincular paquetes en flujos TCP a su creador, etc., pero no tengo un ejemplo funcional de esto.
Kees Cook
7

Acabo de encontrar NetHogs :

NetHogs es una pequeña herramienta 'net top'. En lugar de dividir el tráfico por protocolo o subred, como lo hacen la mayoría de las herramientas, agrupa el ancho de banda por proceso.

ingrese la descripción de la imagen aquí

Esto debería permitirle rastrear el ancho de banda por nombre de usuario. Es posible que aún necesite otro par de herramientas para registrar la información y agregarla, pero es un buen comienzo sin usar directamente iptables.

djeikyb
fuente
También se puede iniciar en el modo para resumir el tráfico: sudo nethogs -v 3 eth0(o presionar mrepetidamente después de comenzar a recorrer los modos). Combine con tmuxpara ejecutar de forma persistente (incluso si su sshsesión se bloquea).
tanius
6

Puedes usar cactus

Cacti es una interfaz completa de RRDTool, almacena toda la información necesaria para crear gráficos y llenarlos con datos en una base de datos MySQL. La interfaz está completamente impulsada por PHP. Además de poder mantener gráficos, fuentes de datos y archivos Round Robin en una base de datos, los cactus manejan la recopilación de datos. También hay soporte SNMP para aquellos acostumbrados a crear gráficos de tráfico con MRTG.

O vnStat

vnStat es un monitor de tráfico de red basado en consola para Linux y BSD que mantiene un registro del tráfico de red para las interfaces seleccionadas. Utiliza las estadísticas de la interfaz de red proporcionadas por el núcleo como fuente de información. Esto significa que vnStat en realidad no detectará ningún tráfico y también asegura un uso ligero de los recursos del sistema.

Ambos son geniales.

sebikul
fuente
2
Gracias, pero ya los vi a ambos y parece que ninguno de ellos proporciona monitoreo por usuario. Quiero monitorear el uso por usuario.
Pedram
5

Miré un poco, y no he encontrado un paquete completo de interfaz gráfica de usuario que haga lo que quieres. Esperemos que exista uno y alguien lo publique aquí eventualmente.

No soy realmente un tipo de red, pero por lo que he leído, entre otras muchas cosas netstat, y iptablesse supone que debemos hacer por ip / host de usuario basada en lo que representa lo que las acctherramientas hicieron para la contabilidad de proceso del sistema. Este enlace cyberciti.biz puede ayudarlo a desarrollar un sistema con estas herramientas:

http://www.cyberciti.biz/faq/linux-configuring-ip-traffic-accounting/

djeikyb
fuente
Gracias, pero como dijiste, se usan para la contabilidad de usuarios basada en IP. Tengo un usuario de shell que puede usar el servidor en diferentes ubicaciones, especialmente en un departamento universitario con la misma dirección IP (detrás de un NAT). buscando una solución de contabilidad basada en el usuario, si es posible.
Pedram
netstat -emuestra los usuarios de shell, permitiéndole vincular ip / host al nombre de usuario.
djeikyb