Firewall Builder: differenze tra le versioni
Vai alla navigazione
Vai alla ricerca
mNessun oggetto della modifica |
S3v (discussione | contributi) Nessun oggetto della modifica |
||
Riga 1: | Riga 1: | ||
== | <pre> | ||
#!/bin/bash | |||
## | |||
clear | |||
## | |||
#################### | |||
VERSION="2003.06.11" | |||
#################### | |||
## | |||
## Interfaccia interna fidata 'settare la propria' | |||
IIF="eth0" | |||
# IIF="eth1" | |||
## | |||
## Interfaccia esterna da proteggere 'settare la propria' | |||
## in genere l'interfaccia esterna è configurata da un DHCP quindi ha indirizzo dinamico. | |||
EIF="ppp0" | |||
# EIF="eth0" | |||
# EIF="eth1" | |||
## Se l'interfaccia esterna ha un IP statico, dichiararlo | |||
# EIP="xx.xx.xx.xx" | |||
## | |||
## Indirizzo macchina router (si presume che il firewall giri sulla macchina router | |||
## in caso contrario correggere manualmente questo indirizzo) | |||
## | |||
## Se preferite utilizzare un indirizzo statico, decommentate la linea che indica un IP | |||
## altrimenti se utilizzate un DHCP o non conoscete l'indirizzo | |||
## usate il riconoscimento tramite ifconfig | |||
## controllare comunque che lo script riconosca l'indirizzo IP (potrebbe non andare su macchine che | |||
## utilizzano shell particolari o che formattano ifconfig diversamente. | |||
## | |||
SERVER=` ifconfig $IIF | grep inet | cut -d : -f2 | cut -d ' ' -f1` | |||
# SERVER="192.168.10.2" | |||
## | |||
## Indirizzo macchina client da inserire a mano, se il server condivide la connessione | |||
## internet, questa macchina sarà autorizzata ad accedere al firewall via eth0 | |||
## al posto di un singolo host è possibile utilizzare una rete intera usando | |||
## la notazione RETE/NETMASK | |||
## attenzione alla banda disponibile perché una rete genera parecchio traffico..;) | |||
CLIENT="10.22.115.11" | |||
# CLIENT"192.168.10.0/24" | |||
## | |||
## Loopback | |||
LOCALHOST="127.0.0.1" | |||
## | |||
## Rete interna | |||
## controllare che gli script ottengano i valori corretti | |||
## o sostituire con valori statici. | |||
net=` ifconfig $IIF | grep inet | cut -d : -f2 | cut -d ' ' -f1 | cut -d . -f1,2,3` | |||
mask=` ifconfig $IIF | grep inet | cut -d : -f4 | cut -d ' ' -f1` | |||
LOCALNET="$net.0/$mask" | |||
## | |||
## Broadcast | |||
BROADCAST=` ifconfig $IIF | grep inet | cut -d : -f3 | cut -d ' ' -f1` | |||
## | |||
## Provider1 DNS 'inserire i propri DNS' | |||
# DNS1="212.216.172.62" | |||
DNS1="195.130.224.18" | |||
## | |||
## Provider2 DNS | |||
#DNS2="195.130.224.18" | |||
DNS2="192.160.10.31" | |||
## | |||
## Local DNS | |||
DNS3="212.245.255.2" | |||
## questo potrebbe essere il DNS locale, in seguito sarà prevista la configurazione | |||
## per il funzionamento di un DNS locale. | |||
## | |||
## Per qualunque problema...;) | |||
EMAIL="m.m.asciutti@email.it" | |||
## | |||
## PATH di iptables 'adattare alla propria macchina, se necessario' | |||
IPT=` which iptables` | |||
## | |||
## NOTA: | |||
## Dopo aver modificato i parametri base per adattare lo | |||
## script alle proprie esigenze, salvarlo e renderlo eseguibile | |||
## in particolare adattare l'indirizzo del client o della rete che | |||
## verrà nattata | |||
## verificare inoltre che lo script che preleva | |||
## l'indirizzo IP da ifconfig sia funzionante | |||
## sul proprio sistema. | |||
## | |||
## Decommentare se si desidera aggiungere lo script al PATH di sistema | |||
# export PATH=$PATH:$NPATH | |||
## | |||
## Nome dello script e Posizione assoluta | |||
NFILE="firewall" | |||
NPATH="/etc/rc.d" | |||
## | |||
## NOTA: | |||
## il percorso predefinito è "/etc/rc.d/" ed | |||
## il nome predefinito è "firewall" | |||
## ma è possibile utilizzare qualsiasi nome / percorso | |||
## avendo cura di modificare le variabili NFILE e NPATH' | |||
## | |||
## Setto permessi e proprietario | |||
chown root $NPATH/$NFILE | |||
chmod 700 $NPATH/$NFILE | |||
## | |||
## NOTA: | |||
## questa funzione viene richiamata solo con | |||
## l'opzione stop e serve a rimuovere i moduli | |||
## caricati dal firewall | |||
## | |||
#ANSI COLOR | |||
MAGENTA='\e[35m' | |||
GREEN='\e[32m' | |||
YELLOW='\e[33m' | |||
WHITE='\e[37m' | |||
BLUE='\e[34m' | |||
CYAN='\e[36m' | |||
RED='\e[31m' | |||
NULL='\e[0m' | |||
COLOR=$BLUE | |||
## | |||
case "$1" in | |||
#**************************************************************START | |||
start) | |||
clear | |||
COLOR=$RED | |||
msg=" Attivo il firewall ..." | |||
echo -e "$COLOR$msg$NULL\n" | |||
=== | ## | ||
## Politica INPUT | |||
chain="DROP" | |||
## | |||
## Politica OUTPUT | |||
outchain="ACCEPT" | |||
## | |||
## Routing | |||
fw="ACCEPT" | |||
CF="1" | |||
## | |||
## Opzioni diverse dalle standard | |||
## | |||
## Politica OUTPUT | |||
## 'se si attiva, decommentare le regole relative all'uscita dei pacchetti' | |||
## outchain="DROP" | |||
## | |||
## Non funziona da router | |||
# fw="DROP" | |||
# CF="0" | |||
## | |||
## Opzioni kernel | |||
SC="1" | |||
ER="1" | |||
DE="1" | |||
TW="1" | |||
SR="0" | |||
DR="0" | |||
ASR="0" | |||
ISR="1" | |||
SAV="1" | |||
LOG="1" | |||
DSR="1" | |||
## | |||
## Solo cosmetico | |||
SET="Abilito" | |||
MSET="Abilito" | |||
function netfilter() | |||
{ | |||
exit 0 | |||
} | |||
;; | |||
#*******************************************************************STOP | |||
stop) | |||
=== | clear | ||
COLOR=$GREEN | |||
msg=" Disattivo il firewall ..." | |||
echo -e "$COLOR$msg$NULL\n" | |||
## | |||
## Politica INPUT | |||
chain="ACCEPT" | |||
## | |||
## Politica OUTPUT | |||
outchain="ACCEPT" | |||
## | |||
## Non funziona da router | |||
fw="DROP" | |||
CF="0" | |||
## | |||
## Opzioni kernel | |||
SC="0" | |||
ER="0" | |||
DE="0" | |||
TW="0" | |||
SR="1" | |||
DR="1" | |||
ASR="1" | |||
ISR="0" | |||
SAV="0" | |||
LOG="0" | |||
DSR="0" | |||
## | |||
## Solo cosmetico | |||
SET="Disabilito" | |||
MSET="Disabilito" | |||
## | |||
function netfilter() | |||
{ | |||
if [ -f /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/ip_tables.o ]; then | |||
( rmmod ip_contrackt \ | |||
ip_contrack_ftp \ | |||
ip_nat_ftp \ | |||
ip_queue \ | |||
ip_tables \ | |||
ipt_LOG \ | |||
ipt_MARK \ | |||
ipt_MASQUERADE \ | |||
ipt_MIRROR \ | |||
ipt_REDIRECT \ | |||
ipt_TCPMSS \ | |||
ipt_TOS \ | |||
ipt_limit \ | |||
ipt_mac \ | |||
ipt_mark \ | |||
ipt_multiport \ | |||
ipt_owner \ | |||
ipt_state \ | |||
ipt_tcpmss \ | |||
ipt_tos \ | |||
ipt_unclean \ | |||
iptable_filter \ | |||
iptable_mangle \ | |||
iptable_net | |||
) > /dev/null 2> /dev/null | |||
( rmmod ipfwadm; rmmod ipchains; modprobe ip_tables ) > /dev/null 2> /dev/null | |||
fi | |||
exit 0 | |||
} | |||
;; | |||
#*************************************************************ROUTER | |||
router) | |||
clear | |||
COLOR=$YELLOW | |||
msg=" Attenzione, disattivo il firewall ed attivo il forwarding..." | |||
echo -e "$COLOR$msg$NULL\n" | |||
=== | ## | ||
## Politica INPUT | |||
chain="ACCEPT" | |||
## | |||
## Politica OUTPUT | |||
outchain="ACCEPT" | |||
## | |||
## Funziona da router | |||
fw="ACCEPT" | |||
CF="1" | |||
## | |||
## Opzioni kernel | |||
SC="0" | |||
ER="0" | |||
DE="0" | |||
TW="0" | |||
SR="1" | |||
DR="1" | |||
ASR="1" | |||
ISR="0" | |||
SAV="0" | |||
LOG="0" | |||
DSR="0" | |||
## | |||
## Solo cosmetico | |||
SET="Disabilito" | |||
MSET="Abilito" | |||
function netfilter() | |||
{ | |||
exit 0 | |||
} | |||
;; | |||
#**************************************************************HELP | |||
help) | |||
clear | |||
COLOR=$CYAN | |||
msg=" Help..." | |||
echo -e "$COLOR$msg" | |||
echo "" | |||
echo "$NFILE start " | |||
echo " Setta il firewall secondo le opzioni" | |||
echo " indicate, è possibile modificare " | |||
echo " gran parte dei parametri predefiniti" | |||
echo " per utilizzare lo script secondo le" | |||
echo " proprie esigenze." | |||
echo "" | |||
echo "$NFILE stop" | |||
echo " Resetta il firewall, permette il passaggio" | |||
echo " di tutti i pacchetti in ingresso su ogni " | |||
echo " interfaccia disabilitando l'utilizzo " | |||
echo " del PC come router;" | |||
echo " navigate usando questa modalità il meno possibile." | |||
echo "" | |||
echo "$NFILE router" | |||
echo " Abilita il transito dei pacchetti" | |||
echo " tra $IIF e $EIF senza nessun firewall" | |||
echo " utilizzare esclusivamente per testare la rete" | |||
echo " o usare un secondo firewall tra router e rete" | |||
echo " molti settaggi del kernel non sono pensati per la sicurezza" | |||
echo " ma solo per testare la rete senza perdita di nessun tipo di pacchetti," | |||
echo " è PERICOLOSO. " | |||
echo "" | |||
echo "$NFILE info" | |||
echo " Mostra il settaggio attuale dei parametri base" | |||
echo " per controllare le personalizzazioni sullo script." | |||
echo "" | |||
echo "$NFILE policy" | |||
echo " Mostra le politiche impostate con start" | |||
echo " e le statistiche relative al funzionamento del firewall" | |||
echo " i pacchetti ricevuti, droppati, loggati ecc." | |||
echo "" | |||
echo "$NFILE vsf" | |||
echo " Verifica se il server è in presenza di " | |||
echo " attacco Syn Flood." | |||
echo " È possibile settare alcuni parametri per diminuire " | |||
echo " la vulnerabilità all'attacco (indicati nel corpo dello script)." | |||
echo " I tentativi di attacco sono comunque tutti loggati." | |||
echo "" | |||
echo "$NFILE help" | |||
echo " Visualizza questo messaggio" | |||
echo -e "$NULL\n" | |||
echo "Per ogni suggerimento:$EMAIL" | |||
echo "" | |||
exit 0 | |||
* | ;; | ||
#***************************************************************INFO | |||
info) | |||
clear | |||
COLOR=$MAGENTA | |||
msg=" Info ..." | |||
echo -e "$COLOR$msg" | |||
echo "" | |||
## | |||
echo "" | |||
echo " il PATH di questo script è $NPATH/$NFILE" | |||
echo " il PATH di iptables è $IPT" | |||
echo " l'interfaccia interna è la $IIF" | |||
echo " l'interfaccia esterna è la $EIF" | |||
echo " l'indirizzo IP del pc server/router è $SERVER " | |||
echo " l'indirizzo IP del pc client fidato è $CLIENT" | |||
echo " la rete locale è $LOCALNET" | |||
echo " l'indirizzo broadcast è $BROADCAST" | |||
echo " il DNS primario è $DNS1" | |||
echo " il DNS secondario è $DNS2" | |||
echo "" | |||
echo -e "$NULL\n" | |||
exit 0 | |||
;; | |||
#***************************************************************INFO | |||
policy) | |||
clear | |||
COLOR=$WHITE | |||
msg=" Politiche ..." | |||
echo -e "$COLOR$msg" | |||
$IPT -nvL | |||
## | |||
## espande la politica di netfilter | |||
## visualizzando le catene e informazioni sulle | |||
echo -e "$NULL\n" | |||
## | |||
exit 0 | |||
;; | |||
#*********************************************************Verifica Syn Flood | |||
vsf) | |||
clear | |||
COLOR=$YELLOW | |||
msg=" Syn Flood ..." | |||
echo -e "$COLOR$msg" | |||
echo "" | |||
echo " Verifico se siamo in presenza di Syn Flood" | |||
echo "" | |||
echo " Oltre 20-30 tentativi di connessione da uno stesso" | |||
echo " indirizzo, indicano un tentativo di flood, verificare comunque i Log" | |||
echo " prima di attivare le contromisure" | |||
## | |||
netstat -npla | grep SYN_RECV | |||
## | |||
echo -e "$NULL\n" | |||
exit 0 | |||
;; | |||
#****************************************************************USO | |||
*) | |||
## | |||
clear | |||
COLOR=$BLUE | |||
msg="Firewall ver. $VERSION - Utilizzo: $NFILE {start|stop|router|info|policy|vsf|help}" | |||
echo -e "$COLOR$msg$NULL\n" | |||
## | |||
exit 0 | |||
;; | |||
## | |||
esac | |||
## | |||
#*******************************************************BLOCCO COMUNE | |||
## | |||
echo -e "$COLOR" | |||
## Caricamento dei moduli necessari nel kernel | |||
## | |||
## Il vostro kernel potrebbe non avere | |||
## tutti questi moduli, è sufficiente ricompilare se le funzionalità | |||
## sono necessarie. | |||
## | |||
## NOTA: I seguenti moduli sono elencati solo per informazione | |||
## Non è necessario inserirli manualmente nel kernel | |||
## a meno di casi particolari. | |||
## | |||
# echo "Caricamento moduli..." | |||
## | |||
# modulo base | |||
modprobe ip_tables | |||
## | |||
# modulo necessario alla stateful connection tracking | |||
modprobe ip_conntrack | |||
## | |||
# modulo filter, permette di droppare rifiutare o loggare i pacchetti | |||
modprobe iptable_filter | |||
## | |||
# modulo mangle | |||
# modprobe iptable_mangle | |||
## | |||
# modulo nat | |||
modprobe iptable_nat | |||
## | |||
# modulo LOG, permette di registrare i pacchetti bloccati in base alle catene | |||
modprobe ipt_LOG | |||
## | |||
# modulo utilizzato per limitare il numero di pacchetti per sec/min/hr | |||
## | |||
modprobe ipt_limit | |||
## | |||
# modulo masquerade | |||
modprobe ipt_MASQUERADE | |||
## | |||
# modulo owner | |||
# modprobe ipt_owner | |||
## | |||
# REJECT respinge il pacchetto restituendo una risposta ICMP | |||
# configurabile, il default è "connection refused". | |||
# modprobe ipt_REJECT | |||
## | |||
# modulo mark, permette di marcare pacchetti sulla catena mangle | |||
# modprobe ipt_mark | |||
## | |||
# questo modulo permette di modificare il TCP MSS | |||
## | |||
modprobe ipt_tcpmss | |||
## | |||
# questo modulo permette di indicare porte multiple | |||
# modprobe multiport | |||
## | |||
# questo modulo consente controlli sui flags TCP | |||
# modprobe ipt_state | |||
## | |||
# controlli su flags invalidi | |||
# modprobe ipt_unclean | |||
## | |||
# supporto ftp non-PASV | |||
# modprobe ip_nat_ftp | |||
## | |||
# modulo per full ftp connection tracking | |||
# modprobe ip_conntrack_ftp | |||
## | |||
# modulo per full irc connection tracking | |||
# modprobe ip_conntrack_irc | |||
## | |||
################# | |||
## area kernel ## | |||
################# | |||
## | |||
echo "$SET forwarding... " | |||
echo "$CF" >/proc/sys/net/ipv4/ip_forward | |||
## | |||
echo "$SET syn-cookies (protezione syn-flood attacks)..." | |||
echo "$SC" >/proc/sys/net/ipv4/tcp_syncookies | |||
## | |||
echo "Riduco il numero di possibili SYN Floods..." | |||
echo "1024" >/proc/sys/net/ipv4/tcp_max_syn_backlog | |||
## | |||
## | |||
echo "$SET ICMP echo-request su indirizzi broadcast (Smurf amplifier)..." | |||
# Questi parametri servono ad ignorare ogni ICMP echo requests | |||
# inviato da indirizzi broadcast. Servono a prevenire | |||
# un gran numero di attacchi smurfs e DoS. | |||
echo "$ER" >/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts | |||
## | |||
# Contromisure contro attacchi DoS | |||
# echo "Disabilito ICMP echo-request (usare solo se si è sotto attacco Dos)" | |||
# echo "1" >/proc/sys/net/ipv4/icmp_echo_ignore_all | |||
# #sotto attacco syn incrementare il valore di tcp_max_syn_backlog e decrementare | |||
# #il valore dei timeout_* | |||
# echo "100" > /proc/sys/net/ipv4/vs/timeout_synack | |||
# echo "10" > /proc/sys/net/ipv4/vs/timeout_synrecv | |||
# echo "128" > /proc/sys/net/ipv4/tcp_max_syn_backlog | |||
## | |||
echo "$SET protezione defrag error... " | |||
echo "$DE" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses | |||
## | |||
echo "$SET time-wait assassination hazards in tcp (RFC 1337)..." | |||
#echo "$TW" >/proc/sys/net/ipv4/tcp_rfc1337 | |||
## | |||
echo "$SET sourcerouting and spoofing protection..." | |||
for i in /proc/sys/net/ipv4/conf/*; do | |||
## | |||
echo "$SET politica per source-routed packets..." | |||
# Questa politica è usata per accettare o rifiutare pacchetti | |||
# di tipo 'source routed'. È attiva di default, ma è considerata | |||
# un rischio per la sicurezza. | |||
echo "$SR" >$i/accept_source_route | |||
## | |||
echo "$SET politica per ICMP Redirect accept/send..." | |||
# Questa opzione disabilita la redirezione dei pacchetti ICMP. | |||
# È generalmente considerato un rischio per la sicurezza. | |||
echo "$DR" >$i/accept_redirects | |||
# Per questo motivo, è preferibile accettare ICMP solo | |||
# dal gateway di default (opzione secure_redirects). | |||
echo "$ASR" >$i/send_redirects | |||
echo "$SET secure ICMP redirects..." | |||
echo "$ISR" >$i/secure_redirects | |||
## | |||
# echo "Disabilito Proxy ARP ..." | |||
# # È un'opzione utilizzata per la realizzazione di DMZ; | |||
# # è disabilitata in quanto non rientra negli scopi di questo script. | |||
# # per maggiorni info: http://www.sjdjweis.com/linux/proxyarp/ | |||
# echo "0" >$i/proxy_arp | |||
## | |||
echo "$SET source-address verification (prevent spoofing)..." | |||
# Abilita i controlli previsti nel RFC1812. | |||
# è raccomandato per sistemi basati su interfacce singole | |||
# Disattivare se si hanno interfacce multiple collegate alla stessa rete. | |||
# Questo controllo blocca i pacchetti che si presentano ad una interfaccia esterna | |||
# con indirizzo forgiato per sembrare provenienti da interfaccia interna; | |||
# il controllo è comunque ripetuto in seguito. | |||
echo "$SAV" >$i/rp_filter | |||
## | |||
done | |||
## | |||
echo "Applico settaggi controllo ..." | |||
if [ -f /proc/sys/net/ipv4/icmp_destunreach_rate ]; then | |||
echo "5" > /proc/sys/net/ipv4/icmp_destunreach_rate | |||
fi | |||
if [ -f /proc/sys/net/ipv4/icmp_echoreply_rate ]; then | |||
echo "5" > /proc/sys/net/ipv4/icmp_echoreply_rate | |||
fi | |||
if [ -f /proc/sys/net/ipv4/icmp_paramprob_rate ]; then | |||
echo "5" > /proc/sys/net/ipv4/icmp_paramprob_rate | |||
fi | |||
if [ -f /proc/sys/net/ipv4/icmp_timeexceed_rate ]; then | |||
echo "10" > /proc/sys/net/ipv4/icmp_timeexceed_rate | |||
fi | |||
## | |||
echo "$SET il Log su spoofed, source routed e redirect packets..." | |||
# Questa opzione serve a loggare i pacchetti provenienti da indirizzi impossibili. | |||
echo "$LOG" >/proc/sys/net/ipv4/conf/all/log_martians | |||
## | |||
echo "$SET dynamic socket address rewriting..." | |||
# Utile se si utilizza un indirizzo dinamico assegnato da DHCP. | |||
echo "$DSR" > /proc/sys/net/ipv4/ip_dynaddr | |||
## | |||
echo "Setto porte locali ..." | |||
echo "56000:65096" > /proc/sys/net/ipv4/ip_local_port_range | |||
## | |||
## | |||
################################# | |||
## inizio competenza iptables ## | |||
################################# | |||
## | |||
echo "Azzero le chain..." | |||
## | |||
for y in filter nat mangle ; do | |||
$IPT -t $y -F | |||
$IPT -t $y -X | |||
done | |||
## | |||
## politica per la tabella filter | |||
$IPT -P INPUT $chain | |||
$IPT -P OUTPUT $outchain | |||
$IPT -P FORWARD DROP | |||
#NOTA: FORWARD è su DROP in quanto il controllo è lasciato ad altre regole | |||
## | |||
## politica per la tabella mangle | |||
for m in PREROUTING OUTPUT ; do | |||
$IPT -t mangle -P $m ACCEPT | |||
done | |||
## | |||
echo "Genero catene utente ..." | |||
$IPT -N chain-log | |||
$IPT -A chain-log -j LOG --log-level info | |||
# NOTA: Senza --log-level "info", si ha la scrittura dei log in ogni | |||
# vty. È un po' troppo ... | |||
$IPT -A chain-log -j $chain | |||
## | |||
# # Dynamic Address | |||
# # La richiesta di assegnazione dell'indirizzo è di tipo broadcast | |||
# # la risposta potrebbe non essere accettata | |||
# # questa dichiarazione abilita il DHCP | |||
# $IPT -A INPUT -p UDP --source-port 67 --destination-port 68 -j ACCEPT | |||
# # DHCPd - abilitare in presenza di DHCP interno | |||
# #$IPT -A INPUT -i $IIF -p tcp --sport 68 --dport 67 -j ACCEPT | |||
# #$IPT -A INPUT -i $IIF -p udp --sport 68 --dport 67 -j ACCEPT | |||
## | |||
## | |||
echo "Accetto connessioni da $LOCALHOST , $SERVER , $CLIENT ..." | |||
$IPT -A INPUT -i lo -j ACCEPT | |||
$IPT -A INPUT -i $IIF -s $CLIENT -j ACCEPT | |||
$IPT -A INPUT -i $IIF -s $SERVER -j ACCEPT | |||
# $IPT -A INPUT -i $IIF -s $LOCALNET -j ACCEPT | |||
# $IPT -A OUTPUT -o lo -s $LOCALHOST -j ACCEPT | |||
# $IPT -A OUTPUT -o lo -s $SERVER -j ACCEPT | |||
## | |||
echo "Controllo di integrità dei pacchetti sulla tabella nat-PREROUTING..." | |||
$IPT -t nat -A PREROUTING -i $EIF -s $LOCALNET -j $chain | |||
$IPT -t nat -A PREROUTING -i $EIF -s $LOCALHOST -j $chain | |||
$IPT -t nat -A PREROUTING -i $EIF -s $CLIENT -j $chain | |||
$IPT -t nat -A PREROUTING -i $EIF -s $SERVER -j $chain | |||
# # È anche possibile bloccare e loggare tutti i pacchetti | |||
# # provenienti da indirizzi privati (chiaramente forgiati per | |||
# # tentare un'intrusione) e non solo quelli relativi a $LOCALNET | |||
# # per una lista completa: | |||
# # http://www.iana.org/assignments/ipv4-address-space | |||
## | |||
# # echo "Rifiuto pacchetti provenienti da indirizzi privati, multicast o riservati..." | |||
## | |||
# # NOTA - le variabili A_r,B_r,C_r,D_r devono essere dimensionate | |||
# # leggendo le liste degli indirizzi da rifiutare (file esterno) | |||
# # il metodo è riportato , ma non è implementato nessun controllo, | |||
# # i pacchetti in ingresso sono comunque tutti droppati. | |||
# # questo controllo potrebbe essere comunque comodo, ma non è | |||
# # nelle finalità di questo script. | |||
# # non | |||
# for CL in A_r B_r C_r D_mc E_r ; do | |||
# $IPT -A INPUT -i $EIF -s $CL -j chain-log | |||
# done | |||
## | |||
# TCP & UDP | |||
# Le porte standard sono elencate su: | |||
# http://www.chebucto.ns.ca/~rakerman/port-table.html | |||
# http://www.iana.org/assignments/port-numbers | |||
## | |||
echo "Accetto connessioni RELATED/ESTABLISHED..." | |||
#in input | |||
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT | |||
echo "Accetto ICMP type 0,3,11..." | |||
## codici ICMP - RFC 792 | |||
## 0 Echo Reply | |||
## 3 Destination Unreachable, il router non ha trovato la destinazione del pacchetto. | |||
## 4 Source Quench | |||
## 5 Redirect, il router informa l'host di aver inoltrato il pacchetto ad un diverso router | |||
## 8 Echo, messaggio utile per sapere se un host è presente oppure no (utilizzato in Ping) | |||
## 11 Time Exceeded | |||
## 12 Parameter Problem, campo dell'header non valido | |||
## 13 Timestamp | |||
## 14 Timestamp Reply | |||
## 15 Information Request | |||
## 16 Information Reply | |||
# Visitare: http://www.ee.siue.edu/~rwalden/networking/icmp.html | |||
# per altre informazioni relative ai tipi ICMP. | |||
for ic in 0 3 11 ; do | |||
$IPT -A INPUT -i $EIF -p icmp --icmp-type $ic -j ACCEPT | |||
done | |||
## | |||
# Decommentare se si desidera che il proprio sistema risponda ai ping | |||
$IPT -A INPUT -i $EIF -p ICMP --icmp-type 8 -j $chain | |||
# $IPT -A INPUT -i $EIF -p ICMP --icmp-type 8 -j ACCEPT | |||
## | |||
echo "Accetto ICMP dalla rete locale..." | |||
$IPT -A INPUT -i $IIF -s $LOCALNET -p icmp -j ACCEPT | |||
## | |||
echo "Accetto DNS replies" | |||
$IPT -A INPUT -i $EIF -p udp -s $DNS1 --sport 53 -j ACCEPT | |||
$IPT -A INPUT -i $EIF -p udp -s $DNS2 --sport 53 -j ACCEPT | |||
# $IPT -A INPUT -i IIF -p tcp -s $DNS3 --sport 53 -j ACCEPT | |||
$IPT -A INPUT -p udp --sport 53 -j ACCEPT | |||
# il DNS 3 si intende come locale, per questo si accettano le connessioni tcp | |||
# $IPT -A INPUT -i $EIF -p tcp -s $DNS1 --sport 53 -j ACCEPT | |||
# $IPT -A INPUT -i $EIF -p tcp -s $DNS2 --sport 53 -j ACCEPT | |||
## | |||
echo "Blocco ogni pacchetto broadcast" | |||
$IPT -A INPUT -p ALL -d 255.255.255.255 -j $chain | |||
# $IPT -A INPUT -s 10.128.0.0/255.255.0.0 -j DROP | |||
## | |||
echo "Attivo SYN-FLOODING protection..." | |||
$IPT -N SYN-FLOOD | |||
$IPT -A INPUT -p tcp --syn -j SYN-FLOOD | |||
$IPT -t filter -A SYN-FLOOD -m limit --limit 1/s --limit-burst 4 -j chain-log | |||
## | |||
# echo "Sperimentale..." | |||
# #NOTA - è disattivato in quanto potrebbe generare molti falsi positivi. | |||
# $IPT -t nat -A PREROUTING -i $EIF -m unclean -j chain-log | |||
## | |||
echo "Blocco le scansioni Xmas tree, i pacchetti senza flag, i flag irregolari, le scansioni..." | |||
##Blocco le scansioni Xmas tree | |||
$IPT -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j chain-log | |||
$IPT -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK -j chain-log | |||
## | |||
##Blocco i pacchetti senza flags | |||
$IPT -A INPUT -p tcp --tcp-flags ALL NONE -j chain-log | |||
## | |||
##Blocco i pacchetti SYN+RST e SYN+FIN | |||
$IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j chain-log | |||
$IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j chain-log | |||
## | |||
##Blocco le scansioni FIN | |||
$IPT -A INPUT -p tcp --tcp-flags FIN FIN -j chain-log | |||
## | |||
##Elimino pacchetti broadcast netbios | |||
$IPT -A INPUT -p udp --dport 135:139 -j $chain | |||
## | |||
echo "Dirotto pacchetti NEW e INVALID verso CHAIN..." | |||
$IPT -A INPUT -i $EIF -m state --state NEW,INVALID -j chain-log | |||
$IPT -A INPUT -i $IIF -m state --state NEW,INVALID -j chain-log | |||
## | |||
## | |||
################################################################## | |||
## Servizi aperti all'esterno 'decommentare i servizi desiderati, attenzione!!' ## | |||
################################################################## | |||
## | |||
# echo "Accetto connessioni su shell criptate dall'esterno..." | |||
# $IPT -A INPUT -p tcp --dport 22 -j ACCEPT | |||
## | |||
# echo "Accetto connessioni sendmail dall'esterno [pericoloso!!!]..." | |||
# $IPT -A INPUT -p tcp --dport smtp -j ACCEPT | |||
## | |||
# echo "Accetto http e https dall'esterno [pericoloso!!]... " | |||
# $IPT -A INPUT -p tcp -m multiport --destination-port 80,443 -j ACCEPT | |||
## | |||
# echo "Accetto POP3 dall'esterno [pericoloso!]..." | |||
# $IPT -A INPUT -p tcp --sport 110 -j ACCEPT | |||
## | |||
# Questo esempio serve per usare il transparent proxy | |||
# $IPT -t nat -A PREROUTING -p tcp -s $LOCALNET --destination-port 80 -j RETURN | |||
# $IPT -t nat -A PREROUTING -p tcp -s $LOCALNET --destination-port 443 -j RETURN | |||
# Redirezione HTTP | |||
# $IPT -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-ports 3128 | |||
# Redirezione HTTPS | |||
# $IPT -t nat -A PREROUTING -p tcp --destination-port 443 -j REDIRECT --to-ports 3128 | |||
## | |||
####################### | |||
## regole in uscita ## | |||
####################### | |||
## | |||
## abilita servizio DNS per protocolli UDP | |||
## (attivare per policy drop su output) | |||
# $IPT -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT | |||
## | |||
## abilita la navigazione WEB ed il traffico HTTPS | |||
## (attivare per policy drop su output) | |||
# $IPT -t filter -A OUTPUT -p tcp -m multiport --dports 80,443 -j ACCEPT | |||
## | |||
## abilita il traffico FTP | |||
## (attivare per policy drop su output) | |||
# $IPT -t filter -A OUTPUT -o $EIF -p tcp --dport ftp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT | |||
## | |||
## abilita le connessioni SMTP e POP3 in uscita | |||
## (attivare per policy drop su output) | |||
# $IPT -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT | |||
# $IPT -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT | |||
## | |||
## abilita connessioni SSH (SecureShell) con attivazione Log | |||
## (attivare per policy drop su output) | |||
# $IPT -t filter -A OUTPUT -p tcp --syn --dport 22 -m state --state NEW -j LOG --log-level info --log-prefix "---SSH from $EIF---" | |||
# $IPT -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT | |||
## | |||
# echo "Impedisco l'uscita di pacchetti netbios..." | |||
# il traffico di questi pacchetti potrebbe attivare | |||
# eventuali connessioni 'dial on demand' a internet. | |||
# $IPT -A OUTPUT -p udp --destination-port 135:139 -j DROP | |||
## | |||
## | |||
#################### | |||
## regole particolari ## | |||
################### | |||
## | |||
## | |||
## | |||
# echo "Imposto le regole sulla tabella MANGLE..." | |||
# # Setto il TTL su tutti i pacchetti in uscita a 128. | |||
# # per nascondere la propria rete dietro al router, | |||
# # convertire i pacchetti uscenti dalla LAN ad un TTL | |||
# # uguale a quello dei pacchetti generati dal router. | |||
# # TTL non è inserito nelle versioni comunemente | |||
# # distribuite (senza patch-o-matic) | |||
# $IPT -t mangle -A FORWARD -o $EIF -j TTL --ttl-inc 1 | |||
## | |||
echo "Risolvo il blocco derivante da ICMP fragmentation" | |||
# Il target TCPMSS risolve i problemi di connessione derivanti da server | |||
# che bloccano i pacchetti ICMP Fragmentation Needed. | |||
# Tale blocco spesso blocca il trasferimento dati anche in presenza di connessioni stabilite. | |||
$IPT -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu | |||
## | |||
############################# | |||
## regole su FORWARD e nat ## | |||
############################# | |||
## | |||
## | |||
## | |||
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT | |||
$IPT -A FORWARD -i $EIF -m state --state NEW,INVALID -j $chain | |||
$IPT -A FORWARD -o $EIF -j ACCEPT | |||
echo "$MSET SNAT (MASQUERADE) su $EIF" | |||
## | |||
#usare su indirizzi dinamici (esempio connessioni dial-up) | |||
$IPT -t nat -A POSTROUTING -o $EIF -j MASQUERADE | |||
#usare solo su indirizzi statici | |||
# $IPT -t nat -A POSTROUTING -o $EIF -j SNAT --to $EIP | |||
## | |||
## | |||
############### | |||
## fine del FW ## | |||
############### | |||
## | |||
## | |||
echo "" | |||
echo "Da ora la politica per INPUT è $chain" | |||
echo "la politica per OUTPUT è $outchain" | |||
echo "IP forwarding è settato su $fw " | |||
echo "" | |||
echo -e "$NULL\n" | |||
## | |||
netfilter | |||
## | |||
##The End.. | |||
</pre> | |||
---- | |||
Autore: debian | |||
[[Categoria:Server]][[Categoria:Firewalling]][[Categoria:Script]] | |||
[[ |
Versione delle 01:38, 3 gen 2010
#!/bin/bash ## clear ## #################### VERSION="2003.06.11" #################### ## ## Interfaccia interna fidata 'settare la propria' IIF="eth0" # IIF="eth1" ## ## Interfaccia esterna da proteggere 'settare la propria' ## in genere l'interfaccia esterna è configurata da un DHCP quindi ha indirizzo dinamico. EIF="ppp0" # EIF="eth0" # EIF="eth1" ## Se l'interfaccia esterna ha un IP statico, dichiararlo # EIP="xx.xx.xx.xx" ## ## Indirizzo macchina router (si presume che il firewall giri sulla macchina router ## in caso contrario correggere manualmente questo indirizzo) ## ## Se preferite utilizzare un indirizzo statico, decommentate la linea che indica un IP ## altrimenti se utilizzate un DHCP o non conoscete l'indirizzo ## usate il riconoscimento tramite ifconfig ## controllare comunque che lo script riconosca l'indirizzo IP (potrebbe non andare su macchine che ## utilizzano shell particolari o che formattano ifconfig diversamente. ## SERVER=` ifconfig $IIF | grep inet | cut -d : -f2 | cut -d ' ' -f1` # SERVER="192.168.10.2" ## ## Indirizzo macchina client da inserire a mano, se il server condivide la connessione ## internet, questa macchina sarà autorizzata ad accedere al firewall via eth0 ## al posto di un singolo host è possibile utilizzare una rete intera usando ## la notazione RETE/NETMASK ## attenzione alla banda disponibile perché una rete genera parecchio traffico..;) CLIENT="10.22.115.11" # CLIENT"192.168.10.0/24" ## ## Loopback LOCALHOST="127.0.0.1" ## ## Rete interna ## controllare che gli script ottengano i valori corretti ## o sostituire con valori statici. net=` ifconfig $IIF | grep inet | cut -d : -f2 | cut -d ' ' -f1 | cut -d . -f1,2,3` mask=` ifconfig $IIF | grep inet | cut -d : -f4 | cut -d ' ' -f1` LOCALNET="$net.0/$mask" ## ## Broadcast BROADCAST=` ifconfig $IIF | grep inet | cut -d : -f3 | cut -d ' ' -f1` ## ## Provider1 DNS 'inserire i propri DNS' # DNS1="212.216.172.62" DNS1="195.130.224.18" ## ## Provider2 DNS #DNS2="195.130.224.18" DNS2="192.160.10.31" ## ## Local DNS DNS3="212.245.255.2" ## questo potrebbe essere il DNS locale, in seguito sarà prevista la configurazione ## per il funzionamento di un DNS locale. ## ## Per qualunque problema...;) EMAIL="m.m.asciutti@email.it" ## ## PATH di iptables 'adattare alla propria macchina, se necessario' IPT=` which iptables` ## ## NOTA: ## Dopo aver modificato i parametri base per adattare lo ## script alle proprie esigenze, salvarlo e renderlo eseguibile ## in particolare adattare l'indirizzo del client o della rete che ## verrà nattata ## verificare inoltre che lo script che preleva ## l'indirizzo IP da ifconfig sia funzionante ## sul proprio sistema. ## ## Decommentare se si desidera aggiungere lo script al PATH di sistema # export PATH=$PATH:$NPATH ## ## Nome dello script e Posizione assoluta NFILE="firewall" NPATH="/etc/rc.d" ## ## NOTA: ## il percorso predefinito è "/etc/rc.d/" ed ## il nome predefinito è "firewall" ## ma è possibile utilizzare qualsiasi nome / percorso ## avendo cura di modificare le variabili NFILE e NPATH' ## ## Setto permessi e proprietario chown root $NPATH/$NFILE chmod 700 $NPATH/$NFILE ## ## NOTA: ## questa funzione viene richiamata solo con ## l'opzione stop e serve a rimuovere i moduli ## caricati dal firewall ## #ANSI COLOR MAGENTA='\e[35m' GREEN='\e[32m' YELLOW='\e[33m' WHITE='\e[37m' BLUE='\e[34m' CYAN='\e[36m' RED='\e[31m' NULL='\e[0m' COLOR=$BLUE ## case "$1" in #**************************************************************START start) clear COLOR=$RED msg=" Attivo il firewall ..." echo -e "$COLOR$msg$NULL\n" ## ## Politica INPUT chain="DROP" ## ## Politica OUTPUT outchain="ACCEPT" ## ## Routing fw="ACCEPT" CF="1" ## ## Opzioni diverse dalle standard ## ## Politica OUTPUT ## 'se si attiva, decommentare le regole relative all'uscita dei pacchetti' ## outchain="DROP" ## ## Non funziona da router # fw="DROP" # CF="0" ## ## Opzioni kernel SC="1" ER="1" DE="1" TW="1" SR="0" DR="0" ASR="0" ISR="1" SAV="1" LOG="1" DSR="1" ## ## Solo cosmetico SET="Abilito" MSET="Abilito" function netfilter() { exit 0 } ;; #*******************************************************************STOP stop) clear COLOR=$GREEN msg=" Disattivo il firewall ..." echo -e "$COLOR$msg$NULL\n" ## ## Politica INPUT chain="ACCEPT" ## ## Politica OUTPUT outchain="ACCEPT" ## ## Non funziona da router fw="DROP" CF="0" ## ## Opzioni kernel SC="0" ER="0" DE="0" TW="0" SR="1" DR="1" ASR="1" ISR="0" SAV="0" LOG="0" DSR="0" ## ## Solo cosmetico SET="Disabilito" MSET="Disabilito" ## function netfilter() { if [ -f /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/ip_tables.o ]; then ( rmmod ip_contrackt \ ip_contrack_ftp \ ip_nat_ftp \ ip_queue \ ip_tables \ ipt_LOG \ ipt_MARK \ ipt_MASQUERADE \ ipt_MIRROR \ ipt_REDIRECT \ ipt_TCPMSS \ ipt_TOS \ ipt_limit \ ipt_mac \ ipt_mark \ ipt_multiport \ ipt_owner \ ipt_state \ ipt_tcpmss \ ipt_tos \ ipt_unclean \ iptable_filter \ iptable_mangle \ iptable_net ) > /dev/null 2> /dev/null ( rmmod ipfwadm; rmmod ipchains; modprobe ip_tables ) > /dev/null 2> /dev/null fi exit 0 } ;; #*************************************************************ROUTER router) clear COLOR=$YELLOW msg=" Attenzione, disattivo il firewall ed attivo il forwarding..." echo -e "$COLOR$msg$NULL\n" ## ## Politica INPUT chain="ACCEPT" ## ## Politica OUTPUT outchain="ACCEPT" ## ## Funziona da router fw="ACCEPT" CF="1" ## ## Opzioni kernel SC="0" ER="0" DE="0" TW="0" SR="1" DR="1" ASR="1" ISR="0" SAV="0" LOG="0" DSR="0" ## ## Solo cosmetico SET="Disabilito" MSET="Abilito" function netfilter() { exit 0 } ;; #**************************************************************HELP help) clear COLOR=$CYAN msg=" Help..." echo -e "$COLOR$msg" echo "" echo "$NFILE start " echo " Setta il firewall secondo le opzioni" echo " indicate, è possibile modificare " echo " gran parte dei parametri predefiniti" echo " per utilizzare lo script secondo le" echo " proprie esigenze." echo "" echo "$NFILE stop" echo " Resetta il firewall, permette il passaggio" echo " di tutti i pacchetti in ingresso su ogni " echo " interfaccia disabilitando l'utilizzo " echo " del PC come router;" echo " navigate usando questa modalità il meno possibile." echo "" echo "$NFILE router" echo " Abilita il transito dei pacchetti" echo " tra $IIF e $EIF senza nessun firewall" echo " utilizzare esclusivamente per testare la rete" echo " o usare un secondo firewall tra router e rete" echo " molti settaggi del kernel non sono pensati per la sicurezza" echo " ma solo per testare la rete senza perdita di nessun tipo di pacchetti," echo " è PERICOLOSO. " echo "" echo "$NFILE info" echo " Mostra il settaggio attuale dei parametri base" echo " per controllare le personalizzazioni sullo script." echo "" echo "$NFILE policy" echo " Mostra le politiche impostate con start" echo " e le statistiche relative al funzionamento del firewall" echo " i pacchetti ricevuti, droppati, loggati ecc." echo "" echo "$NFILE vsf" echo " Verifica se il server è in presenza di " echo " attacco Syn Flood." echo " È possibile settare alcuni parametri per diminuire " echo " la vulnerabilità all'attacco (indicati nel corpo dello script)." echo " I tentativi di attacco sono comunque tutti loggati." echo "" echo "$NFILE help" echo " Visualizza questo messaggio" echo -e "$NULL\n" echo "Per ogni suggerimento:$EMAIL" echo "" exit 0 ;; #***************************************************************INFO info) clear COLOR=$MAGENTA msg=" Info ..." echo -e "$COLOR$msg" echo "" ## echo "" echo " il PATH di questo script è $NPATH/$NFILE" echo " il PATH di iptables è $IPT" echo " l'interfaccia interna è la $IIF" echo " l'interfaccia esterna è la $EIF" echo " l'indirizzo IP del pc server/router è $SERVER " echo " l'indirizzo IP del pc client fidato è $CLIENT" echo " la rete locale è $LOCALNET" echo " l'indirizzo broadcast è $BROADCAST" echo " il DNS primario è $DNS1" echo " il DNS secondario è $DNS2" echo "" echo -e "$NULL\n" exit 0 ;; #***************************************************************INFO policy) clear COLOR=$WHITE msg=" Politiche ..." echo -e "$COLOR$msg" $IPT -nvL ## ## espande la politica di netfilter ## visualizzando le catene e informazioni sulle echo -e "$NULL\n" ## exit 0 ;; #*********************************************************Verifica Syn Flood vsf) clear COLOR=$YELLOW msg=" Syn Flood ..." echo -e "$COLOR$msg" echo "" echo " Verifico se siamo in presenza di Syn Flood" echo "" echo " Oltre 20-30 tentativi di connessione da uno stesso" echo " indirizzo, indicano un tentativo di flood, verificare comunque i Log" echo " prima di attivare le contromisure" ## netstat -npla | grep SYN_RECV ## echo -e "$NULL\n" exit 0 ;; #****************************************************************USO *) ## clear COLOR=$BLUE msg="Firewall ver. $VERSION - Utilizzo: $NFILE {start|stop|router|info|policy|vsf|help}" echo -e "$COLOR$msg$NULL\n" ## exit 0 ;; ## esac ## #*******************************************************BLOCCO COMUNE ## echo -e "$COLOR" ## Caricamento dei moduli necessari nel kernel ## ## Il vostro kernel potrebbe non avere ## tutti questi moduli, è sufficiente ricompilare se le funzionalità ## sono necessarie. ## ## NOTA: I seguenti moduli sono elencati solo per informazione ## Non è necessario inserirli manualmente nel kernel ## a meno di casi particolari. ## # echo "Caricamento moduli..." ## # modulo base modprobe ip_tables ## # modulo necessario alla stateful connection tracking modprobe ip_conntrack ## # modulo filter, permette di droppare rifiutare o loggare i pacchetti modprobe iptable_filter ## # modulo mangle # modprobe iptable_mangle ## # modulo nat modprobe iptable_nat ## # modulo LOG, permette di registrare i pacchetti bloccati in base alle catene modprobe ipt_LOG ## # modulo utilizzato per limitare il numero di pacchetti per sec/min/hr ## modprobe ipt_limit ## # modulo masquerade modprobe ipt_MASQUERADE ## # modulo owner # modprobe ipt_owner ## # REJECT respinge il pacchetto restituendo una risposta ICMP # configurabile, il default è "connection refused". # modprobe ipt_REJECT ## # modulo mark, permette di marcare pacchetti sulla catena mangle # modprobe ipt_mark ## # questo modulo permette di modificare il TCP MSS ## modprobe ipt_tcpmss ## # questo modulo permette di indicare porte multiple # modprobe multiport ## # questo modulo consente controlli sui flags TCP # modprobe ipt_state ## # controlli su flags invalidi # modprobe ipt_unclean ## # supporto ftp non-PASV # modprobe ip_nat_ftp ## # modulo per full ftp connection tracking # modprobe ip_conntrack_ftp ## # modulo per full irc connection tracking # modprobe ip_conntrack_irc ## ################# ## area kernel ## ################# ## echo "$SET forwarding... " echo "$CF" >/proc/sys/net/ipv4/ip_forward ## echo "$SET syn-cookies (protezione syn-flood attacks)..." echo "$SC" >/proc/sys/net/ipv4/tcp_syncookies ## echo "Riduco il numero di possibili SYN Floods..." echo "1024" >/proc/sys/net/ipv4/tcp_max_syn_backlog ## ## echo "$SET ICMP echo-request su indirizzi broadcast (Smurf amplifier)..." # Questi parametri servono ad ignorare ogni ICMP echo requests # inviato da indirizzi broadcast. Servono a prevenire # un gran numero di attacchi smurfs e DoS. echo "$ER" >/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts ## # Contromisure contro attacchi DoS # echo "Disabilito ICMP echo-request (usare solo se si è sotto attacco Dos)" # echo "1" >/proc/sys/net/ipv4/icmp_echo_ignore_all # #sotto attacco syn incrementare il valore di tcp_max_syn_backlog e decrementare # #il valore dei timeout_* # echo "100" > /proc/sys/net/ipv4/vs/timeout_synack # echo "10" > /proc/sys/net/ipv4/vs/timeout_synrecv # echo "128" > /proc/sys/net/ipv4/tcp_max_syn_backlog ## echo "$SET protezione defrag error... " echo "$DE" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses ## echo "$SET time-wait assassination hazards in tcp (RFC 1337)..." #echo "$TW" >/proc/sys/net/ipv4/tcp_rfc1337 ## echo "$SET sourcerouting and spoofing protection..." for i in /proc/sys/net/ipv4/conf/*; do ## echo "$SET politica per source-routed packets..." # Questa politica è usata per accettare o rifiutare pacchetti # di tipo 'source routed'. È attiva di default, ma è considerata # un rischio per la sicurezza. echo "$SR" >$i/accept_source_route ## echo "$SET politica per ICMP Redirect accept/send..." # Questa opzione disabilita la redirezione dei pacchetti ICMP. # È generalmente considerato un rischio per la sicurezza. echo "$DR" >$i/accept_redirects # Per questo motivo, è preferibile accettare ICMP solo # dal gateway di default (opzione secure_redirects). echo "$ASR" >$i/send_redirects echo "$SET secure ICMP redirects..." echo "$ISR" >$i/secure_redirects ## # echo "Disabilito Proxy ARP ..." # # È un'opzione utilizzata per la realizzazione di DMZ; # # è disabilitata in quanto non rientra negli scopi di questo script. # # per maggiorni info: http://www.sjdjweis.com/linux/proxyarp/ # echo "0" >$i/proxy_arp ## echo "$SET source-address verification (prevent spoofing)..." # Abilita i controlli previsti nel RFC1812. # è raccomandato per sistemi basati su interfacce singole # Disattivare se si hanno interfacce multiple collegate alla stessa rete. # Questo controllo blocca i pacchetti che si presentano ad una interfaccia esterna # con indirizzo forgiato per sembrare provenienti da interfaccia interna; # il controllo è comunque ripetuto in seguito. echo "$SAV" >$i/rp_filter ## done ## echo "Applico settaggi controllo ..." if [ -f /proc/sys/net/ipv4/icmp_destunreach_rate ]; then echo "5" > /proc/sys/net/ipv4/icmp_destunreach_rate fi if [ -f /proc/sys/net/ipv4/icmp_echoreply_rate ]; then echo "5" > /proc/sys/net/ipv4/icmp_echoreply_rate fi if [ -f /proc/sys/net/ipv4/icmp_paramprob_rate ]; then echo "5" > /proc/sys/net/ipv4/icmp_paramprob_rate fi if [ -f /proc/sys/net/ipv4/icmp_timeexceed_rate ]; then echo "10" > /proc/sys/net/ipv4/icmp_timeexceed_rate fi ## echo "$SET il Log su spoofed, source routed e redirect packets..." # Questa opzione serve a loggare i pacchetti provenienti da indirizzi impossibili. echo "$LOG" >/proc/sys/net/ipv4/conf/all/log_martians ## echo "$SET dynamic socket address rewriting..." # Utile se si utilizza un indirizzo dinamico assegnato da DHCP. echo "$DSR" > /proc/sys/net/ipv4/ip_dynaddr ## echo "Setto porte locali ..." echo "56000:65096" > /proc/sys/net/ipv4/ip_local_port_range ## ## ################################# ## inizio competenza iptables ## ################################# ## echo "Azzero le chain..." ## for y in filter nat mangle ; do $IPT -t $y -F $IPT -t $y -X done ## ## politica per la tabella filter $IPT -P INPUT $chain $IPT -P OUTPUT $outchain $IPT -P FORWARD DROP #NOTA: FORWARD è su DROP in quanto il controllo è lasciato ad altre regole ## ## politica per la tabella mangle for m in PREROUTING OUTPUT ; do $IPT -t mangle -P $m ACCEPT done ## echo "Genero catene utente ..." $IPT -N chain-log $IPT -A chain-log -j LOG --log-level info # NOTA: Senza --log-level "info", si ha la scrittura dei log in ogni # vty. È un po' troppo ... $IPT -A chain-log -j $chain ## # # Dynamic Address # # La richiesta di assegnazione dell'indirizzo è di tipo broadcast # # la risposta potrebbe non essere accettata # # questa dichiarazione abilita il DHCP # $IPT -A INPUT -p UDP --source-port 67 --destination-port 68 -j ACCEPT # # DHCPd - abilitare in presenza di DHCP interno # #$IPT -A INPUT -i $IIF -p tcp --sport 68 --dport 67 -j ACCEPT # #$IPT -A INPUT -i $IIF -p udp --sport 68 --dport 67 -j ACCEPT ## ## echo "Accetto connessioni da $LOCALHOST , $SERVER , $CLIENT ..." $IPT -A INPUT -i lo -j ACCEPT $IPT -A INPUT -i $IIF -s $CLIENT -j ACCEPT $IPT -A INPUT -i $IIF -s $SERVER -j ACCEPT # $IPT -A INPUT -i $IIF -s $LOCALNET -j ACCEPT # $IPT -A OUTPUT -o lo -s $LOCALHOST -j ACCEPT # $IPT -A OUTPUT -o lo -s $SERVER -j ACCEPT ## echo "Controllo di integrità dei pacchetti sulla tabella nat-PREROUTING..." $IPT -t nat -A PREROUTING -i $EIF -s $LOCALNET -j $chain $IPT -t nat -A PREROUTING -i $EIF -s $LOCALHOST -j $chain $IPT -t nat -A PREROUTING -i $EIF -s $CLIENT -j $chain $IPT -t nat -A PREROUTING -i $EIF -s $SERVER -j $chain # # È anche possibile bloccare e loggare tutti i pacchetti # # provenienti da indirizzi privati (chiaramente forgiati per # # tentare un'intrusione) e non solo quelli relativi a $LOCALNET # # per una lista completa: # # http://www.iana.org/assignments/ipv4-address-space ## # # echo "Rifiuto pacchetti provenienti da indirizzi privati, multicast o riservati..." ## # # NOTA - le variabili A_r,B_r,C_r,D_r devono essere dimensionate # # leggendo le liste degli indirizzi da rifiutare (file esterno) # # il metodo è riportato , ma non è implementato nessun controllo, # # i pacchetti in ingresso sono comunque tutti droppati. # # questo controllo potrebbe essere comunque comodo, ma non è # # nelle finalità di questo script. # # non # for CL in A_r B_r C_r D_mc E_r ; do # $IPT -A INPUT -i $EIF -s $CL -j chain-log # done ## # TCP & UDP # Le porte standard sono elencate su: # http://www.chebucto.ns.ca/~rakerman/port-table.html # http://www.iana.org/assignments/port-numbers ## echo "Accetto connessioni RELATED/ESTABLISHED..." #in input $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT echo "Accetto ICMP type 0,3,11..." ## codici ICMP - RFC 792 ## 0 Echo Reply ## 3 Destination Unreachable, il router non ha trovato la destinazione del pacchetto. ## 4 Source Quench ## 5 Redirect, il router informa l'host di aver inoltrato il pacchetto ad un diverso router ## 8 Echo, messaggio utile per sapere se un host è presente oppure no (utilizzato in Ping) ## 11 Time Exceeded ## 12 Parameter Problem, campo dell'header non valido ## 13 Timestamp ## 14 Timestamp Reply ## 15 Information Request ## 16 Information Reply # Visitare: http://www.ee.siue.edu/~rwalden/networking/icmp.html # per altre informazioni relative ai tipi ICMP. for ic in 0 3 11 ; do $IPT -A INPUT -i $EIF -p icmp --icmp-type $ic -j ACCEPT done ## # Decommentare se si desidera che il proprio sistema risponda ai ping $IPT -A INPUT -i $EIF -p ICMP --icmp-type 8 -j $chain # $IPT -A INPUT -i $EIF -p ICMP --icmp-type 8 -j ACCEPT ## echo "Accetto ICMP dalla rete locale..." $IPT -A INPUT -i $IIF -s $LOCALNET -p icmp -j ACCEPT ## echo "Accetto DNS replies" $IPT -A INPUT -i $EIF -p udp -s $DNS1 --sport 53 -j ACCEPT $IPT -A INPUT -i $EIF -p udp -s $DNS2 --sport 53 -j ACCEPT # $IPT -A INPUT -i IIF -p tcp -s $DNS3 --sport 53 -j ACCEPT $IPT -A INPUT -p udp --sport 53 -j ACCEPT # il DNS 3 si intende come locale, per questo si accettano le connessioni tcp # $IPT -A INPUT -i $EIF -p tcp -s $DNS1 --sport 53 -j ACCEPT # $IPT -A INPUT -i $EIF -p tcp -s $DNS2 --sport 53 -j ACCEPT ## echo "Blocco ogni pacchetto broadcast" $IPT -A INPUT -p ALL -d 255.255.255.255 -j $chain # $IPT -A INPUT -s 10.128.0.0/255.255.0.0 -j DROP ## echo "Attivo SYN-FLOODING protection..." $IPT -N SYN-FLOOD $IPT -A INPUT -p tcp --syn -j SYN-FLOOD $IPT -t filter -A SYN-FLOOD -m limit --limit 1/s --limit-burst 4 -j chain-log ## # echo "Sperimentale..." # #NOTA - è disattivato in quanto potrebbe generare molti falsi positivi. # $IPT -t nat -A PREROUTING -i $EIF -m unclean -j chain-log ## echo "Blocco le scansioni Xmas tree, i pacchetti senza flag, i flag irregolari, le scansioni..." ##Blocco le scansioni Xmas tree $IPT -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j chain-log $IPT -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK -j chain-log ## ##Blocco i pacchetti senza flags $IPT -A INPUT -p tcp --tcp-flags ALL NONE -j chain-log ## ##Blocco i pacchetti SYN+RST e SYN+FIN $IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j chain-log $IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j chain-log ## ##Blocco le scansioni FIN $IPT -A INPUT -p tcp --tcp-flags FIN FIN -j chain-log ## ##Elimino pacchetti broadcast netbios $IPT -A INPUT -p udp --dport 135:139 -j $chain ## echo "Dirotto pacchetti NEW e INVALID verso CHAIN..." $IPT -A INPUT -i $EIF -m state --state NEW,INVALID -j chain-log $IPT -A INPUT -i $IIF -m state --state NEW,INVALID -j chain-log ## ## ################################################################## ## Servizi aperti all'esterno 'decommentare i servizi desiderati, attenzione!!' ## ################################################################## ## # echo "Accetto connessioni su shell criptate dall'esterno..." # $IPT -A INPUT -p tcp --dport 22 -j ACCEPT ## # echo "Accetto connessioni sendmail dall'esterno [pericoloso!!!]..." # $IPT -A INPUT -p tcp --dport smtp -j ACCEPT ## # echo "Accetto http e https dall'esterno [pericoloso!!]... " # $IPT -A INPUT -p tcp -m multiport --destination-port 80,443 -j ACCEPT ## # echo "Accetto POP3 dall'esterno [pericoloso!]..." # $IPT -A INPUT -p tcp --sport 110 -j ACCEPT ## # Questo esempio serve per usare il transparent proxy # $IPT -t nat -A PREROUTING -p tcp -s $LOCALNET --destination-port 80 -j RETURN # $IPT -t nat -A PREROUTING -p tcp -s $LOCALNET --destination-port 443 -j RETURN # Redirezione HTTP # $IPT -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-ports 3128 # Redirezione HTTPS # $IPT -t nat -A PREROUTING -p tcp --destination-port 443 -j REDIRECT --to-ports 3128 ## ####################### ## regole in uscita ## ####################### ## ## abilita servizio DNS per protocolli UDP ## (attivare per policy drop su output) # $IPT -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT ## ## abilita la navigazione WEB ed il traffico HTTPS ## (attivare per policy drop su output) # $IPT -t filter -A OUTPUT -p tcp -m multiport --dports 80,443 -j ACCEPT ## ## abilita il traffico FTP ## (attivare per policy drop su output) # $IPT -t filter -A OUTPUT -o $EIF -p tcp --dport ftp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT ## ## abilita le connessioni SMTP e POP3 in uscita ## (attivare per policy drop su output) # $IPT -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT # $IPT -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT ## ## abilita connessioni SSH (SecureShell) con attivazione Log ## (attivare per policy drop su output) # $IPT -t filter -A OUTPUT -p tcp --syn --dport 22 -m state --state NEW -j LOG --log-level info --log-prefix "---SSH from $EIF---" # $IPT -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT ## # echo "Impedisco l'uscita di pacchetti netbios..." # il traffico di questi pacchetti potrebbe attivare # eventuali connessioni 'dial on demand' a internet. # $IPT -A OUTPUT -p udp --destination-port 135:139 -j DROP ## ## #################### ## regole particolari ## ################### ## ## ## # echo "Imposto le regole sulla tabella MANGLE..." # # Setto il TTL su tutti i pacchetti in uscita a 128. # # per nascondere la propria rete dietro al router, # # convertire i pacchetti uscenti dalla LAN ad un TTL # # uguale a quello dei pacchetti generati dal router. # # TTL non è inserito nelle versioni comunemente # # distribuite (senza patch-o-matic) # $IPT -t mangle -A FORWARD -o $EIF -j TTL --ttl-inc 1 ## echo "Risolvo il blocco derivante da ICMP fragmentation" # Il target TCPMSS risolve i problemi di connessione derivanti da server # che bloccano i pacchetti ICMP Fragmentation Needed. # Tale blocco spesso blocca il trasferimento dati anche in presenza di connessioni stabilite. $IPT -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu ## ############################# ## regole su FORWARD e nat ## ############################# ## ## ## $IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -i $EIF -m state --state NEW,INVALID -j $chain $IPT -A FORWARD -o $EIF -j ACCEPT echo "$MSET SNAT (MASQUERADE) su $EIF" ## #usare su indirizzi dinamici (esempio connessioni dial-up) $IPT -t nat -A POSTROUTING -o $EIF -j MASQUERADE #usare solo su indirizzi statici # $IPT -t nat -A POSTROUTING -o $EIF -j SNAT --to $EIP ## ## ############### ## fine del FW ## ############### ## ## echo "" echo "Da ora la politica per INPUT è $chain" echo "la politica per OUTPUT è $outchain" echo "IP forwarding è settato su $fw " echo "" echo -e "$NULL\n" ## netfilter ## ##The End..
Autore: debian