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 2: Construindo o Firewall - O básico
O script está muito bem comentado para o entendimento melhor do leitor e para que compreenda a finalidade da tal regra ou comando.
Identifica qual é o interpretador que será usado na execução do script:
Título do script, eu coloquei ele por que o que está comentado nesta linha que está mediadamente depois da declaração do shell, será usado na descrição do webmim no modulo de iniciar e encerrar:
Nesta parte eu declaro a variável PATH por que ela indica as pastas onde estão os diversos softwares existentes no sistema que não serão necessárias as indicações completa do caminho deles, a variável IPTABLES recebe o caminho completo do executável do firewall, a variável MACLIST recebe o caminho completo do arquivo que contém os macs e os ips que estão amarrados pelo firewall, na variável PROGRAMA recebe o caminho absoluto do próprio script. Lembrando que geralmente eu particularmente gosto de fazer minhas alterações em uma pasta separada, a fim de obter mais organização e não me perder sem saber onde estão os scripts, então eu faço assim, coloco a maioria deles no diretório "/etc/configuracao_personalizada/", só que aqueles scripts que iniciam no boot, sempre deixo na pasta "/etc/init.d/".
Identificar a interface de rede onde está a LAN e a WAN através de variáveis é muito importante para dar certa flexibilidade no script, pois uma pequena modificação na rede basta mudar a variável onde está LAN e a WAN e todo o restante do script vai mudar, isto serve também para a variável REDE.
Neste variável receberá o caminho completo onde está localizado o arquivo que contém sites que serão negados pelo firewall.
Identifica qual é o interpretador que será usado na execução do script:
#!/bin/sh
Título do script, eu coloquei ele por que o que está comentado nesta linha que está mediadamente depois da declaração do shell, será usado na descrição do webmim no modulo de iniciar e encerrar:
#Configuração do Firewall através do iptables
#Autoria do Script
#"| Script de Firewall - IPTABLES"
#"| Criado por: Marcelo Magno"
#"| Contribuindo por: Josemar, Marcelo, Urubatan Neto e todos os"
#"| membros da comunidade viva o linux"
#"| Técnico em Informática"
#"| marcelo.espindola@gmail.com"
#"| Uso: firewall start|stop|restart"
#Autoria do Script
#"| Script de Firewall - IPTABLES"
#"| Criado por: Marcelo Magno"
#"| Contribuindo por: Josemar, Marcelo, Urubatan Neto e todos os"
#"| membros da comunidade viva o linux"
#"| Técnico em Informática"
#"| marcelo.espindola@gmail.com"
#"| Uso: firewall start|stop|restart"
Nesta parte eu declaro a variável PATH por que ela indica as pastas onde estão os diversos softwares existentes no sistema que não serão necessárias as indicações completa do caminho deles, a variável IPTABLES recebe o caminho completo do executável do firewall, a variável MACLIST recebe o caminho completo do arquivo que contém os macs e os ips que estão amarrados pelo firewall, na variável PROGRAMA recebe o caminho absoluto do próprio script. Lembrando que geralmente eu particularmente gosto de fazer minhas alterações em uma pasta separada, a fim de obter mais organização e não me perder sem saber onde estão os scripts, então eu faço assim, coloco a maioria deles no diretório "/etc/configuracao_personalizada/", só que aqueles scripts que iniciam no boot, sempre deixo na pasta "/etc/init.d/".
#Declaração de variáveis
PATH=/sbin:/bin:/usr/sbin:/usr/bin
IPTABLES="/sbin/iptables"
MACLIST="/etc/configuracao_personalizada/macsliberadosfirewall"
PROGRAMA="/etc/init.d/firewall"
PORTSLIB e PORTSBLO recebem respectivamente o caminho absoluto das portas liberadas e bloqueadas pelo firewall
#portas liberadas e bloqueadas
PORTSLIB="/etc/configuracao_personalizada/portslib"
PORTSBLO="/etc/configuracao_personalizada/portsblo"
PATH=/sbin:/bin:/usr/sbin:/usr/bin
IPTABLES="/sbin/iptables"
MACLIST="/etc/configuracao_personalizada/macsliberadosfirewall"
PROGRAMA="/etc/init.d/firewall"
PORTSLIB e PORTSBLO recebem respectivamente o caminho absoluto das portas liberadas e bloqueadas pelo firewall
#portas liberadas e bloqueadas
PORTSLIB="/etc/configuracao_personalizada/portslib"
PORTSBLO="/etc/configuracao_personalizada/portsblo"
Identificar a interface de rede onde está a LAN e a WAN através de variáveis é muito importante para dar certa flexibilidade no script, pois uma pequena modificação na rede basta mudar a variável onde está LAN e a WAN e todo o restante do script vai mudar, isto serve também para a variável REDE.
#Interfaces de Rede
LAN=eth1
WAN=eth0
REDE="192.168.253.0/24"
LAN=eth1
WAN=eth0
REDE="192.168.253.0/24"
Neste variável receberá o caminho completo onde está localizado o arquivo que contém sites que serão negados pelo firewall.
SITESNEGADOS=/etc/configuracao_personalizada/sitesnegados
# Os diversos módulos do iptables são chamados através do modprobe
modprobe ip_tables
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_LOG
modprobe ipt_REJECT
modprobe ipt_MASQUERADE
modprobe ipt_state
modprobe ipt_multiport
modprobe iptable_mangle
modprobe ipt_tos
modprobe ipt_limit
modprobe ipt_mark
modprobe ipt_MARK
# Os diversos módulos do iptables são chamados através do modprobe
modprobe ip_tables
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_LOG
modprobe ipt_REJECT
modprobe ipt_MASQUERADE
modprobe ipt_state
modprobe ipt_multiport
modprobe iptable_mangle
modprobe ipt_tos
modprobe ipt_limit
modprobe ipt_mark
modprobe ipt_MARK
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