Firewall seguro com o IPTables

É nosso dever enquanto administradores de uma rede corporativa, assegurar a confidencialidade das informações (que são vitais para a sustentação do negócio). Assim, o Firewall se torna uma ferramenta fundamental para o administrador estabelecer um maior nível de segurança no acesso às informações. Bem, vamos ao IPTables...

[ Hits: 108.190 ]

Por: Rafael Lebrão Martins em 17/06/2007


Construindo o Firewall



Iptables

O Iptables é um firewall em nível de pacotes, ou seja, toma as decisões baseadas nos parâmetros do pacote, como porta/endereço de origem/destino, estado da conexão, e outros parâmetros do pacote. Funciona através da comparação de regras para saber se um pacote tem ou não permissão para passar. O iptables tem inúmeras possibilidades de controle oferecidas pelos recursos de filtragem, flexibilidade na manipulação dando lugar à imaginação do administrador.

Construindo o firewall

Estou utilizando o Slackware 10.2 e o iptables v1.3.3. Para o proposto, vou considerar que nosso roteador tem apenas duas interfaces de rede, a eth0 (interface de rede local) e eth1 (interface ligada ao seu link de acesso à internet, neste caso, velox).

Primeiro passo:

Acesse o diretório onde iremos salvar o firewall e crie o arquivo rc.firewall:

# touch /etc/rc.d/rc.firewall

Segundo passo:

Edite o arquivo criado anteriormente:

# mcedit rc.firewall

Terceiro passo, construção:

Primeiramente iremos criar uma variável para cada interface de rede:

### Interfaces de rede
INT=eth0
EXT=ppp0

Criar uma variável para interface é facultativo, é uma boa opção para tornar as regras mais legíveis, veremos isso mais adiante.

Mensagem que será exibida no shell quando iniciarmos o firewall:

echo "Ativando Regras do Firewall"

Agora iremos excluir as regras dos chains nat, mangle e filter:

### Exclui todas as regras
iptables -t nat -F
iptables -t mangle -F
iptables -t filter -F

Excluindo as cadeias customizadas, chains criados pelos usuários:

### Exclui cadeias customizadas
iptables -X

Zerando o contador de bytes das cadeias. Zera o campo pkts e bytes de uma regra no iptables.

### Zera os contadores das cadeias
iptables -t nat -Z
iptables -t mangle -Z
iptables -t filter -Z

Definindo a política padrão do nosso Firewall. O policiamento padrão determina o que acontecerá com um pacote quando ele chegar ao final das regras contidas em um chain.

### Define a política padrão do firewall
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

Agora vamos inserir no nosso firewall as regras de redirecionamento, PREROUTING. O redirecionamento de portas permite a você fazer o repasse de conexões. Podemos redirecionar portas para um ip, repassar conexões com destino a uma porta para outra porta, e várias opções que podem ser exploradas pelo administrador. Bom, vamos criar alguns redirecionamentos.

### Regras PREROUTING
# Redireciona as conexões vindas da rede externa na porta 3389 para o ip 192.168.0.200
iptables -t nat -A PREROUTING -i $EXT -p tcp --dport 3389 -j DNAT --to 192.168.0.200

# Redireciona as conexões vindas da rede externa na porta 5900 para o ip 192.168.0.201
iptables -t nat -A PREROUTING -i $EXT -p tcp --dport 5900 -j DNAT --to 192.168.0.201

# Redireciona as conexões vindas da rede interna na porta 80 para a porta 3128
iptables -t nat -A PREROUTING -i $INT -p tcp --dport 80 -j REDIRECT --to-port 3128

OBS: Temos diversas outras opções de uso com regras PREROUTING, é só estudar um pouco e usar a imaginação.

Após os redirecionamentos, vamos adicionar as regras INPUT (consultado para dados que chegam à máquina).

### Regras INPUT

### informa os estados que devem ser checados (Conexão estabelecida
# ou Relacionada). Caso o estado da conexão seja uma dessas 2, então
# ele vai aceitar.
iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT

# Libera o INPUT para a interface loopback, ou seja, a própria máquina
iptables -A INPUT -i lo -j ACCEPT

# Permite icmp 0 (resposta de Echo)
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT

# Permite icmp 8 (Pedido de Echo)
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

# Permite o acesso ao servidor usando SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Permite o acesso ao servidor usando FTP
iptables -A INPUT -p tcp --dport 21 -j ACCEPT

# Libera o OPENVPN
iptables -A INPUT -p tcp --dport 1194 -j ACCEPT

Vamos agora às regras forward, o chain FORWARD é consultado para dados que são redirecionados para outra interface de rede ou outra máquina. Há uma variedade de regras que o administrador pode implementar com esse chain. Colocarei aqui, alguns serviços essenciais, como ftp, ssh, pop e smtp. Personalize de acordo suas necessidades.

### Regras FORWARD
iptables -A FORWARD -m state --state ESTABLISHED, RELATED -j ACCEPT
iptables -A FORWARD -i $INT -o $EXT -p icmp -j ACCEPT

# Libera o tráfego de pacotes da rede interna para a rede externa na porta 25 (smtp)
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 25 -j ACCEPT

# Libera o tráfego de pacotes da rede interna para a rede externa na porta 22 (ssh)
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 22 -j ACCEPT

# Libera o tráfego de pacotes da rede interna para a rede externa na porta 21 (ftp)
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 21 -j ACCEPT

# Libera o tráfego de pacotes da rede interna para a rede externa na porta 110 (pop)
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 110 -j ACCEPT

# Libera o tráfego de pacotes da rede interna para a rede externa na porta 443 (ssl)
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 443 -j ACCEPT

# Libera o tráfego de pacotes da rede interna para a rede externa na porta 3389 (Terminal Server da Microsoft)
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 3389 -j ACCEPT

# Libera o tráfego de pacotes da rede interna para a rede externa na porta 80 (http)
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 80 -j ACCEPT

# Libera o tráfego de pacotes da rede externa para a rede interna na porta 3389 (Terminal Server da Microsoft)
iptables -A FORWARD -i $EXT -o $INT -p tcp --dport 3389 -j ACCEPT

# Libera o tráfego de pacotes da rede externa para a rede interna na porta 5900 (VNC)
iptables -A FORWARD -i $EXT -o $INT -p tcp --dport 5900 -j ACCEPT

Regras output. O chain OUTPUT é consultado para dados que saem da máquina. Como na nossa política padrão, liberamos o tráfego no neste chain, não é necessário muita coisa aqui.

### Regras OUTPUT
iptables -A OUTPUT -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

Por fim, vamos criar uma regra para fazer o mascaramento da nossa conexão com à internet.

### Regras POSTROUTING
iptables -t nat -A POSTROUTING -o $EXT -j MASQUERADE
    Próxima página

Páginas do artigo
   1. Construindo o Firewall
   2. Arquivo rc.firewall completo
   3. Executando o firewall
Outros artigos deste autor

Matriz <-> Filial com o OpenVPN

Um pouco de PERL

Capital Intelectual

Leitura recomendada

Dois links de ADSL em um mesmo servidor

Configurando firewall Shorewall no CentOS

Implementando prioridade nos serviços com TOS no Iptables

Entendendo TCP/IP (Parte 5) - Portas TCP/UDP

Firewall rápido e seguro com iptables

  
Comentários
[1] Comentário enviado por joseslei em 17/06/2007 - 10:51h

Otimo tutorial, ajudou muito. Obrigado

[2] Comentário enviado por vodooo em 17/06/2007 - 13:40h

Bom artigo!

Mas acho que deveria ter incluído regras básicas como proteção contra:

anti-spoofing
anti_source_route

Mas parabéns pelo artigo!

[3] Comentário enviado por removido em 18/06/2007 - 02:45h

Posso ser sincero? Não achei muito bom não :(
Mas valeu pela iniciativa.

[4] Comentário enviado por zilli em 18/06/2007 - 08:34h

Parabéns pelo artigo !

Como esse é um assunto que sempre é de interesse, levanto apenas algumas situações que se bem discutidas será de grande aprendizado à todos nós.

1) A primeira ação que percemos no script é o PREROUTING. No exemplo do redirecionamento do SQUID para a porta 3128 fica a questão, ao redirecionarmos o tráfego para a porta 3128, isso não acarreta em uma entrada INPUT para essa porta ? E se isso for verdade irá funcionar, já que a política padrão do INPUT é DROP ?

2) Para quem trabalha com subredes (192.168.2.x, 192.168.3.x..etc), qual a melhor maneira de fazer com que todos tenham acesso a internet ?

3) Percebemos em scrips espalhados pela internet as vezes o uso indefido do FORWARD ou o mesmo é confundido com o OUTPUT. Afinal usamos o FORWARD para que ?

Abraços e novamente parabéns.
Daniel

[5] Comentário enviado por rafael martins em 18/06/2007 - 09:43h

Bom dia, Daniel. Você tem razão no questionamento 1. Eu me esqueci de acrescentar a regra INPUT liberando a porta 3128.
iptables -A INPUT -p tcp --dport 3128 -j ACCEPT

No questionamento 2 a resposta é simples. Você terá que alterar as variáveis de rede. Veja como ficaria:
EM VEZ DE:
### Interfaces de rede
INT=eth0
EXT=ppp0

FICARIA:
### Interfaces de rede
INT=eth+
EXT=ppp0

O + significa eth0, eth1, eth2 e assim por diante. Sendo assim, todas as suas lan's serão liberadas.

Com relação ao questionamento 3, o FORWARD é consultado para o tráfego entre redes, tráfego redirecionado para outra máquina. Vou colocar alguns exemplos práticos:

Envio e recebimento de e-mails pela rede local; Neste caso é feito FORWARD nas portas 25 e 110, pois o outlook irá se conectar ao provedor de e-mails nestas portas. É um tráfego da rede local para a rede externa.
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 25 -j ACCEPT
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 110 -j ACCEPT

Acessar um servidor FTP na internet; Fazer FORWARD na porta 21 liberando para o ip do servidor ou liberar todo o acesso à essa porta
iptables -A FORWARD -d [ip do servidor] -p tcp --dport 21 -j ACCEPT
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 21 -j ACCEPT

Podemos fazer mais uma infinidade de coisas com esse Chain. Espero ter esclarecido as dúvidas.
Um abraço.

[6] Comentário enviado por zilli em 18/06/2007 - 09:58h

Tudo certo Rafael !

[7] Comentário enviado por marceloespindola em 07/07/2007 - 14:52h

Pessoal estou escrevendo um artigo aqui para o viva o linux sobre scrippt de firewall, ele está completo pois levei muito tempo para desenvolve-lo e tinha objetivo de reunir as principais soluções e dúvidas sobre firewall para este artigo, mas como quero construir um bom artigo ainda está em fase de construção para o vivaolinux, entretanto estou disponibilizando no endereço http://marcelolinux.blogspot.com/2007/07/meu-primeiro-artigo-do-vivaolinux.html

os arquivos e o artigo referente a script de firewall completo.

[8] Comentário enviado por arkanjoking em 14/01/2008 - 02:12h

Otimo Artigo manu.
Se possivel gostaria que vc desse uma olhada na minha duvida, ta tudo explicado aqui http://www.vivaolinux.com.br/comunidades/verTopico.php?codigo=191&codtopico=13233

To aguniado nisso, nao consigo fazer funcionar os jogos, valeu!

[9] Comentário enviado por valterrezendeeng em 19/02/2008 - 18:45h

Parabens pelo Artigo

Ele ajudou-me a Solucionar problemas com encaminhamento de Pacotes

Obrigado

Um grande Abraço

[10] Comentário enviado por linus black em 02/08/2009 - 22:14h

Eu li em algum lugar que essa regra aqui não e legal usar.
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Mas que desta forma seria melhor
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE qual a diferença...?

[11] Comentário enviado por eeds em 22/01/2010 - 17:25h

chmod 750 /etc/rc.d/rc.firewall | ./rc.firewall
bash: ./rc.firewall: Permissão negada
alguem pode me dar uma dica ???

[12] Comentário enviado por kasper em 06/02/2010 - 23:58h

eeds, vc esta logado como root?

[13] Comentário enviado por mandrak66 em 21/08/2010 - 01:21h

Ola, pessoal ao ativar meu firewall com essas regras, vem uma mensagem assim:

iptables v1.4.1.1: Bad state
Try 'iptables -h' or 'iptables --help' for more information

iptables v1.4.1.1: Bad state
Try 'iptables -h' or 'iptables --help' for more information

iptables v1.4.1.1: Bad state
Try 'iptables -h' or 'iptables --help' for more information

iptables v1.4.1.1: Bad state
Try 'iptables -h' or 'iptables --help' for more information
sera que é um erro?

outra coisa, estou com squid configurado e não queria que ficase mascarado pois uso autenticação, tenho que mudar alguma regra?

grato a todos

[14] Comentário enviado por Rafael Oliveira em 31/08/2010 - 15:29h

mandrak66, corrigi os erros que você citou, e segue o script:

### Interfaces de rede
INT=eth1
EXT=eth0

### Mensagem de inicializaç do Firewall
echo "Ativando Regras do Firewall"

### Exclui todas as regras
iptables -t nat -F
iptables -t mangle -F
iptables -t filter -F

### Exclui cadeias customizadas
iptables -X

### Zera os contadores das cadeias
iptables -t nat -Z
iptables -t mangle -Z
iptables -t filter -Z

### Define a políca padrãdo firewall
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

### Regras PREROUTING
# iptables -t nat -A PREROUTING -i $EXT -p tcp --dport 3389 -j DNAT --to 192.168.0.200
iptables -t nat -A PREROUTING -i $INT -p tcp --dport 80 -j REDIRECT --to-port 3128

### Regras INPUT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT

### Regras FORWARD
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $INT -o $EXT -p icmp -j ACCEPT
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 21 -j ACCEPT
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -i $INT -o $EXT -p tcp --dport 80 -j ACCEPT

### Regras OUTPUT
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

### Regras POSTROUTING
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE


Acabei retirando algumas partes dele, mais em geral os erros estavam em espaços dados entre NEW,ESTABLISHED e a utilma linha do script.
Ótimo artigo!
Valeu!

[15] Comentário enviado por jeff.jno em 30/06/2011 - 20:21h

Estou recebendo a seguinte mensagem quando rodo o script, será que é erro? Não intendi direito.
Eu testei se nao liberar a porta nao passa. Valew muito bom o script,

olha as mensagens que eu recebo.

iptables v1.4.4: "--state" requires a list of states with no spaces, e.g. ESTABLISHED,RELATED
Try `iptables -h' or 'iptables --help' for more information.
iptables v1.4.4: "--state" requires a list of states with no spaces, e.g. ESTABLISHED,RELATED
Try `iptables -h' or 'iptables --help' for more information.
iptables v1.4.4: "--state" requires a list of states with no spaces, e.g. ESTABLISHED,RELATED

[16] Comentário enviado por jeff.jno em 30/06/2011 - 20:24h

Pessoal é so remover os espaços nas regras deixando como a mensagem em ingles esplica. ficando assim:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

[17] Comentário enviado por jonnatha_faria em 04/08/2014 - 11:16h

Amigo, eu criei um script de firewall aki, e procurando sobre o erro presente no meu encontrei esse seu.. Meu problema é o seguinte... Minhas políticas padrão são todas DROP (INPUT, OUTPUT e FORWARD), porém noto que minha LAN de vez em qd dah uma garrada de menos de um segundo e volta, pouco né, mas isso eh suficiente pra dar pau nos downloads e vídeos carregando. Notei que isso só acontece quando uso o "iptables -P OUTPUT DROP". Sabe qual o motivo? Porque resolveu no seu usar o OUTPUT ACCEPT??? Vlw.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts