<h2>Fundamentos de Redes no Linux</h2>
<p>Quando você trabalha com Linux, entender redes é essencial. A maioria dos servidores e máquinas Linux executa serviços que precisam se comunicar pela rede, seja para receber requisições HTTP, conectar-se a bancos de dados remotos ou simplesmente permitir que você faça SSH em uma máquina. Linux oferece ferramentas poderosas para inspecionar, configurar e diagnosticar sua rede, mas muitos iniciantes se sentem perdidos porque há muitas opções.</p>
<p>A chave para dominar redes em Linux é entender que tudo é separado em camadas. Você tem a camada de aplicação (seu navegador, seu servidor web), a camada de transporte (TCP, UDP), a camada IP (roteamento, endereços) e a camada de link (placas de rede, ARP). Cada ferramenta que vamos estudar se concentra em uma ou mais dessas camadas. Neste artigo, você aprenderá a usar as ferramentas padrão do Linux para entender exatamente o que sua rede está fazendo.</p>
<h2>Configuração e Visualização de Interfaces com <code>ip</code></h2>
<p>O comando <code>ip</code> é a ferramenta moderna do Linux para gerenciar tudo relacionado a redes. Ele substitui antigas ferramentas como <code>ifconfig</code> e oferece muito mais funcionalidade. Quando você executa <code>ip</code>, você está falando diretamente com o kernel Linux para gerenciar suas interfaces de rede, rotas, endereços IP e muito mais.</p>
<h3>Inspecionando Interfaces de Rede</h3>
<p>O primeiro passo é ver quais interfaces de rede sua máquina tem e qual é sua configuração atual:</p>
<pre><code class="language-bash">ip link show</code></pre>
<p>Este comando lista todas as interfaces de rede, incluindo seu estado (UP ou DOWN) e informações de camada 2 (MAC address, MTU, etc.). Para ver só as que estão ativas:</p>
<pre><code class="language-bash">ip link show up</code></pre>
<p>Se você quer informações mais detalhadas, inclusive endereços IP:</p>
<pre><code class="language-bash">ip addr show</code></pre>
<p>Você verá algo assim:</p>
<pre><code>1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 08:00:27:00:4e:3f brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
inet6 fe80::a00:27ff:fe00:4e3f/64 scope link</code></pre>
<p>Aqui você vê que <code>eth0</code> tem o endereço IP <code>192.168.1.100/24</code>, o que significa que pode alcançar máquinas de <code>192.168.1.0</code> até <code>192.168.1.255</code>.</p>
<h3>Atribuindo Endereços IP</h3>
<p>Para atribuir um endereço IP a uma interface:</p>
<pre><code class="language-bash">sudo ip addr add 192.168.1.50/24 dev eth0</code></pre>
<p>Para remover:</p>
<pre><code class="language-bash">sudo ip addr del 192.168.1.50/24 dev eth0</code></pre>
<p>Note que mudanças feitas com <code>ip</code> são temporárias e serão perdidas ao reiniciar. Para persistir, você precisa editar arquivos de configuração como <code>/etc/netplan/</code> (Ubuntu/Debian moderno) ou <code>/etc/network/interfaces</code> (Debian antigo).</p>
<h3>Gerenciando Rotas</h3>
<p>Rotas dizem ao seu sistema como alcançar redes remotas. Para ver suas rotas atuais:</p>
<pre><code class="language-bash">ip route show</code></pre>
<p>Saída típica:</p>
<pre><code>default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100</code></pre>
<p>A primeira linha é a rota padrão — qualquer tráfego para redes desconhecidas vai através do gateway <code>192.168.1.1</code>. A segunda é a rota direta para sua rede local.</p>
<p>Para adicionar uma rota para uma rede remota:</p>
<pre><code class="language-bash">sudo ip route add 10.0.0.0/24 via 192.168.1.254 dev eth0</code></pre>
<p>Isto diz: "para alcançar a rede 10.0.0.0/24, envie pelo gateway 192.168.1.254 através da interface eth0".</p>
<h2>Inspecionando Conexões Ativas com <code>ss</code> e <code>netstat</code></h2>
<p>Agora que você entende sua configuração de rede, precisa saber quais conexões estão ativas no momento. O comando <code>ss</code> (socket statistics) é a ferramenta moderna, enquanto <code>netstat</code> ainda funciona mas é legado. Ambos mostram sockets (conexões) TCP, UDP e Unix domain socket em sua máquina.</p>
<h3>Usando <code>ss</code> para Listar Conexões</h3>
<p>O comando mais útil é:</p>
<pre><code class="language-bash">ss -tunap</code></pre>
<p>Vamos quebrar os flags:</p>
<ul>
<li><code>-t</code> mostra sockets TCP</li>
<li><code>-u</code> mostra sockets UDP</li>
<li><code>-n</code> mostra números (IPs e portas) em vez de tentar resolver nomes</li>
<li><code>-a</code> mostra todos os sockets, não só os conectados</li>
<li><code>-p</code> mostra qual processo está usando cada socket</li>
</ul>
<p>Saída esperada:</p>
<pre><code>Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 127.0.0.1:22 : users:(("sshd",pid=1234,fd=3))
tcp ESTAB 0 0 192.168.1.100:50234 8.8.8.8:443 users:(("curl",pid=5678,fd=3))
tcp TIME_WAIT 0 0 192.168.1.100:50235 8.8.8.8:443 </code></pre>
<p>Esta saída te diz que há um serviço SSH ouvindo na porta 22, uma conexão estabelecida para Google (8.8.8.8:443), e uma conexão fechada que ainda está em TIME_WAIT (estado temporário após fechamento).</p>
<h3>Filtrando Conexões por Estado e Porta</h3>
<p>Se você quer apenas conexões estabelecidas:</p>
<pre><code class="language-bash">ss -tan state established</code></pre>
<p>Se quer apenas ver o que está ouvindo (listening):</p>
<pre><code class="language-bash">ss -tln</code></pre>
<p>Ou se quer ver que programa está usando a porta 8080:</p>
<pre><code class="language-bash">ss -tlnp | grep 8080</code></pre>
<h3>Comparação com <code>netstat</code></h3>
<p>O <code>netstat</code> foi a ferramenta padrão antes de <code>ss</code> ser desenvolvido. Ainda funciona, mas é mais lento porque usa arquivos <code>/proc</code> em vez de chamadas de sistema diretas. O comando equivalente seria:</p>
<pre><code class="language-bash">netstat -tunap</code></pre>
<p>Os flags significam a mesma coisa. Você verá saída similar, mas em Linux moderno, <code>ss</code> é preferido porque é mais rápido e oferece mais opções de filtragem.</p>
<p>Um caso onde <code>netstat</code> ainda é útil é para statisticas de rede:</p>
<pre><code class="language-bash">netstat -s</code></pre>
<p>Isto mostra pacotes transmitidos, recebidos, erros, etc. Com <code>ss</code>, você precisaria usar <code>nstat</code> para algo similar.</p>
<h2>Filtrando Tráfego com <code>iptables</code></h2>
<p>O <code>iptables</code> é a ferramenta para gerenciar o firewall do Linux. Ele trabalha com regras que decidem se pacotes são aceitos, rejeitados ou encaminhados. Isso é complexo porque o <code>iptables</code> tem várias tabelas e cadeias, mas o conceito fundamental é simples: cada pacote que entra ou sai do seu sistema passa por um conjunto de regras.</p>
<h3>Estrutura Básica do <code>iptables</code></h3>
<p>O <code>iptables</code> funciona com tabelas, cadeias e regras:</p>
<ul>
<li><strong>Tabelas</strong>: <code>filter</code> (padrão, controla se pacotes passam), <code>nat</code> (tradução de endereços), <code>mangle</code> (modificação de pacotes)</li>
<li><strong>Cadeias</strong>: <code>INPUT</code> (pacotes entrando), <code>OUTPUT</code> (pacotes saindo), <code>FORWARD</code> (pacotes sendo reenviados)</li>
<li><strong>Ações</strong>: <code>ACCEPT</code> (deixa passar), <code>DROP</code> (descarta silenciosamente), <code>REJECT</code> (descarta e avisa o remetente)</li>
</ul>
<p>Quando você executa:</p>
<pre><code class="language-bash">sudo iptables -L</code></pre>
<p>Você vê as regras atuais na tabela <code>filter</code>:</p>
<pre><code>Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
DROP tcp -- anywhere anywhere tcp dpt:telnet
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination</code></pre>
<p>Isto diz que SSH (porta 22) é aceito, Telnet (porta 23) é descartado, e tudo mais por padrão é aceito.</p>
<h3>Adicionando e Removendo Regras</h3>
<p>Para aceitar conexões SSH:</p>
<pre><code class="language-bash">sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT</code></pre>
<p>Vamos entender cada parte:</p>
<ul>
<li><code>-A INPUT</code> adiciona uma regra na cadeia INPUT</li>
<li><code>-p tcp</code> filtra por protocolo TCP</li>
<li><code>--dport 22</code> filtra por porta destino 22</li>
<li><code>-j ACCEPT</code> a ação é aceitar</li>
</ul>
<p>Para descartar Telnet:</p>
<pre><code class="language-bash">sudo iptables -A INPUT -p tcp --dport 23 -j DROP</code></pre>
<p>Para listar com números de linha:</p>
<pre><code class="language-bash">sudo iptables -L INPUT --line-numbers</code></pre>
<p>Para deletar uma regra pelo número:</p>
<pre><code class="language-bash">sudo iptables -D INPUT 2</code></pre>
<p>Isto deleta a 2ª regra da cadeia INPUT.</p>
<h3>Um Exemplo Prático: Firewall Básico</h3>
<p>Vamos criar um firewall que bloqueia tudo por padrão, exceto SSH:</p>
<pre><code class="language-bash"># Limpar regras anteriores
sudo iptables -F
Setar política padrão
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD DROP
Aceitar localhost
sudo iptables -A INPUT -i lo -j ACCEPT
Aceitar conexões já estabelecidas
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Aceitar SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Aceitar HTTP e HTTPS se estiver servindo web
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT</code></pre>
<p>Isto é um firewall funcional. A regra com <code>-m state --state ESTABLISHED,RELATED</code> é crucial porque permite respostas a requisições que você fez.</p>
<h3>Persistindo Regras do <code>iptables</code></h3>
<p>O problema é que regras do <code>iptables</code> são perdidas ao reiniciar. Para persistir, você pode usar <code>iptables-save</code>:</p>
<pre><code class="language-bash">sudo iptables-save > /etc/iptables/rules.v4</code></pre>
<p>E restaurar com:</p>
<pre><code class="language-bash">sudo iptables-restore < /etc/iptables/rules.v4</code></pre>
<p>Para automatizar na inicialização, em sistemas com <code>iptables-persistent</code> instalado:</p>
<pre><code class="language-bash">sudo apt-get install iptables-persistent
sudo netfilter-persistent save</code></pre>
<h2>Diagnóstico de Conectividade</h2>
<p>Quando algo não funciona na rede, você precisa de forma sistemática descobrir onde está o problema. Linux fornece várias ferramentas para testar conectividade em diferentes camadas.</p>
<h3>Verificando Conectividade Local com <code>ping</code></h3>
<p>O <code>ping</code> testa se uma máquina remota está alcançável enviando pacotes ICMP:</p>
<pre><code class="language-bash">ping -c 4 8.8.8.8</code></pre>
<p>Saída típica:</p>
<pre><code>PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=119 time=20.5 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=119 time=21.2 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=119 time=19.8 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=119 time=22.1 ms
--- 8.8.8.8 statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 19.8/20.9/22.1/0.9 ms</code></pre>
<p>Se receber "Destination Host Unreachable", o roteador não sabe como chegar à máquina. Se receber "Network Unreachable", é um problema de rota local.</p>
<h3>Rastreando o Caminho com <code>traceroute</code></h3>
<p>O <code>traceroute</code> mostra todos os saltos (routers) entre você e um destino:</p>
<pre><code class="language-bash">traceroute google.com</code></pre>
<p>Saída típica:</p>
<pre><code>traceroute to google.com (142.250.80.46), 30 hops max, 60 byte packets
1 _gateway (192.168.1.1) 2.234 ms 2.102 ms 1.987 ms
2 router.isp.com (203.0.113.1) 15.432 ms 14.876 ms 15.123 ms
3 *
4 142.250.80.46 (142.250.80.46) 22.456 ms 21.987 ms 22.134 ms</code></pre>
<p>Se um hop responde com <code><em> </em> *</code>, significa que não responde a ICMP (comum em roteadores corporativos). Se para em um hop específico, o problema está ali. Use <code>traceroute -m 30</code> para aumentar o número máximo de hops se não conseguir alcançar o destino.</p>
<h3>Testando Portas Específicas com <code>telnet</code> e <code>nc</code></h3>
<p>Se quer verificar se uma porta específica está aberta:</p>
<pre><code class="language-bash">nc -zv 8.8.8.8 443</code></pre>
<p>A flag <code>-z</code> faz uma varredura sem enviar dados, <code>-v</code> é verbose. Resposta:</p>
<pre><code>Connection to 8.8.8.8 443 port [tcp/https] succeeded!</code></pre>
<p>Ou com <code>telnet</code>:</p>
<pre><code class="language-bash">telnet google.com 443</code></pre>
<p>Ctrl+C para sair. Telnet é mais antigo, mas útil para testar conexões em texto plano.</p>
<h3>Analisando DNS com <code>dig</code> e <code>nslookup</code></h3>
<p>Se o <code>ping</code> falha mas o <code>nc</code> funciona, pode ser problema de DNS:</p>
<pre><code class="language-bash">dig google.com</code></pre>
<p>Isto mostra a resposta do servidor DNS:</p>
<pre><code>; <<>> DiG 9.16.1-Ubuntu <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12345
;google.com. 300 IN A 142.250.80.46</code></pre>
<p>Se receber status NXDOMAIN, o domínio não existe. Se receber status SERVFAIL, o servidor DNS teve um problema. Para testar um servidor DNS específico:</p>
<pre><code class="language-bash">dig @1.1.1.1 google.com</code></pre>
<h3>Analisando Pacotes com <code>tcpdump</code></h3>
<p>Quando tudo mais falha, você precisa ver os pacotes reais. <code>tcpdump</code> captura pacotes na rede:</p>
<pre><code class="language-bash">sudo tcpdump -i eth0 -n 'tcp port 443'</code></pre>
<p>Isto captura pacotes TCP na porta 443 da interface eth0, sem resolver nomes (<code>-n</code>).</p>
<p>Saída:</p>
<pre><code>10:23:45.123456 IP 192.168.1.100.50234 > 142.250.80.46.443: Flags [S], seq 0, win 64240, length 0
10:23:45.234567 IP 142.250.80.46.443 > 192.168.1.100.50234: Flags [S.], seq 0, ack 1, win 65160, length 0
10:23:45.245678 IP 192.168.1.100.50234 > 142.250.80.46.443: Flags [.], ack 1, win 64240, length 0</code></pre>
<p>Flags <code>[S]</code> é SYN (início de conexão), <code>[S.]</code> é SYN-ACK (resposta), <code>[.]</code> é ACK (confirmação). Isto mostra um handshake TCP bem-sucedido.</p>
<p>Para capturar e salvar em arquivo:</p>
<pre><code class="language-bash">sudo tcpdump -i eth0 -w captura.pcap 'tcp port 443'</code></pre>
<p>Depois você pode analisar em ferramentas como Wireshark.</p>
<h3>Verificando Disponibilidade de Serviços com <code>curl</code></h3>
<p>Para testar conectividade HTTP/HTTPS de forma mais realista:</p>
<pre><code class="language-bash">curl -v http://example.com</code></pre>
<p>Flag <code>-v</code> mostra headers HTTP, erros de certificado SSL, etc:</p>
<pre><code>* Trying 93.184.216.34:80...
- Connected to example.com (93.184.216.34) port 80 (#0)
> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/7.68.0
< HTTP/1.1 200 OK
< Content-Type: text/html
...</code></pre>
<p>Se receber "Connection refused", a porta está fechada. Se receber "Connection timeout", há um problema de roteamento.</p>
<h2>Conclusão</h2>
<p>Dominar redes em Linux significa entender que você tem ferramentas em cada camada. Com <code>ip</code>, você configura sua máquina na rede. Com <code>ss</code> e <code>netstat</code>, você vê o que está acontecendo agora. Com <code>iptables</code>, você controla o fluxo de tráfego. E quando algo quebra, você tem um conjunto sistemático de ferramentas de diagnóstico (<code>ping</code>, <code>traceroute</code>, <code>nc</code>, <code>dig</code>, <code>tcpdump</code>, <code>curl</code>) para encontrar o problema.</p>
<p>A chave é seguir uma metodologia: primeiro verifique conectividade básica com <code>ping</code>, depois rastreie o caminho com <code>traceroute</code>, teste portas específicas com <code>nc</code>, verifique DNS com <code>dig</code>, e finalmente analise pacotes com <code>tcpdump</code> se necessário. Assim você resolve 99% dos problemas de rede no Linux.</p>
<p>Por fim, lembre-se que <code>iptables</code> é poderoso mas precisa ser usado com cuidado — uma regra errada e você perde acesso SSH à máquina. Sempre mantenha uma conexão de acesso físico ou console antes de fazer mudanças no firewall.</p>
<h2>Referências</h2>
<ul>
<li><a href="https://man7.org/linux/man-pages/man8/ip.8.html" target="_blank" rel="noopener noreferrer">Linux man page: ip(8)</a> — Documentação oficial do comando ip</li>
<li><a href="https://man7.org/linux/man-pages/man8/ss.8.html" target="_blank" rel="noopener noreferrer">Linux man page: ss(8)</a> — Documentação oficial do ss</li>
<li><a href="https://man7.org/linux/man-pages/man8/iptables.8.html" target="_blank" rel="noopener noreferrer">Linux man page: iptables(8)</a> — Documentação oficial do iptables</li>
<li><a href="https://wiki.debian.org/NetworkConfiguration" target="_blank" rel="noopener noreferrer">Debian Wiki: NetworkConfiguration</a> — Guia prático de rede no Debian/Ubuntu</li>
<li><a href="https://www.oreilly.com/library/view/tcpip-illustrated-volume/9780321336316/" target="_blank" rel="noopener noreferrer">TCP/IP Illustrated, Volume 1</a> — Livro referência sobre TCP/IP</li>
</ul>
<p><!-- FIM --></p>