Enviado em 31/10/2011 - 16:17h
Prezados, antes de tudo venho confessar a todos q sou 1/2 noob em netfilter, logo meu script de firewall n está lá muito 100%, portanto peço paciência e explicações + esmiuçadas, ok?#!/bin/bash
# Script de firewall - ETE Republica - versao 0.4
# Ricardo J. Pinheiro - 21/10/2011
# Baseado em http://www.zago.eti.br/firewall/fireaula.sh
# Faz uso de iptables-layer7 - kernelspace, kernel 2.6.34.
#
# Variaveis
SERVICO="/usr/local/sbin/iptables" #$(which 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' #URL='http://torstatus.blutmagie.de/ip_list_exit.php/Tor_ip_list_EXIT.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 Tor"
#$SERVICO -N TOR_BLOCK
#$SERVICO -A INPUT -j TOR_BLOCK
#$SERVICO -F TOR_BLOCK
#$SERVICO -I TOR_BLOCK -j RETURN
#$WGET -t9 -c $URL --proxy=off --no-check-certificate -O $TEMPORARIO
#
#i=1
#LINHAS=$(cat $TEMPORARIO $TOR_NODES | wc -l)
#echo -e "\n"
#for IP in $(cat $TOR_NODES $TEMPORARIO | sort | uniq)
#do
# $SERVICO -I TOR_BLOCK -p tcp -m tcp -s $IP -j DROP
# tput cup 22 0 ; echo -e "\t\t\t"
# tput cup 22 0 ; echo "IPs bloqueados do TOR: $i de $LINHAS"
# i=$((i+1))
#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
#
echo "Pronto"
# MSX r0x a lot
# Porta 3128 pro Squid
#
http_port 3128 transparent
#
icp_port 0
#
# Define 512 Mb pro Squid usar
#
cache_mem 512 MB
cache_swap_low 90
cache_swap_high 95
#
# Mais de 50 Mb, o Squid descarta do cache.
#
maximum_object_size 51200 KB
minimum_object_size 0 KB
#
cache_replacement_policy lru
memory_replacement_policy lru
#
# Define 53 Gb de espaco pro squid, e onde estarao os logs.
#
cache_dir ufs /var/spool/squid/ 54372 16 32
cache_access_log /var/log/squid3/access.log
cache_log /var/log/squid3/cache.log
cache_store_log /var/log/squid3/store.log
#
log_ip_on_direct off
client_netmask 255.255.255.255
log_mime_hdrs off
pid_filename /var/run/squid.pid
request_header_max_size 80 KB
url_rewrite_children 10
url_rewrite_concurrency 0
#
# Como o Squid lida com FTP anonimo.
#
ftp_user Squid@
ftp_list_width 32
ftp_passive on
ftp_sanitycheck on
#
dns_retransmit_interval 5 seconds
dns_timeout 5 minutes
dns_nameservers 127.0.0.1 10.0.0.5 10.0.0.254
# 208.67.222.222 208.67.220.220
#
hosts_file /etc/hosts
#
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
#
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
#
quick_abort_min 16 KB
quick_abort_max 16 KB
quick_abort_pct 95
#
negative_ttl 5 minutes
positive_dns_ttl 6 hours
negative_dns_ttl 5 minutes
connect_timeout 2 minutes
peer_connect_timeout 30 seconds
read_timeout 15 minutes
request_timeout 5 minutes
persistent_request_timeout 1 minute
client_lifetime 7 days
half_closed_clients on
pconn_timeout 120 seconds
shutdown_lifetime 30 seconds
#
# Redirecionamento para o squidGuard
#
redirect_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf
#
# As regras de acesso
#
acl todos src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl ftp proto FTP
acl localhost src 127.0.0.1/255.255.255.255
acl SSL_ports port 443 563
acl Safe_ports port 80 21 443 563
acl CONNECT method CONNECT
acl POST method POST
acl NOCACHE url_regex 10.0.0.0/16 \?
#
# Listas de controle de acesso
#
acl escola src 10.0.0.0/255.255.0.0
(...)
#
# ACLs de filtragem de acesso
#
# ACL para bloquear spywares e adwares
#
acl spyware url_regex "/etc/squid/blocked/blacklistspy.txt"
#
# ACL para garantir acesso direto
#
acl passareto dstdom_regex "/etc/squid/blocked/acessodireto.txt"
#
# ACL para as maquinas locais
#
acl locais dstdom_regex "/etc/squid/blocked/locais.txt"
#
# ACLs para filtragem por palavra (proibidos e liberados)
#
acl palavras_proibidas url_regex "/etc/squid/blocked/proibidos.txt"
acl palavras_liberadas url_regex "/etc/squid/blocked/liberados.txt"
#
# ACLs para filtragem por extensao (proibidos e liberados)
#
acl downloads_proibidos url_regex "/etc/squid/blocked/downloads_proibidos.txt"
acl downloads_liberados url_regex "/etc/squid/blocked/downloads_liberados.txt"
#
# ACL para filtragem do MSN
#
acl msn url_regex -i /gateway/gateway.dll
#
# ACLs para bloqueio de navegacao por IP e p/ o TeamViewer
#
acl Block_IP_Navegacao dstdom_regex [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+
acl teamviewer browser -i .*DynGate.*
#
# ACLs para cache do YouTube
#
acl googlevideo dstdomain .googlevideo.com
cache allow googlevideo
acl youtube dstdomain .youtube.com
cache allow youtube
#
# cgi-bins nao ficam armazenados.
#
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
#
# Sites que geram muito trafego.
#
acl pesado url_regex "/etc/squid/blocked/trafego.txt"
#acl pesado req_mime_type "/etc/squid/blocked/mimetypes.txt"
acl gulosos src "/etc/squid/blocked/ip.pesado.txt"
acl regime src "/etc/squid/blocked/ip.leve.txt"
#
# Regras de bloqueio de acesso
#
#http_access allow localhost
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow ftp todos
http_access allow !spyware todos
http_access allow passareto todos
http_access allow palavras_liberadas todos
http_access allow !palavras_proibidas todos
http_access allow downloads_liberados todos
http_access allow !downloads_proibidos todos
http_access deny Block_IP_Navegacao todos
http_access deny teamviewer todos
http_access deny all
#####
always_direct allow locais
#always_direct deny all
#never_direct allow all
#####
#never_direct allow passareto
#never_direct allow CONNECT
#never_direct allow POST
#
# Nao faz cache dos enderecos locais
#
no_cache deny NOCACHE
#
# delay pools - 2 deles, um c/ restricoes p/ Youtube, Adobe, Macromedia
# e sites de vÃdeo.
#
delay_pools 2
#
# delay classes - Classe 2
#
delay_class 1 2
delay_class 2 2
#
# delay access - Redirecionando acesso
#
delay_access 1 allow pesado gulosos
delay_access 2 allow pesado regime
#
# delay parameters - classe 3
#
delay_parameters 1 10240/10240 10240/10240
delay_parameters 2 -1/-1 -1/-1
#
http_access allow biblioteca
(...)
http_access deny secretaria
#
# Não caiu numa das regras de cima, corta o acesso.
#
tcp_outgoing_address 10.10.10.130 DINFO
tcp_outgoing_address 192.168.1.64 ADSL1
tcp_outgoing_address 192.168.1.64 ADSL2
tcp_outgoing_address 192.168.1.64 ADSL3
#
# Acesso cortado para quem escapar da regra anterior.
#
http_access deny todos
icp_access allow todos
#
http_reply_access allow todos
miss_access allow todos
#
cache_mgr Squid's_BAFH
cache_effective_user proxy
cache_effective_group proxy
visible_hostname firewall
#
dns_testnames faetec.rj.gov.br rio.rj.gov.br brasil.gov.br ufrj.br linux.org
logfile_rotate 7
#
icon_directory /usr/share/squid3/icons
error_directory /usr/share/squid3/errors/Portuguese
coredump_dir /tmp
client_persistent_connections on
server_persistent_connections on
pipeline_prefetch off
store_dir_select_algorithm least-load
ie_refresh on
htcp_access deny todos
htcp_clr_access deny todos
ident_lookup_access deny todos
#reply_body_max_size 0 allow todos
#follow_x_forwarded_for deny todos
snmp_access deny todos
#
#MSX r0x a lot