Add pt-br translation for the iptables post.
This commit is contained in:
parent
1bbf47295b
commit
2028b8398a
228
content/posts/iptables-basics.pt.md
Normal file
228
content/posts/iptables-basics.pt.md
Normal file
@ -0,0 +1,228 @@
|
|||||||
|
+++
|
||||||
|
date = '2024-10-20T14:22:33-03:00'
|
||||||
|
title = 'Dominando o iptables: Configurações básicas de firewall para um servidor GNU/Linux recém-implantado'
|
||||||
|
description = "O uso básico do iptables para um novo servidor web GNU/Linux"
|
||||||
|
tags = [
|
||||||
|
"webserver",
|
||||||
|
"GNU/Linux",
|
||||||
|
"Basics Series",
|
||||||
|
]
|
||||||
|
+++
|
||||||
|
|
||||||
|
Ao configurar um novo servidor Linux, uma das primeiras coisas que você deve fazer é protegê-lo configurando um firewall. O iptables, uma poderosa ferramenta de firewall disponível na maioria das distribuições Linux, é uma excelente opção para gerenciar regras de tráfego.
|
||||||
|
|
||||||
|
Nesta publicação, vou mostrar algumas configurações básicas do iptables para um servidor recém-implantado. No final, você terá um firewall sólido para proteger seus serviços e, ao mesmo tempo, manter as coisas simples.
|
||||||
|
|
||||||
|
## Oque é iptables?
|
||||||
|
|
||||||
|
iptables é um utilitario de firewall por linha de comando que utiliza "chains" para gerenciar o tráfego. As "chains" são basicamente uma lista de regras que aplicam para pacotes de entrada ou saida. Voce pode fazer as regras baseadas em IPs de origem, portas e protocolos, por exemplo.
|
||||||
|
|
||||||
|
Tornar um servidor seguro é a primeira prioridade para qualquer sysadmin, e firewalls são uma das camadas mais importantes de defesa. Com iptables voce pode:
|
||||||
|
|
||||||
|
- [ ] Bloquear trafego indesejado
|
||||||
|
- [ ] Permitir conexões confiáveis (como SSH, HTTP/HTTPS)
|
||||||
|
- [ ] Proteger contra ataques DoS e port scanning
|
||||||
|
- [ ] Gerar logs de atividades suspeitas para analise futura
|
||||||
|
|
||||||
|
## Como funciona o fluxo de pacotes no iptables
|
||||||
|
|
||||||
|
Eu recomendo fortemente que voce leia mais sobre o fluxo de pacotes do iptables antes de aplicar qualquer regra.
|
||||||
|
|
||||||
|
Recomendo que voce inicie por esses diagramas muito bem feitos nesse gist do [nerdalert no GitHub](https://gist.github.com/nerdalert/a1687ae4da1cc44a437d)
|
||||||
|
|
||||||
|
## Comandos basicos do iptables
|
||||||
|
|
||||||
|
Vamos começar com uma overview dos comandos essenciais do iptables:
|
||||||
|
|
||||||
|
### Mostrar regras atuais
|
||||||
|
```bash
|
||||||
|
iptables -L
|
||||||
|
```
|
||||||
|
|
||||||
|
### Deletar regras atuais
|
||||||
|
```bash
|
||||||
|
iptables -F
|
||||||
|
```
|
||||||
|
|
||||||
|
### Salvar regras atuais
|
||||||
|
|
||||||
|
Se voce está rodando Debian, voce precisa primeiro instalar o pacote `iptables-persistent`, depois disso voce pode usar os seguintes comandos:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables-save > /etc/iptables/rules.v4
|
||||||
|
ip6tables-save > /etc/iptables/rules.v6
|
||||||
|
```
|
||||||
|
|
||||||
|
Restaurar regras:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables-restore < /etc/iptables/rules.v4
|
||||||
|
ip6tables-restore < /etc/iptables/rules.v6
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configurar iptables em um servidor novo
|
||||||
|
|
||||||
|
Agora, vamos passar por algumas regras basicas que voce pode aplicar no seu servidor logo de inicio. Vamos permitir trafego essencial como SSH e HTTP/HTTPs e bloquear todo o resto.
|
||||||
|
|
||||||
|
### Passo 1: Limpar regras existentes
|
||||||
|
|
||||||
|
Antes de começar a definir regras, é uma boa ideia limpar as regras existentes para começar do zero:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -F
|
||||||
|
```
|
||||||
|
|
||||||
|
Isso nos garante que estamos iniciando em um estado limpo.
|
||||||
|
|
||||||
|
Tome cuidado com os proximos comandos, para voce não se trancar para fora do seu proprio servidor! Isso já aconteceu com todos sysadmins mais cedo ou mais tarde. A forma mais simples de garantir que isso não ocorra é fazendo tudo isso fisicamente, ou através de uma conexão por KVM por exemplo.
|
||||||
|
|
||||||
|
### Passo 2: Definir as politicas default
|
||||||
|
|
||||||
|
Agora, vamos definir o comportamento padrão para conexões de entrada (INPUT), saida (OUTPUT) e encaminhadas (FORWARD). Por padrão, é uma boa ideia bloquear toda a entrada e permitir toda a saida.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -P INPUT DROP
|
||||||
|
iptables -P FORWARD DROP
|
||||||
|
iptables -P OUTPUT ACCEPT
|
||||||
|
```
|
||||||
|
|
||||||
|
Isso faz com que todas as conexões sejam dropadas a menos que uma regra as permita. O trafego de saida por sua vez, é liberado por padrão.
|
||||||
|
|
||||||
|
### Passo 3: Permitir trafego SSH (Porta 22)
|
||||||
|
|
||||||
|
Voce vai precisar de SSH para acessar o seu servidor, então vamos permitir trafego na porta 22. É importante que voce proteja esse acesso permitindo que somente seus IPs confiaveis possam acessar, por simplicitade vamos iniciar permitindo todas as conexões SSH:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
|
||||||
|
```
|
||||||
|
|
||||||
|
O "-A" significa "Append", isso insere a regra no final da lista, para colocar no topo use a flag "-I".
|
||||||
|
|
||||||
|
É uma boa ideia sempre adicionar comentarios nas regras, para no futuro facilitar o nosso troubleshooting.
|
||||||
|
|
||||||
|
No iptables, podemos adicionar comentarios com a seguinte sintaxe:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -m comment --comment "Seu comentario aqui"
|
||||||
|
```
|
||||||
|
|
||||||
|
Se voce quiser restringir seu acesso SSH para apenas um IP de origem (por exemplo, o IP da sua casa), faça assim:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -A INPUT -p tcp -s <seu-ip-de-casa> -m comment --comment "Permite SSH de casa" --dport 22 -j ACCEPT
|
||||||
|
```
|
||||||
|
|
||||||
|
### Passo 4: Permitir HTTP e HTTPs (portas 80 e 443)
|
||||||
|
|
||||||
|
Se voce estiver rodando um webserver, voce vai querer liberar o trafego nessas portas:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -A INPUT -m comment --comment "Permite HTTP" -p tcp --dport 80 -j ACCEPT
|
||||||
|
iptables -A INPUT -m comment --comment "Permite HTTPS" -p tcp --dport 443 -j ACCEPT
|
||||||
|
iptables -A INPUT -m comment --comment "Permite QUIC" -p udp --dport 443 -j ACCEPT
|
||||||
|
```
|
||||||
|
|
||||||
|
Isso permite o trafego ao seu servidor via HTTP (porta 80) e HTTPS (porta 443).
|
||||||
|
|
||||||
|
Note que eu adicionei a porta 443/udp, que é para o protocolo QUIC, QUIC é um protocolo de camada de transporte desenvolvido pelo Google, feito para ser mais rapido, e mais seguro combinando features do TCP, TLS e HTTP/2 para melhorar a latencia e performance. Eu recomendo que voce pesquise mais sobre esse assunto, talvez eu faça um artigo sobre ele no futuro.
|
||||||
|
|
||||||
|
### Passo 5: Permitir trafego loopback
|
||||||
|
|
||||||
|
O seu servidor precisa se comunicar com ele mesmo pela interface loopback. Garanta que esse trafego seja permitido:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -A INPUT -m comment --comment "Permite trafego loopback" -i lo -j ACCEPT
|
||||||
|
```
|
||||||
|
|
||||||
|
### Passo 6: Dropar pacotes invalidos
|
||||||
|
|
||||||
|
Pacotes invalidos podem ser erros de configuração ou até mesmo ataques, então é uma boa pratica sempre dropar:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
|
||||||
|
```
|
||||||
|
|
||||||
|
### Passo 7: Permitir conexões estabelecidas e relacionadas
|
||||||
|
|
||||||
|
Para permitir respostar a conexões de saida (como quando o seu servidor solicita algum update), voce vai precisar aplicar essa regra:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
|
||||||
|
```
|
||||||
|
|
||||||
|
Isso garante que o servidor aceite respostas para requisições que ele mesmo fez.
|
||||||
|
|
||||||
|
### Passo 8: Não esqueça o IPv6!
|
||||||
|
|
||||||
|
Para IPv6, a sintaxe é a mesma, voce apenas precisa mudar o comando de `iptables` para `ip6tables`
|
||||||
|
|
||||||
|
A maior diferença é no protocolo ICMP, voce deve sempre permitir ICMPv6 para que o seu servidor funcione corretamente.
|
||||||
|
|
||||||
|
Essas são algumas regras iniciais, onde permitimos explicitamente pacotes de controle ICMPv6 e dropamos o resto.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
|
||||||
|
ip6tables -A OUTPUT -p icmpv6 --icmpv6-type echo-reply -j ACCEPT
|
||||||
|
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
|
||||||
|
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
|
||||||
|
ip6tables -A OUTPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
|
||||||
|
ip6tables -A OUTPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
|
||||||
|
ip6tables -A INPUT -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT
|
||||||
|
ip6tables -A INPUT -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT
|
||||||
|
ip6tables -A INPUT -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT
|
||||||
|
ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT
|
||||||
|
ip6tables -A INPUT -p icmpv6 -j DROP
|
||||||
|
```
|
||||||
|
|
||||||
|
### Passo 9: Salve suas regras
|
||||||
|
|
||||||
|
Quando voce terminou de aplicar as suas regras, não se esqueça de salvar elas. Isso garante que elas sejam aplicadas novamente no proximo reboot:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables-save > /etc/iptables/rules.v4
|
||||||
|
ip6tables-save > /etc/iptables/rules.v6
|
||||||
|
```
|
||||||
|
|
||||||
|
### Passo 10: Testar tudo
|
||||||
|
|
||||||
|
Depois de configurar todas as suas regras, é bom sempre valida-las conectando em seu servidor. Nesse exemplo voce deve conseguir se comunicar via SSH, HTTP e HTTPS, todo o resto deve estar bloqueado.
|
||||||
|
|
||||||
|
## Sumario
|
||||||
|
|
||||||
|
Em sumario, essas são algumas regras basicas para iniciar, sempre revise e altere conforme a sua necessidade!
|
||||||
|
|
||||||
|
### IPv4
|
||||||
|
|
||||||
|
```bash
|
||||||
|
iptables -P INPUT DROP
|
||||||
|
iptables -P FORWARD DROP
|
||||||
|
iptables -P OUTPUT ACCEPT
|
||||||
|
iptables -A INPUT -p tcp -s <seu-ip-de-casa> -m comment --comment "Permite SSH de casa" --dport 22 -j ACCEPT
|
||||||
|
iptables -A INPUT -m comment --comment "Permite HTTP" -p tcp --dport 80 -j ACCEPT
|
||||||
|
iptables -A INPUT -m comment --comment "Permite HTTPS" -p tcp --dport 443 -j ACCEPT
|
||||||
|
iptables -A INPUT -m comment --comment "Permite QUIC" -p udp --dport 443 -j ACCEPT
|
||||||
|
iptables -A INPUT -m comment --comment "Permite trafego loopback" -i lo -j ACCEPT
|
||||||
|
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
|
||||||
|
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
|
||||||
|
iptables-save > /etc/iptables/rules.v4
|
||||||
|
```
|
||||||
|
|
||||||
|
### IPv6
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ip6tables -P INPUT DROP
|
||||||
|
ip6tables -P FORWARD DROP
|
||||||
|
ip6tables -P OUTPUT ACCEPT
|
||||||
|
ip6tables -A INPUT -p tcp -s <seu-ip-de-casa> -m comment --comment "Permite SSH de casa" --dport 22 -j ACCEPT
|
||||||
|
ip6tables -A INPUT -m comment --comment "Permite HTTP" -p tcp --dport 80 -j ACCEPT
|
||||||
|
ip6tables -A INPUT -m comment --comment "Permite HTTPS" -p tcp --dport 443 -j ACCEPT
|
||||||
|
ip6tables -A INPUT -m comment --comment "Permite QUIC" -p udp --dport 443 -j ACCEPT
|
||||||
|
ip6tables -A INPUT -m comment --comment "Permite trafego loopback" -i lo -j ACCEPT
|
||||||
|
ip6tables -A INPUT -m conntrack --ctstate INVALID -j DROP
|
||||||
|
ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
|
||||||
|
ip6tables-save > /etc/iptables/rules.v6
|
||||||
|
```
|
||||||
|
|
||||||
|
## Conclusão
|
||||||
|
|
||||||
|
Parabens! Voce acabou de configurar o iptables em seu novo servidor GNU/Linux. Por bloquear todo o trafego exceto o que é confiavel voce adicionou uma camada de segurança a seu servidor.
|
||||||
Loading…
Reference in New Issue
Block a user