Iptables (firewall-up.sh)

Firewall NAT corporativo

Categoria: Segurança

Software: Iptables

[ Hits: 18.922 ]

Por: Fabricio Beltram


Configuração para redes corporativas - firewall iptables com NAT. Este conf está muito bem documentado, foram 6 meses de estudos para chegar ao nível que está.

Este firewall serve para conectar uma rede local com servidor Linux na Internet, basta configurar as variáveis e executar o script. É necessário um bom conhecimento antes de sair usando este script, pois o mesmo foi elaborado pensando exatamente em segurança. Nenhuma porta foi liberada, aqui só se aceita INPUT na porta 22 (SSH), o resto é descartado, então cuidado ao usar.

Bom, acredito que para fins de estudo este script esteja excelente.


#!/bin/bash



#======================= *** ========================

# Autor: Fabricio Beltram

# Data de Criacao: 16/11/2006

#

#====================================================

# Script: Firewall - iptables

#

#====================================================

# Descricao: Este script ira limpar todas as regras

#de firewall e subir as novas regras de acordo com

#as regras do script - este script possui a funcao 

#de flush que e' a limpeza das regras e faz um full

#NAT como e' conhecido por ai. O script esta bem

#comentado para facilitar eventuais consultas e al-

#teracoes
#====================================================
# Este script esta sobre licenca GPL pode ser alterado
#e distribuido livremente.

#====================================================

# Versao: 1.0

#====================================================

#Alteracoes Realizadas: 

#Altor:

#

#####################################################





#MODPROBE

# Carrega os modulos de iptables + NAT no Kernel

# Estas linhas nao sao necessarias se vc ja tem os 

# modulos do kernel compilado.

#

modprobe ip_nat_ftp

modprobe iptable_nat



# ============================

# === Declaracao das variaveis

# ============================



# Definir a variavel INTRA com a interface que esta ligada com a rede interna/local

# Ex

# INTRA=eth0

INTRA=eth1



# Definir a variavel INTER com a interface que esta ligada com a rede externa (INTERNET)

# Ex

# INTER=eth1

# INTER=ppp0

INTER=eth0



# Definir a variavel LAN com o range de IP utilizado por sua rede local, nao esquecer mascara da rede

# Ex

# LAN=192.168.1.0/24

LAN=10.0.0.0/24



# ======================= *** ========================

# Inicia as regras



# Verifica se o parametro = flush

# Se igual, entao, limpa todas as regras e seta as politicas padroes para ACCEPT

# e tambem deixa a rede como full nat. "Sem Bloqueios"

if [ "$1" = "flush" ]; then



   echo "Limpando as regras, setando as Politicas padroes..."

   # Seta as politicas padroes para accept

   iptables -P INPUT ACCEPT

        iptables -P FORWARD ACCEPT

        iptables -P OUTPUT ACCEPT

        iptables -F

        iptables -t nat -F

        iptables -X

        iptables -Z



   # Faz o masquaramento completo da rede 

   iptables -t nat -A POSTROUTING -o $INTER -j MASQUERADE

   echo "Firewall - Desativado... Mascaramento completo."



# ELSE - Se o parametro != flush

else



   echo "Firewall iptables starting..."

   # Seta as politicas padroes para DROP Bloqueia tudo que nao for OUTPUT   

   iptables -P INPUT DROP

   iptables -P FORWARD DROP

   iptables -P OUTPUT ACCEPT

   iptables -F

   iptables -t nat -F

   iptables -X

   iptables -Z



# ========================= *** ======================

# Inicio das regras que ja defino como padrao



# Liberacao do loopback

iptables -A INPUT -i lo -j ACCEPT


# ======== *** =========

# INTERNET ---> FIREWALL

# Setaremos as portas q seram acessiveis via internet



# SSH - Para mim impressindivel Obs: comente esta linha para nao aceitar ssh

iptables -A INPUT -p tcp --dport 22 -j ACCEPT



# PING - Se nao quiser ser alvo de ping comente as 2 linhas abaixo

# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT

# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT



# HTTP/HTTPS - Apache e outros webservers

# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# iptables -A INPUT -p tcp --dport 443 -j ACCEPT



# Por padrao eu so aceito conecxoes na porta 22 que e' SSH 

# obs. nao deixe ssh direto como root. para isso altere o arquivo sshd_conf 

# set a linha PermitRootLogin no 





# ======== *** =========

# LAN ---> FIREWALL

# Setaremos as portas que poderemos acessar via rede local no servidor



# SQUID - Utilizo servidor proxy squid na porta 3128

iptables -A INPUT -p tcp -s $LAN --dport 3128 -j ACCEPT



# NETBIOS - Estas 3 portas sao usadas pelo protocolo de compartilhamento 

# de arquivos em redes Microsoft. Cada uma das portas tem uma funcao especial 

# (nome, datagrama e sessao) mas e' necessario que as 3 estejam abertas no 

# firewall para que a visualizacoes dos compartilhamentos e acesso aos 

# arquivos funcione corretamente

iptables -A INPUT -p tcp -s $LAN --dport 137:139 -j ACCEPT

iptables -A INPUT -p udp -s $LAN --dport 137:139 -j ACCEPT



# DNS - Libera a resolucao de nomes 

iptables -A INPUT -p tcp -s $LAN --dport 53 -j ACCEPT

iptables -A INPUT -p udp -s $LAN --dport 53 -j ACCEPT 





#======== *** =========

# LAN ---> INTERNET

# Setaremos as portas comuns que devem ser acessadas da rede local para a internet



# Portas comuns que devem ser acessadas na Internet



# FTP-DATA FTP SSH

iptables -A FORWARD -i $INTRA -p tcp --dport 20:22 -j ACCEPT



# SMTP

iptables -A FORWARD -i $INTRA -p tcp --dport 25 -j ACCEPT 

 

# POP3

iptables -A FORWARD -i $INTRA -p tcp --dport 110 -j ACCEPT



# DNS tcp/udp

iptables -A FORWARD -i $INTRA -p udp --dport 53 -j ACCEPT

iptables -A FORWARD -i $INTRA -p tcp --dport 53 -j ACCEPT



# HTTP/HTTPS

iptables -A FORWARD -i $INTRA -p tcp --dport 80 -j ACCEPT

iptables -A FORWARD -i $INTRA -p tcp --dport 443 -j ACCEPT



# ========= *** =======

# Faz o mascaramento da rede local

iptables -t nat -A POSTROUTING -o $INTER -j MASQUERADE



# Statefull inspection

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

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



# FIM - Ate aqui nos temos um firewall seguro estavel e confiavel

#================================= *** =====================================


#

# Apartir desta linha chamo meus scripts de excecoes.

# Ex: Proxy Transparent, Regra acesso ao TED, Regra acesso ao CONECTIVIDADE SOCIAL, etc...

#


# obs. Aqui em regras especiais voce pode configurar algum tipo de DNAT ou FORWARD que 

# sua empresa ira precisar. E' so' criar os scripts e chamalos abaixo 

# que ele starta junto com o firewall.



echo "Carregando as regras especiais utilizadas por Empresa 1."



# Coloque aqui as suas regras especiais
# Start fw-squid.sh

#/root/bin/fw-squid.sh



# Start fw-infib.sh

#/root/bin/fw-infib.sh



echo "Firewall - running - OK !!"



# Fim do Script e do IF
fi
  


Comentários
[1] Comentário enviado por robsonbraga em 27/11/2006 - 11:59h

Bacana seu script, bem elaborado e bem comentado o que é importante para os iniciantes.

Parabens.

[2] Comentário enviado por sblinux em 30/11/2006 - 14:49h

VC me ajudou muito ... OBRIGADO

[3] Comentário enviado por maiam em 03/12/2006 - 02:09h

cara você colocou no inicio que o INPUT só estava liberado a porta 22, mais reparei que isso não é deveras verdades pois esta com as portas 80, 443.
muito bom o seu script mais só gostaria de deixar isso em alerta para outras pessoas que usarem seu script.

[4] Comentário enviado por y2h4ck em 03/12/2006 - 11:49h

Amigo desculpa mas de corporativo seu firewall nao tem nada.
ACLs de seguranca inexistentes.

Sei la tem que melhorar bastante.
Ta tudo aberto.

[5] Comentário enviado por Belem em 03/12/2006 - 14:13h

Maiam -> na verdade é que as linhas que liberam a porta 80 e 443 estão comentadas, então não fazem parte das regras, elas apenas estão ali se acaso alguem precisar ou quiser levantar o apache é só descomentar as linhas e subir o script novamente.

y2h4ck -> Não entendi muito a parte das ACLs, gostaria muito se você pude-se me enviar algum documento ou uma explicação mais formal, Eu utilo squid para controlar as minhas regras para a rede local.

[6] Comentário enviado por eduardofraga em 07/12/2006 - 00:42h

Gostei do script. Parabéns!

[7] Comentário enviado por removido em 14/12/2006 - 05:47h

Para mim está mais para um firewall para "Desktop", esse script está sujeito há vários tipos de ataque principalmente vindo da rede. Recomendo você estuda mais sobre protocolos TCP/IP e o modelo OSI. Mas de qualquer modo, parabéns!

[8] Comentário enviado por blacktop em 14/12/2006 - 12:54h

existem algumas protecoes basicas como Bloquear pacotes XMAS mal formados, Bloquear Pacotes NULL mal formados, Bloquear Syn Floods, PortScanners e etc... isso e basico para seguranca
segue no outro post pra vc iplementar


[9] Comentário enviado por blacktop em 14/12/2006 - 12:54h

# 2.4 - Bloquear pacotes XMAS mal formados
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A FORWARD -p tcp --tcp-flags ALL ALL -j DROP

# 2.5 - Bloquear Pacotes NULL mal formados
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A FORWARD -p tcp --tcp-flags ALL NONE -j DROP

# 2.6 - Bloquear Syn Floods
iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

[10] Comentário enviado por blacktop em 14/12/2006 - 12:54h

iptables -A FORWARD --protocol tcp --tcp-flags ALL SYN,ACK -j DROP
iptables -A FORWARD -m unclean -j DROP
iptables -N VALID_CHECK
iptables -A VALID_CHECK -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A VALID_CHECK -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
iptables -A VALID_CHECK -p tcp --tcp-flags ALL ALL -j DROP
iptables -A VALID_CHECK -p tcp --tcp-flags ALL FIN -j DROP
iptables -A VALID_CHECK -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A VALID_CHECK -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

iptables -A VALID_CHECK -p tcp --tcp-flags ALL NONE -j DROP

[11] Comentário enviado por eduardomiranda em 04/01/2007 - 17:26h

Dúvidas no iptables --->

Configurei meu iptables para que houvesse o minímo de acesso possível (eu acredito nisso ....).

Porém apos o funcionamento do mesmo e a uma boa experiência com seu uso.
Agora que instalei o ntop e seu uso na porta 3000,

inseri as seguinte regras no iptables

#Acesso localhost
IPTABLES -A INPUT -p TCP -s 127.0.0.1/8 --dport 3000 ACCEPT

#ACESSO DA MINHA REDE AO HOST QUE ESTA RODANDO O NTOP
IPTABLES -A INPUT -p TCP -s 192.168.0.0/24 --dport 3000 ACCEPT

#REJEITO TODAS AS OUTRAS CONEXÕES, EVITANDO QUE O ACESSO A PORTA 3000 (NTOP) SEJA DISPONIBILIZADA VIA INTERNET
IPTABLES -A INPUT -p TCP -s 0/0 --dport 3000 REJECT


Peço a todos, que se possível avaliem e comentem essas instruções, considerando que anterior a isto o iptables bloqueia tudo e quem sabe esse poderá ser um artigo para liberar o NTOP na REDE interna auxiliando outros usuários iniciantes no Mundo LINUX.


Grato !

[12] Comentário enviado por Belem em 05/01/2007 - 07:38h

Cara a sua primeira regra deve ser substituida por a seguinte:
iptables -A INPUT -i lo -j ACCEPT
porque usar esta regra?. Desta forma você estará habilitando todas as conexoes vindas de seu loopback em qualquer porta, isto é uma regra que não deve ser DROPADA ou REJEITADA pois muitos programas utilizam o loopback para seu controle proprio.
A segunda regra está esta quase perfeita - falta o -j indicando a ação.
A terceira, ai vai depender das politicas padroes q vc definio no seu caso a opção -s (SOURCE)-(ORIGEM) vc colocou 0/0, ou seja qualquer origem incluindo a sua rede interna, como não conheço a politica padrão sua, utilize a seguinte regra: iptables -A INPUT -p TCP -s ! 192.168.0.0/24 --dport 3000 -j DROP

As Regras ficaram assim:


#ACESSO LOOPBACK
iptables -A INPUT -i lo -j ACCEPT


#ACESSO DA MINHA REDE AO HOST QUE ESTA RODANDO O NTOP
IPTABLES -A INPUT -p TCP -s 192.168.0.0/24 --dport 3000 -j ACCEPT


#REJEITO TODAS AS OUTRAS CONEXÕES, EVITANDO QUE O ACESSO A
PORTA 3000 (NTOP) SEJA DISPONIBILIZADA VIA INTERNET
IPTABLES -A INPUT -p TCP -s ! 192.168.0.0/24 --dport 3000 -j REJECT


Bom testa ai - se não funcionar mande um email pra mim com o seu arquivo do iptables, ou melhor manda um #iptables-save > nomedoaquivo

e anexa ele ao email que eu te passo o resto.

Abraços.

---
Fabricio Beltram
Analista de Sistemas


Contribuir com comentário

  



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts