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: 107.184 ]

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

Capital Intelectual

Um pouco de PERL

Matriz <-> Filial com o OpenVPN

Leitura recomendada

Como construir um firewall de baixo custo para sua empresa (parte 2)

Implementando prioridade nos serviços com TOS no Iptables

Iptables 1.3.4 com Layer 7 e Kernel 2.6.14 no Debian 3.1

Um poderoso firewall para a sua rede wireless com IP x MAC

Roteamento de entrada/saída com iproute e 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