Categories
Tutoriais Ubuntu

Como ver informações da rede TCP/UDP e de sockets no Linux com ss

O comando ss é uma ferramenta nova e mais rápida para acompanhar as conexões TCP e soquetes de sistema. Por ser capaz de exibir mais informações e com mais agilidade, o ss está substituindo o netstat.
comando ss tutorial

netstat vs ss

Não vou me aprofundar muito nesta questão. Cada um usa o que quiser.
Contudo, há algumas diferenças que pesam a favor do uso do ss:

  • O comando netstat coleta informações para elaborar suas estatísticas a partir da leitura de vários arquivos /proc.
    Esta abordagem tem se mostrado frágil quando há uma grande quantidade de conexões a monitorar — neste ponto, o netstat começa a ficar muito mais lento.
  • O comando ss obtém suas informações direto do kernel space, o que lhe acrescenta mais velocidade de resposta e maior quantidade (e qualidade) de infomações.

O comando netstat não está mais presente nas instalações padrão do CentOS e Red Hat 7. Você continua podendo instalar, se quiser, dos repositórios.
No Ubuntu 14.04 LTS, o netstat ainda está presente na instalação padrão.

As opções de uso do ss são muito similares às do netstat —. O que torna a substituição muito mais fácil.
O utilitário ss pode prover informações sobre os seguintes itens:

  • Todos os TCP sockets.
  • Todos os UDP sockets.
  • Todas as conexões ssh/ftp/http/https estabelecidas.
  • Todos os process locais conectados ao servidor X.

Todas estas estatísticas podem ser providas e filtradas por seus estados (conectado, sincronizado, SYN-RECV, SYN-SENT, TIME-WAIT), por seus endereços e portas etc.
Vamos ver alguns dos usos mais comuns do comando. Abra um terminal e me acompanhe! 😉

Liste todas as conexões com o comando ss

A maneira mais simples de executar o comando, é sem qualquer opção.
Para poder examinar pausadamente, cada tela do resultado, acrescente o comando less:

ss | less

A saída vai ter todos os detalhes das conexões tcp, udp e sockets unix.

Netid  State      Recv-Q Send-Q   Local Address:Port       Peer Address:Port   
u_str  ESTAB      0      0                    * 17367                 * 19700  
u_str  ESTAB      0      0                    * 10072                 * 13617  
u_str  ESTAB      0      0                    * 18044                 * 16029  
u_str  ESTAB      0      0      @/tmp/.ICE-unix/2182 16727                 * 15846  
u_str  ESTAB      0      0                    * 12406                 * 12405  
u_str  ESTAB      1      0                    * 79183                 * 79184  
u_str  ESTAB      0      0                    * 16150                 * 15350  
u_str  ESTAB      0      0                    * 8004                  * 8005   
u_str  ESTAB      0      0      /var/run/dbus/system_bus_socket 16946                 * 18476  
:

Use a opção -s ou --summary para ver um resumo geral das estatísticas de conexão.

ss -s

Estas informações são úteis quando a quantidade de soquetes é tão grande que tentar obter a informação do arquivo /proc/net/tcp chega a ser doloroso.

Total: 553 (kernel 0)
TCP:   47 (estab 32, closed 4, orphaned 4, synrecv 0, timewait 3/0), ports 0

Transport Total     IP        IPv6
*	  0         -         -        
RAW	  0         0         0        
UDP	  13        10        3        
TCP	  43        40        3        
INET	  56        50        6        
FRAG	  0         0         0       

Como ver todas as portas de rede abertas

A opção -l exibe apenas as portas que estão em modo escuta (LISTENING) e que, normalmente, são omitidas.

ss -l
Netid  State      Recv-Q Send-Q   Local Address:Port       Peer Address:Port   
nl     UNCONN     0      0                 rtnl:NetworkManager/920                *       
nl     UNCONN     0      0                 rtnl:whoopsie/1162                *       
nl     UNCONN     0      0                 rtnl:dnsmasq/2659                *       
nl     UNCONN     0      0                   15:upowerd/1511                *       
nl     UNCONN     0      0                   15:gvfs-gphoto2-vo/2461                *       
nl     UNCONN     0      0                   15:-4132                  *       
nl     UNCONN     0      0                   15:-4128                  *      15218                 * 0      
tcp    LISTEN     0      50           127.0.0.1:mysql                 *:*       
tcp    LISTEN     0      5            127.0.1.1:domain                *:*       
tcp    LISTEN     0      128          127.0.0.1:ipp                   *:*       
tcp    LISTEN     0      128                 :::http                 :::*       
tcp    LISTEN     0      128                ::1:ipp                  :::*      

Use o comando grep para filtrar resultados específicos para você:

ss -pl | grep mysql
u_str  LISTEN     0      50     /var/run/mysqld/mysqld.sock 12880                 * 0      
tcp    LISTEN     0      50           127.0.0.1:mysql                 *:*       

Opções para exibir diversos soquetes com ss

As opções, que seguem, são muito comuns e podem ser combinadas. Experimente.
Como exibir todos os soquetes TCP:

ss -t -a

Como exibir todos os soquetes UDP:

ss -u -a

Como exibir todos os soquetes RAW:

ss -w -a

Como exibir todos os soquetes UNIX:

ss -x -a

A opção -t, isoladamente, só vai relacionar as conexões estabelecidas ou CONNECTED. Ela não relata as conexões em modo escuta ou LISTENING.

Como listar apenas as conexões LISTENING

O comando ss -ltn vai relacionar todos os soquetes em modo escuta.
Veja, no exemplo abaixo, o servidor web Apache usando um soquete na porta 80 para escutar as conexões que chegam:

ss -ltn

Como você pode acompanhar, abaixo, a opção -n esconde os nomes dos serviços. Experimente dar o mesmo comando, sem esta opção, para ver a diferença.

State      Recv-Q Send-Q        Local Address:Port          Peer Address:Port 
LISTEN     0      5                         *:9090                     *:*     
LISTEN     0      50                127.0.0.1:3306                     *:*     
LISTEN     0      5                 127.0.1.1:53                       *:*     
LISTEN     0      128               127.0.0.1:631                      *:*     
LISTEN     0      128                      :::80                      :::*     
LISTEN     0      128                     ::1:631                     :::*
captura de tela do comando ss exibindo as portas listening
Clique para ver detalhes.

Como exibir todas as conexões SMTP estabelecidas

ss -o state established '( dport = :smtp or sport = :smtp )'
exemplo de execução do comando ss
Clique para ampliar

Como listar todos os nomes de processos em LISTENING e seus respectivos PIDs

O comando abaixo mostra os nomes dos processos em modo escuta, ao lado de seus PIDs (Process IDentification):

sudo ss -ltp

Como você pode notar, este é um dos momentos em que invocar o comando ss com privilégios administrativos traz resultados mais relevantes.

[sudo] password for justincase: 
State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port   
LISTEN     0      5                       *:9090                     *:*        users:(("python2",2855,11))
LISTEN     0      50              127.0.0.1:mysql                    *:*        users:(("mysqld",1220,10))
LISTEN     0      5               127.0.1.1:domain                   *:*        users:(("dnsmasq",1909,5))
LISTEN     0      128             127.0.0.1:ipp                      *:*        users:(("cupsd",2152,11))
LISTEN     0      128                    :::http                    :::*        users:(("apache2",1388,4),("apache2",1387,4),("apache2",1386,4),("apache2",1385,4),("apache2",1384,4),("apache2",1375,4))
LISTEN     0      128                   ::1:ipp                     :::*        users:(("cupsd",2152,10))

Conexões HTTP estabelecidas com o ss

A linha de comando, abaixo, mostra as conexões HTTP estabelecidas:

ss -o state established '( dport = :http or sport = :http )'

A imagem, a seguir, mostra um exemplo do resultado do comando anterior.

conexões http
Clique para ampliar.

Como encontrar todos os processos locais conectados ao servidor X

Não são poucos os casos em que vi grande utilidade em exibir os processos conectados ao servidor X (X server). Veja a fórmula:

ss -x src /tmp/.X11-unix/*
como usar o ss para mostrar quem está conectado ao servidor X local
Clique para ampliar.

Como listar todos os soquetes TCP em estado de FIN-WAIT-1

Término da conexão — a fase de finalização de uma conexão usa um handshake (“aperto de mão” ou cumprimento) em 4 vias, em que cada parte conectada conclui independentemente.
Quando uma das pontas deseja terminar uma conexão, ela emite um pacote FIN a que a outra responde com um ACK.
Assim, uma típica finalização, requer um par de segmentos FIN e ACK de cada ponta TCP.
Assim que estas trocas se concluem, a parte que começou, espera um curto período antes de fechar a conexão — durante o qual ela se torna indisponível a se conectar novamente. Isto previne possíveis confusões causadas por pacotes chegando atrasados junto a novas conexões.

Para listar todos os soquetes em estado FIN-WAIT-1 em nossa rede, com seus respectivos timers, use o seguinte comando:

ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 192.168.254/24

Troque os últimos números da linha de comando acima pelos valores correspondentes à sua rede.

FIN-WAIT-1 — estado em que as duas pontas (servidor e cliente) estão esperando por uma requisição da finalização de uma conexão vinda do TCP remoto ou uma permissão para requerê-la.
FIN-WAIT-2 — representa o estado de espera pelo fim da conexão no TCP remoto.

Como exibir as conexões exclusivamente IPv4 OU IPv6

Para exibir apenas as conexões IPv4 socket, use -f inet ou -4:

ss -tl -f inet
State      Recv-Q Send-Q    Local Address:Port        Peer Address:Port   
LISTEN     0      100           127.0.0.1:smtp                   *:*       
LISTEN     0      128           127.0.0.1:9050                   *:*       
LISTEN     0      128                   *:90                     *:*       
LISTEN     0      128                   *:db-lsp                 *:*       
LISTEN     0      5             127.0.0.1:6600                   *:*

Para exibir exclusivamente as conexões IPv6, use -f inet6 ou -6:

ss -tl6
State      Recv-Q Send-Q    Local Address:Port        Peer Address:Port   
LISTEN     0      100                 ::1:smtp                  :::*       
LISTEN     0      128                  :::12865                 :::*       
LISTEN     0      128                  :::http                  :::*       
LISTEN     0      128                  :::ssh                   :::*       
LISTEN     0      128                 ::1:ipp                   :::*

Há mais para se falar e outras formas de usar o comando ss. Infelizmente, artigos na web não podem se estender muito.
Para quem deseja se aprofundar um pouco mais, há alguns links ao final deste texto.
Recomendo especialmente a Wikipedia, onde você pode encontrar muita informação sobre redes.
Se você for usuário avançado e acredita que pode acrescentar algo mais ao post e aos outros leitores, use a seção de comentários e receba o crédito por sua contribuição.
No mais, divirta-se nas redes!

Referências

By Elias Praciano

Autor de tecnologia (livre, de preferência), apaixonado por programação e astronomia.
Fã de séries, como "Rick and Morty" e "BoJack Horseman".
Me siga no Twitter e vamos trocar ideias!

One reply on “Como ver informações da rede TCP/UDP e de sockets no Linux com ss”

Oi gostaria de tirar uma duvida como sei qual a capacidade de tunnel ssh no servidor por exemplo quero saber se ele suporta 10 30 50 100 pessoas conectadas através do squid3 e ssh nesse caso tenho que saber quantos sockets tcp o servidor suporta?

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.