iptables (rc.firewall)

firewall completo

Categoria: Segurança

Software: iptables

[ Hits: 13.339 ]

Por: paulo cabral da cunha


Este é meu script de firewall, estou tentando melhorá-lo..


#!/bin/sh

echo "####################ATIVANDO IPTABLES#######################"
### Passo 1: Limpando as regras ###
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -F POSTROUTING -t nat
iptables -F PREROUTING -t nat
iptables -F -t nat

echo "Limpando as regras ..................................[ OK ]"

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

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

# Configurando a Protecao anti-spoofing
echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
#for spoofing in /proc/sys/net/ipv4/conf/*/rp_filter; do
#        echo "1" > $spoofing
#done
echo "Protecao anti-spoofing ..............................[ OK ]"
###########setando protecao contra ataques
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
for i in /proc/sys/net/ipv4/conf/*; do
echo 0 >$i/accept_redirects
echo 0 >$i/accept_source_route
echo 1 >$i/log_martians
echo 1 >$i/rp_filter;
done
echo "Protecao contra ataques .............................[ OK ]"

# Impedimos que um atacante possa maliciosamente alterar alguma rota
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
echo "Impedimos alterar alguma rota .......................[ 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 "Impossibilita que o atacante determine o "caminho" ....[ OK ]"

# Protecao contra responses bogus
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo "Protecao contra responses bogus .....................[ 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 "Protecao contra ataques de syn ......................[ OK ]"

### Passo 3: Carregando os modulos do iptables ###
# Ativa modulos
# -------------------------------------------------------
/sbin/modprobe iptable_nat
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_REJECT
/sbin/modprobe ipt_MASQUERADE
#/sbin/modprobe ipt_GRE
echo "Carregando os modulos ...............................[ OK ]"


### Passo 4: Agora, vamos definir o que pode passar e o que nao ###
# Cadeia de Entrada
##ips que nao passam pelo proxy
iptables -A FORWARD -p tcp -s 192.168.1.34 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.1.90 -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.1.90 -j ACCEPT

iptables -A INPUT -p tcp -s 192.168.1.2 -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.1.2 -j ACCEPT

iptables -A FORWARD -p tcp -s 192.168.1.32 -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.1.28 -j ACCEPT
#iptables -A INPUT -p tcp --dport 110 -j ACCEPT
#iptables -A INPUT -p tcp --dport 25 -j ACCEPT
#iptables -A FORWARD -p tcp --dport 110 -j ACCEPT
#iptables -A FORWARD -p tcp --dport 25 -j ACCEPT
#iptables -A FORWARD -p tcp --dport 465 -j ACCEPT

#portas para msn
#fulano
iptables -A FORWARD -p tcp -s 192.168.1.90 --dport 1863 -j ACCEPT
#beltrano
iptables -A FORWARD -p tcp -s 192.168.1.35 --dport 1863 -j ACCEPT
# porta para contabil
  #DCTF
  iptables -A FORWARD -p tcp --dport 3456 -j ACCEPT
  #DPI
  iptables -A FORWARD -p tcp --dport 24001 -j ACCEPT
  #ted
#  iptables -A INPUT -p tcp --dport 8017 -j ACCEPT
  iptables -A FORWARD -p tcp --dport 8017 -j ACCEPT
echo "Regras comtabilidade.................................[ OK ]"

#dp
 #sefip
 iptables -A FORWARD -p tcp  --dport 2004 -j ACCEPT
 #iptables -A INPUT -p tcp --dport 2631 -j ACCEPT
 iptables -A FORWARD -p tcp  --dport 2631 -j ACCEPT
 iptables -A FORWARD -p tcp  --dport 1494 -j ACCEPT
 iptables -A FORWARD -p tcp  --dport 5017 -j ACCEPT
 iptables -A FORWARD -p tcp -s 192.168.1.49 --dport 9090 -j ACCEPT
 ###conectividde social
 #iptables -t nat -A PREROUTING -i eth1 -p tcp -d ! 200.201.174.0/24 --dport 80 -j REDIRECT --to-port 8080
echo "Regras DP ...........................................[ OK ]"

#cadastro
iptables -A FORWARD -p tcp --dport 443 -j ACCEPT

# datasiga
  iptables -A FORWARD -p tcp --dport 20650 -j ACCEPT
  iptables -A FORWARD -p tcp --dport 10650 -j ACCEPT
echo "Regras Datasiga .....................................[ OK ]"


# Porta para Cadastro
 iptables -A FORWARD -p tcp --dport 25777 -j ACCEPT
 iptables -A FORWARD -p tcp --dport 5432 -j ACCEPT

#vnc
  iptables -A FORWARD -p tcp --dport 5700 -j ACCEPT
  iptables -A INPUT -p tcp --dport 5700 -j ACCEPT
  
echo "Regras Cadastro .....................................[ OK ]"
#remote
  iptables -A FORWARD -p tcp --dport 4599 -j ACCEPT
  iptables -A INPUT -p tcp --dport 4599 -j ACCEPT
echo "Regras remote .......................................[ OK ]"
 
 
#terminal server
  iptables -A INPUT -p tcp --dport 3389 -j ACCEPT
 iptables -A FORWARD -p tcp --dport 3389 -j ACCEPT
echo "Regras terminal serv ................................[ OK ]"

######

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

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


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

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

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

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

# PORTA 20 - ACEITA PARA A REDE LOCAL
#iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A FORWARD -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp --syn --dport 22 -m recent --name sshattack --set
iptables -A INPUT -p tcp --dport 22 --syn -m recent --name sshattack --rcheck --seconds 60 --hitcount 3 -j LOG --log-prefix 'SSH REJECT: '
iptables -A INPUT -p tcp --dport 22 --syn -m recent --name sshattack --rcheck --seconds 60 --hitcount 3 -j REJECT --reject-with tcp-reset
iptables -A FORWARD -p tcp --syn --dport 22 -m recent --name sshattack --set
iptables -A FORWARD -p tcp --dport 22 --syn -m recent --name sshattack --rcheck --seconds 60 --hitcount 3 -j LOG --log-prefix 'SSH REJECT: '
iptables -A FORWARD -p tcp --dport 22 --syn -m recent --name sshattack --rcheck --seconds 60 --hitcount 3 -j REJECT --reject-with tcp-reset

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

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


# PORTA 53 - ACEITA PARA A REDE LOCAL

iptables -A FORWARD -i eth0 -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -i eth0 -p udp --dport 53 -j ACCEPT

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

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

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

# identd
iptables -A INPUT -p tcp --dport 113 -j ACCEPT
iptables -A INPUT -p udp --dport 113 -j ACCEPT

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

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

# PORTA 20 - ACEITA PARA A REDE LOCAL
#iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A FORWARD -p tcp --dport 20 -j ACCEPT

#bloqueia  qualquer tentativa de nova conexao de fora para esta maquina
iptables -A INPUT -i eth1 -m state --state ! ESTABLISHED,RELATED -j LOG --log-level 6 --log-prefix "FIREWALL entrada "
iptables -A INPUT -i eth1 -m state --state ! ESTABLISHED,RELATED -j DROP

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

################################
# Cadeia de Reenvio (FORWARD).
# Primeiro, ativar o mascaramento (nat).
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
echo "Ativando o mascaramento .............................[ OK ]"

# Agora dizemos quem e o que podem acessar externamente
# O controle do acesso a rede externa e feito na cadeia "FORWARD"
iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "Ativando o acesso ftp.. .............................[ OK ]"



###################
###BLOQUEANDO TODAS AS SAIDAS E PORTAS
iptables -A INPUT -p all -j DROP
iptables -A FORWARD -p all -j DROP  
echo "Rejeitando saida e entrada ..........................[ OK ]"
########################

# No iptables, temos de dizer quais sockets sao validos em uma conexao

iptables -A FORWARD -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
echo "Quais sockets sao validos ...........................[ OK ]"

#################################################
# Tabela FILTER
#################################################

# Proteção contra tronjans
# -------------------------------------------------------
iptables -A INPUT -p TCP -i eth1 --dport 666 -j DROP
iptables -A INPUT -p TCP -i eth1 --dport 4000 -j DROP
iptables -A INPUT -p TCP -i eth1 --dport 6000 -j DROP
iptables -A INPUT -p TCP -i eth1 --dport 6006 -j DROP
iptables -A INPUT -p TCP -i eth1 --dport 16660 -j DROP

# Proteção contra trinoo
# -------------------------------------------------------
iptables -A INPUT -p TCP -i eth1 --dport 27444 -j DROP
iptables -A INPUT -p TCP -i eth1 --dport 27665 -j DROP
iptables -A INPUT -p TCP -i eth1 --dport 31335 -j DROP
iptables -A INPUT -p TCP -i eth1 --dport 34555 -j DROP
iptables -A INPUT -p TCP -i eth1 --dport 35555 -j DROP
echo "Proteção contra trinoo ............................. [ OK ]"

# Protecao contra acesso externo squid
# -------------------------------------------------------
iptables -A INPUT -p TCP -i eth1 --dport 3128 -j DROP
iptables -A INPUT -p TCP -i eth1 --dport 8080 -j DROP
echo "Proteção contra squid externo....................... [ OK ]"

# Protecao contra telnet
# -------------------------------------------------------
iptables -A INPUT -p TCP -i eth1 --dport telnet -j DROP
echo "Proteção contra telnet       ....................... [ OK ]"

# Dropa pacotes TCP indesejáis
# -------------------------------------------------------
iptables -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP 
# Dropa pacotes mal formados
# -------------------------------------------------------
#iptables -A INPUT -i eth1 -m unclean -j DROP
# Proteç contra worms
# -------------------------------------------------------
iptables -A FORWARD -p tcp --dport 135 -i eth1 -j REJECT
# Proteç contra syn-flood
# -------------------------------------------------------
iptables -A FORWARD -p tcp --syn -m limit --limit 2/s -j ACCEPT
# Proteç contra ping da morte
# -------------------------------------------------------
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
echo "Caregando tabela filter ............................ [ OK ]"
#Allow ALL other forwarding going out
iptables -A FORWARD -o eth1 -i eth0 -j ACCEPT

#################################################
# FIM DA Tabela FILTER
#################################################
# Proteção contra port scanners
# -------------------------------------------------------
#iptables -N SCANNER
iptables -A SCANNER -m limit --limit 15/m -j LOG --log-prefix "FIREWALL: port scanner: "
iptables -A SCANNER -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -i eth1 -j SCANNER
iptables -A INPUT -p tcp --tcp-flags ALL NONE -i eth1 -j SCANNER
iptables -A INPUT -p tcp --tcp-flags ALL ALL -i eth1 -j SCANNER
iptables -A INPUT -p tcp --tcp-flags ALL FIN,SYN -i eth1 -j SCANNER
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -i eth1 -j SCANNER
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -i eth1 -j SCANNER
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -i eth1 -j SCANNER
echo "Scaner de Portas ....................................[ OK ]"

# Loga tentativa de acesso a determinadas portas
# -------------------------------------------------------
iptables -A INPUT -p tcp --dport 22 -i eth1 -j LOG --log-prefix "FIREWALL: ssh: "
iptables -A INPUT -p tcp --dport 21 -i eth1 -j LOG --log-prefix "FIREWALL: ftp: "
iptables -A INPUT -p tcp --dport 23 -i eth1 -j LOG --log-prefix "FIREWALL: telnet: "
iptables -A INPUT -p tcp --dport 25 -i eth1 -j LOG --log-prefix "FIREWALL: smtp: "
iptables -A INPUT -p tcp --dport 80 -i eth1 -j LOG --log-prefix "FIREWALL: http: "
iptables -A INPUT -p tcp --dport 110 -i eth1 -j LOG --log-prefix "FIREWALL: pop3: "
iptables -A INPUT -p udp --dport 111 -i eth1 -j LOG --log-prefix "FIREWALL: rpc: "
iptables -A INPUT -p tcp --dport 113 -i eth1 -j LOG --log-prefix "FIREWALL: identd: "
iptables -A INPUT -p tcp --dport 137:139 -i eth1 -jLOG --log-prefix "FIREWALL: samba: "
iptables -A INPUT -p udp --dport 137:139 -i eth1 -j LOG --log-prefix "FIREWALL: samba: "
iptables -A INPUT -p tcp --dport 161:162 -i eth1 -j LOG --log-prefix "FIREWALL: snmp: "
iptables -A INPUT -p tcp --dport 6667:6668 -i eth1 -j LOG --log-prefix "FIREWALL: irc: "
iptables -A INPUT -p tcp --dport 3128 -i eth1 -j LOG --log-prefix "FIREWALL: squid: "
echo "Negando portas indesejadas ..........................[ OK ]"

# Libera acesso externo a determinadas portas

##Algumas portas devem ser negadas.
iptables -A INPUT -p tcp --dport 1433 -j DROP
iptables -A INPUT -p tcp --dport 6670 -j DROP
iptables -A INPUT -p tcp --dport 6711 -j DROP
iptables -A INPUT -p tcp --dport 6712 -j DROP
iptables -A INPUT -p tcp --dport 6713 -j DROP
iptables -A INPUT -p tcp --dport 12345 -j DROP
iptables -A INPUT -p tcp --dport 12346 -j DROP
iptables -A INPUT -p tcp --dport 20034 -j DROP
iptables -A INPUT -p tcp --dport 31337 -j DROP
iptables -A INPUT -p tcp --dport 6000  -j DROP
echo "Negando portas invalidas ............................[ OK ]"

#Traceroutes caindo

iptables -A INPUT -p udp --dport 33434:33523 -j DROP
iptables -A INPUT -p tcp --dport 113 -j REJECT
iptables -A INPUT -p igmp -j REJECT
iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -A INPUT -p tcp --dport 443 -j REJECT

echo "Rejeitando lixo :....................................[ OK ]"

# Finalmente: Habilitando o trafego IP, entre as Interfaces de rede
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "Habilitar o trafego IP entre as placas: .............[ OK ]"

echo "##################FIM DE REGRAS IPTABLES####################"
exit 0


Lembro que peguei ele a uns 2 anos atraz não lembro da fonte mas agora depois de varias mudanças esta ai. o eth0 = rede interna eth1=internet
  


Comentários
[1] Comentário enviado por zenun em 02/04/2008 - 03:31h

Ola meu amigo...
Esse seu script esta realmente grande!
Mas ao meu ver não precisa ser dessa forma!
Tem muita coisa que você repete no começo e não precisa, como por exemplo:

###########setando protecao contra ataques
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
for i in /proc/sys/net/ipv4/conf/*; do
echo 0 >$i/accept_redirects
echo 0 >$i/accept_source_route
echo 1 >$i/log_martians
echo 1 >$i/rp_filter;
done

E logo depois voce:

echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects

Isso esta fazendo a mesma coisa kra!
Você fez um for ali que já irá redirecionar sua saida para "*" interfaces!

No começo tambem você desabilita o ip_forward, mas se antes do linux dar o boot não tiver nenhum script habilitando ele não tem porque você tirar ele e no final habilitar de novo! ;)

Outra coisa... sei que muita gente coloca para carregar os modulos do iptables da na mão, mas se você esta usando um kernel novo ele irá carregar o modulo automatico. Isso não vai acontecer só se você compilar o kernel tirando essa opção (pelo menos eu creio que sim, me corrijam se eu estiver errado! por favor! ;) )

Ali na parte de scanners ta blz... você ta verificando os campos setados no segmento TCP, mas quando você joga para a chain SCANNER você permite o trafego! Heheh eu acho que não gostaria de ter esse tipo de pacote malicioso em meu servidor! Eu acho que se você realmente quiser deixar isso poderia ser para sua rede interna! E outro detalhe... você deveria jogar essas regras para o inicio do iptables! Porque como elas estão no final existe a possibilidade de elas nunca chegarem ai! ;)

Bom... são uns poucos comentarios pois eu acho que da para melhorar esse seu script!

Falow!!

[2] Comentário enviado por esresende em 02/04/2008 - 08:29h

zenun, como vc deixaria o script do nosso amigo para uma maior eficiência e eficácia? corija-o de da forma que julgar mais interessante e poste ai pra gente. Abraços

[3] Comentário enviado por zenun em 02/04/2008 - 14:26h

Então meu amigo...
O que eu coloquei no meu comentário já seriam melhoras para o script!
Acho que a ideia deste post que ele fez aqui era conseguir ideias para melhorar ele. Eu dei as ideias... ficar postando script no reply não acho interessante! Fica uma bagunça! ;)

O legal seria ele ir arrumando e a galera ir comentando! ;)
Assim ele vai aprendendo mais tb!

[4] Comentário enviado por rjdiniz em 25/06/2008 - 19:17h

kra! como ficou grande... sem contar que está muito repetitivo!!! Mas valeu para novas implementações em meus servidores firewall!

[5] Comentário enviado por paulocdc em 31/07/2008 - 19:54h

Seguindo as dicas do nosso amigo Zenun estou mudando as configurações.
Agora só não entendi a parte que vc falou dos SCANNER teria como vc fazer um exemplo.
E valeu pelas melhorias.
Fica todo mundo avontade em fazer mudanças que eu coloco e discutimos como fazer.....
A ideia e realmente esta criar um firewall "perfeito".rsrs


Contribuir com comentário

  



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts