volcar conexiones tcp sin tcpdump

17

En una caja de centos, me gusta volcar las conexiones TCP; me gustaría ver si un servidor intenta enviar solicitudes a una determinada IP. Por lo general, tcpdump haría el truco, pero tcpdump no está instalado y la instalación de software no es una opción (debido a la política de la compañía). Me temo que netstat no me mostrará una sola solicitud.

Entonces me preguntaba qué otras opciones tengo. Tengo acceso de root en el servidor.

Isaac
fuente
¿Tiene acceso de root en el servidor?
user9517
Sí, tengo acceso de root.
Isaac
11
También debe trabajar para arreglar la política de la empresa. Cuando le impide hacer su trabajo, la política se rompe.
Michael Hampton
1
Bueno, el control de cambios es básicamente un requisito de la FDA, así que nada voy a cambiar en esta vida :)
Isaac

Respuestas:

15

Seguramente tienes python?

from socket import * 
from struct import unpack 
import sys 

INTERFACE = "eth0"
TARGET = "8.8.8.8" 

if __name__ == "__main__": 
  sock = socket(AF_PACKET, SOCK_DGRAM, 0x0800) 
  sock.bind((INTERFACE, 0x0800)) 
  while True: 
    data = sock.recvfrom(1500, 0)[0] 
    ip = inet_ntop(AF_INET, data[12:16]) 
    if ip == TARGET: 
      print "GOT TARGET" 
      sys.exit(1)

Esto saldrá con "OBTENER OBJETIVO" proporcionando la dirección IP que vuelve a coincidir. Como TCP tiene que enviar algo durante un apretón de manos, esto debería capturar cualquier cosa desde una dirección de destino específica. Sin embargo, no importa si el protocolo es TCP o UDP (ni lo verifico).

No olvides cambiar el OBJETIVO y la INTERFAZ.

Matthew Ife
fuente
¿Cómo modificarías esto para capturar también un paquete tcp syn? Porque si el objetivo no es alcanzable, no se mostrará una conexión intentada pero fallida.
Isaac
3
¿No es este script un nuevo software (por lo que no debe instalarse en el sistema)?
Vi.
@Vi con esa lógica, puede argumentar que cualquier script de shell es 'nuevo software'. Depende de cómo se defina 'software'.
Matthew Ife
1
-1 Lo siento, esta es una solución terrible. No solo está matando a un pollo con una ametralladora (escribiendo un programa para hacer lo que ya hay una solución), sino que es un bucle infinito que consume innecesariamente recursos de la CPU (ejecuta una secuencia en el proceso de Python ... pero espera la tecla Control-C!), no resuelve adecuadamente la pregunta del usuario: responderá "OBTENER OBJETIVO" a las conexiones TCP entrantes y salientes (el usuario solicitó "intenta enviar solicitudes ..."). Finalmente sale con 1 (lo que indica una falla en el shell) después del éxito.
Mike S
1
muy bueno, pero aún necesitas permisos elevados para esto. Tengosocket.error: (1, 'Operation not permitted')
Grant Bowman
17

Realmente trataría de obtener tcpdump. Dicho esto, algunas alternativas para ver si existe cierta conexión para una IP son:

strace:

[kbrandt@ny-kbrandt01: ~] strace -e trace=network nc 1.2.3.4 1234
...
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(1234), sin_addr=inet_addr("1.2.3.4")}, 16) = -1 EINPROGRESS (Operation now in progress)

lsof:

[kbrandt@ny-kbrandt01: ~] nc 1.2.3.4 1234 &
[1] 11434
[kbrandt@ny-kbrandt01: ~] lsof -p 11434
....
nc      11434 kbrandt    3u  IPv4 4543149      0t0     TCP 10.7.0.78:58886->1.2.3.4:search-agent (SYN_SENT)

netstat:

