04 - Identificações de Processos
video: https://youtu.be/... no frontmatter da nota.Para que o transporte de dados seja útil, ele não pode apenas entregar o pacote na máquina de destino; ele deve entregar o dado ao processo de software correto (ex: o Chrome, o Outlook ou o servidor Web). Essa identificação é feita através do conceito de Portas e Sockets.
1. O Conceito de Porta (Port)
Uma porta é um endereço lógico de 16 bits (0 a 65.535) que serve como "caixa postal" para uma aplicação específica.
- Portas de Origem: Escolhidas aleatoriamente pelo cliente para cada nova conexão.
- Portas de Destino: Padronizadas para serviços conhecidos (ex: 80 para HTTP, 443 para HTTPS).
Modelo de Portas x Processos
Em sistemas operacionais modernos, o conceito de "porta aberta" é uma abstração: quando um processo cria um socket de escuta, o kernel registra no socket table que segmentos chegando na porta X devem ser entregues àquele processo. Não há "fio físico" na porta — é apenas uma entrada em uma tabela hash do kernel.
2. O Conceito de Socket
Um Socket é a combinação única de um Endereço IP e um Número de Porta.
- Ele identifica de forma absoluta um ponto final de uma conexão na rede.
- Exemplo: 192.168.1.50:443 identifica o processo HTTPS rodando no servidor 50.
API de Sockets (POSIX)
// Servidor TCP escutando na porta 8080
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr = {
.sin_family = AF_INET,
.sin_port = htons(8080),
.sin_addr.s_addr = INADDR_ANY
};
bind(sock, (struct sockaddr*)&addr, sizeof(addr));
listen(sock, 5); // backlog de 5 conexões pendentes
int client = accept(sock, NULL, NULL);
O socket() cria o descritor, o bind() associa IP:Porta, o listen() marca como passivo e o accept() bloqueia até chegar um SYN.
Socket Pair e Quíntupla
Em TCP, uma conexão é completamente identificada por um Socket Pair (dois sockets, um de cada lado). Para fins de gerenciamento, é mais comum falar em 5-tuple:
3. Identificando uma Conexão Completa
Para que o Sistema Operacional saiba exatamente para qual processo entregar cada segmento que chega da rede, ele usa uma Quíntupla (5-tuple) exclusiva para cada conexão:
1. IP de Origem.
2. Porta de Origem.
3. IP de Destino.
4. Porta de Destino.
5. Protocolo de Transporte (TCP ou UDP).
Conexão A: (192.168.1.10, 53142, 93.184.216.34, 443, TCP)
Conexão B: (192.168.1.10, 53143, 93.184.216.34, 443, TCP)
Duas conexões para o mesmo servidor na mesma porta são diferenciadas apenas pela porta de origem — um único servidor web pode atender milhares de clientes simultaneamente porque cada conexão tem uma 5-tuple única.
4. Categorias de Portas (IANA)
As portas são divididas em três grandes grupos, conforme padronizado pela IANA (Internet Assigned Numbers Authority):
| Faixa | Nome | Quantidade | Exemplos |
|---|---|---|---|
| 0-1023 | Well-Known (Sistema) | 1024 | 22 (SSH), 25 (SMTP), 53 (DNS), 80 (HTTP), 443 (HTTPS) |
| 1024-49151 | Registered (Usuário) | 48128 | 3306 (MySQL), 5432 (PostgreSQL), 6379 (Redis), 8080 (HTTP-alt) |
| 49152-65535 | Dynamic / Ephemeral | 16384 | Portas de origem escolhidas automaticamente por clientes |
Atribuição IANA
A IANA mantém um registry público (https://www.iana.org/assignments/service-names-port-numbers) que registra quem usa cada porta. O registro é advisory — nada impede que uma aplicação use a porta 8080 em vez da oficial 80, mas software de firewall, IDS e NMS podem usar esse banco para identificar serviços.
Porta 0
A porta 0 é reservada e não pode ser usada para bind(). Quando usada como porta de origem ao chamar bind(), o kernel escolhe automaticamente uma porta efêmera da faixa dinâmica.
5. Tabelas Internas do SO
Linux: /proc/net/tcp
cat /proc/net/tcp
# sl local_address rem_address st ...
# 0: 0100007F:0016 00000000:0000 0A (LISTEN, 127.0.0.1:22)
# 1: 0A0A0A0A:01BB 05060708:C8F4 01 (ESTABLISHED, 10.10.10.10:443 <-> 5.6.7.8:51444)
Os endereços estão em hex little-endian. O estado (st) segue os códigos do TCP (01=ESTABLISHED, 0A=LISTEN, 06=TIME_WAIT, etc.).
Comando ss
ss -tnp # TCP, numérico, com processos
ss -unlp # UDP, listening, com processos
O ss substituiu o antigo netstat por ser mais rápido (lê diretamente de /proc).
6. Reserva de Portas Efêmeras
Cada SO tem sua faixa para portas de origem:
| Sistema | Faixa Efêmera Padrão |
|---|---|
| Linux moderno | 32768-60999 (cat /proc/sys/net/ipv4/ip_local_port_range) |
| Windows 10/11 | 49152-65535 |
| FreeBSD / macOS | 49152-65535 |
| Linux antigo (kernel 2.x) | 1024-4999 |
Em Linux pode ser ajustado: echo "32768 60999" > /proc/sys/net/ipv4/ip_local_port_range. Servidores sob alta carga (proxies reversos, NAT) precisam ampliar essa faixa para evitar esgotamento.
7. Portas e NAT
Quando um pacote atravessa um NAT (residencial ou corporativo), o NAT reescreve o IP de origem e a porta de origem, mantendo uma tabela de tradução:
Tabela NAT:
Inside local Outside (Inside global)
192.168.1.10:53142 → 200.150.100.20:40001
192.168.1.11:53142 → 200.150.100.20:40002
Note que dois hosts internos podem usar a mesma porta de origem (53142) — o NAT os diferencia pela porta externa atribuída. Por isso o NAT com porte é chamado NAPT ou PAT.
8. Portas e Segurança
Port Scanning
Ferramentas como nmap sondam portas para mapear serviços expostos:
nmap -sS -p 1-65535 alvo.com # TCP SYN scan em todas as portas
nmap -sU --top-ports 100 alvo.com # UDP scan nas 100 portas mais comuns
nmap -sV -O alvo.com # Detecção de versão e SO
Técnicas de Varredura
| Técnica | Flag TCP | Detecção |
|---|---|---|
| TCP Connect | SYN+ACK completos | Logs no alvo |
| SYN scan (stealth) | SYN apenas | Silencioso |
| FIN/Xmas/Null | FIN/URG/PSH | Bypass de firewalls simples |
| UDP scan | Datagrama UDP vazio | Lento, gerar respostas ICMP |
Hardening
- Fechar portas desnecessárias (
systemctl disable <service>). - Usar firewall (
iptables,nftables,ufw,firewalld) para restringir acesso a portas internas. - Em servidores web: 80/443 abertos para qualquer IP, 22 apenas para rede administrativa (ou via VPN).
- Detectar port knocking em servidores de produção como defesa em profundidade.
Em termos de Cyber Segurança, o Port Scanning (mapeamento de portas abertas) é a primeira fase de um ataque. Descobrir qual porta está "escutando" revela quais serviços e versões de software estão rodando no servidor alvo. Por isso, ocultar a existência de portas (com firewall ou TCP wrappers) e manter serviços atualizados são controles defensivos fundamentais.