Me gustaría realizar un seguimiento de los procesos que inician las conexiones salientes en un escritorio Linux. Lo mejor que se me ocurre es esto:
iptables -A OUTPUT -m state --state NEW -j LOG --log-uid
Esto registra el uid / gid que inicia la conexión, pero no el nombre del proceso / comando o incluso el pid. Si pudiera obtener el pid, probablemente podría crear un script que extraiga el nombre del proceso cuando se escribe el registro, pero parece que eso ni siquiera es posible.
Idealmente, también me gustaría registrar los procesos que aceptan conexiones entrantes también.
¿Alguna idea de cómo esto podría ser posible con iptables [o cualquier otra cosa] en una caja de Linux?
Respuestas:
Podría escribir un programa para monitorear / proc / net / tcp, cuya salida se ve así:
Luego, puede relacionar los puertos abiertos con los inodos, que pueden relacionarse nuevamente con los procesos y los descriptores de archivo al hacer un enlace de lectura en los descriptores de archivo enumerados para cada proceso:
Vea aquí que el inodo 4847458 corresponde al primer zócalo tcp en la lista anterior. La salida de netstat -tapn lo verifica por mí (y recuerda que 0x50 == 80):
Cuando el programa del monitor observe un cambio en / proc / net / tcp, analice los datos y determine si el cambio es un socket recién abierto. Luego, puede enumerar todos los descriptores de archivo para cada proceso enumerado en / proc, haciendo un enlace de lectura en cada uno para encontrar el inodo correspondiente. Una vez que encuentre eso, tiene el pid propio, del cual puede obtener cualquier otra cosa que desee, particularmente si tiene contabilidad de procesos.
Si no necesita que su notificación sea instantánea, entonces su programa de monitoreo podría usar una encuesta lenta (quizás un período de 50 ms o 100 ms, o incluso 1000 ms).
fuente
Desea el módulo de coincidencia del propietario, que solo funciona en la cadena OUTPUT (y tal vez PREROUTING ...?). Lea los documentos, pero funcionará de la siguiente manera:
fuente
Nada que ver con iptables o registro; pero aquí hay una interfaz similar a "superior" que sondea el directorio / proc / y muestra el ancho de banda por programa / pid:
http://sourceforge.net/projects/nethogs
"NetHogs es una pequeña herramienta 'net top'. En lugar de desglosar el tráfico por protocolo o por subred, como la mayoría de las herramientas, agrupa el ancho de banda por proceso. NetHogs no depende de un módulo especial del núcleo para cargar".
fuente
Cuando estoy investigando una pregunta similar, tratando de limitar la velocidad de Skype, he encontrado
es una buena forma de vincular el número de puerto a pid / cmd, ahora que pid-owner / cmd-owner ya no se admite directamente en iptables; luego deberá analizar el resultado, luego agregar la regla de iptables de acuerdo con el puerto; naturalmente, necesitará un código de limpieza después / al apagar / reiniciar el sistema, etc. guarde el / los número / s de puerto en un archivo para referencia en el momento de la limpieza
de hecho, una buena respuesta a la pregunta de números de puerto es
es posible que deba ajustar el elemento grep tcp de acuerdo con sus necesidades
entonces, para mis propósitos, era más simple agregar filtros tc u32 de acuerdo con los números de puerto, las entradas de iptables de acuerdo con los números de puerto similares
fuente