#!/bin/bash
# Script de firewall - ETE Republica - versao 0.4
# Baseado em [URL]http://www.zago.eti.br/firewall/fireaula.sh[/URL]
# Faz uso de iptables-layer7 - kernelspace, kernel 2.6.34.
#
# Variaveis
SERVICO="/usr/local/sbin/iptables"
MODULO=$(which modprobe)
WGET=$(which wget)
REDE_DE_DENTRO="10.0.0.0/16"
PLACA_ADSL=eth0
PLACA_FAETEC=eth1
PLACA_DE_DENTRO=eth2
PLACA_DE_FORA=eth+
FAIXA_FAETEC="10.10.10.128/27"
FAIXA_ADSL="192.168.1.0/24"
ROTEADOR_FAETEC="10.10.10.129"
ROTEADOR_ADSL="192.168.1.254"
PROXY_FAETEC="10.0.0.2"
INETSERV="10.0.0.5"
WEBSERV="10.0.0.4"
BDSERV="10.0.0.3"
LOOPBACK="127.0.0.1"
DIRETORIO="."
PORTAS_ABERTAS_REDIRECIONADAS="80 443"
PORTAS_BLOQUEADAS_ULTRASURF="5938 19769 55433 33190 19769 23620 3103 3162 2000:3000"
IPS_BLOQUEADOS_ULTRASURF="65.49.2.0/24 65.49.14.0/24 208.43.202.0/24"
FAIXAS_IP_BLOQUEADAS_ULTRASURF="/home/install/bin/internet/faixas.ultrasurf.txt"
ARQUIVO_IPS_ULTRASURF=$HOME"/bin/internet/ips.ultrasurf.txt"
TEMPORARIO=$(mktemp)
TOR_NODES=$HOME"/bin/internet/tor_nodes.csv"
LAYER7="http-rtsp rtsp skypetoskype skypeout bittorrent msnmessenger msn-filetransfer tor teamspeak"
URL='http://torstatus.all.de/ip_list_exit.php/Tor_ip_list_ALL.csv'
#
echo "Carrega modulos"
$MODULO iptable_nat
$MODULO nf_conntrack
$MODULO nf_conntrack_netlink
$MODULO nf_conntrack_ftp
$MODULO nfnetlink_queue
$MODULO ip_nat_ftp
$MODULO ipt_LOG
$MODULO ipt_REJECT
$MODULO ipt_MASQUERADE
#
echo "Zera regras"
$SERVICO -F
$SERVICO -X
$SERVICO -F -t nat
$SERVICO -X -t nat
$SERVICO -F -t mangle
$SERVICO -X -t mangle
$SERVICO -P INPUT DROP
$SERVICO -P OUTPUT DROP
$SERVICO -P FORWARD DROP
#
echo "NAT para os demais servicos"
$SERVICO -A POSTROUTING -t nat -o $PLACA_ADSL -j MASQUERADE
echo "0" > /proc/sys/net/ipv4/ip_forward
#
echo "Libera acesso externo para ssh e servidor web"
$SERVICO -A INPUT -p tcp --dport 80 -i $PLACA_ADSL -j ACCEPT
$SERVICO -A INPUT -p tcp --dport 80 -i $PLACA_DE_DENTRO -j ACCEPT
$SERVICO -A INPUT -p tcp --dport 22 -i $PLACA_ADSL -j ACCEPT
$SERVICO -A INPUT -p tcp --dport 22 -i $PLACA_DE_DENTRO -j ACCEPT
#
echo "Mascarando tudo de dentro pela placa de fora da rede (80 e 443 -> 3128)"
for PORTAS in $PORTAS_ABERTAS_REDIRECIONADAS
do
$SERVICO -t nat -A PREROUTING -i $PLACA_DE_DENTRO -p tcp --dport $PORTAS -j REDIRECT --to-port 3128
done
#
echo "Conexoes para as portas 20, 21, 80 e 443 tem q passar pelo Squid."
$SERVICO -t filter -A OUTPUT -p tcp -m multiport --dport ftp,ftp-data,http,https -m owner ! --uid-owner proxy -j REJECT --reject-with tcp-reset
#
echo "Conexoes para a porta 53 tem q passar pelo MaraDNS."
$SERVICO -t filter -A OUTPUT -p tcp -m multiport --dport 53 -m owner ! --uid-owner maradns -j REJECT --reject-with tcp-reset
#
echo "Drop em alguns servicos especificos (layer 7)"
for TIPO in $LAYER7; do
$SERVICO -A INPUT -m layer7 --l7proto $TIPO -j DROP
$SERVICO -A OUTPUT -m layer7 --l7proto $TIPO -j DROP
$SERVICO -I FORWARD -m layer7 --l7proto $TIPO -d any/0 -j DROP
$SERVICO -I FORWARD -m layer7 --l7proto $TIPO -s any/0 -j DROP
$SERVICO -t filter -A FORWARD -m layer7 --l7proto $TIPO -j DROP
done
#
echo "Bloqueio ao Ultrasurf"
for PORTA in $PORTAS_BLOQUEADAS_ULTRASURF; do
$SERVICO -I FORWARD -p tcp --dport $PORTA -j DROP
done
for IP in $IPS_BLOQUEADOS_ULTRASURF; do
$SERVICO -I FORWARD -p tcp -d $IP -j DROP
$SERVICO -I FORWARD -p tcp -s $IP -j DROP
done
for FAIXA in $(cat $FAIXAS_IP_BLOQUEADAS_ULTRASURF); do
$SERVICO -I FORWARD -d $FAIXA -p tcp --destination-port 443 -j DROP
$SERVICO -I FORWARD -s $FAIXA -p tcp --destination-port 443 -j DROP
done
#i=1
#LINHAS=$(cat $ARQUIVO_IPS_ULTRASURF | wc -l)
#echo -e "\n"
#for IP in $(cat $ARQUIVO_IPS_ULTRASURF); do
# $SERVICO -A FORWARD -p tcp --dport 443 -d $IP -j LOG --log-prefix "UltraSurf: "
# $SERVICO -A FORWARD -p tcp --dport 443 -d $IP -j DROP
# tput cup 22 0 ; echo -e "\t\t\t"
# tput cup 22 0 ; echo "IPs bloqueados do Ultrasurf: $i de $LINHAS"
# i=$((i+1))
#done
#
echo "Bloqueio ao TeamViewer"
$SERVICO -A FORWARD -p TCP -i $PLACA_DE_DENTRO -s $REDE_DE_DENTRO --dport 5938 -j DROP
#
echo "Limitando o numero de conexoes simultaneas da porta 443."
$SERVICO -A INPUT -p tcp --syn --dport 443 -m connlimit --connlimit-above 10 -j REJECT
#
echo "Redirecionando portas 80 e 8080 pela placa externa p/ o servidor Web"
PORTAS_ABERTAS_TCP_DENTRO="80 8080"
for PORTAS in $PORTAS_ABERTAS_TCP_DENTRO;
do
$SERVICO -t nat -A PREROUTING -i $PLACA_ADSL -p tcp --dport $PORTAS -j DNAT --to-dest $WEBSERV
$SERVICO -A FORWARD -p tcp -i $PLACA_ADSL --dport $PORTAS -d $WEBSERV -j ACCEPT
done
#
echo "DROP para ataques brute force do SSH"
$SERVICO -I INPUT -i $PLACA_ADSL -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name DEFAULT --rsource
$SERVICO -I INPUT -i $PLACA_ADSL -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name DEFAULT --rsource -j DROP
#
echo "Protegendo contra o ping-of-death"
$SERVICO -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
#
echo "Protegendo contra syn-floods"
$SERVICO -A FORWARD -p tcp -m limit --limit 1/s -j ACCEPT
#
echo "Pacotes estabilizados e relatados passam sem problemas."
$SERVICO -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#
echo "Protegendo contra port-scanners avancados"
$SERVICO -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
#
echo "Bloqueio ao traceroute"
$SERVICO -A INPUT -p udp -i $PLACA_DE_FORA --dport 33435:33525 -j DROP
#
echo "Ignora (DROP) nos pacotes TCP indesejaveis"
$SERVICO -A FORWARD -p tcp ! --syn -m state --state NEW -j LOG --log-level 6 --log-prefix "FIREWALL: NEW sem syn: "
$SERVICO -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP
#
echo "LIbera (ACCEPT) pacotes de retorno da internet"
$SERVICO -A INPUT ! -i $PLACA_ADSL -j ACCEPT
$SERVICO -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$SERVICO -A OUTPUT -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
$SERVICO -A FORWARD -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
#
echo "DROP e LOG de port-scanners"
$SERVICO -N SCANNER
$SERVICO -A SCANNER -m limit --limit 15/m -j LOG --log-level 6 --log-prefix "DIVERSOS: port scanner: "
$SERVICO -A SCANNER -j DROP
$SERVICO -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -i $PLACA_ADSL -j SCANNER
$SERVICO -A INPUT -p tcp --tcp-flags ALL NONE -i $PLACA_ADSL -j SCANNER
$SERVICO -A INPUT -p tcp --tcp-flags ALL ALL -i $PLACA_ADSL -j SCANNER
$SERVICO -A INPUT -p tcp --tcp-flags ALL FIN,SYN -i $PLACA_ADSL -j SCANNER
$SERVICO -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -i $PLACA_ADSL -j SCANNER
$SERVICO -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -i $PLACA_ADSL -j SCANNER
$SERVICO -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -i $PLACA_ADSL -j SCANNER
#
echo "Log de acesso por porta"
$SERVICO -A INPUT -p tcp --dport 21 -i $PLACA_ADSL -j LOG --log-level 6 --log-prefix "FIREWALL: ftp: "
$SERVICO -A INPUT -p tcp --dport 80 -i $PLACA_ADSL -j LOG --log-level 6 --log-prefix "FIREWALL: http: "
$SERVICO -A INPUT -p tcp --dport 3128 -i $PLACA_ADSL -j LOG --log-level 6 --log-prefix "FIREWALL: squid: "
#
echo "DROP no samba"
$SERVICO -A INPUT -p tcp -i $PLACA_ADSL --syn --dport 139 -j DROP
$SERVICO -A INPUT -p tcp -i $PLACA_ADSL --syn --dport 138 -j DROP
$SERVICO -A INPUT -p tcp -i $PLACA_ADSL --syn --dport 137 -j DROP
#
echo "DROP no NFS (portmap)"
$SERVICO -A INPUT -p tcp -i $PLACA_ADSL --syn --dport 111 -j DROP