Averiguar qué IPs están generando tráfico en un determinado momento
En muchas ocasiones es de utilidad averiguar qué IPs están realizando solicitudes a un determinado servidor. Puede darse el caso de que se necesite identificar qué servidores conectan (y como) a las 4 de la mañana y generan algún tipo pico de carga o problema. En estos casos se puede hacer uso de aplicaciones de monitoreo de red y cron para programar en qué momento registrar la información. No todas las herramientas ofrecen la misma información ni las mismas métricas, por lo tanto depende de la información que se necesite obtener habrá que usar una u otra. Se mostrarán unos ejemplos con iptables, iftop, iptraf y Tshark.
IPtables: Permite establecer una regla que simplemente registra el tipo de información deseado. Como es lógico se puede filtrar por puerto, protocolo, IP, etc. Se muestran a continuación algunos ejemplos.Es muy útil para poder identificar el tráfico UDP, que en herramientas como netstat / ss es casi imposible localizarlas ya que las conexiones UDP suelen permanecen activas únicamente fracciones de segundo.
## Activar los logs (Protocolos de iptables: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh, all). iptables -A INPUT -p udp -j LOG --log-prefix "udp connection: " iptables -A INPUT -p tcp -j LOG --log-prefix "tcp connection: " ## Filtrar registros por protocolo (TCP / UDP) y hacer sumatorio de conexiones. # UDP journalctl -k -f --until +10 | grep -i "PROTO=UDP" | grep -oE "SRC.*DST=\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | sort | uniq -c | sort -n # UDP journalctl -k -f --until +10 | grep -i "PROTO=TCP " | grep -oE "SRC.*DST=\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | sort | uniq -c | sort -n # TCP ## Filtrar por puerto origen / destino. journalctl -k -f --until +10 | grep SPT=52922 | grep -oE "SRC.*DST=\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | sort | uniq -c | sort -n # Puerto origen journalctl -k -f --until +10 | grep DPT=52922 | grep -oE "SRC.*DST=\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | sort | uniq -c | sort -n # Puerto destino ... 1006 SRC=37.135.83.207 DST=192.168.178.50 1008 SRC=83.165.72.39 DST=192.168.178.50 2131 SRC=37.15.32.58 DST=192.168.178.50 2556 SRC=85.84.102.132 DST=192.168.178.50 7538 SRC=87.222.152.233 DST=192.168.178.50 9402 SRC=84.123.170.127 DST=192.168.178.50 12958 SRC=95.19.83.28 DST=192.168.178.50
# Logs de iptables visualizados mediante journalctl. journalctl -k -f --until +10 abr 13 22:19:14 archlinux kernel: tcp connection: IN=enp2s0 OUT= MAC=14:8a:5b:24:c0:29:24:65:11:bc:e1:1e:08:00 SRC=213.236.20.93 DST=192.168.178.50 LEN=40 TOS=0x00 PREC=0x00 TTL=113 ID=11298 DF PROTO=TCP SPT=52677 DPT=51413 WINDOW=65520 RES=0x00 ACK URGP=0 abr 13 22:19:14 archlinux kernel: tcp connection: IN=enp2s0 OUT= MAC=14:8a:5b:24:c0:29:24:65:11:bc:e1:1e:08:00 SRC=79.154.171.123 DST=192.168.178.50 LEN=40 TOS=0x00 PREC=0x00 TTL=112 ID=29895 DF PROTO=TCP SPT=60433 DPT=51413 WINDOW=260 RES=0x00 ACK URGP=0 abr 13 22:19:14 archlinux kernel: tcp connection: IN=enp2s0 OUT= MAC=14:8a:5b:24:c0:29:24:65:11:bc:e1:1e:08:00 SRC=190.186.65.12 DST=192.168.178.50 LEN=40 TOS=0x00 PREC=0x00 TTL=46 ID=5769 DF PROTO=TCP SPT=4693 DPT=51413 WINDOW=2518 RES=0x00 ACK URGP=0 ...
Los comandos anteriores registraban todo envío / recepción de paquetes, si solo se quiere contabilizar las conexiones nuevas (si un socket se mantiene abierto y manda 500Gb se contabiliza como una conexión), es decir cuando nuevos cokets son abiertos, se debe agregar “-m state --state NEW”.
iptables -A INPUT -p tcp -m state --state NEW -j LOG --log-prefix "tcp connection: "
De esta manera se puede visualizar rápidamente si un cliente / servidor realiza muchas conexiones nuevas o no (leer).
iftop: Este monitor de red por linea de comandos tiene un parámetro para registrar en un fichero sus métricas y permite programar el tiempo que estará registrando las conexiones.
# 10 segundos a partir de que se ejecute. lamentablemente iftop no soporta el uso de múltiples interfaces al mismo tiempo. iftop -i eth1 -n -t -s 10 > log.txt Listening on eth1 # Host name (port/service if enabled) last 2s last 10s last 40s cumulative -------------------------------------------------------------------------------------------- 1 192.168.178.24 => 0b 16.2Kb 13.5Kb 20.2KB 192.168.178.50 <= 0b 9.54Kb 7.95Kb 11.9KB 2 192.168.178.255 => 0b 0b 0b 0B 192.168.178.50 <= 660b 132b 110b 165B -------------------------------------------------------------------------------------------- Total send rate: 0b 16.2Kb 13.5Kb Total receive rate: 660b 9.67Kb 8.06Kb Total send and receive rate: 660b 25.8Kb 21.5Kb -------------------------------------------------------------------------------------------- Peak rate (sent/received/total): 29.5Kb 18.7Kb 41.3Kb Cumulative (sent/received/total): 20.2KB 12.1KB 32.3KB ============================================================================================
iptraf-ng: Permite escuchar en todas las interfaces y tiene una salida más detallada que iftop. Si eliminamos el parámetro “-B” se permite utilizar de manera interactiva sin dejar de registrar en el fichero indicado. Por supuesto para cronjobs la opción -B es la idónea.
# Duración de 1 minuto. iptraf-ng -i all -t1 -B -L fichero.log Sat Apr 13 22:35:42 2019; ******** IP traffic monitor started ******** Sat Apr 13 22:35:49 2019; TCP; eth1; 60 bytes; from 192.168.178.50:60586 to 192.168.178.24:8000; first packet (SYN) Sat Apr 13 22:35:49 2019; TCP; eth1; 60 bytes; from 192.168.178.24:8000 to 192.168.178.50:60586; first packet (SYN) Sat Apr 13 22:35:49 2019; TCP; eth1; 52 bytes; from 192.168.178.24:8000 to 192.168.178.50:60586; FIN sent; 5 packets, 1048 bytes, avg flow rate 8.38 kbps Sat Apr 13 22:35:49 2019; TCP; eth1; 52 bytes; from 192.168.178.50:60586 to 192.168.178.24:8000; FIN acknowleged Sat Apr 13 22:35:49 2019; TCP; eth1; 52 bytes; from 192.168.178.50:60586 to 192.168.178.24:8000; FIN sent; 6 packets, 403 bytes, avg flow rate 3.22 kbps Sat Apr 13 22:35:49 2019; TCP; eth0; 68 bytes; from 10.0.2.15:22 to 10.0.2.2:34324; first packet Sat Apr 13 22:35:49 2019; TCP; eth0; 40 bytes; from 10.0.2.2:34324 to 10.0.2.15:22; first packet ...
tshark : El modo texto de wireshark puede indicarnos qué IPs fueron conectadas, se podría incluso filtrar por puerto,protocolo, etc. (Leer)
tshark -qz endpoints,ip -a duration:10 # tshark -r test.pcap -qz endpoints,ip # Obtener las IPs de una captura pcap. ================================================================================ IPv4 Endpoints Filter:<No Filter> | Packets | | Bytes | | Tx Packets | | Tx Bytes | | Rx Packets | | Rx Bytes | 224.0.0.252 20 1464 0 0 20 1464 10.0.204.94 19 2028 19 2028 0 0 224.0.0.251 17 1873 0 0 17 1873 239.255.255.250 16 3154 0 0 16 3154 10.6.124.255 11 1056 0 0 11 1056 ...