O que é o firewall ferm baseado em iptables do Linux e como configurá-lo

In Linuxbaseados em sistemas operacionais, o firewall por excelência que você usa é o iptables, porém, também é possível que você use nftables, que é a evolução do iptables, muito mais eficiente e com uma sintaxe muito mais “humana”, porém nem todo mundo ainda usa nftables. Hoje vamos explicar como configurar um firewall em servidores Linux usando Ferm (For Easy Rule Making), um frontend iptables que nos permitirá adicionar regras ao firewall de forma muito fácil, rápida e simples, sem ter que aprender a sintaxe de iptables.

O que é o firewall Ferm e para que serve?

O que é o firewall ferm baseado em iptables do Linux

Ferm (For Easy Rule Making) é um frontend do iptables, isso significa que, no fundo, ele está realmente usando iptables para permitir ou negar tráfego, mas nos permite configurar o firewall de uma forma muito avançada sem ter que aprender a sintaxe do iptables ou fazer scripts diferentes usando iptables, mas faremos isso diretamente com Ferm. Esta ferramenta é capaz de ler as regras de um arquivo de configuração que vamos definir, para depois “chamar” o iptables para adicionar as diferentes regras uma a uma, inserindo-as em tempo real no kernel.

O objetivo de Ferm é fornecer aos administradores de sistema e rede uma maneira fácil de ler e escrever todas as regras de firewall, reduzindo a tarefa de ter que escrever uma regra após a outra, para que possamos gastar mais tempo desenvolvendo e otimizando as regras, para torná-las o mais eficiente possível. Ferm usa uma linguagem de configuração muito simples, mas bastante avançada, podemos usar variáveis, funções, arrays e até blocos. Outra opção muito interessante do Ferm é que nos permitirá incluir outros arquivos de configuração em um diretório, e se encarregará de importar e aplicar todas essas regras automaticamente.

Ferm ainda é um frontend iptables, portanto, quando usarmos esta ferramenta, sempre poderemos editar e configurar diretamente o firewall usando os comandos iptables. Na verdade, o Ferm é capaz de importar as regras atuais do iptables e colocá-las automaticamente no arquivo de configuração, para posteriormente editá-las ou expandi-las.

Um dos front-end de iptables mais populares é o ufw, amplamente usado por administradores de sistema e rede para configurar seus firewalls de maneira fácil e rápida.

Instalação e comissionamento de Ferm

A instalação do Ferm é realmente simples, atualmente está na maioria dos repositórios das diferentes distribuições baseadas em Linux, no nosso caso usamos a última versão do Debian para realizar todos os testes que vamos ensinar a você. Para instalar este programa, que é um frontend iptables, devemos executar o seguinte comando:

sudo apt install ferm

Assim que executarmos este comando, devemos ver algo como isto, onde nos serão mostrados os pacotes adicionais que temos que instalar, basicamente temos que instalar o Perl para poder rodar este programa corretamente.

O instalador do Ferm nos dirá que carregará as regras do firewall durante a inicialização a partir do caminho /etc/ferm/ferm.conf, ou seja, tudo neste arquivo será automaticamente passado para o iptables para permitir ou negar o tráfego da rede. A configuração padrão deste firewall nos permite ter acesso por SSH remotamente através da porta 22, se você não tiver o SSH configurado nesta porta, então terá que editar os valores padrão e clicar em “não” para que não inicie , caso contrário, você perderá a conectividade.

Uma vez que tenhamos escolhido sim ou não, o apt terminará de instalar todos os pacotes adicionais que precisamos para fazer este programa funcionar.

Uma vez instalado, podemos ir para o caminho / etc / ferm / e veremos o arquivo de configuração chamado ferm.conf, bem como um diretório chamado ferm.d onde podemos incorporar nossos arquivos de configuração ferm para importá-los, isso permite nós temos maior modularidade.

O Ferm já vem por padrão com uma lista de regras que podemos remover a qualquer momento, mas isso vai nos ajudar a lidar com a sintaxe desse frontend iptables, portanto, será bastante útil. Se olharmos a sintaxe, veremos que é semelhante ao nftables, mas é baseado em iptables.

Na imagem a seguir você pode ver como estão declarados os domínios onde vai ser configurado (iptables ou ip6tables), as tabelas e as chains, bem como as regras que temos dentro das diferentes chains.

Também podemos ver que temos várias regras por padrão:

  • Na cadeia INPUT, a política é DROP, o tráfego localhost é permitido, o tráfego ICMP e a conexão é permitida via IPsec e também via SSH com as portas padrão. Quanto ao estado das conexões, as conexões inválidas são DROPED, e as estabelecidas e relacionadas são permitidas, mas as novas não são permitidas, exceto aquelas especificamente definidas.

Na cadeia OUTPUT está definido que a política é aceitar tudo, e o estado da conexão permite que sejam estabelecidas e relacionadas. Na cadeia FORWARD, o tráfego é negado pela política, as conexões inválidas são especificamente bloqueadas, mas as conexões estabelecidas e relacionadas são permitidas.

A seguir, você pode ver este arquivo de configuração em formato de texto:

# -*- shell-script -*-
#
# Configuration file for ferm(1).
#
domain (ip ip6) {
table filter {
chain INPUT {
policy DROP;

# rastreamento de conexão
mod estado estado INVALID DROP;
estado do mod estado (ESTABLISHED RELACIONATED) ACEITAR;

# permitir pacote local
interface o que ACEITO;

# responder ao ping
proto icmp ACEITAR;

# permitir IPsec
proto udp dport 500 ACEITAR;
@if @eq ($ DOMÍNIO, ip) {
proto (esp ah) ACEITAR;
} @outro {
proto (esp) ACEITAR;
}

# permitir conexões SSH
proto tcp dport ssh ACEITAR;
}
corrente OUTPUT {
política ACEITAR;

# rastreamento de conexão
#mod estado estado INVALID DROP;
estado do mod estado (ESTABLISHED RELACIONATED) ACEITAR;
}
corrente FORWARD {
política DROP;

# rastreamento de conexão
mod estado estado INVALID DROP;
estado do mod estado (ESTABLISHED RELACIONATED) ACEITAR;
}
}
}

@include ferm.d/;

O mais interessante é o “@include ferm.d /” que temos na parte final, isto significa que irá importar todos os arquivos de configuração que temos nesse diretório em questão.

Este firewall Ferm abaixo usa iptables, portanto, se executarmos o seguinte comando:

iptables -L

Podemos ver o estado atual do iptables com todas as regras que ele incorporou ao firewall:

Depois de ver a configuração padrão do Ferm, veremos diferentes exemplos de configuração que podemos fazer.

Configuração Básica Ferm

A sintaxe de Ferm é muito simples e flexível, mas devemos aprendê-la para fazer uma configuração correta. Recomendamos que você acesse o manual oficial do Ferm onde você encontrará todos os detalhes sobre a sintaxe a ser usada e como as diferentes regras devem ser declaradas no arquivo de configuração, graças a este manual oficial podemos configurar este firewall sem muitos problemas.

A primeira coisa a ter em mente é que todas as regras de Ferm começam e terminam com colchetes, e as regras terminam com um ponto-e-vírgula, portanto, é uma sintaxe bem conhecida em programação. Outros recursos interessantes são que as quebras de linha são ignoradas e você pode colocar comentários em qualquer lugar colocando “#” no final da linha.

Em relação à sintaxe de iptables e ferm, temos algumas diferenças:

  • Para definir a interface de entrada: interface (se)
  • Para definir a interface de saída: outerface (de)
  • Para definir uma origem: saddr
  • Para definir um destino: daddr
  • Para definir um protocolo: proto
  • Porto de origem: esporte
  • Porta de destino: dport
  • Carregue um módulo: mod
  • Pule para uma regra personalizada: pule

