¿Cómo puedo monitorear todas las solicitudes / conexiones salientes de mi máquina?

71

Mi máquina es un servidor, por lo que quiero ignorar las conexiones que se realizan a mi servidor (por ejemplo, cuando alguien visita mi sitio web). Quiero ver solo conexiones / solicitudes realizadas por mi servidor a otros lugares.

¿Cómo veo solo esas conexiones salientes?

EDITAR: Soy nuevo en este tipo de cosas. Lo que intento hacer es ver si se está enviando algo de mi servidor que no sea datos para mis aplicaciones web. Por ejemplo, si alguien visita mis sitios web, obviamente mi servidor enviará datos al navegador del cliente. Pero supongamos que también hay código en algún lugar del marco de mi aplicación web que envía datos estadísticos a otro lugar que no conozco. Me gustaría ver aquellos lugares a los que mi servidor envía datos, si los hay. Probablemente no sea probable, pero supongamos que decide utilizar un marco php o nodejs que no escribió: hay una pequeña posibilidad de que envíe algún tipo de datos a alguna parte. Si es así, eso es lo que me gustaría ver.

trusktr
fuente

Respuestas:

77

Utilizar netstat. Por ejemplo

$ netstat -nputw
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
[...]
tcp        0      0 192.168.25.222:22       192.168.0.134:42903     ESTABLISHED 32663/sshd: gert [p

enumera todas las conexiones salientes UDP ( u), TCP ( t) y RAW ( w) (que no usan lo a) en forma numérica ( n, evita posibles consultas DNS de larga duración) e incluye el programa ( p) asociado con eso.

Considere agregar la copción para que la salida se actualice continuamente.

gertvdijk
fuente
Gracias. Esa es buena información. ¿Podrías echar un vistazo a mi pregunta actualizada?
trusktr
1
Secuestro completamente inapropiado (excepto que esta respuesta buscó en Google): esta respuesta también funciona con Windows. Para usar netstaten "modo continuo" allí, -cno funciona. En su lugar, utiliza números, como netstat -na 1 | find "[Scan_Host_IP_Addr]"para que se actualice cada 1segundo (en este ejemplo). ( fuente )
ruffin
44
Esto sondea, por lo que no siempre capturará todas las conexiones.
reinierpost
¿Hay alguna manera de mostrar información más fácil de usar, como nombres de dominio, información sobre la IP? ¿Quizás usando un script personalizado?
awm
@awm Bueno, eso sería factible con straceel proceso, filtrando las búsquedas del servidor de nombres (sin detalles, esta no es una respuesta completa). Alternativamente, puede mostrar el DNS inverso de las IP enumeradas netstatal omitir la nopción incluida en mi respuesta.
gertvdijk
11

Si solo desea registrar cada intento de conexión, el más fácil probablemente sea el iptables LOGobjetivo en Linux (o la función de registro de firewall equivalente en su sistema).

Si necesita más información como la duración de la conexión y la cantidad de datos intercambiados en ambas direcciones, entonces conntrackd(en Linux) es probablemente la mejor opción.

Sin embargo, tenga en cuenta que los dos anteriores solo registran el tráfico que pasa a través de netfilter, que generalmente es todo el tráfico pero no tiene en cuenta el tráfico generado con pilas de IP en el espacio del usuario (como máquinas virtuales o cualquier cosa que use sockets sin procesar) o tráfico puenteado.

Para soluciones más generales, se puede echar un vistazo a cosas como argus, bro-ids, sancpo ntopque ingrese todo tipo de información sobre la base de tráfico que huelen en una interfaz.

Stéphane Chazelas
fuente
9

He probado un montón de herramientas, incluidas iftop, ntopy iptraf, por supuesto, las muy útiles integradas netstat -tupln(las opciones compatibles dependen del sistema operativo), pero resultó ser la más práctica para mi caso de uso nethogs: agrega conexiones por el origen aplicación , y es el menos ruidoso de todos.

Instalable a través de:

sudo apt-get install nethogs

Ejecutar como root:

sudo nethogs

Si su objetivo es ver todas las conexiones TCP iniciadas por cualquier aplicación, puede usar:

sudo tcpdump -i lo -A | grep Host:
ccpizza
fuente
6

Lo que creo que quieres hacer es obtener una lista de puertos de escucha y luego eliminarlos de cualquier otra conexión TCP, entonces todas esas conexiones saldrán. El comando ss (estado del socket) genera las columnas "Dirección local: puerto" y "Dirección par: puerto", necesitamos eliminar los puertos de escucha de la columna "Dirección local: puerto" y no la columna "Dirección par: puerto", de lo contrario, puede perder algunas conexiones salientes. Para lograr eso, estoy usando \s{2}+detrás de la cadena ": $ port" en el grep para que coincida con los espacios que existen detrás de la columna "Dirección local: puerto"; esa columna tiene dos o más espacios en blanco detrás, donde la "Dirección de pares: Puerto" tiene un espacio y luego una nueva línea (grrr ... debería tener una nueva línea, IMO,\s+\s{2}+.) Normalmente podría intentar usar la funcionalidad de filtrado de ss, como con ss -tn state established '(sport != :<port1> and sport !=:<port2>)' src <ip address>. Pero parece que hay un límite en cuanto al tiempo que puede durar esa cadena, se bombardeó en un sistema donde tenía muchos puertos de escucha. Así que estoy tratando de hacer lo mismo con grep. Creo que lo siguiente funcionará:

FILTER=$(ss -tn state listening | gawk 'NR > 1 {n=split($3,A,":"); B[NR-1]=A[n]} END {for (i=1; i<length(B); i++) printf ":%s\\s{2}+|", B[i]; printf ":%s\\s{2}+", B[i]}')

ss -tn state established dst :* | grep -P -v "$FILTER"

Tenga en cuenta que esto depende de la versión de ss que esté usando, las versiones anteriores (como: ss utility, iproute2-ss111117) tienen un formato de salida diferente, por lo que es posible que deba usar $ 3 en lugar de $ 4 en awk. Tenga en cuenta también ss -tlny ss -tn state listeningle da una salida diferente, lo cual es un poco intuitivo para mí. YMMV.

Encontré una solución un poco más elegante que no requiere conocer la IP del host, ss -tn state established dst :*funciona bien, modifiqué las líneas de comando anteriores.

Valle
fuente
¿Podría agregar alguna explicación de cómo funciona esto? ( Edite la respuesta; no publique información aclaratoria como comentarios). Creo que en parte lo he descubierto. Parece que podría necesitar un poco más de trabajo. Ejecuté ss -tn state listeningen un host que ejecuta un servidor FTP, y naturalmente el comando mostró que la máquina estaba escuchando en el puerto 21. Entonces, eso no significa que egrep -vfiltrará los hosts remotos cuya dirección IP incluye "21" (incluyendo "210 "," 211 "," 212 ", ...)? Además, ¿es asortrealmente necesario, o solo un escaparate?
G-Man
Tuve que arreglar casi todo, el script corregido está arriba.
Dale
En última instancia, sería mucho mejor si ss o netstat solo incluyeran esta funcionalidad. Haga una ss --outpara obtener una lista de conexiones salientes.
Dale
Bien, me gusta esta respuesta. Lo intentaré cuando vuelva a mejorar la seguridad en mi servidor. : D
trusktr
Parece que esto también podría usarse para UDP, pero, por supuesto, solo tiene que usar diferentes indicadores y estados.
Dale
4

tcpdumple permite ver todo el tráfico IP que fluye hacia / desde una interfaz específica con la capacidad de filtrar según ciertos criterios. tcpdumpPor lo general, se instala en la mayoría de los sistemas * nix de forma predeterminada, si no, generalmente hay un puerto en algún lugar para tomarlo para su distribución específica.

txtechhelp
fuente
2

netstat es una buena opción. Utilice los parámetros según sea necesario. (consulte sus páginas de manual) Por ejemplo

netstat -antup

Aquí puede monitorear todo (a) proceso numérico de escucha (n) tcp (t) y udp (u) (p).

También puedes probar el sscomando. Para uso de referencia:

SS Red TCP / UDP e información de socket

Kratos
fuente