Dia 8: Redes Linux — ip, ss, nmcli e DNS
No Dia 8 do curso Linux em 30 Dias, deixamos para trás a gestão local de processos e pacotes e entramos no mundo das redes. Se o ifconfig ainda aparece em algum tutorial antigo, é altura de o esquecer — em 2026 o stack net-tools foi removido ou tornado opcional em praticamente todas as distribuições modernas. O substituto é o iproute2, que oferece o comando ip para configurar interfaces, endereços e rotas, e o ss para inspecionar sockets. Para configuração persistente, o cenário está dividido: Ubuntu usa netplan (YAML abstracto sobre NetworkManager ou systemd-networkd), enquanto RHEL/Rocky/Alma usa NetworkManager com nmcli (e manteve network-scripts como legado até RHEL 9). Este artigo cobre o workflow completo: inspeção, configuração temporária, configuração persistente, DNS e diagnóstico — com comandos testados em Ubuntu 24.04 e Rocky Linux 9.
ℹ Neste artigo
- O Stack de Redes Linux em 2026 — net-tools é História
- ip — Configuração de Interfaces, Endereços e Rotas
- ss — Inspeção de Sockets e Ligações
- nmcli — Gestão de Ligações em RHEL/Rocky e Ubuntu
- netplan vs network-scripts — Dois Mundos de Config Persistente
- DNS — resolv.conf, systemd-resolved e /etc/hosts
- Diagnóstico de Rede — ping, dig, traceroute e mtr
- Erros Comuns em Configuração de Redes Linux
- Checklist de Verificação de Rede
- Artigos Relacionados
O Stack de Redes Linux em 2026 — net-tools é História
O pacote net-tools (ifconfig, netstat, route, arp) foi descontinuado em 2009 e removido das instalações base de Ubuntu, Debian, Fedora, RHEL e Arch nos anos seguintes. O motivo técnico: o net-tools lê informação via /proc/net/ e ioctl, um mecanismo que não escala para múltiplas tabelas de routing, policy routing, túneis, ou namespaces. O iproute2 usa netlink — a API kernel-userspace nativa do Linux para networking — que suporta todas essas funcionalidades (Arch Wiki — Network configuration).
A tabela abaixo resume o mapeamento entre comandos antigos e modernos:
| net-tools (legado) | iproute2 (moderno) | Função |
|---|---|---|
ifconfig |
ip addr / ip link |
Ver e configurar interfaces e endereços IP |
route |
ip route |
Ver e manipular a tabela de routing |
arp |
ip neigh |
Cache ARP (vizinhos) |
netstat |
ss |
Listar sockets e ligações activas |
netstat -r |
ip route |
Tabela de routing |
ifconfig eth0 up |
ip link set eth0 up |
Activar interface |
⚠ Atenção: Se ifconfig ainda funciona no teu servidor, é porque o pacote net-tools foi instalado manualmente. Não contes com isso num sistema novo — em Ubuntu 24.04 e Rocky 9 não vem pré-instalado.
O pacote iproute2 vem pré-instalado em todas as distribuições Linux modernas. Para confirmar:
# Verificar versão do iproute2
ip -V
ip utility, iproute2-6.1.0
# Confirmar que o binário existe
which ip
/usr/sbin/ip
ip — Configuração de Interfaces, Endereços e Rotas
O comando ip é o canivete suíço da configuração de redes em Linux. A sua sintaxe segue o padrão ip OBJECT COMMAND onde OBJECT pode ser addr, link, route, neigh, rule, tunnel, entre outros. Documentação oficial em man ip(8).
Inspeção de interfaces e endereços
# Listar todas as interfaces e endereços IP
ip addr show
# Abreviação: ip a
# Listar apenas interfaces (sem endereços)
ip link show
# Abreviação: ip l
# Filtrar por interface específica
ip addr show dev eth0
# Ver apenas interfaces UP
ip -br link show
# Output compacto (address + state)
ip -br addr show
# lo UNKNOWN 127.0.0.1/8 ::1/128
# eth0 UP 192.168.1.50/24 metric 100
A flag -br (brief) é das mais úteis para diagnóstico rápido — mostra uma linha por interface com nome, estado e endereços.
Configuração temporária de endereços
As alterações feitas com ip são temporárias — perdem-se no reboot. Para configuração persistente, ver as secções netplan e nmcli mais abaixo.
# Adicionar endereço IPv4 a uma interface
sudo ip addr add 192.168.1.100/24 dev eth0
# Adicionar endereço IPv6
sudo ip addr add fd00::100/64 dev eth0
# Remover endereço específico
sudo ip addr del 192.168.1.100/24 dev eth0
# Activar / desactivar interface
sudo ip link set eth0 up
sudo ip link set eth0 down
# Alterar MTU
sudo ip link set eth0 mtu 1400
# Adicionar interface virtual (alias)
sudo ip addr add 192.168.1.101/24 dev eth0 label eth0:1
Gestão de rotas (routing table)
# Ver tabela de routing completa
ip route show
# default via 192.168.1.1 dev eth0 proto static metric 100
# 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.50
# Adicionar rota estática
sudo ip route add 10.0.0.0/24 via 192.168.1.254 dev eth0
# Adicionar default gateway
sudo ip route add default via 192.168.1.1
# Remover rota
sudo ip route del 10.0.0.0/24 via 192.168.1.254 dev eth0
# Ver rota para um destino específico
ip route get 8.8.8.8
# 8.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.50 uid 0
# cache
Cache ARP e vizinhos
# Ver cache ARP (vizinhos IPv4 e IPv6)
ip neigh show
# 192.168.1.1 dev eth0 lladdr aa:bb:cc:dd:ee:ff REACHABLE
# 192.168.1.254 dev eth0 lladdr 11:22:33:44:55:66 STALE
# Remover entrada específica (útil quando MAC mudou)
sudo ip neigh del 192.168.1.254 dev eth0
# Limpar toda a cache ARP
sudo ip neigh flush all
ss — Inspeção de Sockets e Ligações
O comando ss (socket statistics) substitui o netstat e é significativamente mais rápido em servidores com muitos sockets, porque lê directamente do kernel via /proc/net/sockstat e netlink, em vez de iterar /proc/net/tcp linha a linha. Documentação em man ss(8).
Comandos essenciais
# Todos os sockets TCP
ss -t
# Todos os sockets TCP em LISTEN
ss -tln
# Todos os sockets TCP estabelecidos (sem LISTEN)
ss -tn state established
# Sockets TCP + UDP
ss -tun
# Todos os sockets (TCP, UDP, raw, Unix domain)
ss -a
# Mostrar processos associados (requer root)
sudo ss -tlnp
# Mostrar apenas ligações a um porto específico
ss -tn dport = :443
# Filtro por estado
ss -tn state time-wait
ss -tn state close-wait
Interpretar o output de ss
$ sudo ss -tlnp
State Local Address:Port Peer Address:Port Process
LISTEN 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=890,fd=3))
LISTEN 127.0.0.1:5432 0.0.0.0:* users:(("postgres",pid=1234,fd=5))
LISTEN [::]:80 [::]:* users:(("nginx",pid=567,fd=7))
As flags mais usadas:
| Flag | Significado |
|---|---|
-t |
Sockets TCP |
-u |
Sockets UDP |
-l |
Apenas em estado LISTEN (listening) |
-n |
Não resolver nomes (mostra IPs e portos numéricos) |
-p |
Mostrar processo associado (requer root) |
-a |
Todos os estados (LISTEN + estabelecidos + outros) |
-m |
Mostrar memória usada por cada socket |
✓ Dica prática: ss -tlnp é o comando que mais usas para saber “que portos estão abertos e por que processo”. Corresponde ao antigo netstat -tlnp mas executa em milissegundos mesmo com milhares de sockets.
nmcli — Gestão de Ligações em RHEL/Rocky e Ubuntu
O NetworkManager é o daemon de gestão de redes padrão em RHEL, Rocky Linux, AlmaLinux, Fedora e — desde Ubuntu 22.04 — também em Ubuntu Server (embora o netplan seja a camada de configuração preferida em Ubuntu). O nmcli é a CLI do NetworkManager e permite configurar ligações de forma persistente sem editar ficheiros manualmente (Arch Wiki — NetworkManager).
ℹ Conceito-chave: NetworkManager distingue entre dispositivos (interfaces físicas/virtuais — nmcli device) e ligações (perfis de configuração que se aplicam a dispositivos — nmcli connection). Uma ligação define IP, gateway, DNS e pode ser activada/desactivada independentemente do hardware.
Inspeção
# Estado geral do NetworkManager
nmcli general status
# Listar dispositivos e estado
nmcli device status
# DEVICE TYPE STATE CONNECTION
# eth0 ethernet connected System eth0
# lo loopback unmanaged --
# Listar ligações (perfis)
nmcli connection show
# NAME UUID TYPE DEVICE
# System eth0 5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03 ethernet eth0
# Ver detalhes de uma ligação específica
nmcli connection show "System eth0"
Configurar IP estático com nmcli
# Criar nova ligação com IP estático
sudo nmcli connection add \
type ethernet \
con-name "static-eth0" \
ifname eth0 \
ipv4.method manual \
ipv4.addresses 192.168.1.100/24 \
ipv4.gateway 192.168.1.1 \
ipv4.dns "8.8.8.8 1.1.1.1"
# Modificar ligação existente
sudo nmcli connection modify "static-eth0" \
ipv4.addresses 192.168.1.200/24 \
+ipv4.dns 192.168.1.10
# Activar a ligação
sudo nmcli connection up "static-eth0"
# Desactivar
sudo nmcli connection down "static-eth0"
# Mudar para DHCP
sudo nmcli connection modify "static-eth0" ipv4.method auto
Verificar e fazer reload
# Recarregar todos os perfis de /etc/NetworkManager/system-connections/
sudo nmcli connection reload
# Reaplicar configuração a um dispositivo sem reiniciar a ligação
sudo nmcli device reapply eth0
Os perfis criados com nmcli são guardados em /etc/NetworkManager/system-connections/ como ficheiros INI. A configuração é persistente entre reboots.
netplan vs network-scripts — Dois Mundos de Config Persistente
A configuração de rede persistente é onde Ubuntu e RHEL/Rocky divergem mais claramente. O Ubuntu adoptou o netplan — um abstracção em YAML que gera configuração para NetworkManager ou systemd-networkd. O RHEL manteve os network-scripts (/etc/sysconfig/network-scripts/ifcfg-*) até RHEL 8, e no RHEL 9 esses scripts foram removidos em favor exclusivo do NetworkManager (Netplan docs).
| Aspecto | Ubuntu (netplan) | RHEL/Rocky 9 (NetworkManager) |
|---|---|---|
| Formato | YAML em /etc/netplan/*.yaml |
INI em /etc/NetworkManager/system-connections/ |
| Backend | NetworkManager (desktop) ou systemd-networkd (server) | NetworkManager |
| CLI | netplan apply |
nmcli |
| network-scripts (ifcfg) | Não suportado | Removido no RHEL 9 (legacy em RHEL 8 via network-scripts package) |
netplan — Ubuntu
Os ficheiros netplan vivem em /etc/netplan/ e são processados por ordem alfabética. O ficheiro 50-cloud-init.yaml tem precedência sobre 01-netcfg.yaml se ambos existirem (números mais altos sobrepõem).
# /etc/netplan/01-static.yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses:
- 192.168.1.100/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
search: [exemplo.pt, corp.local]
# Validar sintaxe YAML antes de aplicar
sudo netplan try
# Aplica temporariamente por 120s e reverte se não confirmares
# Aplicar definitivamente
sudo netplan apply
# Gerar configuração sem aplicar (debug)
sudo netplan generate --debug
⚠ Cuidado com a indentação YAML: O netplan usa YAML onde a indentação é significativa (espaços, não tabs). Um espaço em falso faz o netplan apply falhar com erro de parser. Usa sempre netplan try antes de netplan apply num servidor remoto — se perderes acesso SSH, o netplan reverte após 120 segundos.
network-scripts — RHEL 8 (legado) e ifcfg-*
No RHEL 8 e CentOS Stream 8, os ficheiros ifcfg-* ainda funcionam via pacote network-scripts (instalado por defeito). No RHEL 9 e Rocky 9 foram removidos — a configuração persistente é exclusivamente via NetworkManager.
# /etc/sysconfig/network-scripts/ifcfg-eth0 (RHEL 8 legado)
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.1.100
PREFIX=24
GATEWAY=192.168.1.1
DNS1=8.8.8.8
DNS2=1.1.1.1
DOMAIN=exemplo.pt corp.local
# Reiniciar a ligação (RHEL 8)
sudo nmcli connection reload
sudo nmcli connection up eth0
# OU (legado, se NetworkManager estiver parado)
sudo ifup eth0
No RHEL 9 / Rocky 9, o equivalente em ficheiro INI gerado pelo NetworkManager fica em:
# /etc/NetworkManager/system-connections/eth0.nmconnection (RHEL 9)
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
method=manual
addresses=192.168.1.100/24
gateway=192.168.1.1
dns=8.8.8.8;1.1.1.1;
dns-search=exemplo.pt,corp.local
# Aplicar alterações manuais ao ficheiro
sudo nmcli connection reload
sudo nmcli connection up eth0
DNS — resolv.conf, systemd-resolved e /etc/hosts
A resolução de nomes em Linux moderno tem três camadas que é preciso entender: o /etc/hosts (resolução local estática), o /etc/resolv.conf (configuração de resolvedor DNS) e o /etc/nsswitch.conf (ordem de resolução). Em muitas distribuições modernas, o systemd-resolved gere o DNS de forma dinâmica.
/etc/hosts — resolução local estática
O ficheiro /etc/hosts mapeia nomes para IPs localmente, sem qualquer consulta DNS. É consultado antes do DNS (por defeito em nsswitch.conf). Documentação em man hosts(5).
# /etc/hosts
127.0.0.1 localhost
127.0.1.1 servidor01.exemplo.pt servidor01
::1 localhost ip6-localhost ip6-loopback
# Entradas personalizadas
192.168.1.10 bd1.exemplo.pt bd1
192.168.1.20 proxy.exemplo.pt proxy
10.0.0.5 api.interna.corp api
O formato é: IP FQDN alias [alias...]. Podes ter múltiplos aliases na mesma linha. O 127.0.1.1 em Debian/Ubuntu é uma convenção para o hostname da própria máquina quando não tem IP permanente.
/etc/nsswitch.conf — ordem de resolução
# Ver configuração de resolução de hosts
grep hosts /etc/nsswitch.conf
# hosts: files dns (ficheiro local primeiro, depois DNS)
# Ordem alternativa (DNS primeiro, útil em ambientes com muitos hosts)
# hosts: dns files myhostname
/etc/resolv.conf — resolvedor DNS
O resolv.conf define os servidores DNS (nameserver), domínios de pesquisa (search) e opções. Não editar directamente se o sistema usar systemd-resolved ou NetworkManager — esses serviços geram o ficheiro. As alterações manuais perdem-se no reboot ou no próximo netplan apply / nmcli connection up.
# /etc/resolv.conf (quando gerado manualmente)
nameserver 8.8.8.8
nameserver 1.1.1.1
search exemplo.pt corp.local
options timeout:2 attempts:3 rotate
# Verificar qual ficheiro está a gerir o resolv.conf
ls -la /etc/resolv.conf
# lrwxrwxrwx 1 root root 39 ... /etc/resolv.conf -> /run/systemd/resolve/stub-resolv.conf
systemd-resolved — DNS dinâmico (Ubuntu 24.04, RHEL 9)
Em Ubuntu 24.04 e RHEL 9, o systemd-resolved é o resolvedor DNS padrão. Mantém o /etc/resolv.conf como symlink para /run/systemd/resolve/stub-resolv.conf e gere os servidores DNS por interface. Documentação em man resolvectl(1) e Arch Wiki — systemd-resolved.
# Estado do systemd-resolved
resolvectl status
# Ver DNS configurado por interface
resolvectl dns eth0
# Link 2 (eth0): 8.8.8.8 1.1.1.1
# Definir DNS manualmente numa interface
sudo resolvectl dns eth0 8.8.8.8 1.1.1.1
# Definir domínio de pesquisa
sudo resolvectl domain eth0 exemplo.pt corp.local
# Limpar cache DNS
sudo resolvectl flush-caches
# Verificar resolução de um nome
resolvectl query exemplo.pt
# exemplo.pt: 93.184.216.34 -- link: eth0
ℹ DNS split-horizon: O systemd-resolved suporta DNS diferente por interface. Por exemplo, podes ter eth0 (rede interna) a usar um DNS interno para corp.local e eth1 (WAN) a usar 8.8.8.8. O resolvedor encaminha a query para a interface cujo domínio de pesquisa corresponde.
Diagnóstico de Rede — ping, dig, traceroute e mtr
Para além da configuração, precisas de ferramentas de diagnóstico. Estas não fazem parte do iproute2 mas são essenciais para qualquer administrador Linux.
ping — conectividade básica
# Ping básico (4 pacotes)
ping -c 4 192.168.1.1
# Ping contínuo até Ctrl+C
ping 192.168.1.1
# Ping com intervalo personalizado (1s)
ping -i 1 192.168.1.1
# Ping com tamanho de pacote específico (MTU discovery)
ping -s 1472 -M do 192.168.1.1
# -s 1472 = payload (1500 - 28 bytes ICMP header)
# -M do = Don't Fragment (detecta MTU path)
dig — consulta DNS detalhada
# Consulta A record
dig exemplo.pt
# Consulta específica a um servidor DNS
dig @8.8.8.8 exemplo.pt
# Consulta MX records
dig exemplo.pt MX
# Consulta reversa (PTR)
dig -x 192.168.1.1
# Output compacto (útil em scripts)
dig +short exemplo.pt
# 93.184.216.34
# Rastrear toda a cadeia de resolução
dig +trace exemplo.pt
Instalação das ferramentas de diagnóstico
As ferramentas de diagnóstico não vêm sempre pré-instaladas. Eis como as obter em ambas as famílias de distribuições:
# Ubuntu/Debian
sudo apt update && sudo apt install -y dnsutils traceroute mtr-tiny iputils-ping
# RHEL/Rocky/Alma
sudo dnf install -y bind-utils traceroute mtr iputils
| Pacote (apt) | Pacote (dnf) | Conteúdo |
|---|---|---|
iputils-ping |
iputils |
ping, arping, traceroute6 |
dnsutils |
bind-utils |
dig, nslookup, host |
traceroute |
traceroute |
traceroute, traceroute6 |
mtr-tiny ou mtr |
mtr |
mtr (traceroute + ping em tempo real) |
traceroute e mtr — identificar onde a rede falha
# traceroute básico
traceroute 8.8.8.8
# traceroute com ICMP em vez de UDP (passa firewalls)
sudo traceroute -I 8.8.8.8
# mtr — traceroute contínuo em tempo real
sudo mtr 8.8.8.8
# mtr com relatório (não interactivo, 10 ciclos)
mtr --report --report-cycles 10 8.8.8.8
O mtr combina traceroute e ping numa interface em tempo real, mostrando perda de pacotes por salto (hop). É a ferramenta mais útil para diagnosticar onde exactamente a latência ou perda ocorre num caminho de rede.
Erros Comuns em Configuração de Redes Linux
| Problema | Causa | Solução |
|---|---|---|
| Configuração perde-se após reboot | ip altera apenas em runtime; não é persistente |
Usar netplan (Ubuntu) ou nmcli (RHEL/Rocky) para configuração persistente |
| DNS não resolve após mudar netplan | netplan não aplicou ou YAML tem erro de indentação | Correr netplan try para validar antes de apply |
ifconfig: command not found |
net-tools não instalado (esperado em 2026) | Usar ip addr em vez de ifconfig |
| Interface não activa no boot | Falta ONBOOT=yes (ifcfg) ou optional: true (netplan) ou ligação não activada |
Verificar nmcli connection show e connection.autoconnect yes |
| DNS inconsistente entre ferramentas | systemd-resolved activo mas /etc/resolv.conf editado manualmente |
Usar resolvectl e garantir symlink /etc/resolv.conf -> /run/systemd/resolve/stub-resolv.conf |
| SSH perdido após mudar IP | IP alterado com ip addr sem actualizar gateway ou firewall |
Usar at ou systemd-run --on-active para reverter automaticamente |
| Conflito entre netplan e NetworkManager | Ambos tentam gerir a mesma interface | Definir renderer: networkd em netplan para server, ou renderer: NetworkManager para desktop |
| Entradas ARP erradas (MAC antigo) | Servidor trocado ou VM migrada, IP mantém cache ARP antiga | sudo ip neigh flush all e verificar com ip neigh show |
Checklist de Verificação de Rede
Usa este checklist após configurar ou alterar a rede num servidor Linux. Cada item corresponde a um comando de verificação rápida:
| ✓ | Verificação | Comando |
|---|---|---|
| ✓ | Interface está UP e tem IP | ip -br addr show |
| ✓ | Default gateway acessível | ping -c 4 $(ip route show default | awk '{print $3}') |
| ✓ | DNS resolve nomes | dig +short exemplo.pt |
| ✓ | Hostname resolve em /etc/hosts | getent hosts $(hostname) |
| ✓ | Portos esperados em LISTEN | sudo ss -tlnp |
| ✓ | Config persistente após reboot | ls /etc/netplan/*.yaml ou nmcli connection show |
| ✓ | Conectividade externa | ping -c 4 8.8.8.8 |
| ✓ | Rota para destino conhecido | ip route get 8.8.8.8 |
| ✓ | DNS por interface (systemd-resolved) | resolvectl status |
| ✓ | Cache ARP limpa após migração | ip neigh show — sem entradas STALE |
Artigos Relacionados
Este artigo faz parte do Curso Linux em 30 Dias. Os artigos anteriores cobrem os fundamentos que assumimos neste Dia 8:
- Dia 1: Terminal, Shell e Comandos Essenciais — Linux do Zero — base de linha de comandos usada em todos os dias seguintes
- Dia 2: Sistema de Ficheiros Linux — FHS, Mounts e Links — caminhos do sistema de ficheiros onde vivem os ficheiros de configuração de rede (
/etc/) - Dia 3: Gestão de Utilizadores e Grupos — permissões de root necessárias para
sudo ipenmcli - Dia 4: Permissões Avançadas — ACLs e SUID aplicados a binários de rede
- Dia 5: Processos e Jobs —
ss -pmostra processos associados a sockets - Dia 6: Gestão de Pacotes — instalação de
dnsutils/bind-utils,mtr,traceroute - Dia 7: Systemd — Services, Timers e journalctl — o
systemd-resolvedé um service systemd - Dia 9: Firewalls — iptables, nftables, UFW e firewalld — a continuação natural da configuração de redes
No Dia 9 veremos firewalls (iptables/nftables, UFW e firewalld) — a continuação natural da configuração de redes.