No Ferm não existem comandos como -A, -I, -C, -R ou -D, já que tudo está escrito em um arquivo de configuração, o mesmo acontece com os comandos para adicionar uma nova string, renomeá-la ou excluí-la, agora aqui desaparece completamente. Outros recursos são que o ferm permite que você herde regras diferentes para serem usadas em outras regras, aninhando no arquivo de configuração.

Uma vez que saibamos aproximadamente como é a sintaxe, veremos alguns exemplos comparando-a com o iptables, em todos eles trabalharemos na tabela «filter» na cadeia «INPUT».

iptables -P INPUT ACCEPT
iptables -A INPUT -p tcp -j ACCEPT

Em ferm, isso seria escrito da seguinte forma (adicionando a política da cadeia OUTPUT e FORWARD da tabela de filtros):

domain ip {
table filter {
chain INPUT {
policy DROP;
proto tcp ACCEPT;
}
chain OUTPUT {
policy ACCEPT;
}
chain FORWARD {
policy DROP;
}
}
}

O Ferm nos permite definir as mesmas regras no INPUT e OUTPUT de forma fácil e rápida, sem a necessidade de repetir as regras indefinidamente. Por exemplo, vamos imaginar que agora queremos aceitar o protocolo TCP tanto na cadeia INPUT quanto na cadeia OUTPUT, isso em iptables seria o seguinte:

iptables -A INPUT -p tcp -j ACCEPT
iptables -A OUTPUT -p tcp -j ACCEPT
iptables -A INPUT -p udp -j ACCEPT
iptables -A OUTPUT -p udp -j ACCEPT

Com Ferm, é tão simples quanto fazer o seguinte:

domain ip {
table filter {
chain (INPUT OUTPUT) {
proto (udp tcp) ACCEPT;
}
}

Como você pode ver, é muito mais rápido e fácil aplicar essa mesma regra tanto para INPUT quanto para OUTPUT.

Este firewall também incorpora funções muito interessantes, por exemplo, podemos verificar se uma variável ou função está definida, podemos verificar se dois valores são iguais ou diferentes, negar um valor booleano, resolver domínios diretamente do Ferm, concatenar parâmetros e um longo lista de funções.

O Ferm também permite “carregar” os módulos iptables para utilizá-los, e configurar o firewall de forma avançada, por exemplo, temos o seguinte:

mod connlimit connlimit-above 4 connlimit-mask 24 REJECT;

Isso podemos colocar em todo o arquivo de configuração.

Para aplicar as regras introduzidas no Ferm, teremos que executar o seguinte comando:

ferm -i -t 10 /etc/ferm/ferm.conf

Importar regras de iptables para Ferm

O Ferm nos permite importar de forma fácil e rápida as regras de iptables que temos atualmente em execução, em um arquivo Ferm para posterior modificação. Para poder fazer isso, simplesmente teremos que ter as regras iptables carregadas na memória (atualmente em uso) e executar este comando:

import-ferm > /etc/ferm/ferm.d/reglas-iptables.conf

Quando o executamos, podemos ver as regras do iptables diretamente na sintaxe de Ferm.

Se quiser transformar as regras de iptables que você tem em um arquivo de texto em Ferm, você pode executar o seguinte comando:

import-ferm origen de las reglas de iptables > /etc/ferm/ferm.d/reglas-iptables.conf

Como você viu, ferm é um ótimo frontend do iptables que nos permitirá configurá-lo de forma avançada, sem ter que aprender a sintaxe do iptables e organizar as regras corretamente em um arquivo de configuração. No entanto, em nossa opinião, acreditamos que configurar um script bash com todas as regras do iptables corretamente não requer nenhum frontend ou software adicional, embora possa ser útil para algumas pessoas. Devemos lembrar que o Nftables já incorpora a possibilidade de configurar as regras diretamente em um arquivo de configuração, e não apenas de forma interativa através de comandos de console.