Em alguns cenários, o uso do comando
ping para analisar a
conexão entre dois hosts não é o bastante. Um administrador
poderá desejar simular o tráfego de dados reais através de
uma rede.
Uma das importantes ferramentas que poderá ser utilizada é o
comando nc (também conhecido como netcat). Funcionando de
forma semelhante ao comando telnet (mas minimizando erros
de interpretação que eram comuns neste), o nc pode ser
utilizado para realizar conexões em portas abertas em hosts
remotos (ou até mesmo na máquina local).
Por exemplo, o comando pode ser usado para criar uma
conexão em uma dada porta em um host local. A seguir,
criaremos uma conexão na porta 80 (serviço HTTP) do host B
(cujo IP é 192.168.0.32):
[root@curso6:~]# nc –l 80
Detalhes sobre esta conexão poderão ser vistos a partir do
comando lsof, utilizado para exibir arquivos que encontram-se
abertos no sistema, como sockets rede, arquivos comuns,
diretórios, bibliotecas etc:
[root@curso6:~]# lsof –i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE
NAME
nc 3362 root 3u IPv4 40963 0t0 TCP *:http (LISTEN)
Agora, a partir do host A, podemos também usar o
comando nc para testar a conectividade com a porta 80
oferecida por B:
[root@curso6:~]# nc 192.168.0.32 80
Como a conexão foi realizada com sucesso, ela representa um
arquivo aberto no host B. Dessa maneira, seus detalhes
poderão ser visualizados através do uso do comando lsof:
[root@curso6:~]# lsof –i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE
NAME
nc 2990 root 3u IPv4 38944 0t0 TCP *:http (LISTEN)
nc 2990 root 4u IPv4 38945 0t0 TCP
192.168.0.32:http->192.168.0.90:40396 (ESTABLISHED)
Qualquer coisa digitada no host A irá ser exibida no shell
dedicado à criação da conexão no host B.
Outro exemplo de uso do comando nc é a verificação da
disponibilidade de conexão em uma faixa de portas. No
exemplo a seguir, utilizando o host A, vamos fechar a conexão
(Ctrl + c) e em seguida, rodar o comando nc para identificar
portas que encontram-se disponíveis no host B no range entre
80 a 90:
[root@curso6:~]# nc –vz 192.168.32 80-90
Connection to 192.168.0.90 80 port [tcp/http] succeeded!
nc: connect to 192.168.0.90 port 81 (tcp) failed: Connection
refused
nc: connect to 192.168.0.90 port 82 (tcp) failed: Connection
refused
nc: connect to 192.168.0.90 port 83 (tcp) failed: Connection
refused
nc: connect to 192.168.0.90 port 84 (tcp) failed: Connection
refused
nc: connect to 192.168.0.90 port 85 (tcp) failed: Connection
refused
nc: connect to 192.168.0.90 port 86 (tcp) failed: Connection
refused
nc: connect to 192.168.0.90 port 87 (tcp) failed: Connection
refused
nc: connect to 192.168.0.90 port 88 (tcp) failed: Connection
refused
nc: connect to 192.168.0.90 port 89 (tcp) failed: Connection
refused
nc: connect to 192.168.0.90 port 90 (tcp) failed: Connection
refused
Outro comando muito útil que surge neste sentido é o netstat,
responsável por (dentre outras coisas) exibir as conexões de
rede que foram estabelecidas. Para visualizarmos as
conexões TCP que foram estabelecidas, utilizamos a opção –t:
[root@curso6:~]# netstat –t
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign
Address State
tcp 0 0 192.168.0.32:www-http 192.168.0.90:40402
ESTABLISHED
Para exibir todas (-a) as conexões TCP (-t) em modo "LISTEN"
ou aquelas "ESTABLISHED", não havendo o processo de
resolução de nomes (-n) lançamos o comando da seguinte
forma:
[root@curso6:~]# netstat -ta
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign
Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:*
LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 192.168.0.32:80 192.168.0.90:40402
ESTABLISHED
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:631 :::* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN
O comando netstat consegue ainda exibir outras diversas
informações importantes para o diagnóstico e aplicação de
soluções em problemas relacionados a rede. Apesar de já ter
sido praticamente substituído por outros comandos, como
o ss por exemplo, ele ainda costuma ser bastante utilizado.
Ao ser executado sem quaisquer opções, o
comando netstat exibe uma lista completa de todos os
sockets/conexões atualmente abertos/ativos. Observe um
exemplo parcial e adaptado:
[root@curso6:~]# netstat | less
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign
Address State
tcp 0 0 192.168.0.32:www-http 192.168.0.90:40402
ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 27674 /run/user/1000/
unix 2 [ ] DGRAM 19235 /var/run/chrony/
unix 2 [ ] DGRAM 25281
/run/user/463/systemd/
unix 2 [ ] DGRAM 13513
/run/systemd/journal/
unix 3 [ ] DGRAM 10468
/run/systemd/notify
Se a intenção também for visualizar aqueles sockets que
estejam em modo "LISTEN", basta utilizar a opção –a (ou --all).
Se o administrador desejar visualizar os PIDs e nomes dos
programas relacionados a cada um desses sockets, a opção –
p (ou --program) também poderá ser usada.
No dia a dia, o processo de pesquisa por sockets se dá de
maneira mais refinada. No exemplo a seguir, vamos exibir os
sockets TCP (-t) e UDP (-u) que estejam em modo "LISTEN" (-
l), não realizando o processo de resolução de nomes (-n):
[root@curso6:~]# netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign
Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:*
LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:631 :::* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN
udp 0 0 0.0.0.0:5353 0.0.0.0:*
udp 0 0 127.0.0.1:323 0.0.0.0:*
udp 0 0 0.0.0.0:43626 0.0.0.0:*
udp6 0 0 :::177 :::*
udp6 0 0 :::5353 :::*
udp6 0 0 ::1:323 :::*
udp6 0 0 :::60224 :::*
O comando netstat também poderá ser usado para exibir a
tabela de roteamento IP do kernel, bastando para isto utilizar a
opção –r (ou --route).
[root@curso6:~]# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS
Window irtt Iface
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0
eth0
As estatísticas relacionadas às interfaces também poderão ser
exibidas através do uso dos comandos ip, ifconfig e netstat.
Acompanhe:
[root@curso6:~]# netstat –i
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK
TX-ERR TX-DRP TX-OVR Flg
eth0 1500 545 0 0 0 418 0 0 0
BMRU
lo 65536 148 0 0 0 148 0 0 0 LRU
[root@curso6:~]# ifconfig
eth0: flags=4163 mtu 1500
inet 192.168.0.32 netmask 255.255.255.0 broadcast
192.168.0.255
inet6 fe80::a00:27ff:fe5a:4e7a prefixlen 64 scopeid 0x20
ether 08:00:27:5a:4e:7a txqueuelen 1000 (Ethernet)
RX packets 545 bytes 54032 (52.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 418 bytes 34090 (33.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1000 (Local Loopback)
RX packets 148 bytes 12392 (12.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 148 bytes 12392 (12.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@curso6:~]# ip –s link
1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode
DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
RX: bytes packets errors dropped overrun mcast
12392 148 0 0 0 0
TX: bytes packets errors dropped carrier collsns
12392 148 0 0 0 0
2: eth0: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT
group default qlen 1000
link/ether 08:00:27:5a:4e:7a brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
54032 545 0 0 0 168
TX: bytes packets errors dropped carrier collsns
34090 418 0 0 0 0
Já o comando ss, outro importante utilitário para investigação
de sockets e atuante como substituto ao netstat, ao ser
utilizado sem quaisquer opções, é exibida uma lista de sockets
em estado "não-LISTEN" e que possuam conexões
estabelecidas. Observe um exemplo parcial:
[root@curso6:~]# ss
Netid State Recv-Q Send-Q Local Address:Port Peer
Address:Port
u_str ESTAB 0 0 * 29070 *
29071
u_str ESTAB 0 0 * 26747 * 26748
u_str ESTAB 0 0 * 30982 *
30983
u_str ESTAB 0 0 * 26274 *
26275
u_str ESTAB 0 0 * 25983 *
25984
u_str ESTAB 0 0 * 31011 *
31012
u_str ESTAB 0 0 * 25771 * 25772
Seguindo a mesma lógica que vimos no netstat, se utilizarmos
o comando ss junto às opções "lunt", serão exibidos os
sockets TCP e UDP em modo LISTEN (além de não haver o
processo de resolução de nomes). Além disso, também é
possível acrescentar a opção –p (ou --process) para visualizar
os PIDs dos processos relacionados a cada socket.