Iptables (rc.firewall)

Firewall Completo, Fácil e Limpo!

Categoria: Segurança

Software: Iptables

[ Hits: 15.577 ]

Por: André L. Antunes


Firewall pronto para ser usado com proxy transparente, bloqueando acessos da internet para a sua rede, inclusive ao ssh do firewall.

Obs.: Caso vc não tenha o squid rodando, basta comentar a seguinte linha:
#iptables -t nat -A PREROUTING -s $Rede_Interna -p tcp --dport 80 -j REDIRECT --to-port 3128

Obs.: O script tem uma função que verifica o status do último comando executado, retornando "ok" ou "erro"


#/bin/bash

#Deleloped by Andrei/André

Internet=eth0
#configure a variavel Rede_Interna de acordo com a sua rede
Rede_Interna=10.1.1.0/24



NORMAL="\33[0m"
GOOD="\33[32;1m"
BAD="\33[31;1m"

ok_or_error() {
  if [ "$?" = "0" ]; then
    tput hpa 60
    echo -ne "$GOOD[OK]"
  else
    tput hpa 60
    echo -ne "$BAD[ERR]"
  fi
  echo -ne "$NORMAL\n"
}

fire_start() {

/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp
/sbin/modprobe iptable_nat

echo
echo "================================================================"
echo "            | :: Setando as regras do Firewall :: |             "
echo "================================================================"


#Regras Padrão das Chains --------------------------------------------
echo -n "Setting default rules"
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
ok_or_error
#---------------------------------------------------------------------


# Desativando o IP Forward -------------------------------------------
echo -n  "Setting ip_forward: OFF"
echo "0" > /proc/sys/net/ipv4/ip_forward
ok_or_error
#---------------------------------------------------------------------


# Anti Spoofing ------------------------------------------------------
echo -n "Setting anti-spoofing protection"
for spoofing in /proc/sys/net/ipv4/conf/*/rp_filter; do
        echo "0" > $spoofing
done
ok_or_error 
#----------------------------------------------------------------------


# Anti-Redirects ------------------------------------------------------
echo -n "Setting anti-redirects"
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
ok_or_error
#----------------------------------------------------------------------


# Anti source route -- ------------------------------------------------
echo -n "Setting anti-source_route"
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
ok_or_error
#----------------------------------------------------------------------


# Anti bugus response -------------------------------------------------
echo -n "Setting anti-bugus_response"
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
ok_or_error
#----------------------------------------------------------------------


# Anti Synflood protection --------------------------------------------
echo -n "Setting anti-synflood protection"
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
ok_or_error


# Ping ignore ---------------------------------------------------------
echo -n "Ping Ignore"
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
ok_or_error
#----------------------------------------------------------------------


# Chain INPUT  --------------------------------------------------------
echo -n "Setting rules for INPUT"
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ok_or_error
#----------------------------------------------------------------------


# Chain FORWARD -------------------------------------------------------
echo -n "Setting rules for FORWARD"
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
ok_or_error
#----------------------------------------------------------------------


# IP Masquerading (NAT) -----------------------------------------------
echo -n "Activating IP Mask"
iptables -t nat -A POSTROUTING -o $Internet -j MASQUERADE
ok_or_error
#----------------------------------------------------------------------


# INPUT--------------------------------------------------------------------------------
echo -n "Input manual rules"
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -s $Rede_Interna --dport 22 -j ACCEPT
iptables -A INPUT -p udp -s $Rede_Interna --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -s $Rede_Interna --dport 3128 -j ACCEPT
ok_or_error
#--------------------------------------------------------------------------------------


# FORWARD------------------------------------------------------------------------------
echo -n "Forward manual rules"
iptables -A FORWARD -p tcp -s $Rede_Interna -j ACCEPT
ok_or_error
#--------------------------------------------------------------------------------------

# REDIRECIONAMENTO DE HOSTS------------------------------------------------------------
echo -n "Hosts Redirects manual rules"
#aqui vc pode colocar seus redirecionamentos DNAT e SNAT
ok_or_error
#----------------------------------------------------------------------------------------------------------


# REDIRECIONAMENTO DE PORTAS-------------------------------------------------------------------------------
echo -n "Ports Redirects manual rules"
iptables -t nat -A PREROUTING -s $Rede_Interna -p tcp --dport 80 -j REDIRECT --to-port 3128
ok_or_error
#----------------------------------------------------------------------------------------------------------


# IP Forward ON -------------------------------------------------------------------------------------------
echo -n "Setting ip_forward: ON"
echo "1" > /proc/sys/net/ipv4/ip_forward
ok_or_error
#----------------------------------------------------------------------------------------------------------

echo "================================================================"
echo "       <<<--->>>       Firewall Ativo!          <<<--->>>       "
echo "================================================================"
}




fire_stop() {
  echo "Stopping Firewall..."
  /usr/sbin/iptables -F 
  /usr/sbin/iptables -t nat -F 
  /usr/sbin/iptables -t mangle -F 
  /usr/sbin/iptables -X 
  /usr/sbin/iptables -X -t nat 
  /usr/sbin/iptables -Z 
  /usr/sbin/iptables -F INPUT
  /usr/sbin/iptables -F OUTPUT
  /usr/sbin/iptables -F POSTROUTING -t nat
  /usr/sbin/iptables -F PREROUTING -t nat


  /usr/sbin/iptables -P INPUT ACCEPT 
  /usr/sbin/iptables -P FORWARD ACCEPT 
  /usr/sbin/iptables -P OUTPUT ACCEPT 
ok_or_error
}


fire_restart() {
  fire_stop
  sleep 1
  fire_start
}

case "$1" in
'start')
  fire_start
  ;;
'stop')
  fire_stop
  ;;
'restart')
  fire_restart
  ;;
*)
  echo "usage $0 start|stop|restart"
esac
  


Comentários
[1] Comentário enviado por beowulf em 26/11/2007 - 08:33h

Bem legal seu script... uma pergunta, se eu tenho neste servidor um "servidor de DNS primario" como ficaria a regra para libera-lo, a consulta seria de fora para dentro e de dentro para fora

[2] Comentário enviado por scoff em 26/11/2007 - 11:09h

Opa... Cara, se o DNS ta rodando na mesma máquina....na linha
iptables -A INPUT -p udp -s $Rede_Interna --dport 53 -j ACCEPT
vc ta liberando as consultas ao DNS somente a partir da rede interna, mas se vc remover "-s $Rede_Interna" seu servidor estará aceitando conexões externas na porta 53.
ex:
iptables -A INPUT -p udp --dport 53 -j ACCEPT

Espero ter ajudado!
Att.
Scoff

[3] Comentário enviado por elgio em 29/11/2007 - 21:52h

Tem razão... olhei de forma muito superficial o teu script. Foi mal

[4] Comentário enviado por scoff em 30/11/2007 - 10:04h

Opa Elgio. Em primeiro lugar, me senti um pouco ofendido com o seu comentário final, pois admito que posso cometer erros, assim como qualquer outra pessoa, mas td bem....vamos lá!
vc disse:

"Ao mesmo tempo que tu liga regras de proxy transparente tu FECHA a chain FORWARD e desliga o roteamento (colocando 0 em ip_forward)."

-Na verdade, não sei se vc reparou, mas eu desligo o rotemaneto no início sim, aí todas as regras são aplicadas, e se vc reparar, eu ativo novamente o roteamento na última regra do fire_start()

# IP Forward ON -------------------------------------------------------------------------------------------
echo -n "Setting ip_forward: ON"
echo "1" > /proc/sys/net/ipv4/ip_forward
ok_or_error
-------------------------------------------------------------------------------------------

Muito obrigado por ter se prestado a analisar meu script, mas talvez vc não tenha visto a regra acima. Caso eu tenha entendido mal, sua critica, me desculpa...mas ativando o roteamento antes do final da função, acredito que o problema que vc citou não existe. Obrigado...=)

Obs. A chain forward é fechada como padrão, mas vc tb não deve ter percebido a regra:
# FORWARD------------------------------------------------------------------------------
echo -n "Forward manual rules"
iptables -A FORWARD -p tcp -s $Rede_Interna -j ACCEPT
ok_or_error

Essa regra abre td a saida da rede interna, mas bloqueia a entrada...se o cara tiver um servidor na rede, é só fazer os redirecionamentos!

[5] Comentário enviado por elgio em 30/11/2007 - 10:09h

Opa.

Realmente, não vi o final do script onde tu libera o roteamento e depois insere regras no firewall. Mais uma vez desculpas.

Como errar é humano e corrigir o erro, sempre que possível, é sempre louvável, tomei a liberdade de editar meus comentários anteriores para que novos mal entendidos não ocorram.

[]'s

[6] Comentário enviado por andrey em 30/11/2007 - 11:25h

Cada um....tem gente que precisa de óculos....

Show de bola André! Ótimo script!

[7] Comentário enviado por elgio em 30/11/2007 - 11:32h

Oi Andrey.

Pior é que a revisão do meu grau de óculos está vencida mesmo! Fez-me lembrar que preciso mesmo marcar um oftalmo. hehehehe

Eu já me desculpei com o André seja em outro post logo abaixo e em email pessoal a ele. realmente não vi e espero que isto seja considerado como nada além de um descuido meu.

Forte abraço

[8] Comentário enviado por scoff em 30/11/2007 - 11:38h

Td resolvido galera! O importante é que assim, as dúvidas foram esclarecidas, os mal entendidos tb, e parece que o script funciona, qto ao Elgio...isso acontece...sem ressentimentos! Qto ao Andrei, valeu a força...é uma cara que sempre ta disposto a ajudar, e os artigos deles provam que o cara é extraordinário!

VIVA O LINUX! (e o Patrick)

[9] Comentário enviado por Bique em 20/12/2007 - 13:58h

Bom artigo e gostei da opcao nele contra os SYN FOODS
"echo 1 > /proc/sys/net/ipv4/tcp_syncookies" - creio ser um dos metodos mais eficazes contra DOS.
Mais uma vez valeu.

[10] Comentário enviado por ramos1986 em 15/01/2008 - 21:49h

Ficou Show esse script

[11] Comentário enviado por AndreFranca em 07/02/2008 - 01:45h

Excelente script.... porém tenho um comentário....
você mudando a política padrão do FORWARD para DROP, e não permitindo a passagem de pacotes udp vindo da rede local, seus clientes não poderão fazer pesquisas DNS.... me corrija caso esteja errado.... como solução teríamos do #FORWARD assim:

iptables -A FORWARD -p tcp -s $Rede_Interna -j ACCEPT
iptables -A FORWARD -p udp -s $Rede_Interna -j ACCEPT ou

simplesmente assim:

iptables -A FORWARD -s $Rede_Interna -j ACCEPT

sucesso a todos... e
Viva O Linux (e o patrick)

[12] Comentário enviado por scoff em 07/02/2008 - 15:22h

AndreFranca
Opa, obrigado pelo comentário. Agradeço a sua colaboração, mas acho que você deixou passar a regra:
# FORWARD------------------------------------------------------------------------------
echo -n "Forward manual rules"
iptables -A FORWARD -p tcp -s $Rede_Interna -j ACCEPT
ok_or_error
#--------------------------------------------------------------------------------------

Essa regra permite consultas DNS a servidores externos, tanto quanto qualquer outro tipo de conexão, em qualquer porta, desde que as solicitações sejam originadas na rede interna.
Abraço!


[13] Comentário enviado por azo em 13/03/2008 - 01:27h

aqui n ta dando certo. bem o que ocorre é que na linha

iptables -A FORWARD -p tcp -s $Rede_Interna -j ACCEPT

eu fiz isso
iptables -A FORWARD -s $Rede_Interna -j ACCEPT

bem... agora soh consigo pingar do cliente... mas nao navega em nada
alguem?

[14] Comentário enviado por scoff em 24/03/2008 - 15:03h

Opa Azo. cara, vc ta usando o squid?

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

muito bom !!

[16] Comentário enviado por scoff em 28/10/2008 - 16:12h

Obrigado comfaa!

[17] Comentário enviado por silent-man em 21/11/2008 - 18:29h

Boa tarde,
Muito Boa Config, porém quando insiro na chain DNAT nesse conf um redirecionamento tipo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 23 -j DNAT --to-destination 172.x.x.x não funciona. Se eu der um Stop no firewall e colocar esta regra na mão funciona. Já procurei algo na config que pudesse estar barrando mais não encontrei se alguém ai tiver a solução por favor postar!


Abcs

[18] Comentário enviado por scoff em 22/11/2008 - 16:36h

Opa! Cara, vc liberou a porta na FORWARD com destino ao IP q está ouvindo na 3389?

Ex: iptables -A FORWARD -p tcp -d 172.x.x.x --dport 3389 -j ACCEPT

Se puder, posta o resultado! Vlw, Abraço...

[19] Comentário enviado por silent-man em 24/11/2008 - 09:32h

Funcionou com esta opção, porém sem o -t nat :) ou então removendo o FORWARD DROP porém não é nada seguro.

Agora não estou conseguindo liberar determinado IP para NET.

iptables -t nat -I POSTROUTING -s 172.x.x.x -o eth0 -j MASQUERADE

[20] Comentário enviado por scoff em 24/11/2008 - 18:14h

desculpa, eu tava na aula qdo tava respondendo...ehehe (-t nat)

[21] Comentário enviado por scoff em 24/11/2008 - 18:21h

vc tem algum proxy rodando na rede?
vc ta usando a variável "Rede_Interna" ?

[22] Comentário enviado por silent-man em 24/11/2008 - 18:54h

Sim tenho proxy rodando!!!
mailme gleison.r2@gmail.com

[]s

[23] Comentário enviado por apileofshit em 03/03/2009 - 21:28h

opa

[24] Comentário enviado por apileofshit em 03/03/2009 - 22:17h

Ola, sou novato no linux estou estudando mto e me esforçando pra aprender, virei pinguim de paixão, entao vamos la.
na minha rede uso apenas os servicos.( DNS, DHCP, SAMBA, POSTFIX, (JA ATIVOS, e td OK )) (SSH, FIREWALL, E SQUID.(ESTOU FAZENDO E QUERO AJUDA) )
quero bloquear TD, que nao seja isso, tenho mto medo de invasao, etcs.
minha rede eh:
modem dlink 500b 10.1.10.1
eth0 = 10.1.10.2 rodando (DNS)
eth1 = 10.1.1.3 rodando (DHCP, SAMBA, POSTFIX)
(acho que o squid, e firewall entra na eth1?!?)
(os ips das extações ficaram 10.1.1.4 , .5 , .6 e assim vai ..)
(minhas duvidas são, deixo o DNS na eth0 ? ou passo pra eth1 ? )
( estou querendo trocar os ips, deixando eth0 10.1.1.2, e eth1 192.168.0.1
ou nao precisa ? )
(esse script ta bloqueando tudo e so liberando as portas que quero ?)
segue a baixo o script do scoff com minhas duvidas comentas !!

#/bin/bash

#Deleloped by Andrei/André

Internet=eth0
#configure a variavel Rede_Interna de acordo com a sua rede
Rede_Interna=10.1.1.0/24 (seria minha eth0) ????
Rede_Interna=10.1.10.0/24 (ou minha eth1) ????



NORMAL="\33[0m"
GOOD="\33[32;1m"
BAD="\33[31;1m"

ok_or_error() {
if [ "$?" = "0" ]; then
tput hpa 60
echo -ne "$GOOD[OK]"
else
tput hpa 60
echo -ne "$BAD[ERR]"
fi
echo -ne "$NORMAL\n"
}

fire_start() {

/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp
/sbin/modprobe iptable_nat

echo
echo "================================================================"
echo " | :: Setando as regras do Firewall :: | "
echo "================================================================"


#Regras Padrão das Chains --------------------------------------------
echo -n "Setting default rules"
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
ok_or_error
#---------------------------------------------------------------------


# Desativando o IP Forward -------------------------------------------
echo -n "Setting ip_forward: OFF"
echo "0" > /proc/sys/net/ipv4/ip_forward
ok_or_error
#---------------------------------------------------------------------


# Anti Spoofing ------------------------------------------------------
echo -n "Setting anti-spoofing protection"
for spoofing in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo "0" > $spoofing
done
ok_or_error
#----------------------------------------------------------------------


# Anti-Redirects ------------------------------------------------------
echo -n "Setting anti-redirects"
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
ok_or_error
#----------------------------------------------------------------------


# Anti source route -- ------------------------------------------------
echo -n "Setting anti-source_route"
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
ok_or_error
#----------------------------------------------------------------------


# Anti bugus response -------------------------------------------------
echo -n "Setting anti-bugus_response"
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
ok_or_error
#----------------------------------------------------------------------


# Anti Synflood protection --------------------------------------------
echo -n "Setting anti-synflood protection"
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
ok_or_error


# Ping ignore ---------------------------------------------------------
echo -n "Ping Ignore"
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
ok_or_error
#----------------------------------------------------------------------


# Chain INPUT --------------------------------------------------------
echo -n "Setting rules for INPUT"
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ok_or_error
#----------------------------------------------------------------------


# Chain FORWARD -------------------------------------------------------
echo -n "Setting rules for FORWARD"
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
ok_or_error
#----------------------------------------------------------------------


# IP Masquerading (NAT) -----------------------------------------------
echo -n "Activating IP Mask"
iptables -t nat -A POSTROUTING -o $Internet -j MASQUERADE
ok_or_error
#----------------------------------------------------------------------


# INPUT--------------------------------------------------------------------------------
echo -n "Input manual rules"
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -s $Rede_Interna --dport 22 -j ACCEPT
iptables -A INPUT -p udp -s $Rede_Interna --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -s $Rede_Interna --dport 3128 -j ACCEPT
#AQUI E SO COLOCA AS PORTAS QUE QUERO LIBERA , ISSO EU SEI 53,139,3128,80, etcs etcs
ok_or_error
#--------------------------------------------------------------------------------------


# FORWARD------------------------------------------------------------------------------
echo -n "Forward manual rules"
iptables -A FORWARD -p tcp -s $Rede_Interna -j ACCEPT
ok_or_error
#--------------------------------------------------------------------------------------

# REDIRECIONAMENTO DE HOSTS------------------------------------------------------------
echo -n "Hosts Redirects manual rules"
#aqui vc pode colocar seus redirecionamentos DNAT e SNAT
ok_or_error
#----------------------------------------------------------------------------------------------------------


# REDIRECIONAMENTO DE PORTAS-------------------------------------------------------------------------------
echo -n "Ports Redirects manual rules"
#iptables -t nat -A PREROUTING -s $Rede_Interna -p tcp --dport 80 -j REDIRECT --to-port 3128
#QUANDO EU ARRUMAR O SQUID EU DESCOMENTO
ok_or_error
#----------------------------------------------------------------------------------------------------------


# IP Forward ON -------------------------------------------------------------------------------------------
echo -n "Setting ip_forward: ON"
echo "1" > /proc/sys/net/ipv4/ip_forward
ok_or_error
#----------------------------------------------------------------------------------------------------------

echo "================================================================"
echo " <<<--->>> Firewall Ativo! <<<--->>> "
echo "================================================================"
}




fire_stop() {
echo "Stopping Firewall..."
/usr/sbin/iptables -F
/usr/sbin/iptables -t nat -F
/usr/sbin/iptables -t mangle -F
/usr/sbin/iptables -X
/usr/sbin/iptables -X -t nat
/usr/sbin/iptables -Z
/usr/sbin/iptables -F INPUT
/usr/sbin/iptables -F OUTPUT
/usr/sbin/iptables -F POSTROUTING -t nat
/usr/sbin/iptables -F PREROUTING -t nat


/usr/sbin/iptables -P INPUT ACCEPT
/usr/sbin/iptables -P FORWARD ACCEPT
/usr/sbin/iptables -P OUTPUT ACCEPT
ok_or_error
}


fire_restart() {
fire_stop
sleep 1
fire_start
}

case "$1" in
'start')
fire_start
;;
'stop')
fire_stop
;;
'restart')
fire_restart
;;
*)
echo "usage $0 start|stop|restart"
esac


[25] Comentário enviado por leonardufb em 16/02/2012 - 18:43h

Amigo, como faria para deixar por padrão todas a portas originadas da rede bloqueadas, e liberar apenas as que precisar, pois, aqui na rede, o pessoal está usando muito programas, P2P, skype, etc, e ferrando o tráfego. Não tenho como bloquear porta a porta devido serem muitas, além de sempre ter um usuário com um programa novo.

[26] Comentário enviado por silent-man em 17/02/2012 - 09:20h

@leonardufb

Se a sua política padrão na chain(tabela) FORWARD estiver como -P, está bloqueando todo o tráfego de dentro da sua rede para fora. Se ainda assim com esta política de negar tudo, pode ser que tenha alguma regra liberando tudo mesmo que a política padrão seja -P.

Outra dica: se você utiliza proxy na rede, pode ser que a pessoa esteja saindo pelo proxy para usar programas P2P. Uma solução para isso é bloquear a navegação por IP. Assim, o cara não irá conseguir acessar sites pelo seu endereço IP, logo, o programa P2P não irá funcionar.

Exemplo de uma acl do proxy squid.

acl bloqueia_navegacao_via_ip dstdom_regex [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+
http_access deny bloqueia_navegacao_via_ip

[]s


Contribuir com comentário

  



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts