Neste capítulo temos os comandos para a opção de start do script - "/etc/init.d/firewall start".
case "$1" in
start)
#mensagem de inicialização
echo "| Script de Firewall - IPTABLES"
echo "| Criado por: Marcelo Magno"
echo "| Contribuído por: Josemar, Marcelo, Urubatan Neto e todos os"
echo "| membros da comunidade viva o linux"
echo "| Técnico em Informática"
echo "| marcelo.espindola@gmail.com"
echo "| Uso: firewall start|stop|restart"
echo
echo "============================================= |"
echo "|:INICIANDO A CONFIGURAÇÃO DO FIREWALL NETFILTER ATRAVÉS :|"
echo "|: DO IPTABLES :|"
echo "============================================= |"
Aqui o finalmente o iptables começa a trabalhar, nesta parte ele zera todas as regras do iptables (isso caso exista), para que as regras deste script sejam únicas presente na tabela do netfilter.
$IPTABLES -F
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD
$IPTABLES -t mangle -F
$IPTABLES -t nat -F
$IPTABLES -X
A política padrão do iptables é aceitar qualquer pacote que medidamente não exista nenhuma regra para a bloqueando, e nesta parte o iptables é instruído a mudar esta política padrão (-P), no caso bloqueado as conexões de entrada e redirecionamento, menos a saída, que ficará aceitando o envio de pacotes originados pelo o nosso computador firewall, se não fosse assim ele não ficaria funcional.
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP
Obs.: Se você colocar para negar (DROP) por padrão o redirecionamento e entrada (recomendado) você deverá por obrigação liberar as portas principais do servidor se não ele ficará incomunicável, mas também não cometa o erro de bloquear algo e depois liberar o mesmo, só estará consumido recursos desnecessários do servidor. A estrutura ideal das regras é liberar e depois bloquear, isto que foi o que fiz neste script!
# ativar o redirecionamento no arquivo ip_forward
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "ativado o redirecionamento no arquivo ip_forward"
echo "ON ..................................................... [ OK ]"
#habilitando o fluxo interno entre os processos
$IPTABLES -I INPUT -i lo -j ACCEPT
$IPTABLES -I OUTPUT -o lo -j ACCEPT
echo "ativado o fluxo interno entre os processos"
echo "ON ..................................................... [ OK ]"
Nesta parte o laço "for" credita na variável i, uma linha de cada vez o conteúdo do arquivo, onde o caminho deste foi atribuído na variável PORTSLIB, então o comando cat $PORTSLIB terá como a saída o conteúdo do arquivo portslib (portas liberadas) e linha deste será atribuída de cada vez a variável i, assim fica possível configura diversas portas de uma vez só.
#liberar as portas principais do servidor
for i in `cat $PORTSLIB`; do
$IPTABLES -A INPUT -p tcp --dport $i -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport $i -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --sport $i -j ACCEPT
done
$IPTABLES -I INPUT -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -I INPUT -m state --state RELATED -j ACCEPT
$IPTABLES -I OUTPUT -p icmp -o $WAN -j ACCEPT
$IPTABLES -I INPUT -p icmp -j ACCEPT
echo "ativado as portas abertas para estabelecer conexões"
echo "ativado a liberação das portas principais do servidor $HOSTNAME"
echo "ON ..................................................... [ OK ]"
#ATIVAR O REDIRECIONAMENTO (para ambiente flexível)
#LIBERAR RADIO UOL (para ambiente flexível)
Este caso é muito parecido com anterior, mas este bloqueia sites que serão negados pelo firewall com o intuito de proteger a rede e o servidor.
#bloquear acesso de sites negados a rede interna
for i in `cat $SITESNEGADOS`; do
$IPTABLES -t filter -A FORWARD -s $REDE -d $i -j DROP
$IPTABLES -t filter -A FORWARD -s $i -d $REDE -j DROP
$IPTABLES -t filter -A INPUT -s $i -j DROP
$IPTABLES -t filter -A OUTPUT -d $i -j DROP
done
echo "ativado o bloqueio de envio de pacotes com origem aos sites negados"
echo "ON ...................................................... [ OK ]"
#Bloqueio ping da morte
echo "0" > /proc/sys/net/ipv4/icmp_echo_ignore_all
$IPTABLES -N PING-MORTE
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -j PING-MORTE
$IPTABLES -A PING-MORTE -m limit --limit 1/s --limit-burst 4 -j RETURN
$IPTABLES -A PING-MORTE -j DROP
echo "ativado o bloqueio a tentativa de ataque do tipo ping da morte"
echo "ON ...................................................... [ OK ]"
#bloquear ataque do tipo SYN-FLOOD
echo "0" > /proc/sys/net/ipv4/tcp_syncookies
$IPTABLES -N syn-flood
$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
$IPTABLES -A syn-flood -j DROP
echo "ativado o bloqueio a tentativa de ataque do tipo SYN-FLOOD"
echo "ON ...................................................... [ OK ]"
#Bloqueio de ataque ssh de força bruta
$IPTABLES -N SSH-BRUT-FORCE
$IPTABLES -A INPUT -i $WAN -p tcp --dport 22 -j SSH-BRUT-FORCE
$IPTABLES -A SSH-BRUT-FORCE -m limit --limit 1/s --limit-burst 4 -j RETURN
$IPTABLES -A SSH-BRUT-FORCE -j DROP
echo "ativado o bloqueio a tentativa de ataque do tipo SSH-BRUT-FORCE"
echo "ON ...................................................... [ OK ]"
A mesma coisa que no caso anterior, mas neste as portas serão bloqueadas, a fim de evitar ataques que serão explicados no capitulo posterior onde estão as sintaxes do arquivos sendo explicados. Mesmo com a política padrão de bloquear as portas cuja liberação só seria possível com regras do IPTABLES, eu coloquei este exemplo de como bloquear portas apenas para ilustrar a possibilidade esta possibilidade de bloqueio e para enriquecer este artigo, pois o mesmo poderá ser facilmente mudado a gosto de quem quiser.
#Bloqueio de portas
for i in `cat $PORTSBLO`; do
$IPTABLES -A INPUT -p tcp -i $WAN --dport $i -j DROP
$IPTABLES -A INPUT -p udp -i $WAN --dport $i -j DROP
$IPTABLES -A FORWARD -p tcp --dport $i -j DROP
$IPTABLES -A FORWARD -p udp --dport $i -j DROP
$IPTABLES -A OUTPUT -p tcp --dport $i -j DROP
$IPTABLES -A OUTPUT -p udp --dport $i -j DROP
done
Este tipo de ataque origina-se da seguinte forma: um atacante que visa destabilizar o servidor, tentará enviar pacotes cuja origem deste não existe ou são inválidos e assim o servidor enviar respostas a destinos inalcançáveis pela rede. Estas regras bloqueiam esta tentativa de ataque.
#bloqueio Anti-Spoofings
$IPTABLES -A INPUT -s 10.0.0.0/8 -i $WAN -j DROP
$IPTABLES -A INPUT -s 127.0.0.0/8 -i $WAN -j DROP
$IPTABLES -A INPUT -s 172.16.0.0/12 -i $WAN -j DROP
$IPTABLES -A INPUT -s 192.168.1.0/16 -i $WAN -j DROP
echo "ativado o bloqueio de tentativa de ataque do tipo Anti-spoofings"
echo "ON ....................................................... [ OK ]"
Esta regra Limitará os pacotes através do módulo limit do iptables.
#Bloqueio de scanners ocultos (Shealt Scan)
$IPTABLES -A FORWARD -p tcp --tcp-flags SYN,ACK, FIN, -m limit --limit 1/s -j ACCEPT
echo "bloqueado scanners ocultos"
echo "ON ....................................................... [ OK ]"