[kbrandt@ny-kbrandt01: ~] nc 1.2.3.4 1234 &
[1] 11486
[kbrandt@ny-kbrandt01: ~] sudo netstat -a -p | grep 11486
tcp        0      1 10.7.0.78:58891             1.2.3.4:search-agent        SYN_SENT    11486/nc
Kyle Brandt
fuente
1
Ese era el tipo de respuesta que esperaba. Desafortunadamente, strace tampoco está instalado: /
Isaac
Intentaré lsof
Isaac
1
Supongo que al póster original le gustó la respuesta, pero curiosamente no responde realmente a su pregunta ("... conexiones tcp, me gustaría ver si un servidor intenta enviar solicitudes a una determinada IP ...). darle información de conexión de red para un proceso en particular ... tal vez él quiera eso? Para aquellos como yo que vienen aquí buscando información sobre conexiones TCP de una máquina a otra, esto podría no ser el truco. Pero accesorios para mostrar una serie de diferentes ejemplos de comandos de shell que le permiten recopilar información sobre sus conexiones de red.
Mike S
15

Iptables tiene una capacidad de depuración y también se puede usar para el análisis de tráfico.

La solución se describe en la URL a continuación.

Reglas de depuración en Iptables

También vale la pena leer la siguiente URL para configurar el registro de salida de rastreo en un archivo de su elección.

http://backreference.org/2010/06/11/iptables-debugging/

No consideraría esta solución igual a tcpdump, pero se puede hacer usando una instalación mínima de Centos. Debe tener cuidado de no llenar el disco con los registros, porque tcpdump es mucho más eficiente en el uso del disco. Apague el registro cuando no sea necesario.

Puede usar lo siguiente como plantilla básica en su secuencia de comandos.

# Logging
log(){
SOURCE=a.b.c.d (IP address)
$IPT -A INPUT   -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "In: "
$IPT -A OUTPUT  -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Out: "
$IPT -A FORWARD -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Fw: "
$IPT -t nat -A POSTROUTING -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Nat: "
}
#log  (remove comment to enable)

trace(){
iptables -t raw -A PREROUTING -p tcp  -j TRACE
iptables -t raw -A OUTPUT     -p tcp  -j TRACE
}
#trace (remove comment to enable)
John Auld
fuente
8

Si necesita un software específico para hacer su trabajo y no se le permite hacerlo, o no está haciendo un buen caso de negocios o no está vendiendo sus ideas a las personas adecuadas ... o no tiene el control de este sistema ... .

Si me encargaran hacer algo y necesitara el tipo de información de depuración / solución de problemas que necesita en este caso, usaría la herramienta adecuada. Eso es probable tcpdumpo tshark. Sí, esas son piezas de software, pero las consideraría utilidades más esenciales . De hecho, son utilidades que podrían instalarse o cargarse en el sistema temporalmente y eliminarse sin incidentes (¿los medios extraíbles son una opción? ... sugerencia )

Pero el punto es que una solución alternativa a la política de la compañía probablemente requiere más esfuerzo que obtener la aprobación para este caso de uso.

ewwhite
fuente
Estoy completamente de acuerdo en usar la herramienta adecuada para el trabajo correcto. De hecho, puedo instalar software, pero tenemos que usar el control de cambios, por lo que el proceso lleva unos días: necesitaba el volcado en este momento, por lo que la instalación no era una opción. Me preguntaba si pasé por alto algunas opciones que aún no había pensado.
Isaac
:( sobre el cambio de gestión ¿Hay alguna manera de jugar a un juego político y obtener las personas / partes que se beneficiaría del vertedero para acelerar el proceso de gestión del cambio.?
ewwhite
1
Me temo que no, pero dado que es el cliente el que requiere la gestión de cambios y también tcpdump, tendrá que aceptar los hechos. Esperaba poder hacerlo feliz de todos modos.
Isaac
3
@ewwhite: cualquier buena política de gestión de cambios debe tener la capacidad de eximir los cambios específicos o de clases de pasar por el proceso completo. Si este no ...
Scott Pack
2
¿No puede compilar un enlace estático en tcpdumpotro lugar, y simplemente copiarlo a / tmp y ejecutarlo desde allí?
che
5

Kyle ofreció algunas excelentes opciones. Una más sería usar iptables:

[james@server ~]$ sudo iptables -I OUTPUT -d 1.2.3.4/32
...
[james@server ~]$ sudo iptables -L OUTPUT -n -v
Chain OUTPUT (policy ACCEPT 105 packets, 35602 bytes)
 pkts bytes target  prot opt in  out  source      destination
   87 33484 LOG     all  --  *   *    0.0.0.0/0   1.2.3.4     LOG flags 0 level 4

Esto es esencialmente una regla de contabilidad. No permite ni niega explícitamente el tráfico, por lo que se utiliza la política predeterminada para la cadena de SALIDA (que por defecto es ACEPTAR). Sin embargo, cualquier paquete coincidente incrementará los contadores para la regla.

Opcionalmente, también puede registrar detalles sobre el paquete con la -j LOGopción:

[james@server ~]$ sudo iptables -I OUTPUT -d 1.2.3.4/32 -j LOG
...
[james@server ~]@ dmesg | grep 1.2.3.4 | tail -1
IN= OUT=eth0 SRC=192.168.1.1 DST=1.2.3.4 LEN=100 TOS=0x10 PREC=0x00 TTL=64 ...

Los registros irán al recurso de registro del kernel, por lo que debería aparecer en / var / log / messages en derivados de Red Hat y /var/log/kern.log en derivados de Debian. También sería visible en la salida de dmesg, como se muestra. A diferencia tcpdump, sin embargo, no registrará el contenido completo del paquete, solo el contenido del encabezado del paquete.

James Sneeringer
fuente
Estaba pensando en iptables, pero tampoco instalado: /. De todos modos, buena solución.
Isaac
3

Dado que su servidor se conecta a una determinada IP, supongo que será a un puerto del que también tenga conocimiento.

En cualquier caso, netstato ssestán diseñados para hacer lo que quieras. Puede hacer lo mismo con cualquier comando:

netstat -n -t | awk '{print $5}' | grep A.B.C.D:n
ss      -n -t | awk '{print $5}' | grep A.B.C.D:n

donde A.B.C.Drepresenta una dirección IPv4 y n representa un número de puerto al que se conecta su servidor en el lado remoto. Por ejemplo:

ss      -n -t | awk '{print $5}' | grep 10.137.54.22:3389

O, si solo desea saber que la conexión está hecha:

ss      -n -t | awk '{print $5}' | grep -q 10.137.54.22:3389 && echo "CONNECTION MADE"

Si no conoce el número de puerto al que está intentando conectarse, entonces el trabajo sería más difícil ya que TCP abrirá un puerto en ambos lados de la conversación para los paquetes de datos y ACK. En ese caso, podría simplemente buscar la dirección IP para mostrar que se ha realizado una conexión, ya sea desde o hacia.

Finalmente, puede enlazar esto con el contenido de su corazón para usarlo como su herramienta de monitoreo:

while true; do
    ss -n -t | awk '{print $5}' | grep -q A.B.C.D:n && \
        echo "CONNECTION MADE" && \
        exit 0
    sleep 1
done
Mike S
fuente
Gran manera de monitorear sin necesidad de privilegios elevados de kernel.
Grant Bowman