Como Configurar um Firewall do Iptables para Permitir Acesso Remoto a Serviços no Linux – Parte 8

Linux Foundation Certified Engineer – Part 8

Apresentando o Programa de Certificação da Linux Foundation

Você se lembrará da Parte 1 – Sobre o Iptables desta série LFCE (Engenheiro Certificado pela Linux Foundation) que demos uma descrição básica do que é um firewall: um mecanismo para gerenciar pacotes que entram e saem da rede. Por “gerenciar” queremos dizer na verdade:

  1. Permitir ou impedir que certos pacotes entrem ou saiam de nossa rede.
  2. Encaminhar outros pacotes de um ponto da rede para outro.

com base em critérios predeterminados.

Neste artigo, discutiremos como implementar filtragem básica de pacotes e como configurar o firewall com o iptables, uma interface para o netfilter, que é um módulo nativo do kernel usado para firewall.

Por favor, note que firewall é um assunto vasto e este artigo não tem a intenção de ser um guia abrangente para entender tudo o que há para saber sobre isso, mas sim como um ponto de partida para um estudo mais aprofundado sobre este tópico. No entanto, revisitaremos o assunto na Parte 10 desta série quando explorarmos alguns casos de uso específicos de um firewall no Linux.

Você pode pensar em um firewall como um aeroporto internacional onde aviões de passageiros chegam e partem quase 24 horas por dia, 7 dias por semana. Com base em várias condições, como a validade do passaporte de uma pessoa, ou seu país de origem (para citar alguns exemplos), ele ou ela pode, ou não, ser autorizado a entrar ou sair de um determinado país.

Ao mesmo tempo, os oficiais do aeroporto podem instruir as pessoas a se moverem de um lugar do aeroporto para outro, se necessário, por exemplo, quando precisam passar pelos Serviços Aduaneiros.

Pode ser útil usar a analogia do aeroporto durante o restante deste tutorial. Apenas tenha em mente as seguintes relações à medida que avançamos:

  1. Pessoas = Pacotes
  2. Firewall = Aeroporto
  3. País #1 = Rede #1
  4. País #2 = Rede #2
  5. Regulamentos do aeroporto aplicados pelos oficiais = regras do firewall

Iptables – Os Conceitos Básicos

No nível mais baixo, é o próprio kernel que “decide” o que fazer com os pacotes com base em regras agrupadas em cadeias, ou “sentenças”. Essas cadeias definem quais ações devem ser tomadas quando um pacote corresponde aos critérios especificados por elas.

A primeira ação tomada pelo iptables consistirá em decidir o que fazer com um pacote:

  1. Aceitá-lo (deixá-lo passar para nossa rede)?
  2. Rejeitá-lo (impedir o acesso à nossa rede)?
  3. Encaminhá-lo (para outra cadeia)?

Apenas no caso de você estar se perguntando por que essa ferramenta é chamada de iptables, é porque essas cadeias são organizadas em tabelas, com a tabela de filtro sendo a mais conhecida e a que é usada para implementar a filtragem de pacotes com suas três cadeias padrão:

1. A cadeia INPUT lida com pacotes que entram na rede e que são destinados a programas locais.

2. A cadeia SAÍDA é usada para analisar pacotes originados na rede local, que devem ser enviados para o exterior.

3. A cadeia ENCAMINHAR processa os pacotes que devem ser encaminhados para outro destino (como no caso de um roteador).

Para cada uma dessas cadeias, há uma política padrão, que dita o que deve ser feito por padrão quando os pacotes não correspondem a nenhuma das regras na cadeia. Você pode visualizar as regras criadas para cada cadeia e a política padrão executando o seguinte comando:

# iptables -L

As políticas disponíveis são as seguintes:

  1. ACEITAR → permite a passagem do pacote. Qualquer pacote que não corresponda a nenhuma regra na cadeia é permitido na rede.
  2. DESCARTAR → descarta o pacote silenciosamente. Qualquer pacote que não corresponda a nenhuma regra na cadeia é impedido de entrar na rede.
  3. REJEITAR → rejeita o pacote e retorna uma mensagem informativa. Esta em particular não funciona como política padrão. Em vez disso, é destinada a complementar as regras de filtragem de pacotes.
Linux Iptables Policies

Ao decidir qual política implementar, é necessário considerar os prós e contras de cada abordagem conforme explicado acima – observe que não há uma solução única para todos os casos.

Adicionando Regras

Para adicionar uma regra ao firewall, invoque o comando iptables da seguinte forma:

# iptables -A chain_name criteria -j target

onde,

  1. -A significa Anexar (anexar a regra atual ao final da cadeia).
  2. nome_da_cadeia é INPUT, OUTPUT ou FORWARD.
  3. Alvo é a ação, ou política, a ser aplicada neste caso (ACEITAR, REJEITAR ou DESCARTAR).
  4. Critério é o conjunto de condições contra as quais os pacotes devem ser examinados. É composto por pelo menos uma (provavelmente mais) das seguintes bandeiras. Opções dentro de colchetes, separadas por uma barra vertical, são equivalentes entre si. O restante representa interruptores opcionais:
[--protocol | -p] protocol: specifies the protocol involved in a rule.
[--source-port | -sport] port:[port]: defines the port (or range of ports) where the packet originated.
[--destination-port | -dport] port:[port]: defines the port (or range of ports) to which the packet is destined.
[--source | -s] address[/mask]: represents the source address or network/mask.
[--destination | -d] address[/mask]: represents the destination address or network/mask.
[--state] state (preceded by -m state): manage packets depending on whether they are part of a state connection, where state can be NEW, ESTABLISHED, RELATED, or INVALID.
[--in-interface | -i] interface: specifies the input interface of the packet.
[--out-interface | -o] interface: the output interface.
[--jump | -j] target: what to do when the packet matches the rule.

Nosso Ambiente de Teste

Vamos juntar tudo isso em 3 exemplos clássicos usando o seguinte ambiente de teste para os dois primeiros:

Firewall: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
Source: CentOS 7 
Hostname: dev1.gabrielcanepa.com
IP Address: 192.168.0.17

E isso para o último exemplo

NFSv4 server and firewall: Debian Wheezy 7.5 
Hostname: debian
IP Address: 192.168.0.10
Source: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
EXEMPLO 1: Analisando a diferença entre as políticas DESCARTAR e REJEITAR

Vamos definir uma política de DESCARTAR primeiro para pings de entrada para nosso firewall. Ou seja, pacotes icmp serão descartados silenciosamente.

# ping -c 3 192.168.0.15
# iptables -A INPUT --protocol icmp --in-interface eth0 -j DROP
Drop ICMP Ping Request

Antes de prosseguir com a parte de REJEITAR, vamos limpar todas as regras da cadeia de ENTRADA para garantir que nossos pacotes serão testados por esta nova regra:

# iptables -F INPUT
# iptables -A INPUT --protocol icmp --in-interface eth0 -j REJECT
# ping -c 3 192.168.0.15
Reject ICMP Ping Request in Firewall
EXEMPLO 2: Desabilitando / reabilitando logins ssh de dev2 para dev1

Vamos lidar com a cadeia de SAÍDA pois estamos lidando com tráfego de saída:

# iptables -A OUTPUT --protocol tcp --destination-port 22 --out-interface eth0 --jump REJECT
Block SSH Login in Firewall
EXEMPLO 3: Permitindo / impedindo clientes NFS (de 192.168.0.0/24) de montar compartilhamentos NFS4

Execute os seguintes comandos no servidor / firewall NFSv4 para fechar as portas 2049 e 111 para todos os tipos de tráfego:

# iptables -F
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j REJECT
Block NFS Ports in Firewall

Agora vamos abrir essas portas e ver o que acontece.

# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j ACCEPT
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j ACCEPT
Open NFS Ports in Firewall

Como você pode ver, conseguimos montar o compartilhamento NFSv4 após abrir o tráfego.

Inserindo, Anexando e Excluindo Regras

Nas exemplos anteriores, mostramos como anexar regras às cadeias INPUT e OUTPUT. Se quisermos inseri-los em uma posição predefinida, devemos usar o interruptor -I (i maiúsculo) em vez disso.

Você precisa lembrar que as regras serão avaliadas uma após a outra, e a avaliação para (ou salta) quando uma política DROP ou ACCEPT é correspondida. Por esse motivo, você pode se encontrar na necessidade de mover regras para cima ou para baixo na lista de cadeias conforme necessário.

Vamos usar um exemplo trivial para demonstrar isso:

Check Rules of Iptables Firewall

Vamos colocar a seguinte regra,

# iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT

na posição 2) na cadeia INPUT (movendo assim o anterior #2 como #3)

Iptables Accept Rule

Usando a configuração acima, o tráfego será verificado para ver se está direcionado para a porta 80 antes de verificar a porta 2049.

Alternativamente, você pode excluir uma regra e alterar o destino das regras restantes para REJECT (usando o interruptor -R</diy16):

# iptables -D INPUT 1
# iptables -nL -v --line-numbers
# iptables -R INPUT 2 -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
# iptables -R INPUT 1 -p tcp --dport 80 -j REJECT
Iptables Drop Rule

Por último, mas não menos importante, você precisará lembrar que, para que as regras do firewall sejam persistentes, você precisará salvá-las em um arquivo e depois restaurá-las automaticamente durante a inicialização (usando o método preferido de sua escolha ou o disponível para sua distribuição).

Salvando regras do firewall:

# iptables-save > /etc/iptables/rules.v4		[On Ubuntu]
# iptables-save > /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

Restaurando regras:

# iptables-restore < /etc/iptables/rules.v4		[On Ubuntu]
# iptables-restore < /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

Aqui podemos ver um procedimento semelhante (salvando e restaurando regras do firewall manualmente) usando um arquivo fictício chamado iptables.dump em vez do padrão mostrado acima.

# iptables-save > iptables.dump
Dump Linux Iptables

Para tornar essas alterações persistentes através das inicializações:

Ubuntu: Instale o pacote iptables-persistent, que carregará as regras salvas no arquivo /etc/iptables/rules.v4.

# apt-get install iptables-persistent

CentOS: Adicione as seguintes 2 linhas ao arquivo /etc/sysconfig/iptables-config.

IPTABLES_SAVE_ON_STOP="yes"
IPTABLES_SAVE_ON_RESTART="yes"

OpenSUSE: Liste as portas permitidas, protocolos, endereços, e assim por diante (separados por vírgulas) no arquivo /etc/sysconfig/SuSEfirewall2.

Para mais informações, consulte o próprio arquivo, que está fortemente comentado.

Conclusão

Os exemplos fornecidos neste artigo, embora não cubram todos os recursos do iptables, servem para ilustrar como habilitar e desabilitar o tráfego de entrada ou saída.

Para aqueles que são fãs de firewall, tenham em mente que revisaremos esse tópico com aplicações mais específicas na Parte 10 desta série LFCE.

Sinta-se à vontade para me informar se tiver alguma dúvida ou comentário.

Source:
https://www.tecmint.com/configure-iptables-firewall/