Firewall no Linux com IPTABLES

Este guia não pretende ser definitivo, ele somente é utilizado para fins de ensino. Qualquer configuração adicional é bom olhar no próprio manual que acompanha o software.

Versão original do guia: 07/11/2007

Considerações

  • Os testes para configuração e utilização foram feitos utilizando a distribuição Suse Linux (versão 8.0) e no Red Hat Linux (versão 8.0)
  • Literatura recomendada: Firewalls em Linux. Antonio Marcelo. Editora Brasport.

Conceito de Firewall

Um firewall é um sistema (ou grupo de sistemas) que reforçam a norma de segurança entre uma rede interna segura e uma rede não-confiável como a Internet. Os firewalls tendem a serem vistos como uma proteção entre a Internet e a rede privada. Mas em geral, um firewall deveria ser considerado como um meio de dividir o mundo em duas ou mais redes: uma ou mais redes seguras e uma ou mais redes não-seguras.

Um firewall pode ser um PC, um roteador, um computador de tamanho intermediário, um mainframe, uma estação de trabalho UNIX ou a combinação destes que determine qual informação ou serviços podem ser acessados de fora e a quem é permitido usar a informação e os serviços de fora. Geralmente, um firewall é instalado no ponto onde a rede interne segura e a rede externa não-confiável se encontram, ponto que também é conhecido como ponto de estangulamento.

A fim de entender como um firewall funciona, considere que a rede seja um edifício onde o acesso deva ser controlado. O edifício tem uma sala de espera como o único ponto de entrada. Nesta sala de espera, as recepcionistas recebem os visitantes, os guardas de segurança observam os visitantes, as câmeras de vídeo gravam as ações de cada visitante e leitores de sinais autenticam os visitantes que entram no edifício.

Estes procedimentos devem funcionar bem para controlar o acesso ao edifício, contudo se uma pessoa não autorizada consegue entrar, não há meio de proteger o edifício contra as ações do intruso. Porém, se os movimentos do intruso são monitorados, é possível detectar qualquer atividade suspeita.

Um firewall é projetado para proteger as fontes de informação de uma organização, controlando o acesso entre a rede interna segura e a rede externa não-confiável. É importante notar que mesmo se o firewall tiver sido projetado para permitir que dados confiáveis passem, negar serviços vulneráveis e proteger a rede interna contra ataques externos, um ataque recém-criado pode penetrar o firewall a qualquer hora. O administrador da rede deve examinar regularmente os registros de eventos e alarmes gerados pelo firewall.

Os firewalls podem ser dividos em duas grandes classes: Filtros de pacote e servidores proxy.

Filtros de Pacotes
A filtragem de pacotes é um dos principais mecanismos que, mediante regras definidas pelo administrador em um firewall, permite ou não a passagem de datagramas IP em uma rede. Poderíamos filtrar pacotes para impedir o acesso a um serviço de Telnet, um chat ou mesmo um site na Internet.

O modelo mais simples de firewall é conhecido como o dual homed system, ou seja, um sistema que interliga duas redes distintas. Este sistema possui um servidor com duas placas de rede que faz com que os usuários possam falar entre si. O exemplo clássico é um firewall entre uma Intranet e a Internet.

dual homed system

Servidores Proxy
Permite executar a conexão ou não a serviços em uma rede modo indireto. Normalmente os proxies são utilizados como caches de conexão para serviços Web. Um proxy é utilizado em muitos casos como elemento de aceleração de conexão em links lentos.

servidor proxy

