Firewall - IPTables (rc.firewall)

Firewall com máxima segurança

Categoria: Segurança

Software: Firewall - IPTables

[ Hits: 27.477 ]

Por: Sérgio Abrantes Junior



Esse firewall possui política DROP tanto para entrada (INPUT) quando saída de rede interna (FORWARD).

Essas regras estão em pleno funcionamento em cliente.

O arquivo está comentado e, ao meu ver, é de fácil compreensão.


Qualquer dúvida estou aí.


Sérgio Abrantes


[]'s


#!/bin/bash
#
# /etc/rc.d/rc.firewall
#
# Start/stop/restart Firewall
#
# To make Firewall start automatically at boot, make this
# file executable:  chmod 755 /etc/rc.d/rc.firewall
#
#Autor: Sérgio Abrasntes Junior sergioabrantes@gmail.com
#Data de criação 15/09/05
#Data de modificação 15/12/07

# Variáveris #

LanExt=200.193.xx.xx
LanInt=192.168.4.1
Rede=192.168.4.0/24

# Modulos #

/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state
/sbin/modprobe ipt_REDIRECT
/sbin/modprobe ipt_owner
/sbin/modprobe ipt_REJECT
/sbin/modprobe ipt_MASQUERADE
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp

####################
### Função START ###
####################
firewall_start() {
echo "Iniciando o Firewall"

# Limpa as regras #

iptables -X
iptables -Z
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -F -t nat
iptables -F -t mangle

# Politicas padrao #

iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD DROP
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P OUTPUT ACCEPT

# Manter conexoes jah estabelecidas para nao parar
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Aceita todo o trafego vindo do loopback e indo pro loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
#######################
### LOG DO FIREWALL ###
#######################

#iptables -A INPUT -d $LanExt -p tcp --dport 22 -j LOG --log-level 6 --log-prefix "FIREWALL: SSH EXT 22"
#iptables -A INPUT -d $LanExt -p tcp --dport 21 -j LOG --log-level 6 --log-prefix "FIREWALL: FTP EXT 21"
#iptables -A INPUT -d $LanInt -p tcp --dport 22 -j LOG --log-level 6 --log-prefix "FIREWALL: SSH INT 22"
#iptables -A INPUT -d $LanInt -p tcp --dport 21 -j LOG --log-level 6 --log-prefix "FIREWALL: FTP INT 21"


###############################
#         Proteções           #
###############################

# Protege contra os "Ping of Death"
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 20/m -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 20/m -j ACCEPT

# Protege contra port scanners avançados (Ex.: nmap)
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 20/m -j ACCEPT

# Bloqueando tracertroute
iptables -A INPUT -p udp -s 0/0 -i eth0 --dport 33435:33525 -j REJECT

# Protecoes contra ataques
iptables -A INPUT -m state --state INVALID -j REJECT


###############################
#       TABELA Input          #
###############################
### Destino Externo ###

# Liberando Porta 22 (SSH)
#iptables -A INPUT -d $LanExt -p tcp --dport 22 -j LOG --log-level 6 --log-prefix "FIREWALL: SSH EXT 2222"
iptables -A INPUT -d $LanExt -p tcp --dport 22 -j ACCEPT

# Liberando Porta 21 (ftp)
#iptables -A INPUT -d $LanExt -p tcp --dport 21 -j LOG --log-level 6 --log-prefix "FIREWALL: FTP EXT 21"
iptables -A INPUT -d $LanExt -p tcp --dport 21 -j ACCEPT

### Destino Interno ###

# Liberando Porta 22 (SSH)
#iptables -A INPUT -d $LanInt -p tcp --dport 22 -j LOG --log-level 6 --log-prefix "FIREWALL: SSH INT 22"
iptables -A INPUT -d $LanInt -p tcp --dport 22 -j ACCEPT

# Liberando porta 3128 (Squid)
iptables -A INPUT -d $LanInt -p tcp --dport 3128 -j ACCEPT

# Liberando Porta 80 (http)
#iptables -A INPUT -d $LanInt -p tcp --dport 80 -j LOG --log-level 6 --log-prefix "FIREWALL: HTTP INT 80"
iptables -A INPUT -d $LanInt -p tcp --dport 80 -j ACCEPT


# Liberando Porta 21 (ftp)
#iptables -A INPUT -d $LanInt -p tcp --dport 21 -j LOG --log-level 6 --log-prefix "FIREWALL: FTP INT 21"
iptables -A INPUT -d $LanInt -p tcp --dport 21 -j ACCEPT

# Liberando porta 3000 (NTOP)
iptables -A INPUT -d $LanInt -p tcp --dport 3000 -j ACCEPT
###############################
#       TABELA Forward        #
###############################


# Libera computador das regras do firewall
iptables -A FORWARD -s 192.168.4.13 -p tcp  -j ACCEPT
iptables -A FORWARD -s 192.168.4.13 -p udp  -j ACCEPT

### MSN ###

# Libera msn para o IP #


# nome
iptables -A FORWARD -s 192.168.4.11 -p tcp --dport 1863 -j ACCEPT


# Bloqueio de MSN #


#iptables -A FORWARD -s 192.168.4.0 -p tcp --dport 1863 -j DROP
#iptables -A FORWARD -s 192.168.4.0 -d loginnet.passport.com -j DROP
#iptables -A FORWARD -s 198.164.4.0/24 -p tcp --dport 1863 -j DROP
#iptables -A FORWARD -s 198.164.4.0/24 -d loginnet.passport.com -j DROP
#iptables -A FORWARD -s 198.164.4.0/24 -d messenger.hotmail.com -j DROP
#iptables -A FORWARD -s 198.164.4.0/24 -d webmessenger.msn.com -j DROP
#iptables -A FORWARD -p tcp --dport 1080 -j DROP
#iptables -A FORWARD -s 198.164.4.0/24 -p tcp --dport 1080 -j DROP
#iptables -A FORWARD -p tcp --dport 1863 -j DROP
#iptables -A FORWARD -d 64.4.13.0/24 -j DROP

# Liberando Porta 2222 (SSH)
iptables -A FORWARD -s $Rede -p tcp --dport 2222 -j ACCEPT

# Liberando Porta 22 (SSH)
iptables -A FORWARD -s $Rede -p tcp --dport 22 -j ACCEPT
# Liberando Porta 110 (pop-3)
iptables -A FORWARD -s $Rede -p tcp --dport 110 -j ACCEPT

# Liberando Porta 995 (spop-3)
iptables -A FORWARD -s $Rede -p tcp --dport 995 -j ACCEPT

# Liberando Porta 25 (smtp)
iptables -A FORWARD -s $Rede -p tcp --dport 25 -j ACCEPT

# Liberando Porta 465 (smtp-s)
iptables -A FORWARD -s $Rede -p tcp --dport 465 -j ACCEPT

# Liberando Porta 2121 (ftp)
iptables -A FORWARD -s $Rede -p tcp --dport 2121 -j ACCEPT

# Liberando Porta 21 (ftp)
iptables -A FORWARD -s $Rede -p udp --dport 21 -j ACCEPT
iptables -A FORWARD -s $Rede -p udp --dport 20 -j ACCEPT

# Liberando porta 53 (DNS)
iptables -A FORWARD -s $Rede -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -s $Rede -p udp --dport 53 -j ACCEPT

# Regras forward para o funcionamento de redirecionamento de portas (NAT)
# Redirecionando porta 5900 (VNC)
#iptables -A FORWARD -p tcp --dport 5900 -j ACCEPT
#ptables -A FORWARD -p tcp --dport 5800 -j ACCEPT
###############################
######### TABELA NAT ## #######
###############################

# Redireconamento de portas
# VNC Para algum micro (192.168.1.31 = nome da pessoa)
#iptables -t nat -A PREROUTING -d $LanExt -p tcp --dport 5900 -j DNAT --to 192.168.0.77:5900

# Mascaramento de rede para acesso externo #
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

#Bloqueia todo o resto
#iptables -A INPUT -p tcp -j LOG --log-level 6 --log-prefix "FIREWALL: GERAL "
iptables -A INPUT -p tcp --syn -j DROP
iptables -A INPUT -p tcp -j DROP
iptables -A INPUT -p udp -j DROP

}

##################
### Função STOP ##
##################
firewall_stop() {

echo "Parando firewall e funcionando apenas com mascaramento"
# Limpa as regras #

iptables -X
iptables -Z
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -F -t nat
iptables -F -t mangle

# Politicas padrao #

iptables -t filter -P INPUT ACCEPT
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P OUTPUT ACCEPT

# Manter conexoes jah estabelecidas para nao parar
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Aceita todo o trafego vindo do loopback e indo pro loopback
iptables -t filter -A INPUT -i lo -j ACCEPT

###############################
#       TABELA Forward        #
###############################

### MSN ###

# Libera msn para o IP #


# nome
#iptables -A FORWARD -s 192.168.0.34 -p tcp --dport 1863 -j ACCEPT

# nome
#iptables -A FORWARD -s 192.168.0.5 -p tcp --dport 1863 -j ACCEPT


# Bloqueio de MSN #


#iptables -A FORWARD -s 192.168.1.0 -p tcp --dport 1863 -j DROP
#iptables -A FORWARD -s 192.168.1.0 -d loginnet.passport.com -j DROP
#iptables -A FORWARD -s 198.164.1.0/24 -p tcp --dport 1863 -j DROP
#iptables -A FORWARD -s 198.164.1.0/24 -d loginnet.passport.com -j DROP
#iptables -A FORWARD -s 198.164.1.0/24 -d messenger.hotmail.com -j DROP
#iptables -A FORWARD -s 198.164.1.0/24 -d webmessenger.msn.com -j DROP
#iptables -A FORWARD -p tcp --dport 1080 -j DROP
#iptables -A FORWARD -s 198.164.1.0/24 -p tcp --dport 1080 -j DROP
#iptables -A FORWARD -p tcp --dport 1863 -j DROP
#iptables -A FORWARD -d 64.4.13.0/24 -j DROP

###############################
######### TABELA NAT ## #######
###############################


# Mascaramento de rede para acesso externo #
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE



    echo "Regras Limpas e Firewall desabilitado"
}

firewall_restart() {
  echo "Reiniciando Firewall"
  firewall_stop
  sleep 3
  firewall_start
  echo "Firewall Reiniciado"
}
case "$1" in
'start')
  firewall_start
echo "Firewall Iniciado"
  ;;
'stop')
  firewall_stop
  ;;
'restart')
  firewall_restart
  ;;
*)
        echo "Opções possíveis:"
        echo "rc.firewall start"
        echo "rc.firewall stop"
        echo "rc.firewall restart"
esac


                   
  


Comentários
[1] Comentário enviado por walber em 18/07/2008 - 12:01h

Muito bom.

[2] Comentário enviado por walber em 18/07/2008 - 14:54h

Legal.

[3] Comentário enviado por pelo em 19/07/2008 - 21:30h

Me adiciona no MSN pra trocar uma idéia.
pelourinhu@hotmail.com

Sérgio Abrantes
[]'s

[4] Comentário enviado por VonNatur em 31/07/2008 - 18:09h

Excelente o script muito bem comentado,parabéns.

[]'s

[5] Comentário enviado por moacircostajr em 01/10/2008 - 18:21h

uso apenas internet externa, via cabo e wi-fi (eth0 e ath0). como faço para adaptar seu script às minhas necessidades?
PS.: minhas conexões são efetuadas com ip dinâmico.

[6] Comentário enviado por pelo em 01/10/2008 - 19:50h

Meu caro,

Existe apenas duas linhas de configuração onde faz referência a interface de rede que segue abaixo:

# Bloqueando tracertroute
iptables -A INPUT -p udp -s 0/0 -i eth0 --dport 33435:33525 -j REJECT


# Mascaramento de rede para acesso externo #
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Deve ser alterado o eth0 pela interface correspondente.

Para o restante, basta editar as variáveis no início do script .

# Variáveris #

LanExt=200.193.xx.xx
LanInt=192.168.4.1
Rede=192.168.4.0/24

Qualquer dúvida estou a disposição.

Sérgio Abrantes

[]'s

[7] Comentário enviado por moacircostajr em 03/10/2008 - 10:23h

Chefão, se não for muito incômodo, seria possível me indicar especificamente como faço as modificações no script para uma configuração tão completa como a que você já mostrou, mas considerando apenas que sou usuário doméstico pois me conecto à internet (de um modo geral e sem restrições) em casa e na faculdade, via cabo e wireless, respectivamente com um laptop. Não uso qualquer dispositivo servidor (se envio de dados através de torrents pode ser chamado, de certo modo, de dispositivo servidor, sim, eu faço o uso dele).

Muitíssimo Obrigado!!!!!!!

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

muito bom !!

[9] Comentário enviado por PROBERIO em 08/03/2009 - 22:45h

Olha excelente configuração conforme vc me indicou em outro tópico testarei aqui de acordo com as minhas necessidades e te digo se funcionou!

[10] Comentário enviado por lidue em 25/06/2009 - 17:17h

Cara estou migrando de Ubuntu 9 para Slackware 12.2.
Estou sentindo na pele o peso desse sistema que me impressiona cada fez mais pela robustes.
Digo isso porque meu lab sobe e desse com hardware limitado sem problemas.

Embora conheça pouco, mas tenho me esforçado ja alguns anos pra entender Linux.
E passando por aqui vi seu post vou esperimentar pois pude ver que é bem completo.
Minha ideia é fazer proxy Squid transparent + Iptables e junto vai rodar um Openvpn e alguma ferramentas de monitoração de bamda(NTOP, SARG E MRTG).
O hardware alocado sera Dual-Core, 2GB RAM e HD 80 GB.

Por favor gostaria de sua opnião e dos demais sobre este possivel feito.
Lembrando a todos que sempre trabalhei com Windows e tenho bastante dificuldade com sistema Linux.

E me desculpar por estar saindo da ideia do post.
Volto depois para postar.
Valeu mesmo

Sérgio Liduário

[11] Comentário enviado por pelo em 25/06/2009 - 17:28h

Lidue,

Eu tinha um pentium 700Mhz com 256MB de ram dorando tudo o que você citou acima e rodando tranquilo. Nunca tive problema.
Tens recurso de hardware sobrando pra essa finalizade. Para o NTOP e o MRTG, utilize os slackbuilds disponíveis em www.slackbuilds.org porque eles não fazem parte dos pacotes oficiais.
De resto boa sorte : )

Sérgio Abrantes
[]'s

[12] Comentário enviado por lidue em 29/06/2009 - 16:15h

Caro pelo,
Fiz minhas alterações aqui na regra que vc colocou e não consegui navegar no cliente.
Adicionei para o squid que está funcionando legal.
#iptables -t nat -A PREROUTING -p tcp -s $Rede --dport 80 -j REDIRECT --to-port 8080
#iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
#echo "1" > /proc/sys/net/ipv4/ip_forward #so por garantia

Quando paro o firewall e dou comandos acima o cliente volta a navegar.
Adicionei estes no stop do seu script e tb funcionou no cliente.
Quando dou restart navego somente local.
Liberei tb as portas 80 e 8080 assim:
#iptables -A FORWARD -s $Rede -p tcp --dport 80 -j ACCEPT
#iptables -A FORWARD -s $Rede -p tcp --dport 8080 -j ACCEPT
#iptables -A FORWARD -s $Rede -p udp --dport 8080 -j ACCEPT
Numa tentativa de resolver mas acho que estou fazendo a coisa errada.
Uma ultima coisa o ping no cliente responde somente no servidor fora não.
Preciso liberar mais coisas?
Poderia me dar uma ajuda?
Agradeço desde ja.

[13] Comentário enviado por pelo em 30/06/2009 - 22:01h

lidue,

Para liberar o ping tente o seguinte comando:

# Para poder pingar para fora
iptables -A FORWARD -p icmp --icmp-type echo-request -j ACCEPT

# Para o servidor responder ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

Para os usuários não conseguirem navegar com proxy, recomento retirar as regras acima liberando para a rede interna as portas 80 e 8080.

Desculpa a demora, mas estou atucanado no final de semestre da facul.

Sérgio Abrantes
[]'s

[14] Comentário enviado por lidue em 02/07/2009 - 16:21h

pelo,

valeu mais uma vez.

Vou refazer umas configurações aqui e retomo os teste na semana que vem.
Depois te conto o resultado.

Obrigado

[15] Comentário enviado por rapablo84 em 21/07/2009 - 14:31h

Pelo estou lendo as conf dando uma estudada para compatilhar minha conexão virta ip fico com as demais maquinas na rede, mais enfim so encontro conf de elaboração além do que vou usar e isso acaba me confundindo, tenho duas placas no debian lenny uma para o virtua ip fixo e outra para rede interna, como compartilho está conexão? pode me ajudar meu msn:ghoghost@gmail.com

[16] Comentário enviado por pelo em 21/07/2009 - 17:07h

Rapablo84,

Apenas para compartilhar então tente o seguinte:

#!/bin/bash

echo 1 > /proc/sys/net/ipv4/ip_forward

# Limpa as regras #

iptables -X
iptables -Z
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -F -t nat
iptables -F -t mangle

# Politicas padrao #

iptables -t filter -P INPUT ACCEPT
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P OUTPUT ACCEPT

# Manter conexoes jah estabelecidas para nao parar
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Aceita todo o trafego vindo do loopback e indo pro loopback
iptables -t filter -A INPUT -i lo -j ACCEPT

Sérgio Abrantes
[]'s

[17] Comentário enviado por tulioredes em 27/03/2010 - 10:55h

tenho um problema com servidor centos, posso usar este scrip, a pouco que migrei para o linux , e certas partes ainda nao consigo executar mas tento, rss


Contribuir com comentário

  



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts