sábado, 1 de dezembro de 2012

Script de Firewall

Pessoal nesse post iremos abordar a criação de um script de firewall "inteligente", na verdade não sei se essa palavra se encaixa, mas enfim, a questão é a seguinte, quando precisamos alterar alguma coisa em nossos scrips ou até mesmos para novas pessoas entenderem fica um pouco confuso devido ao tamanho, então o modo que iremos fazer hoje esse problema é bem reduzido, porque fica mais fácil de explicar e fazer alterações, quando precisamos liberar ou bloquear alguma porta por exemplo basta ir ao arquivo de portas tcp por exemplo e altera-lo, adicionamos também algumas medidas adicionais de segurança, de modo que tenhamos o controle do que esta trafegando na rede, bem chega de blá blá blá e vamos ao que interessa, primeiro devemos criar os arquivos que iremos precisar, siga os passos abaixo:



# mkdir /etc/firewall && cd /etc/firewall
# pico portas_udp.txt

# dns
53

# pico portas_tcp.txt


# Ntp Date
119
123
563

# Squid
3128

# teamviewer
5938
1989

# ftp
21
20

# ssh
22

# telnet
23

# smtp
25

# pop3
110

143

# http
80
8080

# https
443

# dns
53

# Terminal Service
3389



# pico flags.txt


SYN,RST
SYN,FIN
SYN,PSH
SYN,URG
FIN,RST
FIN,URG,PSH


# pico ips_seguros.txt

Aqui você irá colocar os ips de onde você irá acessar os serviços, ips que serão liberados

# pico portas_adm.txt

Aqui a portas de serviços, ssh por exemplo

# pico ips_liberados_para_facebook.txt

Aqui os ips da sua rede que você irá liberar para acessar o facebook

Bem com nosso ambiente preparado vamos criar o script de firewall:

# pico /etc/init.d/Firewall


#!/bin/bash

## SCRIPT DE FIREWALL ##

## DECLARACAO DE VARIAVEIS ##

IPT=$(which iptables)
IP_LOCAL="192.168.0.1"
LO="127.0.0.1"
QQR_LUGAR="0/0"
PORTS_ALTAS="1024:65535"
REDE_LOCAL="192.168.0.0/24"
IFACE_LOCAL="eth0"
IFACE_EXTERNA="eth1"

## DECLARACAO DOS MODULOS ##
modprobe iptable_nat
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_string

#---------------------------------------------------------------------

#Controle de facebook para os espertinhos que usam https
facebook ()
{

for LIBERADOS in $(cat /etc/firewall/ips_liberados_para_facebook.txt | grep -v ^#)
do


$IPT -A FORWARD -s $LIBERADOS  -m string --algo bm --string "facebook.com" -j ACCEPT
$IPT -A FORWARD -s $REDE_LOCAL  -m string --algo bm --string "facebook.com" -j ACCEPT

done

}

# Define as politicas como drop
politica_drop ()
{
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
}

# Limpa todas as regras
limpa_regras ()
{
echo "### ABRINDO O FIREWALL ###"

$IPT -F
$IPT -F -t nat
$IPT -F -t mangle
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT
}

# Compartilha a internet
compartilhando ()
{
echo "### COMPARTILHANDO ###"

echo 1 > /proc/sys/net/ipv4/ip_forward
$IPT -t nat -A POSTROUTING -o $IFACE_EXTERNA -j MASQUERADE
}

#Define proxy transparente
proxy_transparent ()
{

$IPT -t nat -A PREROUTING -p tcp -i $IFACE_LOCAL -s $REDE_LOCAL --dport 80 -j REDIRECT --to-port 3128
$IPT -A INPUT -p tcp -i $IFACE_LOCAL -s $REDE_LOCAL --sport $PORTS_ALTAS --dport 3128 -j ACCEPT
$IPT -A INPUT -p tcp -i $IFACE_EXTERNA -s $QQR_LUGAR --dport 3128 -j DROP
}

# Libera loopback
loop_back ()
{
echo "### LIBERANDO O LOOP BACK ###"

$IPT -A INPUT -i lo -d $LO -j ACCEPT
$IPT -A OUTPUT -o lo -d $LO -j ACCEPT
}

# Aceita conexões já estabelecidas e relacionadas
estabiliza_input ()
{
echo "### ESTABILIZANDO CONEXOES DE INPUT ###"

$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

}

# Aceita conexões já estabelecidas e relacionadas
estabiliza_output ()
{
echo "### ESTABILIZANDO CONEXOES DE OUTPUT ###"

$IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

}

# Aceita conexões já estabelecidas e relacionadas
estabiliza_forward ()
{
echo " ### ESTABILIZANDO CONEXOES DE FORWARD ### "

$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
}

# Controla o tráfego icmp da rede
controle_de_icmp ()
{

echo " ### LIBERANDO ICMPS ###"

for TIPO in 0 3/0 3/1 3/2 3/3 3/4 4 5 11 12
do

        $IPT -A INPUT -p icmp -s $QQR_LUGAR --icmp-type $TIPO -m limit --limit 1/s -j ACCEPT

done

$IPT -A OUTPUT -p icmp -d $QQR_LUGAR --icmp-type 8 -j ACCEPT

$IPT -A INPUT -p icmp -s $REDE_LOCAL --icmp-type 8 -m limit --limit 1/s -j ACCEPT

$IPT -A FORWARD -p icmp -s $REDE_LOCAL -d $QQR_LUGAR --icmp-type 8 -m limit --limit 1/s -j ACCEPT
}

# Aceita conexões de dhcp
controle_dhcp ()
{
for PROTO in tcp udp
do
        $IPT -A INPUT -p $PROTO -i $IFACE_EXTERNA -s $QQR_LUGAR --sport 67 --dport 68 -j ACCEPT
done

for PROTO in tcp udp
do
         $IPT -A OUTPUT -p $PROTO -o $IFACE_EXTERNA --sport 68 -d $QQR_LUGAR --dport 67 -j ACCEPT
done

for PROTO in tcp udp
do
        $IPT -A INPUT -p $PROTO -i $IFACE_LOCAL -s $QQR_LUGAR --sport 68 --dport 67 -j ACCEPT
done

for PROTO in tcp udp
do
        $IPT -A OUTPUT -p $PROTO -o $IFACE_LOCAL -s $IP_LOCAL --sport 67 -d $REDE_LOCAL --dport 68 -j ACCEPT
done

}

# Estabelece quais portas tcp serão liberadas para trafego
portas_tcp ()
{

echo "### LIBERANDO CONEXOES EM PORTAS TCP ###"

for PORTAS in $(cat /etc/firewall/portas_tcp.txt | grep -v ^#)
do

        $IPT -A OUTPUT -p tcp -m state --state NEW --sport $PORTS_ALTAS -d $QQR_LUGAR --dport $PORTAS -j ACCEPT
        $IPT -A FORWARD -p tcp -s $REDE_LOCAL --sport $PORTS_ALTAS -d $QQR_LUGAR --dport $PORTAS -j ACCEPT

done
}

# Estabelece quais portas udp serão liberadas para trafego
portas_udp ()
{

echo "### LIBERANDO CONEXOES EM PORTAS UDP ###"

for PORTAS in $(cat /etc/firewall/portas_udp.txt | grep -v ^#)
do
        $IPT -A OUTPUT -p udp -m state --state NEW  --sport $PORTS_ALTAS -d $QQR_LUGAR --dport $PORTAS -j ACCEPT
        $IPT -A FORWARD -p udp -m state --state NEW -s $REDE_LOCAL --sport $PORTS_ALTAS -d $QQR_LUGAR --dport $PORTAS -j ACCEPT
done
}

# Libera portas se serviços para ips seguros
libera_pt_ip_seguros ()
{
echo "### ATIVANDO CONTROLE DE IPs REMOTO ###"

for IP in $(cat /etc/firewall/ips_seguros.txt | grep -v ^#)
do

        for PORTAS in $(cat /etc/firewall/portas_adm.txt | grep -v ^#)
        do
                $IPT -A INPUT -p tcp -m state --state NEW -s $IP --sport $PORTS_ALTAS -d $IP_LOCAL --dport $PORTAS -j ACCEPT
        done
done

for PORTAS in $(cat /etc/firewall/portas_adm.txt | grep -v ^#)
do
        $IPT -A INPUT -p tcp -s $QQR_LUGAR --sport $PORTS_ALTAS -d $IP_LOCAL --dport $PORTAS -j REJECT --reject-with tcp-reset
done
}

# Bloqueia flags invalidas
flags_invalidas ()
{

echo "### BLOQUEANDO POSSIVEIS SCANNERS ###"

for FLAGS in $(cat /etc/firewall/flags.txt | grep -v ^#)
do
        for CHAINS in INPUT FORWARD
        do
                $IPT -A $CHAINS -p tcp --tcp-flags $FLAGS $FLAGS -j LOG --log-prefix "POSSIVEL_SCANNER"
                $IPT -A $CHAINS -i $IFACE_EXTERNA -p tcp ! -s $REDE_LOCAL --tcp-flags $FLAGS $FLAGS -j DROP
        done
done
}


echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route

#-----------------------------------------------------------------------


case $1 in
start)
compartilhando
facebook
proxy_transparent
politica_drop
loop_back
estabiliza_input
estabiliza_output
estabiliza_forward
controle_de_icmp
controle_dhcp
portas_tcp
portas_udp
libera_pt_ip_seguros
flags_invalidas

echo " ******* FIREWAL ATIVADO ******* "
;;
stop)
limpa_regras


echo " ******* FIREWALL DESATIVADO ******* "
;;
filter) $IPT -nL | more
;;
nat) $IPT -nL -t nat | more
;;
mangle) $IPT -nL -t mangle | more
;;
restart) $0 stop
$0 start
;;
*) echo "erro use $0 {start|stop|filter|nat|mangle|restart}"
exit 0
;;
esac
exit 1

Para que o script inicie no boot siga os passos:

# aptitude install rcconf

# rcconf

Marque a opção Firewall e de OK.

Agora para iniciar basta:

# /etc/init.d/Firewall start

Um comentário:

  1. cara eu coloco na lista de ips para acessar o facebook mas o mesmo não conecta

    ResponderExcluir