Iptables (rc.firewall)

Script de firewall que libera apenas as portas mais comuns para a rede. Tem suporte a firewall transparente.

Categoria: Segurança

Software: Iptables

[ Hits: 29.478 ]

Por: Perfil removido


Este script libera apenas as portas mais comuns para os usuários da rede interna (80, 21, 22, 25, 110, 443, 53 e 3128). O proxy transparente está ativo, redirecionando toda requisição da porta 80 para a 3128. Todos os demais pacotes serão rejeitados!


#!/bin/bash

echo
echo "=========================================="
echo "| :: SETTING IPTABLES'S CONFIGURATION :: |"
echo "=========================================="

### Passo 1: Limpando as regras ###
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
echo "Cleaning all rules .................[ OK ]"

# Definindo a Politica Default das Cadeias
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
echo "Setting default rules ..............[ OK ]"

### Passo 2: Desabilitar o trafego IP entre as placas de rede ###
echo "0" > /proc/sys/net/ipv4/ip_forward
echo "Setting ip_forward: OFF ............[ OK ]"

# Configurando a Protecao anti-spoofing
for spoofing in /proc/sys/net/ipv4/conf/*/rp_filter; do
        echo "1" > $spoofing
done
echo "Setting anti-spoofing protection ...[ OK ]"

# Impedimos que um atacante possa maliciosamente alterar alguma rota
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
echo "Setting anti-redirects .............[ OK ]"

# Utilizado em diversos ataques, isso possibilita que o atacante determine o "caminho" que seu
# pacote vai percorrer (roteadores) ate seu destino. Junto com spoof, isso se torna muito perigoso.
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo "Setting anti-source_route ..........[ OK ]"

# Protecao contra responses bogus
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo "Setting anti-bugus_response ........[ OK ]"

# Protecao contra ataques de syn flood (inicio da conexao TCP). Tenta conter ataques de DoS.
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo "Setting anti-synflood protection ...[ OK ]"

### Passo 3: Carregando os modulos do iptables ###
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_mangle
modprobe iptable_nat
modprobe ipt_MASQUERADE
echo "Loading iptables's modules .........[ OK ]"

### Passo 4: Agora, vamos definir o que pode passar e o que nao ###
####################
# Cadeia de Entrada

# LOCALHOST - ACEITA TODOS OS PACOTES
iptables -A INPUT -i lo -j ACCEPT

# PORTA 80 - ACEITA PARA A REDE LOCAL
iptables -A INPUT -i eth1 -p tcp --dport 80 -j ACCEPT

# PORTA 22 - ACEITA PARA A REDE LOCAL
iptables -A INPUT -i eth1 -p tcp --dport 22 -j ACCEPT

# No iptables, temos de dizer quais sockets sao validos em uma conexao
iptables -A INPUT -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
echo "Setting rules for INPUT ............[ OK ]"

################################
# Cadeia de Reenvio (FORWARD).

# Primeiro, ativar o mascaramento (nat).
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo "Activating IP Mask .................[ OK ]"

# Agora dizemos quem e o que podem acessar externamente
# No iptables, o controle do acesso a rede externa e feito na cadeia "FORWARD"

# COMPUTADOR DO CHEFE - ACEITA TODOS OS PACOTES
iptables -A FORWARD -s 192.168.3.50 -j ACCEPT

# PORTA 3128 - ACEITA PARA A REDE LOCAL
iptables -A FORWARD -i eth1 -p tcp --dport 3128 -j ACCEPT

# Redireciona porta 80 para 3128 (squid)
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128

# PORTA 53 - ACEITA PARA A REDE LOCAL
iptables -A FORWARD -i eth1 -p udp --dport 53 -j ACCEPT

# PORTA 110 - ACEITA PARA A REDE LOCAL
iptables -A FORWARD -i eth1 -p tcp --dport 110 -j ACCEPT

# PORTA 25 - ACEITA PARA A REDE LOCAL
iptables -A FORWARD -i eth1 -p tcp --dport 25 -j ACCEPT

# PORTA 443 - ACEITA PARA A REDE LOCAL
iptables -A FORWARD -i eth1 -p tcp --dport 443 -j ACCEPT

# PORTA 21 - ACEITA PARA A REDE LOCAL
iptables -A FORWARD -i eth1 -p tcp --dport 21 -j ACCEPT

# No iptables, temos de dizer quais sockets sao validos em uma conexao
iptables -A FORWARD -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
echo "Setting rules for FORWARD ..........[ OK ]"

# Finalmente: Habilitando o trafego IP, entre as Interfaces de rede
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "Setting ip_forward: ON .............[ OK ]"
echo "Finished!! Firewall: OK! ...........[ OK ]"
echo "=========================================="
echo
  


Comentários
[1] Comentário enviado por removido em 22/07/2004 - 11:53h

Corrigindo: Script de firewall que libera apenas as portas mais comuns para a rede. Tem suporte a PROXY transparente.

[2] Comentário enviado por agk em 23/07/2004 - 08:29h

Parabéns ótimo scripts para utilizar com iptables, bem estruturado, ideal para quem está aprendendo sobre o assunto.

[3] Comentário enviado por removido em 23/07/2004 - 17:23h

valeu kra......
estava procurando um firewall bem explicativo....e o seu ta muito bom!

valeu de novo....t+

[4] Comentário enviado por lacierdias em 24/07/2004 - 05:30h

Ficou exelente...

[5] Comentário enviado por SantAnna em 27/07/2004 - 06:01h

Confesso que pela primeira vez vi alguem montar um script de firewall decente. Ficou excelente!!!

[6] Comentário enviado por fsflores em 04/08/2004 - 09:13h

Valeu.....era isso que que precisavamos

[7] Comentário enviado por lacierdias em 08/08/2004 - 09:29h

ficou exelente mas não entendi pq vc repetiu a regra dos sockets duas vezes:

No iptables, temos de dizer quais sockets sao validos em uma conexao
iptables -A FORWARD -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
echo "Setting rules for FORWARD ..........[ OK ]"

[8] Comentário enviado por removido em 08/08/2004 - 14:08h

A regra não "repete"... numa você define os sockets para a cadeia INPUT e outro para a cadeia FORWARD.

[9] Comentário enviado por flexsystem em 13/08/2004 - 08:30h

Legal este firewall, muito útil para um iniciante.

[10] Comentário enviado por removido em 20/08/2004 - 10:06h

Olá amigos achei esse script super legal mais no meu slackware esta dando o seguinte erro, o que pode ser :

oot@esquadra:/etc/rc.d# sh rc.firewall
: command not found:
: command not found: echo
==========================================
| :: SETTING IPTABLES'S CONFIGURATION :: |
==========================================
: command not found:
iptables: No chain/target/match by that name
iptables: No chain/target/match by that name
iptables: No chain/target/match by that name
Cleaning all rules .................[ OK ]
: command not found3:
iptables: Bad policy name
iptables: Bad policy name
iptables: Bad policy name
Setting default rules ..............[ OK ]
: command not found9:
: No such file or directory/sys/net/ipv4/ip_forward
Setting ip_forward: OFF ............[ OK ]
: command not found3:
'c.firewall: line 25: syntax error near unexpected token `do
'c.firewall: line 25: `for spoofing in /proc/sys/net/ipv4/conf/*/rp_filter; do

[11] Comentário enviado por marcioit em 03/09/2004 - 02:59h

tens alguma ideia para fazer regra usando o mac address ?

[12] Comentário enviado por removido em 03/09/2004 - 22:02h

Na minha opinião isto não funciona de forma segura:

iptables -A FORWARD -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT

Explicação:

A idéia do "state" é verificar o estado da conexão,certo?

No caso "ESTABLISHED,RELATED" você verifica conexões Estabelecidas e Relacionadas, ou seja, conexões pré-estabelecidas e relatada que são pacotes referentes a pacotes icmp ou ftp por exemplo.
Acho que o erro ocorre quando você coloca a opção NEW que indica conexões Novas.
No caso para verificarmos conexões novas deveríamos fazer uma outra regra.

O que você acha?

Gostaria de ser corrigido caso tenha me equivocado.
Obrigado!


[13] Comentário enviado por removido em 03/09/2004 - 22:04h

master_foca

Acho que você deve compilar o teu kernel com suporte a netfiler. Já tentou?

[14] Comentário enviado por removido em 03/09/2004 - 22:09h

marcioit

utilize o comando a seguir:

iptables -A INPUT -i eth0 -m mac endereço_mac_aqui -j ACCEPT

[15] Comentário enviado por removido em 10/09/2004 - 10:48h

Olá Darvin!

Achei interessante o seu comentário sobre o script de firewall, e isso me gerou umas dúvidas! Acho que juntos podemos tentar chegar a solução correta e mais segura para este script.

Vou falar sobre meu ponto de vista... No caso de conexões estabelecidas ou relacionadas, não há problema... são conexões ativas que passaram pelas regras e são permitidas.

Já o estado NEW, no meu ponto de vista, é quando alguma máquina tenta estabelecer uma nova conexão com o servidor, então essa requisição vem com estado "novo"... e logo depois, se for aceita, se tornará "estabelecida".

Acredito que se o estado "NEW" não for permitido, novas conexões não serão aceitas, mantendo apenas as que já estiverem ativas.

O que você acha?

Um abraço!
Alex

[16] Comentário enviado por __FERNANDO__ em 26/09/2004 - 18:33h

No caso quando vc diz...
# PORTA 80 - ACEITA PARA A REDE LOCAL
iptables -A INPUT -i eth1 -p tcp --dport 80 -j ACCEPT

# PORTA 22 - ACEITA PARA A REDE LOCAL
iptables -A INPUT -i eth1 -p tcp --dport 22 -j ACCEPT

Você está liberando somente para a rede interna ? Mas então a eth1 é a interface de rede com o IP da rede interna né ? ou é a interface externa ?

Fernando

[17] Comentário enviado por removido em 26/09/2004 - 19:42h

eth1 é a rede interna... eth0, a externa.

[18] Comentário enviado por __FERNANDO__ em 26/09/2004 - 20:09h

Ah..beleza..valeu cara.

[19] Comentário enviado por bonaldo em 29/09/2004 - 12:43h

Caras, depois que coloquei o IPtables pra compartilhar a conexao aqui, não consigo acessar sites FTP externo, por exemplo ftp.unicamp.br , o que pode estar havendo aqui.
Obrigado.
Carlos

[20] Comentário enviado por removido em 29/09/2004 - 23:19h

Carlos... você tem que acessar FTPs usando "passive mode"... senão não vai rolar mesmo! A maioria dos clientes FTP tem essa opção, incluvise o "Internet Explorer"... Veja em Ferramentas > opções da internet > avançado

[21] Comentário enviado por removido em 07/10/2004 - 11:52h

Ola pessoal,

Estou com uma duvida estou usando esse firewall em uma pequena rede que requer a utilização do pcAnyWare para manutenção de máquinas acessados de fora da minha rede. Como eu implemento isso no firewall ?

[22] Comentário enviado por airton_slz em 21/10/2004 - 18:14h

Gostei muito do script e gostaria de saber o seguinte:

Como fazer proxy transparente para outro ip(proxy) da rede interna, retornar ao firewall e sair para internet?

Airton Almeida
São Luis/MA

[23] Comentário enviado por bandidodoceu em 02/06/2006 - 22:11h

ae cara vlw em...me ajudou muito...flw
bandidodoceu.

[24] Comentário enviado por Anderson Menezes em 28/07/2006 - 09:27h

VLW muito bom este escript... funcionou na minha rede como uma luva. Fiz apenas algumas adequaçoes a minha realidade. muito bom Parabéns.

Anderson
Palmas/TO

[25] Comentário enviado por walison.augusto em 14/12/2006 - 16:13h

Parabens Velho, muito bom seu script.. me ajudou bastante.. voce esta de parabens. continue assim


Valeus..
Walison Augusto
Belo Horizonte

[26] Comentário enviado por ropessoa em 20/01/2007 - 03:52h

Primeiramente, parabéns pelo script. Muito bem explicado, o que é ótimo para mim que estou tentando entender as regras...
Com relação a abertura de portas, não sei o que fiz anteriormente que mesmo colocando a linha "iptables -A INPUT -i eth1 -p tcp --dport 22 -j ACCEPT" na ordem correta, ela não funciona. Não consigo acessar meu roteador através de um computador cliente na rede. Será possivel alguma alteração no Kernel com algum outro script? Pq regra iptables aparentemente não é...
Abraços e obrigado!

[27] Comentário enviado por jeffersondantas em 12/04/2007 - 10:32h

muito bom artigo, parabéns!

[28] Comentário enviado por fbssolucoes em 31/05/2007 - 09:47h

achei interessante a sua regra, pois o chefe pelo jeito está liberado, mas na minha empresa não deu certo o chefe não ficou fora do squid só com aquela regra.
Como que eu devo proceder para o IP do chefe não passar pela porta do squid e sim ficar totalmente liberado?

Desde ja agradeço

Fabiano

[29] Comentário enviado por heliosauro em 28/06/2007 - 10:04h

Amigo, achei excelente os seus comentários !! ... porém apareceu um erro quando fui executá-lo:

Oque pode ser ?????

==========================================
| :: SETTING IPTABLES'S CONFIGURATION :: |
==========================================
Cleaning all rules .................[ OK ]
Setting default rules ..............[ OK ]
Setting ip_forward: OFF ............[ OK ]
Setting anti-spoofing protection ...[ OK ]
Setting anti-redirects .............[ OK ]
Setting anti-source_route ..........[ OK ]
Setting anti-bugus_response ........[ OK ]
Setting anti-synflood protection ...[ OK ]
WARNING: Error inserting ipchains (/lib/modules/2.6.9/kernel/net/ipv4/netfilter/ipchains.ko): Device or resource busy
WARNING: Error inserting ipchains (/lib/modules/2.6.9/kernel/net/ipv4/netfilter/ipchains.ko): Device or resource busy
Loading iptables's modules .........[ OK ]
Setting rules for INPUT ............[ OK ]
Activating IP Mask .................[ OK ]
Setting rules for FORWARD ..........[ OK ]
Setting ip_forward: ON .............[ OK ]
Finished!! Firewall: OK! ...........[ OK ]
==========================================

[30] Comentário enviado por comfaa em 28/10/2008 - 10:46h

muito bom !!

[31] Comentário enviado por ch4c4r em 09/05/2009 - 11:38h

Muito bom script, esclareceu muita coisa pra mim :D

Grande Baraço
Chacal

[32] Comentário enviado por ton.work em 23/08/2010 - 10:06h

sei que faz tempo desde a ultima mensagem mas poderia me dizer aqui onde está o erro ?

==========================================
| :: SETTING IPTABLES'S CONFIGURATION :: |
==========================================
/etc/init.d/firewall: line 9: ip_tables: command not found
/etc/init.d/firewall: line 10: iptables: command not found
/etc/init.d/firewall: line 11: iptables: command not found
Cleaning all rules .................[ OK ]
/etc/init.d/firewall: line 15: iptables: command not found
/etc/init.d/firewall: line 16: iptables: command not found
/etc/init.d/firewall: line 17: iptables: command not found
Setting default rules ..............[ OK ]
Setting ip_forward: OFF ............[ OK ]
Setting anti-spoofing protection ...[ OK ]
Setting anti-redirects .............[ OK ]
Setting anti-source_route ..........[ OK ]
Setting anti-bugus_response ........[ OK ]
Setting anti-synflood protection ...[ OK ]
Loading iptables's modules .........[ OK ]
/etc/init.d/firewall: line 60: iptables: command not found
/etc/init.d/firewall: line 63: iptables: command not found
/etc/init.d/firewall: line 66: iptables: command not found
/etc/init.d/firewall: line 69: iptables: command not found
Setting rules for INPUT ............[ OK ]
/etc/init.d/firewall: line 76: iptables: command not found
/etc/init.d/firewall: line 77: iptables: command not found
Activating IP Mask .................[ OK ]
/etc/init.d/firewall: line 84: iptables: command not found
/etc/init.d/firewall: line 87: iptables: command not found
/etc/init.d/firewall: line 90: iptables: command not found
/etc/init.d/firewall: line 93: iptables: command not found
/etc/init.d/firewall: line 96: iptables: command not found
/etc/init.d/firewall: line 99: iptables: command not found
/etc/init.d/firewall: line 102: iptables: command not found
/etc/init.d/firewall: line 105: iptables: command not found
/etc/init.d/firewall: line 108: iptables: command not found
Setting rules for FORWARD ..........[ OK ]
Setting ip_forward: ON .............[ OK ]
Finished!! Firewall: OK! ...........[ OK ]
==========================================


Contribuir com comentário

  



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts