Seja o lorde dos firewalls do Linux usando iptables
O firewall é a ferramenta PRINCIPAL de proteção de seu computador contra ataques via rede e internet.
O que é um firewall? É simplesmente um software! MAS... que consegue olhar TODOS os pacotes de rede que trafegam pelo computador, TODOS mesmo.
O firewall olha cada pacote, um por um, e decide:
- Vou deixá-lo passar
- Vou simplesmente jogá-lo fora
- Vou jogar fora e enviar uma mensagem de "comunicação rejeitada" para o remetente
Mas com base em quê o firewall toma essa decisão?
É VOCÊ quem decide as regras! É você quem configura o que o firewall joga fora e aceita.
Você pode filtrar os pacotes com, basicamente, 6 coisas:
- ip de origem do pacote
- porta de origem do pacote
- ip de destino do pacote
- porta de destino do pacote
- interface física de onde o pacote está trafegando
- rastreamento de conexão: esse pacote é novo? ele está iniciando uma nova conexão? ou é apenas a continuação de uma conexão já estabelecida?
O item 6 é uma das coisas que diferencia o Firewall da ACL (Access Control List). A ACL é stateless - não tem noção do que veio antes daquele pacote. O Firewall é stateful - ele sabe o que veio antes daquele pacote, portanto consegue dizer se o pacote é de uma conexão nova ou se é a resposta de uma conexão já aberta. Referência.
E no Linux? Quais firewalls temos à nossa disposição?
O Linux tem o supremo iptables. Ele é a base de praticamente todos os firewalls do Linux. Pra você ter uma ideia, ele é a base do UFW (Uncomplicated Firewall) que vêm com o Ubuntu - o UFW é só uma interface que facilita e traduz as configurações que se faz nele pra linguagem e comandos do iptables.
O restante desse artigo está em construção!
Uma coisa muito importante sobre a configuração do iptables: todos os comandos dados são perdidos quando o computador for reiniciado.
Para manter as configurações de firewall para sempre você tem algumas opções:
- Opção que já vem instalada: iptables-save
- Opção que precisa instalar: iptables-persistent
- Opção que usa o systemd: criar um serviço para iniciar as regras automaticamente antes das interfaces de rede serem iniciadas.
Referências
Tutorial básico:
https://www.digitalocean.com/community/tutorials/iptables-essentials-common-firewall-rules-and-commands#saving-rules
Tutorial sobre listar, apagar e deletar regras:
https://www.digitalocean.com/community/tutorials/iptables-essentials-common-firewall-rules-and-commands#saving-rules
Tutorial mais completo:
https://www.booleanworld.com/depth-guide-iptables-linux-firewall/
Modelo simples de firewall no iptables (EXEMPLO MUITO BOM!):
https://blog.remontti.com.br/2435
Fazendo o firewall iniciar automaticamente usando systemctl (EXEMPLO MUITO BOM!):
https://blog.remontti.com.br/2478
Sobre não perder as configurações do iptables ao reiniciar (reboot):
https://www.thomas-krenn.com/en/wiki/Saving_Iptables_Firewall_Rules_Permanently
Debian Firewall:
https://wiki.debian.org/DebianFirewall
Descrição dos comandos do iptables:
https://www.vivaolinux.com.br/artigo/Manual-do-IPtables-Comentarios-e-sugestoes-de-regras
Rejeitar (REJECT) ou Ignorar (DROP) pacotes no firewall?
http://www.chiark.greenend.org.uk/~peterb/network/drop-vs-reject
Um script de firewall completo para uma rede corporativa - praticamente uma obra de arte
https://sempreupdate.com.br/iptables-script-completo-para-rede-corporativa-incluindo-lan-dmz-e-filtro-de-ataques/
Em que ordem as regras são aplicadas?
O iptables lê as regras de cima para baixo. Caso a regra se encaixe para o pacote recebido, o destino do pacote é definido (rejeitado, bloqueado ou aceito).
Adicionando/Removendo
-A
-I
Connection State ~ ctstate
- NEW
Nova conexão, recém aberta. Com ela é possível saber se a conexão se iniciou fora do seu PC ou dentro do seu PC - ESTABLISHED
Se a conexão já foi estabelecida e o pacote é a continuação de um fluxo - RELATED
- INVALID
-m conntrack --ctstate NEW,ESTABLISHED
-m conntrack --ctstate INVALID
-m conntrack --ctstate NEW,ESTABLISHED,RELATED
Porta de destino
--dport 1234
Protocolo
-p tcp
-p udp
Interface de Entrada
-i lo
-i tun0
-i eth0
Interface de Saída
-o lo
-o tun0
-o eth0
Ação
-j REJECT
-j ACCEPT
-j DROP