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.
[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.
[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.
[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
[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
#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.
[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