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.

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:

No Dia 9 veremos firewalls (iptables/nftables, UFW e firewalld) — a continuação natural da configuração de redes.