Script de firewall completíssimo
Este script possui diversas características como: mascaramento da rede interna e a rede externa, bloquear acesso de sites, rádio UOL mesmo com proxy transparente, liberar as portas principais, bloqueio de ataques como ping da morte, SYN-FLOOD, ssh de força bruta, anti-spoofings e entre outros. Faltou dizer a importante amarração do ip ao mac.
Parte 4: Construindo o Firewall - Corpo principal do script/start - parte II
Aqui está uma regra onde muitos procuram como fazer, basicamente ela bloqueia um computador na rede em que o ip não seja o que está liberado para aquele mac, isto é, ele restringe o mac para aquele ip e vice versa (amarra o IP ao mac). A lógica do comando for é semelhante as anteriores, a variável i receberá de cada vez, cada linha existente no arquivo maclist, no laço for ele executará os comandos tanta vezes forem a quantidade de linhas existe no arquivo maclist.
A sintaxe deste será explicada mais adiante, mas eu posso tecer algumas sobre isto, status; ip_do_computador; mac_do_computador; nome_do_computador é a sintaxe básica do maclist, funciona assim: a sintaxe é separada por ";", na primeira subparte representa o status do computador que pode ser a (liberado) ou b (bloqueado), é possível observar nas linhas seguintes como isto ocorrerá:
Na versão original do script de amarrar ip ao mac não inclui bloquear todos os IPs.
A sintaxe deste será explicada mais adiante, mas eu posso tecer algumas sobre isto, status; ip_do_computador; mac_do_computador; nome_do_computador é a sintaxe básica do maclist, funciona assim: a sintaxe é separada por ";", na primeira subparte representa o status do computador que pode ser a (liberado) ou b (bloqueado), é possível observar nas linhas seguintes como isto ocorrerá:
#amarrar ip ao mac
for i in `cat $MACLIST`; do
#aqui cada linha do maclist é atribuída de cada vez
STATUS=`echo $i | cut -d ';' -f 1`
#o comando echo exibe o conteúdo da variável e o pipe "|" repassa a saída para outro comando, o cut por sua vez reparte cada linha em pedaços onde o delimitador (-d) é o ';' no parâmetro -f imprime na tela conteúdo da 1º coluna (status), a saída deste é enviada para STATUS;
IPSOURCE=`echo $i | cut -d ';' -f 2`
MACSOURCE=`echo $i | cut -d ';' -f 3`
MARK= `echo $IPSOURCE | cut -d '.' -f 4`
# neste caso o IPSOURCE e o MACSOURCE recebem as outras colunas da mesma linha, faço uma ressalva para o nome do computador que eu coloquei apenas para a organização do maclist, pois neste do script contará até a 3º coluna.
#aqui neste caso o comando if está dentro do laço for
#Se status = a então iptables libera a conexão através destes comandos construídos na tabela filter
if [ $STATUS = "a" ]; then
$IPTABLES -t filter -A FORWARD -d 0/0 -s $IPSOURCE -m mac --mac-source $MACSOURCE -j ACCEPT
$IPTABLES -t filter -A FORWARD -d $IPSOURCE -s 0/0 -j ACCEPT
$IPTABLES -t filter -A INPUT -s $IPSOURCE -d 0/0 -m mac --mac-source $MACSOURCE -j ACCEPT
$IPTABLES -t filter -A OUTPUT -s $IPSOURCE -d 0/0 -j ACCEPT
$IPTABLES -t filter -A OUTPUT -s 0/0 -d $IPSOURCE -j ACCEPT
$IPTABLES -t mangle -A PREROUTING -s $IPSOURCE -j MARK --set-mark $MARK
# Se for = b então bloqueia o MAC, ele só executa este comandos se STATUS não for igual a "a".
elif [ $STATUS = "b" ]; then
$IPTABLES -t filter -A FORWARD -m mac --mac-source $MACSOURCE -j DROP
$IPTABLES -t filter -A INPUT -m mac --mac-source $MACSOURCE -j DROP
$IPTABLES -t filter -A OUTPUT -m mac --mac-source $MACSOURCE -j DROP
$IPTABLES -t filter -I INPUT -s $IPSOURCE -j DROP
$IPTABLES -t filter -I FORWARD -s $IPSOURCE -d 0/0 -j DROP
$IPTABLES -t filter -I FORWARD -s 0/0 -d $IPSOURCE -j DROP
$IPTABLES -t filter -I OUTPUT -d $IPSOURCE -j DROP
# Senão for igual a "a" nem "b" então bloqueia todos os ips que não estão sendo usados
else
$IPTABLES -t filter -I INPUT -s $IPSOURCE -j DROP
$IPTABLES -t filter -I FORWARD -s $IPSOURCE -d 0/0 -j DROP
$IPTABLES -t filter -I FORWARD -s 0/0 -d $IPSOURCE -j DROP
$IPTABLES -t filter -I OUTPUT -d $IPSOURCE -j DROP
fi #fim do elif
done #fim do for
echo "Ativado a amarração do ip ao mac"
echo "ON .................................................[ OK ]"
for i in `cat $MACLIST`; do
#aqui cada linha do maclist é atribuída de cada vez
STATUS=`echo $i | cut -d ';' -f 1`
#o comando echo exibe o conteúdo da variável e o pipe "|" repassa a saída para outro comando, o cut por sua vez reparte cada linha em pedaços onde o delimitador (-d) é o ';' no parâmetro -f imprime na tela conteúdo da 1º coluna (status), a saída deste é enviada para STATUS;
IPSOURCE=`echo $i | cut -d ';' -f 2`
MACSOURCE=`echo $i | cut -d ';' -f 3`
MARK= `echo $IPSOURCE | cut -d '.' -f 4`
# neste caso o IPSOURCE e o MACSOURCE recebem as outras colunas da mesma linha, faço uma ressalva para o nome do computador que eu coloquei apenas para a organização do maclist, pois neste do script contará até a 3º coluna.
#aqui neste caso o comando if está dentro do laço for
#Se status = a então iptables libera a conexão através destes comandos construídos na tabela filter
if [ $STATUS = "a" ]; then
$IPTABLES -t filter -A FORWARD -d 0/0 -s $IPSOURCE -m mac --mac-source $MACSOURCE -j ACCEPT
$IPTABLES -t filter -A FORWARD -d $IPSOURCE -s 0/0 -j ACCEPT
$IPTABLES -t filter -A INPUT -s $IPSOURCE -d 0/0 -m mac --mac-source $MACSOURCE -j ACCEPT
$IPTABLES -t filter -A OUTPUT -s $IPSOURCE -d 0/0 -j ACCEPT
$IPTABLES -t filter -A OUTPUT -s 0/0 -d $IPSOURCE -j ACCEPT
$IPTABLES -t mangle -A PREROUTING -s $IPSOURCE -j MARK --set-mark $MARK
# Se for = b então bloqueia o MAC, ele só executa este comandos se STATUS não for igual a "a".
elif [ $STATUS = "b" ]; then
$IPTABLES -t filter -A FORWARD -m mac --mac-source $MACSOURCE -j DROP
$IPTABLES -t filter -A INPUT -m mac --mac-source $MACSOURCE -j DROP
$IPTABLES -t filter -A OUTPUT -m mac --mac-source $MACSOURCE -j DROP
$IPTABLES -t filter -I INPUT -s $IPSOURCE -j DROP
$IPTABLES -t filter -I FORWARD -s $IPSOURCE -d 0/0 -j DROP
$IPTABLES -t filter -I FORWARD -s 0/0 -d $IPSOURCE -j DROP
$IPTABLES -t filter -I OUTPUT -d $IPSOURCE -j DROP
# Senão for igual a "a" nem "b" então bloqueia todos os ips que não estão sendo usados
else
$IPTABLES -t filter -I INPUT -s $IPSOURCE -j DROP
$IPTABLES -t filter -I FORWARD -s $IPSOURCE -d 0/0 -j DROP
$IPTABLES -t filter -I FORWARD -s 0/0 -d $IPSOURCE -j DROP
$IPTABLES -t filter -I OUTPUT -d $IPSOURCE -j DROP
fi #fim do elif
done #fim do for
echo "Ativado a amarração do ip ao mac"
echo "ON .................................................[ OK ]"
Na versão original do script de amarrar ip ao mac não inclui bloquear todos os IPs.
#proxy transparente
$IPTABLES -t nat -A PREROUTING -i $LAN -p tcp --dport 80 -j REDIRECT --to-port 3128
echo "Proxy Transparente ativado"
echo "ON ..........................................................................................[ OK ]"
# ativar o mascaramento
$IPTABLES -t nat -A POSTROUTING -o $WAN -j MASQUERADE
# Carrega controlador de banda
/etc/init.d/cbq start #Para Debian
#/etc/rc.d/init.d/cbq start #Para Slackware
echo
echo "============================================= |"
echo "::TERMINADA A CONFIGURAÇÃO DO FIREWALL NETFILTER ATRAVÉS::|"
echo ":: DO IPTABLES :: |"
echo "============================================= |"
echo "FIREWALL ATIVADO - SISTEMA PREPARADO"
echo "SCRIPT DE FIREWALL CRIADO POR :-) MARCELO MAGNO :-)"
;;
$IPTABLES -t nat -A PREROUTING -i $LAN -p tcp --dport 80 -j REDIRECT --to-port 3128
echo "Proxy Transparente ativado"
echo "ON ..........................................................................................[ OK ]"
# ativar o mascaramento
$IPTABLES -t nat -A POSTROUTING -o $WAN -j MASQUERADE
# Carrega controlador de banda
/etc/init.d/cbq start #Para Debian
#/etc/rc.d/init.d/cbq start #Para Slackware
echo
echo "============================================= |"
echo "::TERMINADA A CONFIGURAÇÃO DO FIREWALL NETFILTER ATRAVÉS::|"
echo ":: DO IPTABLES :: |"
echo "============================================= |"
echo "FIREWALL ATIVADO - SISTEMA PREPARADO"
echo "SCRIPT DE FIREWALL CRIADO POR :-) MARCELO MAGNO :-)"
;;
Só uma contribuição:
"
#bloquear ataque do tipo SYN-FLOOD
echo "0" > /proc/sys/net/ipv4/tcp_syncookies
$IPTABLES -A INPUT -i $WAN -p tcp --syn -j syn-flood
(...)
$IPTABLES -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
"
Como descrevi em meu outro artigo "Iptables Protege contra Syn-Food?" esta técnica baseada em limit é FURADA (veja o artigo e meus argumentos em http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=7070).
Mas porque o "0" no tcp_syncookies??
Colocar "1" nele (LIGAR) por si só já é técnica suficiente para bloquear o Syn food. Claro que isto deve ser feito em TODOS os servidores. Tentar evitar a negação de serviço no firewall usando limit é FURADA!
[]'s