Faça uma pergunta »

Linux - Instalação de um Firewall

Setembro 2015


Instalação de um Firewall no Linux



Prefácio


Não se arrisque a tentar o que eu descrevo aqui, se você tiver tarefas importantes em andamento. Alguns comandos descritos aqui podem bloquear certos aplicativos no seu computador durante a sessão. Talvez você não saiba como voltar atrás. Além disso, se você já tem um firewall em sua máquina, os scripts abaixo poderiam desregular as regras do firewall que você estabeleceu. Então, cuidado...
O mesmo vale se você tem uma rede local (LAN) em casa, alguns scripts podem bloquear as conexões.

O script aqui mencionado refere-se a um único computador, não conectado a uma LAN .

Existem várias formas de configurar um firewall no Linux.

Iptables


A maior parte do tempo, existe uma ferramenta integrada no Linux, é o "iptables" (para kernel 2.4 e 2.6).

Sua administração é feita em linha de comando e na raiz.

Introdução


Em primeiro lugar, é preciso entender o conceito de tabelas e chains no iptables. Imagine que você possui três mesas na sua sala de jantar. Em cada um delas, você tem os mapas das estradas de suas conexões.
A partir daí, você decidirá que caminhos elas deverão tomar. Comecemos pela descrição de cada tabela:
  • A tabela NAT. Ele não nos interessa aqui. Ela é usada para o roteamento (masquerading), é uma espécie de mapa que permite definir os desvios para certas conexões, indicar o caminho a ser tomado, alterar o seu destino ou sua origem. Ela também é usada para a famosa "Partilha de conexão Internet".
  • A tabela MANGLE. Raramente usada porque se refere aos recursos avançados de firewall. Em geral, diz-se que esta tabela diz respeito à alteração dos pacotes. Ela permite "marcar" os pacotes ou modificar o seu cabeçalho no objetivo de um roteamento avançado entre várias interfaces, gerenciamento de largura de banda e/ou por serviços (estilo ToS, QoS ou iproute).
  • A tabela FILTER. Esta é a que nos interessa. Ela permite dizer o que pode acontecer e o que não acontecerá em qualquer lugar.

Toda vez que usarmos um script "iptables" aqui, vamos recorrer a esta tabela, desta maneira:
iptables -t filter

Com -t de tabela. Filter é a tabela padrão, caso você não especifique nada no iptables. Assim sendo, basta escrever "iptables", abreviado se quiser mas, ao menos você adquirirá bons hábitos e evitará confusões, se usar outras tabelas no futuro.

Em seguida, vêm as chains . São uma espécie, de grandes eixos do seu mapa da tabela filter. Há três:

O chain INPUT. Este é o eixo principal das conexões que entram em sua máquina, as que vêm de fora.
O chain OUTPUT. É o eixo das conexões de saída, geradas em sua máquina. Simplesmente, quando você se conecta a um site, a conexão começa com um pedido de saída de sua casa para ir para o site.

O chain FORWARD, para as conexões que serão roteadas, ou seja, as conexões que você pediu para desviar.

Ao invocar um ou outro chain, proceda com este modelo:
iptables -t <tabela> -Ação <chain>

A tabela é o filter, a ação pode ser -A, -I,-P ou -D (além de outras específicas que não falaremos aqui), são coisas que veremos mais tarde. Quanto ao «chain» que você pode escolher entre os três acima.
Exemplo:
iptables -t filter -A INPUT (regra a ser definida)

P como Policy: Política


Para começar, vamos estabelecer uma "política" geral para os três «chain»s da tabela "filter" (a tabela que filtra os pacotes).
A política é a regra da maioria, a regra padrão para uma conexão que se refere a tal chain.

=> Se o Firewall não encontrar uma regra para essa conexão, ele se submeterá à política deste «chain».


Para configurar uma política, utilizamos esta sintaxe:
iptables -t <tabela> -P <chain> <política>

( NB: A configuração a seguir só te interessaré se a sua conexão internet for feita através de uma interface ppp0. Informe-se sobre a sua própria configuração. Você poderá consultar suas interfaces e suas configurações com o comando /sbin/ifconfig).

Em primeiro lugar, para fazer um firewall básico que bloqueie apenas conexões de entrada, nós construímos as políticas dos três chains da tabela filter:
iptables -t filter -P INPUT DROP   
iptables -t filter -P FORWARD ACCEPT   
iptables -t filter -P OUTPUT ACCEPT


As duas políticas que você precisa conhecer são "ACCEPT"e "DROP".

Para o ACCEPT: eu aceito as conexões; para o DROP: eu não deixo entrar as conexões.


Aqui, as conexões de saída não serão filtradas. Esta não é uma configuração ultra-segura, mas para bloquear conexões de entrada. É melhor que nada.

A como Append: Adicionar


Depois, vamos deixar as aplicações que usam o loop local se executar, sem serem bloqueados. Pois, certas aplicações usam conexões TCP no loop local (127.0.0.1) para serem executadas. Então, nós adicionamos uma regra para o chain INPUT, para informar-lhes que as conexões vindas do endereço do loop local e, entrando para a interface local, serão aceitas:

iptables -t filter -A INPUT -s 127.0.0.1 -i lo -I ACCEPT


Aqui eu utilizo -A para significar aos iptables que eu vou Aceitar uma nova regra.
Para fazer uma breve tradução, vamos desmembrar esta linha.
"-A INPUT" significa que vamos acrescentar uma regra no chain INPUT. -s 127.0.0.1 significa que esta nova regra diz respeito às conexões vindas do loop local.-i lo -i lo </ ital> para dizer que a regra diz respeito às conexões de entrada (-i interface de entrada) para a interface local designado por "lo". (Além da interface lo, você tem eth0 para a interface ethernet, ppp0 para a interface de um modem (internet), etc ... eth0 e ppp0 também podem ser eth1 ou ppp1, dependendo do número de interfaces ethernet ou ppp você tem). E, finalmente <ital>-I ACCEPT para especificar que a regra é aceitar essas conexões.

Com o o que você tem aí, talvez você não possa navegar na Internet, pois ao tentar acessar um site e, se ele responder, seu firewall irá bloqueá-lo. Para isso, utilizamos um módulo chamado "State" que tem várias opções, incluindo as que nos interessam: estabelecidas e vinculadas. ESTABLISHED e RELATED. ESTABLISHED significa, aproximadamente, que a conexão analisada pelo firewall foi vista, anteriormente, em outra direção.

Por exemplo, eu envio um pedido ao [www.ccm.net] para visitar a página inicial.
O firewall viu passar um pedido saindo da minha casa para ir para o Kioskea. Kioskea me envia uma resposta. Aqui, o firewall verá que fui eu quem começou esta conexão, então ele considerará esta conexão como "ESTABLISHED". "RELATED" diz respeito a novas conexões, mas que foram inicializados por uma conexão já existente e estabelecida. Somente este tipo de conexão será autorizado, o que nos dá:

iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -I ACCEPT

Para traduzir esses novos elementos (não vou repetir o que já expliquei acima), o que nos dá:
-m state=> Carregamos o módulo state. --state ESTABLISHED,RELATED => deste módulo state, especificamos os estados ESTABLISHED e RELATED, portanto, apenas as conexões desse tipo serão afetadas pela regra.

Então, resumindo todos os comandos para escrever o nosso firewall:
iptables -t filter -P INPUT DROP   
iptables -t filter -P FORWARD ACCEPT   
iptables -t filter -P OUTPUT ACCEPT   

iptables -t filter -A INPUT -s 127.0.0.1 -i lo -I ACCEPT   
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -I ACCEPT

I como Insert : Inserir


Esta ação é semelhante à ação -A (Append) vista anteriormente, exceto quando se trata de "inserir" uma regra na tabela de filtragem. Saiba que as regras de filtragem são percorridas em uma determinada ordem quando um pacote é examinado. Atenção: a ordem das regras pode mudar completamente o comportamento do firewall!
Uma regra definida com -A será simplesmente adicionada após as regras já estabelecidas no chain em questão. Portanto, as regras definidas antes serão prioritárias (se o pacote examinado corresponder à descrição de uma regra, então, as seguintes regras não serão utilizadas).

Une règle "insérée" avec -I va se placer au tout début des règles de la chaîne au lieu de s'ajouter après. Cette règle va donc logiquement déplacer toutes les autres "vers le bas". Elle sera prioritaire sur toutes les autres.
Uma regra "inserida" com -I vai se colocar no início das regras do chain e não, depois. Então, esta regra vai, logicamente, mover dados as outras "para baixo". Ela será prioritária.
Em geral, esta ação é usada em casos específicos como se, de repente, devêssemos bloquear ou autorizar um serviço e, isso, apesar das regras pré-definidas do firewall.
Também podemos inserir uma regra para um local específico (consulte a página do manual) com -I.

L como List : Listar


Para listar, consulte as regras do seu firewall:
iptables -t filter -L

Vejamos esse balanço. Com ele, você tem um firewall de base para a maioria das configurações únicas com o modem ADSL conectado pelo pen drive, por exemplo (talvez até para os modems de banda estreita). Eu digo firewall básico, porque, repito, ele não impõe nenhuma restrição para as conexões de saída. Além disso, ele não é adequado se você tiver um servidor ou uma aplicação, à espera, em uma porta. Por exemplo, se você tem um servidor http, você deverá, provavelmente, desbloquear a porta 80.


Para abrir a porta TCP 80 às conexões de entrada:
iptables -A INPUT -p tcp --dport 80 -I ACCEPT

D como Delete: Deletar


Acabamos de ver que você pode fazer um balanço usando o argumento -L. Talvez você queira apagar uma regra.
Por exemplo, eu não preciso mais do meu servidor HTTP por hoje, vou ocultar a porta 80, porque eu já não tenho mais nenhuma aplicação, à espera, nessa porta. Então, eu vou deletar a regra de autorização de conexão na porta TCP 80. É a política do meu chain INPUT que substituirá essa regra padrão que definimos anteriormente => DROP.

Em seguida, usaremos o argumento -D com esta sintaxe:
iptables -t <tabela> -D <chain> <n° da regra a ser deletada>

Então, vamos ter que encontrar o nº da nossa regra. Para isso, usaremos o comando "iptables-t filter-L" que nos dá:

chain INPUT (policy DROP)   
target     prot opt source               destination   
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED   
ACCEPT     all  --  localhost.localdomain  anywhere   
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www   

chain FORWARD (policy ACCEPT)   
target     prot opt source               destination   

chain OUTPUT (policy ACCEPT)   
target     prot opt source               destination   

Ele inclui as nossas políticas e regras dos chains. Para o chain INPUT, a minha primeira regra é aceitar tudo que vem de "qualquer lugar", contanto que a conexão seja "ESTABLISHED" ou "RELATED".
Em 2 º, Eu "Aceito as conexões vindas do localhost.

E em 3 º, Eu "Aceito todas as conexões na porta"www ", ou seja, a porta 80.

Assim, é a regra 3 do chain INPUT que nos interessa. Para removê-la digite:
iptables -t filter -D INPUT 3


O seu Firewall não encontrará mais regra para as conexões para a porta TCP 80, ele se submeterá à política de INPUT que é "DROP", então, as conexões serão recusadas.

Prontinho!

F como Flush: Limpar


Se você deseja redefinir seu firewall e pedir-lhe que não bloqueie nenhuma conexão (configuração padrão, em geral) você deve digitar:
# Para esvaziar as regras da tabela inteira "filter"   
iptables -t filter -F   

# Para que as políticas aceitem as conexões   
iptables -P INPUT ACCEPT   
iptables -P FORWARD ACCEPT   
iptables -P OUTPUT ACCEPT


Isso tornará seu sistema vulnerável, é claro, mas tornará a configuração padrão, se você não tiver aplicado nehum firewall antes de testar esses scripts.

Fontes e documentos bem mais completos:

As alternativas


Existem muitos softwares que podem facilitar a administração do seu firewall, muitas vezes (se não sempre?) dos "front-end" para o iptables, ou seja, interfaces que facilitam a configuração dos iptables.
(Fontes: algumas discussões no fórum GNU/Linux)


Tradução feita por Lucia Maurity y Nouira
Para uma leitura offline, é possível baixar gratuitamente este artigo no formato PDF:
Linux-instalacao-de-um-firewall.pdf

Veja também

Na mesma categoria

Linux - Instalación de un firewall
Por Carlos-vialfa em 15 de abril de 2009
Linux - Installation d'un Firewall
Por kilian em 26 de fevereiro de 2005
Artigo original publicado por kilian. Tradução feita por pintuda.
Este documento, intitulado « Linux - Instalação de um Firewall »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.