Entendendo a Necessidade do Firewall
Independente de você estar implementando um filtro de pacotes ou um servidor proxy, o firewall fornece diversos serviços. As funções firewall mais essenciais no Linux são:

  • Conservação de endereço IP e encaminhamento de tráfego – Muitos firewalls agem primeiro como roteadores de modo que várias redes possam se comunicar entre si. Muitos administradores de rede somente utilizam esta função para ajudar a criar subredes adicionais. Este recurso é incluído como um elemento de firewall somente porque ele é conseguido com a utilização de IPCHAINS (kernel 2.2) e IPTABLES (kernel 2.4). Assim qualquer um com apenas um endereço IP pode ser capaz de criar uma rede local (LAN) ou rede remota (WAN) com acesso total à Internet. Entretanto um firewall não tem necessariamente que fornecer o serviço de NAT (Network Address Translation). Mesmo assim, muitos firewalls permitem que você utilize este recurso;
  • Distinção de rede – Um firewall é o meio principal de criar uma borda entre a sua rede e quaisquer outras redes. Como ele criar uma clara distinção entre as redes, o firewall ajuda a administrar o tráfego. O firewall não tem que necessariamente ser instalado entre uma rede privada confiável e a Internet. Muitas vezes, o firewall é instalado dentro de uma rede corporativa para diferenciar ainda mais certas áreas da empresa do restante da rede;
  • Proteção contra ataques denial-of-service (DoS) ou negação de serviços, análises e farejadores (sniffers) – Um firewall funciona como um ponto único que monitora o tráfego de entrada e de saída. É possível para este firewall limitar qualquer tipo de tráfego que você desejar;
  • Filtragem de IP e de portas – A capacidade de permitir ou rejeitas uma conexão baseada no endereço IP e na porta. Este tipo de filtragem é provavelmente a função mais bem entendida de um firewall. De uma forma geral, este tipo de filtragem é geralmente feito por filtros de pacotes. A filtragem de pacotes pode se tornar bastante complexa, pois você deve sempre considerar que o tráfego pode ser filtrado de acordo com a origem ou o destino do pacote. Por exemplo, um filtro de pacotes pode bloquear o tráfego que chega à sua rede vindo de um determinado endereço IP e uma determinada porta;
  • Filtragem de conteúdo – Os servidores proxy são geralmente os únicos tipos de firewall que administram e controlam o tráfego através da inspeção de URL e conteúdo de página. Se configurado corretamente, um firewall baseado em proxy é capaz de identificar e bloquear todo o conteúdo que você considere impróprio;
  • Redirecionamento de pacotes – Algumas vezes, é preciso que um firewall envie o tráfego para outra porta ou outro servidor. Por exemplo, suponha que você tenha instalado o servidor proxy Squid em um servidor separado do seu firewall. É possível que você configure o seu firewall para encaminhar automaticamente todo o tráfego enviado às portas 80 (HTTP) e 443 (HTTPS) para o seu servidor proxy.
  • Autenticação e criptografia mais fortes – Um firewall é capaz de autenticar usuários e criptografar transmissões entre ele mesmo e o firewall de uma outra rede.
  • Registros complementares – Um dos benefícios mais importantes (mas ignorado) de um firewall é que ele permite examinar todos os detalhes dos pacotes de rede que passam por ele. Você pode descobrir se está para sofrer (ou já sofreu) um ataque, basta verificar se existem análises de portas e vários tipos de conexão ao seu sistema.

COMO PROGER O FIREWALL
Um dos benefícios de ter um firewall é que ele proporciona um ponto único para processar tráfego de entrada e saída. Contudo, considere que um firewall também pode fornecer um ponto central de ataque ou falhas. Ele informa ao hacker que há uma série de redes por trás dele. Se o hacker conseguir derrotar este único firewall, toda a rede ficará aberta ao ataque. Além disso, se o hacker, de alguma maneira, for capaz de desativar o servidor, toda a rede será recusada por todos os serviços de Internet. É importante que você tome medidas que protejam o seu firewall.

Algumas coisas que podem ser feitas:

  1. Limite o acesso ao roteador e o firewall apenas para login interativo e proteja o sistema fisicamente. Assim, seu firewall estará muito menos suscetível a ataques remotos. Ainda assim, é possível que ocorram problemas no kernel (estouros de buffer ou buffer overflow e outros problemas de programação). Tais problemas podem levar ao comprometimento do sistema, mesmo que você não tenha outros serviços rodando;
  2. Se for necessário o acesso remoto, analise a possibilidade de usar o acesso somente através do SSH (Secure Shell). Devidamente configurado para utilizar chaves públicas na autenticação. Embora o SSH não seja imune às ameaças de segurança, é uma das ferramentas de administração remota mais populares e seguras para servidores;
  3. Crie um servidor de segurança – Se o seu servidor entrar em pane devido a um ataque, ou simplesmente por causa de uma falha em disco rígido, você deverá ter um sistema idêntico disponível para substituí-lo;
  4. Monitore o servidor – Use um aplicativo IDS (Intrusion Detection System) para ouvir as conexões feitas no seu roteador. Geralmente, o melhor é instalar um aplicativo IDS em um servidor independente na rede. Isto se chama monitoramente passivo, porque o servidor remoto não consome os recursos de sistema do firewall. O aplicativo IDS pode, por exemplo, enviar um ping aleatório ao firewall para saber dele está ativo, e pode então informar se o servidor estiver parado.
  5. Fique atento aos relatórios e informativos sobre bugs relacionados ao firewall e ao sistema operacional. Manter-se atualizado sobre tais alterações ajudará a atualar rapidamente seu sistema, caso um problema seja descoberto.

IPTABLES


O iptables ̩ o firewall padṛo do Kernel 2.4.x (quando este guia estava sendo escrito, a verṣo do kernel era 2.4.19 Рvoc̻ pode baixar a novas vers̵es do Kernel do Linux no site The Linux Kernel Archives).

A sintaxe genérica usada pelo comando iptables é:

iptables comando regras extensões

  • -A cadeia – Anexa regras ao final de uma cadeia. Se um nome de host é fornecido, como fonte ou como destino, uma regra é adicionada para cada IP relacionado a este host.
  • -D cadeia – Apaga uma ou mais regras da cadeia especificada
  • -D cadeia regra_num – Apaga a regra residente na posição indicada por regra_num da cadeia especificada. A primeira regra na cadeia é a de número 1.
  • -R cadeia regra_num – Substituí a regra regra_num da cadeia especificada pela regra dada
  • -I cadeia regra_num – Insere uma ou mais regras no começo da cadeia. Se um nome de host é fornecido, como fonte ou como destino, uma regra é adicionada para cada IP relacionado a este host.
  • -L [cadeia] – Lista todas as regras em uma cadeia. Caso não haja nenhuma cadeia especificada, todas as regras em todas as cadeias são listadas.
  • -F [cadeia] – Remove todas as regras de uma cadeia. Se nenhuma cadeia for especificada, remove as regras de todas as cadeias existentes, inclusive as do usuário.
  • -Z [cadeia] – Restaura os contadores de datagramas e de bytes em todas as regras das cadeias especificadas para zero, ou para todas as cadeias se nenhuma for especificada.
  • -N cadeia – Cria uma cadeia definida pelo usuário com o nome especificado.
  • -X [cadeia] – Apaga a cadeia definida pelo usuário ou todas se não for especificada uma.
  • -C cadeia – Verifica o datagrama descrito pela regra especificada contra a cadeia especificada. Este comando retorna uma mensagem descrevendo como a cadeia processou o datagrama. Isto é muito útil para testar a configuracão do firewall, e para uma análise posterior.
  • -P cadeia política – Define a política padrão para uma cadeia dentro de uma política especificada. As políticas válidas: ACCEPT, DROP, QUEUE e RETURN. ACCEPT permite a passagem do datagrama. DROP descarta o datagrama. QUEUE passa o datagrama para área do usuário para posterior processamento. RETURN força o código do firewall a retornar para a cadeia anterior e continua o processamento na regra seguinte à que retornou.

Regras
As seguintes regras podem ser usadas:

  • -p[!] Protocol – Define o protocolo ao qual a regra se aplica. O parâmetro protocol pode ser qualquer valor numérico do arquivo /etc/protocol ou uma das palavras chave: tcp,udp ou icmp
  • -s [!] addres[/mask] – Define a origem do pacote ao qual a regra se aplica. O parâmetro address pode ser um nome de host, um nome de rede ou um endereço IP com uma máscara de rede opcional.
  • -d [!] address[/mask] – Define o destino do pacote ao qual a regra se aplica. O endereço e a porta são definidos usando-se as mesmas regras utilizadas para definir esses valores para a origem do pacote.
  • -j alvo – Define um alvo para o pacote caso ele se encaixe nesta regra. Os alvos possíveis são ACCEPT, DROP, QUEUE ou RETURN. É possível especificar uma cadeia do usuário. Também é possível especificar uma extensão.
  • -i [!] interface_name – Define o nome da interface por onde o datagrama foi recebido. Um nome de interface parcial pode ser usado encerrando-o com um sinal de “+”; por exemplo, eth+ corresponderia a todas as interfaces Ethernet iniciadas com eth.
  • -o [!] interface_name – Define o nome da interface por onde o datagrama será transmitido.
  • [!] -f – Indica que a regra somente se refere ao segundo fragmento e aos subseqüentes de pacotes fragamentados.

Observação: O símbolo “!” é usado na regras como uma negação da expressão. Exemplo: -s 192.168.0.10/32 equivale ao endereço de origem 192.168.0.10, -s !192.168.0.10/32 equivale a todos os endereços exceto o 192.168.0.10.

Opções

  • -v – Saída em modo verbose. Mais rico em termos de detalhes sobre o que está acontecendo ou sendo feito.
  • -n – Saída em modo numérico e não por nome de host, rede ou porta.
  • -x – Exibe o valor exato do pacote e dos contadores de bytes em vez de arrendondá-los para o milhar, milhão ou bilhão mais próximo.
  • –line-numbers – Quando lista as regras, adiciona um número de linha ao começo de cada regra, correspondendo à posição da regra dentro da cadeia.

Extensões

O utilitário iptables é extensível através de uma biblioteca de módulos compartilhados opcionais. Para fazer uso das extensões é preciso especificar o seu nome usando o parâmetro -m [argumento] para o que o iptables carregue este módulo.

Em alguns casos é usuado o parâmetro -p para determinar o protocolo (em certos casos não é necessário o parâmetro -m pois ele é carregado automaticamente, por exemplo quando se usa tcp, udp ou icmp).

Extensão TCP: usada com -m tcp -p tcp

  • –sport [!] [port[:port]] – Especifica a porta que a origem do datagrama usa. Portas podem ser especificadas com um conjunto especificando-se o seu limite superior e inferior separados por dois pontos (:). Por exemplo, 20:25 descreve todas as portas numeradas de 20 até 25 inclusive. Também é possível usar o caracter “!” para inverter a expressão.
  • –dport [!] [port[:port]] – Especifica a porta que o destino do datagrama usa.
  • –tcp-flags [!] mask comp – Especifica que esta regra somente será validada quando os flags do datagrama TCP coincidirem com o especificado em mask e comp. Mask é uma lista separada por vírgulas dos flags que devem ser examinados quando for feito o teste. Comp é uma lista separada por vírgulas dos flas que devem ser configurados. Os flags válidos são: SYN, ACK, FIN, RST, URG, PSH, ALL ou NONE.
  • –syn – Especifica que a regre deve encontrar somente datagramas com o bit SYN ligado e os bits ACK e FIN desligados. Datagramas com essas opções são usados para requisitar início de conexão TCP.

Extensão UDP: usada com -m udp -p udp

  • –sport[!][port[:port]] – Este parâmetro tem funcionamento idêntico ao da extensão TCP.
  • –dport[!][port[:port]] – Este parâmetro tem funcionamento idêntico ao da extensão TCP.

Extensão ICMP: usada com -m icmp -p icmp

–icmp-type [!] typername – Especifica o tipo de mensagem ICMP que a regra deve satisfazer. O tipo pode ser determinado por um número ou nome. Alguns nomes válidos são: echo-request, echo-reply, source-quench, time-exceeded, destionation-unreachable, network-unreachable, host-unreanchable, protocol-unreachable e port-unreachable.

Extensão MAC: usada com -m mac
–mac-source [!] address – Especifica o endereço Ethernet do host que transmitiu o datagrama que esta regra deve encontrar.

Dispositivos de Rede Importantes no Linux

  • ethX – Dispositivo de rede utilizado para as placas padrão ethernet. Normalmente a primeira placa conectada no host é eth0, a segunda eth1 e assim sucessivamente.
  • lo – Dispositivo de loopback, utilizando para testes do TCP/IP. Normalmente quando aparece somente este dispositivo, significa que a parte física da rede não está ativa.
  • pppX – A interface ppp, normalmente é ativa no momento de uma conexão PPP (point-to-point protocol) via modem no sistema recebe o dispositivo ppp0, a segunda ppp1, e assim sucessivamente. Para verificar sua existência é necessário que uma conexão PPP esteja estabelecida.

Alguns Exemplos de Utilização

Para facilitar na criação das regras (principalmente para saber quando utilizamos -s ou -d), podemos utilizar as seguintes dicas:


Proteção contra IP Spoofing – O IP Spoofing é uma técnica de forjar endereços IP falsos para executar ataques a uma máquina na web. Geralmente utilizam-se IP falsos nas redes 10.0.0.0, 172.16.0.0 e 192.168.0.0. Para bloquear estes endereços:

Para máquinas com interface de rede:

# iptables -A INPUT -s 10.0.0.0/8 -i eth0 -j DROP
# iptables -A INPUT -s 172.16.0.0/8 -i eth0 -j DROP
# iptables -A INPUT -s 192.168.0.0/8 -i eth0 -j DROP

Para máquinas com interface com modens ADSL:

# iptables -A INPUT -s 10.0.0.0/8 -i ppp0 -j DROP
# iptables -A INPUT -s 172.16.0.0/8 -i ppp0 -j DROP
# iptables -A INPUT -s 192.168.0.0/8 -i ppp0 -j DROP

Para garantir a navegação do nosso equipamento:
# iptables -A INPUT -m state -state RELATED, ESTABLISHED -j ACCEPT

Sem este comando, a estação não navegaria. O módulo ip_conntrack permite especificar regras de acordo com o estado da conexão do pacote. Isto é feito através do parâmetro -state.

  • NEW – Confere os pacotes que estabelecem novas conexões.
  • ESTABLISHED – Confere os pacotes com conexões já estabelecidas.
  • RELATED – Confere com pacotes relacionados indiretamente a uma conexão, como mensagens de erro.
  • INVALID – Confere com pacotes que não puderem ser identificados por algum motivo. Como respostas de conexão desconhecidas.

Registrar conexões a portas não autorizadas – É importante sabermos quando estamos sendo monitorados, a fim de prever e se defender de possíveis ataques. Para isso podemos fazer com que o iptables registre no messages do Linux tentativas de conexão a portas bloqueadas no sistemas.

# iptables -A INPUT -s 0.0.0.0/0 -i eth0 -j LOG -log-prefix “Conexão proibida”

Se quisermos fechar algumas portas especificamente:
# iptables -A INPUT -p tcp -dport 21 -j LOG -log-prefix “Serviço: ftp”
# iptables -A INPUT -p tcp -dport 23 -j LOG -log-prefix “Serviço:telnet”

O tamanho da mensagem para o parâmetro -log-prefix é de 64 caracteres.

Filtrar mensagem echo-request do ping ou traceroute – Através do comando ping, podemos descobrir qual o sistema operacional está executando num servidor. De posse desta informação, é possível programas ataques e explorações direcionados para este sistema. Caso não queiramos que alguém execute um ping na nossa máquina.

# iptables -A INPUT -p icmp -icmp-type echo-request -j DROP

Considerações Finais
A utilização de um firewall é muito importante, mesmo em máquinas para acessos doméstico. Crie a sua seqüência de regras e salve em arquivo para ser inicializado sempre que você for acessar a internet. Coloque no processo de boot da máquina, dentro do arquivo /etc/rc.d/rc.local e não se esqueça de liberar o acesso de execução do arquivo (chmod 755 nomedoscript).

7 respostas a Firewall no Linux com IPTABLES

  1. Olá.
    Gostaria de comentar que o firewall baseado em IPtables não é uma proteção suficiente. Imagine o seguinte caso: uma recepcionista em uma empresa recebe um e-mail comentando que o CPF dela vai ser cancelado. Para evitar isto ela tem que clicar em um link. Todos nos sabemos que a possibilidade dela fazer isto é grande e sabemos no que vai dar, certo?
    O firewall baseado em IP tables irá bloquear as conexões de fora para dentro, por exemplo. Mas é quase impossível gerenciar todas as conexões indesejadas de dentro para fora como esta da recepcionista.

    Com um Next Generation Firewall há diversas análises e bloqueios adicionais que podem evitar isto. Por exemplo, quando o e-mail passar pelo Next Generation Firewall este o analisará e identificará um link que aponta para um site já catalogado como spyware. Neste caso o link é removido do e-mail e o ataque não consegue prosseguir.

    Este é só um exemplo. Se você quer saber mais recomendo acessar para saber mais

  2. Samara disse:

    Ótimo.

  3. Isadora Riul disse:

    Incŕivel.. Muito bom o conteúdo desse post. Vai me ajudar bastante, obrigadaa =3

  4. Tiago Guimaraes disse:

    PARABÉNS pelo material que nos disponibilizou fico muito agradecido, ótimo conteúdo.

  5. Eduardo Uda disse:

    Oi! Muito bom o teu artigo! Olha só, fiquei com uma dúvida. Tem como eu mascarar um ip fixo que entra no firewall e mudá-lo de forma que a conexão pptp identifique coneções diferentes?

  6. Eduardo Seixas disse:

    Realmente algo muito bom nesse manual. Qualquer um aprende com os exemplos. Parabéns

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *