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
[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.
[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.
[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!
[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.
[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
[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!
[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!
[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"
}
# 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
#--------------------------------------------------------------------------------------
[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.