Utilidades para comprobar sockets en Linux

por | octubre 17, 2018

Existen multitud de utilidades aunque yo suelo utilizar netstat, ss, lsof y nc. Aparte de estas tenemos también información muy útil en el sistema de ficheros virtual /proc

La primera de ellas es un clásico, aunque en cualquier distro medianamente actual podemos ver que está marcada como obsoleta (deprecated) y nos ofrecen una serie de utilidades alternativas que sustituyen su funcionalidad.

Suelo utilizar la combinación de opciones netaup:

  • -n mara no hacer resolución de nombre
  • -e me ofrece información adicional (usuario e inodo)
  • -t conexiones TCP
  • -a mostrar todas las conexiones (escucha, time_wait, establecidas, etc…)
  • -u conexiones UDP
  • -p para ver el PID del proceso que abre el socket

Ejemplo:

[root@jota-pc ~]# netstat -netaup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name    
tcp        0      0 192.168.1.2:9200        0.0.0.0:*               LISTEN      130        27953      1247/java           
tcp        0      0 127.0.0.1:80            0.0.0.0:*               LISTEN      0          25063      1394/apache2        
tcp        0      0 192.168.1.2:8083        0.0.0.0:*               LISTEN      124        20368      1237/influxd        
tcp        0      0 127.0.0.1:27060         0.0.0.0:*               LISTEN      1000       273585     20571/steam         
tcp        0      0 0.0.0.0:5044            0.0.0.0:*               LISTEN      999        28134      761/java            
tcp        0      0 192.168.1.2:9300        0.0.0.0:*               LISTEN      130        29948      1247/java           
tcp        0      0 192.168.1.2:8086        0.0.0.0:*               LISTEN      124        20369      1237/influxd        
tcp        0      0 127.0.0.1:3000          0.0.0.0:*               LISTEN      127        23534      1249/grafana-server 
tcp        0      0 192.168.1.2:8088        0.0.0.0:*               LISTEN      124        23488      1237/influxd        
tcp        0      0 127.0.0.1:443           0.0.0.0:*               LISTEN      0          25065      1394/apache2        
tcp        0      0 0.0.0.0:27036           0.0.0.0:*               LISTEN      1000       276849     20571/steam         
tcp        0      0 127.0.0.1:40189         0.0.0.0:*               LISTEN      1000       593684     26503/cli           
tcp        0      0 127.0.0.1:57343         0.0.0.0:*               LISTEN      1000       270118     20571/steam         
tcp        0      0 192.168.1.2:9600        0.0.0.0:*               LISTEN      999        34855      761/java            
tcp        0      0 192.168.1.2:5601        0.0.0.0:*               LISTEN      131        27057      742/node            
tcp        0      0 192.168.1.2:9200        192.168.1.2:54056       ESTABLISHED 130        26425      1247/java           
tcp        0      0 127.0.0.1:80            127.0.0.1:34140         TIME_WAIT   0          0          -

Tal y como nos comentan en la página man de netstat, la utilidad ss viene a cumplir las mismas funciones a la hora de comprobar conexiones, sockets, etc… Por ejemplo para ver conexiones TCP:

[root@jota-pc ~]# ss -t
State      Recv-Q Send-Q Local Address:Port                 Peer Address:Port                
ESTAB      0      0      192.168.1.2:40020                192.168.1.102:https                
ESTAB      0      0      192.168.1.2:59222                192.168.1.102:https                
ESTAB      0      0      192.168.1.2:34120                192.168.1.102:https                
ESTAB      0      0      192.168.1.2:37358                192.168.1.102:https                
ESTAB      0      0      192.168.1.2:55940                192.168.1.105:https                
ESTAB      0      0      192.168.1.2:40518                192.168.1.105:https                
ESTAB      0      0      192.168.1.2:49294                192.168.1.105:https                
ESTAB      0      0      192.168.1.2:53468                192.168.1.105:https                
...     

De la misma manera que nestat, si queremos ver todos los sockets, incluso los que están en escucha, tendremos que incluir la opción -a:

[root@jota-pc ~]# ss -ta | head
State      Recv-Q Send-Q Local Address:Port                 Peer Address:Port                
LISTEN     0      128    192.168.1.2:9200                     *:*                    
LISTEN     0      128    127.0.0.1:http                     *:*                    
LISTEN     0      128    192.168.1.2:8083                     *:*                    
LISTEN     0      128    127.0.0.1:27060                    *:*                    
LISTEN     0      128        *:5044                     *:*                    
LISTEN     0      128    192.168.1.2:9300                     *:*                    
LISTEN     0      128    192.168.1.2:8086                     *:*                    
LISTEN     0      128    127.0.0.1:3000                     *:*                    
LISTEN     0      128    192.168.1.2:omniorb                  *:*
...        

Para ver los sockets UNIX:

[root@jota-pc ~]# ss -x | head
Netid  State      Recv-Q Send-Q Local Address:Port                 Peer Address:Port                
u_seq  ESTAB      0      0      @00009 276563                * 276564               
u_str  ESTAB      0      0       * 252171                * 254233               
u_str  ESTAB      0      0       * 94279                 * 94280                
u_str  ESTAB      0      0       * 48215                 * 48214                
u_str  ESTAB      0      0       * 31927                 * 26220                
u_str  ESTAB      0      0      /run/systemd/journal/stdout 29788                 * 29787                
u_str  ESTAB      0      0       * 273629                * 273628               
u_str  ESTAB      0      0      /var/run/dbus/system_bus_socket 88664                 * 88663                
u_str  ESTAB      0      0      /run/user/1000/bus 273580                * 271197    
...

La tercera herramienta es lsof, cuyas opciones se parecen mucho a las de las herramientas anteriores:

[root@jota-pc ~]# lsof -i 4
COMMAND     PID          USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node        742        kibana   10u  IPv4  29375      0t0  TCP jota-pc:54054->jota-pc:9200 (ESTABLISHED)
node        742        kibana   11u  IPv4  27057      0t0  TCP jota-pc:5601 (LISTEN)
node        742        kibana   12u  IPv4  29400      0t0  TCP jota-pc:54056->jota-pc:9200 (ESTABLISHED)
node        742        kibana   13u  IPv4 238922      0t0  TCP jota-pc:57660->jota-pc:9200 (ESTABLISHED)
node        742        kibana   14u  IPv4  29409      0t0  TCP jota-pc:54064->jota-pc:9200 (ESTABLISHED)
node        742        kibana   15u  IPv4  26563      0t0  TCP jota-pc:54072->jota-pc:9200 (ESTABLISHED)
node        742        kibana   16u  IPv4  26564      0t0  TCP jota-pc:54074->jota-pc:9200 (ESTABLISHED)
node        742        kibana   17u  IPv4  29490      0t0  TCP jota-pc:54076->jota-pc:9200 (ESTABLISHED)
node        742        kibana   18u  IPv4  37932      0t0  TCP jota-pc:54100->jota-pc:9200 (ESTABLISHED)
java        761      logstash   64u  IPv4  28111      0t0  TCP jota-pc:54082->jota-pc:9200 (ESTABLISHED)
java        761      logstash  138u  IPv4  28134      0t0  TCP *:5044 (LISTEN)
java        761      logstash  141u  IPv4  34855      0t0  TCP jota-pc:9600 (LISTEN)
influxd    1237      influxdb    3u  IPv4  23488      0t0  TCP jota-pc:omniorb (LISTEN)
influxd    1237      influxdb   16u  IPv4  20368      0t0  TCP jota-pc:8083 (LISTEN)
influxd    1237      influxdb   23u  IPv4  20369      0t0  TCP jota-pc:8086 (LISTEN)
influxd    1237      influxdb   30u  IPv4  27731      0t0  UDP jota-pc:25826
... 

Sockets de un determinado proceso con la opción -p PID

[root@jota-pc ~]# lsof -p 761
COMMAND PID     USER   FD      TYPE             DEVICE SIZE/OFF     NODE NAME
java    761 logstash  cwd       DIR                8,2     4096        2 /
java    761 logstash  rtd       DIR                8,2     4096        2 /
java    761 logstash  txt       REG                8,2     6456 10092893 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
java    761 logstash  DEL       REG                8,2           7340180 /tmp/libnetty_tcnative_linux_x86_644223929712074830072.so
java    761 logstash  mem       REG                8,2   186528 10095618 /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/libsunec.so
java    761 logstash  mem       REG                8,2    39256  6425865 /lib/x86_64-linux-gnu/libcrypt-2.24.so
java    761 logstash  DEL       REG                8,2           7340044 /tmp/jffi4474550211659101291.so
...

Sockets abiertos por un determinado usuario:

[root@jota-pc ~]# lsof -u jota | head
COMMAND     PID USER   FD      TYPE             DEVICE   SIZE/OFF       NODE NAME
systemd    2018 jota  cwd       DIR                8,2       4096          2 /
systemd    2018 jota  rtd       DIR                8,2       4096          2 /
systemd    2018 jota  txt       REG                8,2    1120968    6428072 /lib/systemd/systemd
systemd    2018 jota  mem       REG                8,2      47632    6425873 /lib/x86_64-linux-gnu/libnss_files-2.24.so
systemd    2018 jota  mem       REG                8,2      47688    6425875 /lib/x86_64-linux-gnu/libnss_nis-2.24.so
systemd    2018 jota  mem       REG                8,2      89064    6425870 /lib/x86_64-linux-gnu/libnsl-2.24.so
systemd    2018 jota  mem       REG                8,2      31616    6425871 /lib/x86_64-linux-gnu/libnss_compat-2.24.so
systemd    2018 jota  mem       REG                8,2      19008    6422645 /lib/x86_64-linux-gnu/libuuid.so.1.3.0
systemd    2018 jota  mem       REG                8,2      18832    6422646 /lib/x86_64-linux-gnu/libattr.so.1.1.0
...

Por otro lado para comprobar que puedes abrir un socket con una máquina remota telnet o nc (netcat) son herramientas útiles:

telnet [IP | hostname ] puerto
nc -v [IP | hostname] servidor puerto

Ejemplo:

[root@jota-pc ~]# nc -v 192.168.2.105 80
Connection to 192.168.2.105 80 port [tcp/http] succeeded!

Por su parte nc tiene más funciones de las que podemos hacer uso como vimos hace tiempo.

Por último /proc/net nos ofrece información interesante de red. Por ejemplo podemos comprobar los sockets unix haciendo un cat /proc/net/unix

[root@jota-pc net]# cat unix 
Num       RefCount Protocol Flags    Type St Inode Path
ffff93319771b000: 00000002 00000000 00010000 0001 01 21209 /var/lib/samba/winbindd_privileged/pipe
ffff9331238fe000: 00000002 00000000 00010000 0001 01 26378 /run/user/1000/keyring/pkcs11
ffff933129244c00: 00000002 00000000 00000000 0002 01 19211 /run/user/1000/systemd/notify
ffff9331998eec00: 00000002 00000000 00010000 0001 01 21943 @/tmp/dbus-Iuf9tFsT
ffff933114be7400: 00000002 00000000 00010000 0001 01 26382 /run/user/1000/keyring/ssh
ffff9331252bf400: 00000002 00000000 00010000 0001 01 19215 /run/user/1000/systemd/private
ffff933199027c00: 00000002 00000000 00010000 0001 01 21439 /tmp/.X11-unix/X0
ffff933198e8c000: 00000002 00000000 00010000 0001 01 18706 /var/run/mcelog-client
ffff933125a95800: 00000002 00000000 00010000 0001 01 22071 /tmp/.ICE-unix/1424
ffff93313eb45800: 00000002 00000000 00010000 0001 01 19220 /run/user/1000/bus
ffff93319a096400: 00000002 00000000 00010000 0001 01 19222 /run/user/1000/gnupg/S.gpg-agent
ffff9330e8061800: 00000002 00000000 00010000 0001 01 315965 /tmp/.vbox-jota-ipc/ipcd
ffff93319a35e000: 00000002 00000000 00010000 0001 01 19225 /run/user/1000/gnupg/S.dirmngr
ffff93318cc8e400: 00000002 00000000 00010000 0001 01 20940 @/tmp/dbus-vbiIPTj9
ffff93319a35e400: 00000002 00000000 00010000 0001 01 19227 /run/user/1000/gnupg/S.gpg-agent.ssh
ffff9331239fa000: 00000002 00000000 00010000 0001 01 19229 /run/user/1000/gnupg/S.gpg-agent.browser
ffff933114a48c00: 00000002 00000000 00010000 0001 01 24085 @/tmp/.ICE-unix/1901
ffff933125a95000: 00000002 00000000 00010000 0001 01 22070 @/tmp/.ICE-unix/1424
ffff933123ffe000: 00000002 00000000 00010000 0001 01 19231 /run/user/1000/gnupg/S.gpg-agent.extra
ffff9331255a1c00: 00000002 00000000 00010000 0001 01 28703 @/tmp/dbus-xgNKc7a8
ffff93319b380400: 00000002 00000000 00010000 0001 01 21438 @/tmp/.X11-unix/X0
ffff933139158400: 00000002 00000000 00010000 0001 01 28714 @/tmp/.X11-unix/X1
ffff93319bdd9c00: 00000002 00000000 00010000 0001 01 21941 @/tmp/dbus-pPDHplKH
ffff933125cd3400: 00000002 00000000 00010000 0001 01 28715 /tmp/.X11-unix/X1
ffff9331293b4400: 00000002 00000000 00010000 0001 01 19265 /tmp/ssh-y4ZlNA3yowSe/agent.1901
ffff93312500a800: 00000002 00000000 00010000 0001 01 24086 /tmp/.ICE-unix/1901
ffff93319a1f6000: 00000002 00000000 00010000 0001 01 21940 @/tmp/dbus-nn0Lwela
...

De la misma manera los sockets TCP en /proc/net/tcp o UDP en /proc/net/udp

[root@jota-pc ~]# cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
   0: 0201A8C0:23F0 00000000:0000 0A 00000000:00000000 00:00000000 00000000   130        0 28999 1 ffff89c1fb36e080 100 0 0 10 0                     
   1: 0100007F:0050 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 20290 1 ffff89c2cb6c8000 100 0 0 10 0                     
   2: 0201A8C0:1F93 00000000:0000 0A 00000000:00000000 00:00000000 00000000   124        0 28882 1 ffff89c2cb670080 100 0 0 10 0                     
   3: 00000000:13B4 00000000:0000 0A 00000000:00000000 00:00000000 00000000   999        0 24157 1 ffff89c1e1981800 100 0 0 10 0                     
   4: 0201A8C0:2454 00000000:0000 0A 00000000:00000000 00:00000000 00000000   130        0 31176 1 ffff89c2d936f080 100 0 0 10 0                     
   5: 0201A8C0:1F96 00000000:0000 0A 00000000:00000000 00:00000000 00000000   124        0 28883 1 ffff89c2cb670800 100 0 0 10 0                     
   6: 0100007F:0BB8 00000000:0000 0A 00000000:00000000 00:00000000 00000000   127        0 27113 1 ffff89c2d86a9780 100 0 0 10 0                     
   7: 0201A8C0:1F98 00000000:0000 0A 00000000:00000000 00:00000000 00000000   124        0 20283 1 ffff89c2cb6c8780 100 0 0 10 0                     
   8: 0100007F:01BB 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 20292 1 ffff89c2cb4e3040 100 0 0 10 0                     
   9: 0201A8C0:2580 00000000:0000 0A 00000000:00000000 00:00000000 00000000   999        0 30005 1 ffff89c184b197c0 100 0 0 10 0                     
  10: 0201A8C0:15E1 00000000:0000 0A 00000000:00000000 00:00000000 00000000   131        0 14331 1 ffff89c2d8784040 100 0 0 10 0            
...

Número de sockets por en /proc/net/protocols

[root@jota-pc net]# cat protocols 
protocol  size sockets  memory press maxhdr  slab module     cl co di ac io in de sh ss gs se re sp bi br ha uh gp em
PACKET    1344      0      -1   NI       0   no   kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n
PINGv6    1080      0      -1   NI       0   yes  kernel      y  y  y  n  n  y  n  n  y  y  y  y  n  y  y  y  y  y  n
RAWv6     1080      0      -1   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  y  y  y  y  n  n
UDPLITEv6 1088      0      -1   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  n  y  y  y  y  n
UDPv6     1088      0       2   NI       0   yes  kernel      y  y  y  n  y  n  y  n  y  y  y  y  n  n  y  y  y  y  n
TCPv6     2048      0       1   no     304   yes  kernel      y  y  y  y  y  y  y  y  y  y  y  y  y  n  y  y  y  y  y
UNIX      1024    619      -1   NI       0   yes  kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n
UDP-Lite   928      0      -1   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  y  n  y  y  y  y  n
PING       872      0      -1   NI       0   yes  kernel      y  y  y  n  n  y  n  n  y  y  y  y  n  y  y  y  y  y  n
RAW        880      1      -1   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  y  y  y  y  n  n
UDP        928      5       2   NI       0   yes  kernel      y  y  y  n  y  n  y  n  y  y  y  y  y  n  y  y  y  y  n
TCP       1888     13       1   no     304   yes  kernel      y  y  y  y  y  y  y  y  y  y  y  y  y  n  y  y  y  y  y
NETLINK   1032     52      -1   NI       0   no   kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n

Como vemos tenemos varias formas de comprobar conexiones. Dependiendo de las necesidades del momento yo utilizo unas u otras, aunque todas tienen funciones similares.