Conceitos
Hoje em dia, é comum trabalharmos com vários aplicativos diferentes abertos ao mesmo tempo, como por exemplo um navegador com
várias abas, um cliente de mensagem instantânea, um cliente de e-mail, um player de MP3, etc. Todos eles recebendo e enviando dados
ao mesmo tempo.
Mas você já parou para pensar, em como o computador sabe para qual programa enviar um dados, quando este chega na interface de
rede? Como ele sabe que um determinado pacote é para a primeira aba do navegador e não para o cliente de e-mail?
Quando uma aplicação de rede é iniciada, ela abre uma porta com um numeração única. Cada aplicação fica associada a uma porta. As
aplicações cliente abrem uma porta aleatória que varia de 1024 até 65535. Aplicações servidoras possuem portas padrão.
Por exemplo, um Servidor Web vai abrir a porta 80 e ficar aguardando conexões. Se você quiser acessar a página do Viva o
Linux, o seu navegador abrirá uma porta alta aleatória e tentará a conexão na porta 80 do Servidor que hospeda o site.
Na figura abaixo, isto está exemplificado melhor.
Resumidamente, o IP identifica a máquina na Internet, o MAC address identifica a máquina dentro do segmento de rede, e a porta
identifica a aplicação.
O arquivo “/etc/services”, contém uma lista das principais portas usadas por padrão. Abaixo um trecho do arquivo.
#/etc/services
ftp 21/tcp
ssh 22/tcp # SSH Remote Login Protocol
smtp 25/tcp
tacacs 49/tcp # Login Host Protocol (TACACS)
domain 53/tcp # name-domain server
bootps 67/tcp # BOOTP server
bootpc 68/tcp # BOOTP client
www 80/tcp http # WorldWideWeb HTTP
kerberos 88/tcp kerberos5 krb5 kerberos-sec # Kerberos v5
kerberos 88/udp kerberos5 krb5 kerberos-sec # Kerberos v5
pop3 110/tcp pop-3 # POP version 3
nntp 119/tcp readnews untp # USENET News Transfer Protocol
ntp 123/udp # Network Time Protocol
netbios-ssn 139/tcp # NETBIOS session service
imap2 143/tcp imap # Interim Mail Access P 2 and 4
snmp 161/tcp # Simple Net Mgmt Protocol
snmp 161/udp # Simple Net Mgmt Protocol
snmp-trap 162/tcp snmptrap # Traps for SNMP
snmp-trap 162/udp snmptrap # Traps for SNMP
Há vários tipos de portas. As principais são
TCP,
UDP e
ICMP.
- Portas ICMP:
São usadas para controle de tráfego. Não se transfere dados 'úteis' por ele, apenas dados relacionados a conexão, ao link,
ao tempo de resposta, etc.
Um exemplo típico de ICMP, é o famoso comando Ping. O Ping envia uma requisição ao destino e gera estatísticas, com o tempo da
resposta.
Outro comando típico é o Tracert, que nada mais é do que um Ping com 'ttl 1', depois outro Ping com 'ttl 2', assim por diante, até que o
alvo seja atingido, ou algum erro for encontrado.
O resultado é uma relação dos saltos (roteadores) usados para se alcançar o alvo, com seus respectivos tempos de resposta.
- Portas TCP:
São usadas para transferência de dados que requerem integridade. Em uma comunicação TCP, as partes estabelecem uma
conexão que fica aberta enquanto os dados são trafegados.
Para cada sequência de dados enviada, espera-se como resposta uma confirmação do recebimento. Por isso, dizemos que o TCP possui
qualidade na comunicação.
- Porta UDP:
É usada para conexões onde a integridade não é necessária, ou quando o dado trafegado é muito pequeno.
Por exemplo, em uma Vídeo-Conferência ou Stream de áudio, se um pacote de dados se perder durante a comunicação, isto não afetará
o entendimento.
Uma requisição DNS também é feita por UDP, pois seus pacotes são muito pequenos. Por isso, o UDP é mais rápido que o TCP, mas não
pode ser usado onde a integridade é essencial, como numa transferência bancária, ou mesmo no envio de um e-mail.
Entendidos esses pormenores, vamos fazer algo prático.
Pesquisando Portas Locais
Para ver quais portas estão abertas em sua máquina, use o
Netstat.
No exemplo abaixo, estou mostrando apenas as portas TCP e UDP.
Cada linha é uma conexão aberta em sua máquina. As colunas mais importantes aqui, são Endereço Local, Endereço Remoto e Estado.
Os endereços contém o nome do Host e o nome da porta separados por ':'. O nome do Host é resolvido via DNS, e o da porta é retirado
do “/etc/services”. Para evitar a resolução de nomes, melhorando o desempenho do Netstat, execute-o com a opção: -n
A última coluna contém o estado da conexão. Abaixo descrevo os estados possíveis. Dependendo da língua padrão do seu sistema, a
última coluna pode mudar um pouco.
- ESTABELECIDO: A conexão está estabelecida.
- SYN_SENT: O Socket está tentando estabelecer uma conexão. Indica que a estação tentou estabelecer uma conexão enviando um pacote
SYN, mas ainda não recebeu a resposta SYN ACC. Isso pode ocorrer quando há algum problema para se conectar, como um firewall
bloqueando a conexão, ou quando a conexão está lenta.
- SYN_RECV: Uma requisição de conexão foi recebida da rede.
- FIN_WAIT1: O Socket está fechado e a conexão está terminando.
- FIN_WAIT2: A conexão está fechada e o Socket está esperando por uma terminação pela máquina remota.
- TIME_WAIT: A conexão está aberta, mas não há dados trafegando neste momento. Após um período de inatividade, a conexão será
fechada.
- FECHADO: A conexão está fechada.
- CLOSE_WAIT: O lado remoto terminou, esperando pelo fechamento do Socket.
- ÚLTIMO_ACK: O lado remoto terminou, e o Socket está fechado. Esperando por uma confirmação.
- OUVINDO: O Socket está aguardando conexões, ou seja, tem uma aplicação servidor rodando em sua máquina.
- FECHANDO: Ambos os Sockets estão terminados, mas nós ainda não enviamos todos os nossos dados.
- DESCONHECIDO: O estado do Socket é desconhecido.
É possível descobrir qual o programa que está usando a porta em questão através do 'lsof'.
# netstat -na | grep :4200
tcp 0 0 0.0.0.0:4200 0.0.0.0:* OUÇA
# lsof -i TCP:4200
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
shellinab
1423 shellinabox 4u IPv4 5541 0t0 TCP *:4200
(LISTEN)
Podemos perceber com isso, que o programa 'shell in a box', está usando a porta 4200 e está aguardando por conexões.
Outro exemplo:
# netstat -na | grep :37319
tcp 0 0
172.20.16.60:37319 74.125.65.125:5222 ESTABELECIDA
# lsof -i TCP:37319
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
pidgin 7188 ricardo 15u IPv4 172198 0t0 TCP
compaq:37319->gx-in-
f125.1e100.net:xmpp-client (ESTABLISHED)
Neste exemplo, o Pidgin abriu a porta 37319 na minha estação de trabalho, e se conectou na porta 5222 do servidor 74.125.65.125.