Un firewall è essenzialmente un dispositivo che permette di gestire come un filtro il traffico tra due interfacce di rete. In questa sezione vedremo come impostare un firewall per un sistema Linux, sia per proteggere un singolo PC, sia una rete locale, in entrambe le situazioni nel caso di collegamento a internet. Inoltre vedremo come poter consentire la condivisione di una connessione internet, in modo che un singolo PC possa isolare da possibili attacchi esterni e allo stesso tempo permetta l'accesso all'esterno alla rete locale. Per accesso esterno considero solo quello in entrata: tutti i PC della rete potranno inviare e ricevere tutte le informazioni che vorranno, ma non potranno offrire servizi all'esterno (infatti per questo servizio serve un demone apposito, rinetd). Inoltre l'inserimento nella macchina firewall di un server dns e di un cache proxy permetteranno di sveltire il traffico: il server dns locale permette infatti di avere una risposta più immediata alle richieste di risoluzione dei nomi in indirizzi ip, mentre il cache proxy permette di tenere copie locali delle pagine web e dei file già scaricati, evitando una nuova richiesta esterna (questi due tipi di servizi sono trattati nelle sezioni DNS e WWWOFFLE di questo howto).
Linux contiene già al suo interno tutto il necessario per implementare un firewall e il masquerading: si tratta del tool ipchains dei kernel 2.2.x. I kernel della serie 2.0.x usavano ipfwadm, mentre quelli della futura versione 2.4.x useranno iptables: qui si tratterà solo la gestione con ipchains e kernel 2.2.x (e in futuro iptables), mentre ipfwadm non verrà trattato. Per poter utilizzare ipchains, è necessario che il kernel sia compilato con le opzioni di firewalling seguenti impostate a Yes:
più naturalmente tutto quello che vi serve per la rete (networking, ppp, ethernet, routing, ecc.). Ipchains suddivide il traffico in tre tronconi, fornendo tre filtri: input, output e forward, gestibili tramite una serie di regole che stabiliscono il trattamento del pacchetto arrivato. Le regole vengono applicate nell'ordine in cui sono inserite, e se non è presente alcuna regola specifica, si applica la politica di default. In questo howto prendereno in considerazione solo le cose essenziali e solo quelle trattate nello script, per il resto si rimanda al Firewall-Howto e all'Ipchains-Howto, oltre all'ottima sezione degli Appunti Linux. L'impostazione tipica di una regola è la seguente:
ipchains <opzione-di-comando> <filtro> [<regola>] [<obiettivo>]
Le opzioni di comando sono:
I filtri sono (rispettivamente per pacchetti in entrata, uscita e in transito):
Gli obiettivi sono:
Le regole invece usano le seguenti opzioni (le parentesi [] indicano qualcosa di opzionale, mentre il ! indica una negazione):
Altre informazioni sono reperibili nei documenti su indicati. Il mascheramento IP permette di far credere all'esterno che l'origine delle connessioni è sempre un solo nodo, anche quando in realtà si tratta di un nodo interno ad una rete privata. Naturalmente, il nodo che esegue il mascheramento è poi in grado di distinguere quali siano stati i nodi mascherati che hanno originato la connessione, girando a loro i pacchetti di loro competenza.
Lo script seguente funziona sia come firewall che da mascheramento di una rete locale interna verso Internet. E' configurato per l'accesso dialup via ppp (usa ppp0). Leggete i commenti nel file, modificate dove indicato e andate in pace. Per sapere come abilitare il supporto per firewall e masquerading, guardate nella pagina relativa al kernel. Dovrebbe fare la maggior parte dei controlli su esistenza di file, connessione, parametri, e segnalarvi se qualcosa non va. ***Nota*** per il mascheramento di ICQ, dovete scaricare, compilare e installare "ip_masq_icq", reperibile all'URL http://freeshell.org/~djsf/masq-icq/ oppure all'URL http://djsf.narod.ru/masq-icq/ (un grazie a Filippo Panessa per il suggerimento!). In ICQ2000 non funziona ancora il trasferimento file. Nella configurazione dei client che vengono mascherati, dovete impostare nelle loro opzioni l'uso di un firewall sull'intervallo di porte 2000:4000.
#!/bin/bash
#
# ==========================================================================
# ========= Script per la configurazione di un Firewall per Linux ==========
# ==========================================================================
#
# Da utilizzarsi esclusivamente per una macchina stand-alone connessa
# ad internet tramite connessione dial-up. E' necessario disporre di
# un kernel della serie 2.2.x o 2.3.x compilato con il supporto
# del masquerading, del firewall e l'opzione "always defragment".
# Viene filtrato cio' che entra e permesso alla rete di uscire
#
# $Revisione: 7.0$
# modificato da MrShark su un lavoro precedente di Maurizio Cimaschi,
# con vari preziosi suggerimenti di Pierluigi De Rosa e Marco d'Itri.
# (Se ci sono errori, fatemeli conoscere a: <mrshark@tiscalinet.it>).
#
# Utilizzo: firewall start|stop|status
# start = attiva il firewall
# stop = disattiva il firewall
# status = impostazioni correnti del firewall
#
# by Antonio Fragola, aka MrShark - The Informaniac
#
#------------------------------ verifica che lo script sia avviato da root
if [ $UID !=0 ]; then
clear
echo -e "\aATTENZIONE: solo l'utente root puo' avviare il firewall!"
exit 1
fi
# ==========================================================================
# =========== Definizione delle variabili d'ambiente necessarie ============
# ==========================================================================
#------------------------------ variabili utili
IPCHAINS="/sbin/ipchains"
INTERFACES=`/sbin/ifconfig | grep Link | cut -d \ -f 1`
CURRENT_KERNEL=`uname -r`
IP_MASQ_MODULES="ftp irc quake"
#IP_MASQ_MODULES="cuseeme ftp irc quake raudio vdolive"
INTERFACE="ppp0"
INTERFACEMASK="255.255.255.255"
INTERFACEIP=`/sbin/ifconfig $INTERFACE | grep inet | cut -d : -f 2 | cut -d \ -f 1`
LOCALIP="$INTERFACEIP/$INTERFACEMASK"
LOCALNET="192.168.0.0/16"
ANYWHERE="0.0.0.0/0"
LOOPBACK="127.0.0.0/8"
CLASS_A="10.0.0.0/8"
CLASS_B="172.16.0.0/12"
CLASS_C="192.168.0.0/16"
CLASS_D_MULTICAST="224.0.0.0/4"
CLASS_E_RESERVED_NET="240.0.0.0/5"
NFS_PORT="2049" # (TCP/UDP) NFS
SOCKS_PORT="1080" # (TCP) Socks
# X Windows alloca le porte a partire dalla 6000 e incrementa
# fino alla 6063 per ogni server addizionale in funzione.
XWINDOW_PORTS="6000:6063" # (TCP) X windows
# traceroute di solito usa -S 32769:65535 -D 33434:33523
TRACEROUTE_SRC_PORTS="32769:65535"
TRACEROUTE_DEST_PORTS="33434:33523"
PRIVPORTS="0:1023"
UNPRIVPORTS="1024:65535"
# SSH incomincia dalla porta 1023 e va a scalare fino alla 513
SSH_PORTS="1022:1023"
#------------------------------ codici escape colori
RED="\\033[1;31m"
GREEN="\\033[0;32m"
WHITE="\\033[0;39m"
CYAN="\\033[0;36m"
BLUE="\\033[1;34m"
ORANGE="\\033[0;33m"
YELLOW="\\033[1;33m"
MAGENTA="\\033[1;35m"
# ==========================================================================
# ================== Definizione dei servizi utilizzabili ==================
# ============ ON=Servizio attivo OFF=Servizio non richiesto ============
# ==========================================================================
# masquerading: ON solo se si ha una rete locale che deve accedere a internet
MASQ="ON"
FTP="ON"
DNS1="ON"
DNS2="ON"
HTTP="ON"
SMTP="ON"
NNTP="ON"
POP3="ON"
ICMP="ON"
AUTH="ON"
IRC="OFF"
ICQ="OFF"
SSH="ON"
NAP="OFF"
# ==========================================================================
# ============== Definizione degli IP dei servizi del provider =============
# ==========================================================================
# de/commentare solo le sezioni d'interesse o aggiungerne altre
#------------------------------ IP di libero
DNS1_IP="195.210.91.1"
DNS2_IP="195.210.91.2"
SMTP_IP="193.70.192.50"
NNTP_IP="192.106.1.6"
#------------------------------ IP di iol1055
#DNS1_IP="195.210.91.1"
#DNS2_IP="195.210.91.2"
#SMTP_IP="193.70.192.50"
#NNTP_IP="193.70.192.201"
#------------------------------ IP di tiscali
#DNS1_IP="195.130.224.18"
#DNS2_IP="195.130.225.129"
#SMTP_IP="195.130.224.22"
#NNTP_IP="195.130.224.123"
#------------------------------ IP di clubnet
#DNS1_IP="212.216.112.222"
#DNS2_IP="212.216.172.162"
#attenzione: clubnet usa smtp con piu' IP - cercarli con nslookup
#SMTP_IP="212.216.176.50"
#NNTP_IP="194.243.154.18"
# Attenzione: aggiungere TUTTI gli IP dei server POP3 usati, non solo
# quelli del provider in uso, altrimenti non si potra' scaricare la posta
#pop3 tiscali
POP3_1_IP="195.130.224.23"
#pop3 iol1055
POP3_2_IP="193.70.192.80"
#pop3 libero
POP3_3_IP="193.70.192.70"
#pop3 clubnet
#attenzione: clubnet usa pop con piu' IP
POP3_4_IP="212.216.176.71"
POP3_5_IP="212.216.176.64"
POP3_6_IP="212.216.176.65"
POP3_7_IP="212.216.176.67"
POP3_8_IP="212.216.176.68"
POP3_9_IP="212.216.176.69"
POP3_10_IP="212.216.176.70"
# ==========================================================================
# =========== Da qui in poi non toccare niente (al piu' solo la ===========
# ========== parte del POP3 per aggiungere/rimuovere gli account) ==========
# ==========================================================================
case "$1" in
#------------------------------ opzione start dello script
start)
#------------------------------ verifica esistenza interfaccia
if [ -z $INTERFACEIP ]; then
#------------------------------ se non esiste, avverti ed esci con errore 1
clear
echo -e "${RED}ATTENZIONE: ${YELLOW}l'interfaccia "
echo -e "${RED}ppp0${YELLOW} NON e' attiva nel sistema."
echo -e "Firewall NON attivato. Controllare la connessione Internet."
echo -en "${WHITE}Interfacce attualmente attive nel PC: "
for irf in ${INTERFACES} ; do
echo -en "${RED}${irf}${WHITE} "
done
echo -e "\n\a"
exit 1
#------------------------------ se l'interfaccia esiste, si procede
else
echo
echo "Attivazione del Firewall in corso..."
echo -e "Indirizzo IP locale sull'interfaccia ${YELLOW}$INTERFACE"
echo -e "${WHITE} : ${RED}$LOCALIP${WHITE}"
echo -n "Flushing delle regole eventualmente presenti : "
$IPCHAINS -F input
$IPCHAINS -F output
$IPCHAINS -F forward
echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]"
# ==========================================================================
# =========================== Regole in ingresso ===========================
# ==========================================================================
#------------------------------ attivazione protezioni varie
echo -n "Permesso al traffico locale sull'interfaccia di loopback : "
$IPCHAINS -A input -s $ANYWHERE -i lo -j ACCEPT
$IPCHAINS -A input -s $LOCALNET -d $ANYWHERE -j ACCEPT
echo -e "\t[ ${GREEN}OK ${WHITE}]"
echo -n "Attivazione Source Address Verification : "
if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 > $f
done
echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t[ ${RED}NO ${WHITE}]"
echo -n "SAV non disponibile, utilizzo di ipchains : "
$IPCHAINS -A input -s 127.0.0.1 -i lo -j ACCEPT
echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]"
fi
echo -n "Attivazione TCP SYN Cookie Protection : "
if [ -e /proc/sys/net/ipv4/tcp_syncookies ]; then
echo 1 >/proc/sys/net/ipv4/tcp_syncookies
echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t[ ${RED}NO ${WHITE}]"
fi
echo -n "Attivazione Always Defragging Protection : "
if [ -e /proc/sys/net/ipv4/ip_always_defrag ]; then
echo 1 > /proc/sys/net/ipv4/ip_always_defrag
echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t[ ${RED}NO ${WHITE}]"
fi
echo -n "Attivazione Broadcast Echo Protection : "
if [ -e /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts ]; then
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t[ ${RED}NO ${WHITE}]"
fi
echo -n "Attivazione Bad Error Message Protection : "
if [ -e /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses ]; then
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t[ ${RED}NO ${WHITE}]"
fi
echo -n "Disattivazione ICMP Redirect Acceptance : "
if [ -e /proc/sys/net/ipv4/conf/all/accept_redirects ]; then
for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
echo 0 > $f
done
echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t[ ${RED}NO ${WHITE}]"
fi
echo -n "Disattivazione Source Routed Packets : "
if [ -e /proc/sys/net/ipv4/conf/all/accept_source_route ]; then
for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo 0 > $f
done
echo -e "\t\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
echo -e "${YELLOW}Attivazione dei servizi in ingresso richiesti : ${WHITE}"
echo -n "Impostazione della POLICY di ingresso a DENY : "
$IPCHAINS -P input DENY
echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]"
#------------------------------ DNS1 (53)
echo -n "Server DNS primario : "
if [ $DNS1 = "ON" ]; then
$IPCHAINS -A input -p tcp ! -y -s $DNS1_IP 53 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
$IPCHAINS -A input -p udp -s $DNS1_IP 53 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
echo -e "\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
#------------------------------ DNS2 (53)
echo -n "Server DNS secondario : "
if [ $DNS2 = "ON" ]; then
$IPCHAINS -A input -p tcp ! -y -s $DNS2_IP 53 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
$IPCHAINS -A input -p udp -s $DNS2_IP 53 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
echo -e "\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
#------------------------------ HTTP (80) e HTTPS (443)
echo -n "Navigazione WEB : "
if [ $HTTP = "ON" ]; then
$IPCHAINS -A input -p tcp ! -y -s 0/0 80 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
$IPCHAINS -A input -p tcp ! -y -s 0/0 443 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
echo -e "\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
#------------------------------ SMTP (25)
echo -n "Invio posta : "
if [ $SMTP = "ON" ]; then
$IPCHAINS -A input -p tcp -s $SMTP_IP 25 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
# $IPCHAINS -A input -p tcp -s $ANYWHERE 25 -d $LOCALIP \
# $UNPRIVPORTS -j ACCEPT
echo -e "\t\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
#------------------------------ POP3 (110)
echo -n "Prelievo posta : "
if [ $POP3 = "ON" ]; then
$IPCHAINS -A input -p tcp -s $POP3_1_IP 110 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
$IPCHAINS -A input -p tcp -s $POP3_2_IP 110 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
$IPCHAINS -A input -p tcp -s $POP3_3_IP 110 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
$IPCHAINS -A input -p tcp -s $POP3_4_IP 110 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
$IPCHAINS -A input -p tcp -s $POP3_5_IP 110 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
$IPCHAINS -A input -p tcp -s $POP3_6_IP 110 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
$IPCHAINS -A input -p tcp -s $POP3_7_IP 110 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
$IPCHAINS -A input -p tcp -s $POP3_8_IP 110 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
$IPCHAINS -A input -p tcp -s $POP3_9_IP 110 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
$IPCHAINS -A input -p tcp -s $POP3_10_IP 110 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
echo -e "\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
#------------------------------ NNTP (119)
echo -n "Newsgroup Usenet : "
if [ $NNTP = "ON" ]; then
$IPCHAINS -A input -p tcp ! -y -s $NNTP_IP 119 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
echo -e "\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
#------------------------------ FTP (20/21)
echo -n "File Transfer Protocol : "
if [ $FTP = "ON" ]; then
$IPCHAINS -A input -p tcp ! -y --source-port 21 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
#FTP Port Mode (normale)
$IPCHAINS -A input -p tcp --source-port 20 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
#FTP Passive Mode (senza questa i browser non accedono ai siti FTP)
$IPCHAINS -A input -p tcp ! -y --source-port $UNPRIVPORTS \
-d $LOCALIP $UNPRIVPORTS -j ACCEPT
echo -e "\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
#------------------------------ SSH (22)
echo -n "Secure Shell : "
if [ $SSH = "ON" ]; then
$IPCHAINS -A input -p tcp ! -y -s $ANYWHERE 22 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
$IPCHAINS -A input -p tcp ! -y -s $ANYWHERE 22 -d $LOCALIP \
$SSH_PORTS -j ACCEPT
echo -e "\t\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
#------------------------------ ICMP (solo tipi 0/3/11)
echo -n "Traffico ICMP : "
if [ $ICMP = "ON" ]; then
$IPCHAINS -A input -p icmp -s $ANYWHERE 0 -d $LOCALIP -j ACCEPT
$IPCHAINS -A input -p icmp -s $ANYWHERE 3 -d $LOCALIP -j ACCEPT
$IPCHAINS -A input -p icmp -s $ANYWHERE 11 -d $LOCALIP -j ACCEPT
echo -e "\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
#------------------------------ AUTH (113)
echo -n "Richieste di identificazione : "
if [ $AUTH = "ON" ]; then
$IPCHAINS -A input -p tcp ! -y -d $LOCALIP 113 -j ACCEPT
echo -e "\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
#------------------------------ IRC (6667)
echo -n "Internet Relay Chat : "
if [ $IRC = "ON" ]; then
$IPCHAINS -A input -p tcp ! -y -s $ANYWHERE 6667 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
echo -e "\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
#------------------------------ ICQ (2000:4000)
echo -n "ICQ : "
if [ $ICQ = "ON" ]; then
$IPCHAINS -A input -p tcp ! -y -s $ANYWHERE 2000:4000 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
$IPCHAINS -A input -p udp -s $ANYWHERE 2000:4000 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
echo -e "\t\t\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t\t\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
#------------------------------ NAPSTER (6699)
echo -n "NAPSTER : "
if [ $NAP = "ON" ]; then
$IPCHAINS -A input -p tcp ! -y -s $ANYWHERE 6699 -d $LOCALIP \
$UNPRIVPORTS -j ACCEPT
echo -e "\t\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
#------------------------------ blocco e log
echo -n "Blocco e log di tutto il resto : "
# Rifiuta pacchetti spoof che simulano di provenire dall'esterno.
$IPCHAINS -A input -i $INTERFACE -s $LOCALIP -j DENY -l
# Rifiuta pacchetti che sembrano provenire da una rete privata di Classe A
$IPCHAINS -A input -i $INTERFACE -s $CLASS_A -j DENY
$IPCHAINS -A input -i $INTERFACE -d $CLASS_A -j DENY -l
# Rifiuta pacchetti che sembrano provenire da una rete privata di Classe B
$IPCHAINS -A input -i $INTERFACE -s $CLASS_B -j DENY -l
$IPCHAINS -A input -i $INTERFACE -d $CLASS_B -j DENY -l
# Rifiuta pacchetti che sembrano provenire da una rete privata di Classe C
$IPCHAINS -A input -i $INTERFACE -s $CLASS_C -j DENY -l
$IPCHAINS -A input -i $INTERFACE -d $CLASS_C -j DENY -l
# Rifiuta pacchetti che sembrano provenire dall'interfaccia di Loopback
$IPCHAINS -A input -i $INTERFACE -s $LOOPBACK -j DENY -l
# Rifiuta pacchetti broadcast address SOURCE
$IPCHAINS -A input -i $INTERFACE -s $INTERFACEMASK -j DENY -l
$IPCHAINS -A input -i $INTERFACE -d $ANYWHERE -j DENY -l
# Rifiuta pacchetti multicast addresses di Classe D (in.h) (NET-3-HOWTO)
# Il Multicast e' illegale come indirizzo sorgente, ed usa UDP.
$IPCHAINS -A input -i $INTERFACE -s $CLASS_D_MULTICAST -j DENY -l
# Rifiuta pacchetti da indirizzi IP riservati di Classe E
$IPCHAINS -A input -i $INTERFACE -s $CLASS_E_RESERVED_NET -j DENY -l
# Rifiuta pacchetti con indirizzi definiti riservati dall'IANA
# 0.*.*.*, 1.*.*.*, 2.*.*.*, 5.*.*.*, 7.*.*.*, 23.*.*.*, 27.*.*.*
# 31.*.*.*, 37.*.*.*, 39.*.*.*, 41.*.*.*, 42.*.*.*, 58-60.*.*.*
# 65-95.*.*.*, 96-126.*.*.*, 197.*.*.*, 201.*.*.* (?), 217-223.*.*.*
$IPCHAINS -A input -i $INTERFACE -s 1.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 2.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 5.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 7.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 23.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 27.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 31.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 37.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 39.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 41.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 42.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 49.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 50.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 58.0.0.0/7 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 60.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 65.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 66.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 67.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 68.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 69.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 70.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 71.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 72.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 73.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 74.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 75.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 76.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 77.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 78.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 79.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 80.0.0.0/4 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 96.0.0.0/4 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 112.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 113.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 114.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 115.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 116.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 117.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 118.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 119.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 120.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 121.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 122.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 123.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 124.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 125.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 126.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 197.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 217.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 218.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 219.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 220.0.0.0/6 -j DENY -l
#------------------------------ porte TCP non privilegiate
# NFS: instauramento connessione TCP
$IPCHAINS -A input -i $INTERFACE -p tcp -y -d $LOCALIP \
$NFS_PORT -j DENY -l
# Xwindow: instauramento connessione
$IPCHAINS -A input -i $INTERFACE -p tcp -y -d $LOCALIP \
$XWINDOW_PORTS -j DENY -l
# SOCKS: instauramento connessione
$IPCHAINS -A input -i $INTERFACE -p tcp -y -d $LOCALIP \
$SOCKS_PORT -j DENY -l
#------------------------------ porte UDP non privilegiate
# NFS: instauramento connessione UDP
$IPCHAINS -A input -i $INTERFACE -p udp -d $LOCALIP \
$NFS_PORT -j DENY -l
# TRACEROUTE UDP in ingresso
$IPCHAINS -A input -i $INTERFACE -p udp -s $ANYWHERE \
$TRACEROUTE_SRC_PORTS -d $LOCALIP $TRACEROUTE_DEST_PORTS -j DENY -l
#------------------------------ altri log
$IPCHAINS -A input -i $INTERFACE -p tcp -d $LOCALIP -j DENY -l
$IPCHAINS -A input -i $INTERFACE -p udp -d $LOCALIP $PRIVPORTS \
-j DENY -l
$IPCHAINS -A input -i $INTERFACE -p udp -d $LOCALIP $UNPRIVPORTS \
-j DENY -l
$IPCHAINS -A input -i $INTERFACE -p icmp -s $ANYWHERE 5 -d $LOCALIP \
-j DENY -l
$IPCHAINS -A input -i $INTERFACE -p icmp -s $ANYWHERE 13:255 -d $LOCALIP \
-j DENY -l
echo -e "\t\t\t\t[ ${GREEN}OK ${WHITE}]"
# ==========================================================================
# ======================= Mascheramento all' esterno =======================
# ==========================================================================
#------------------------------ verifica esistenza moduli mascheramento
if [ $MASQ = "ON" ]; then
echo -e "${YELLOW}Mascheramento : ${WHITE}"
echo -n "Controllo presenza moduli necessari : "
MASQ_PRESENT=""
for mod in ${IP_MASQ_MODULES}; do
if [ ! -e /lib/modules/$CURRENT_KERNEL/ipv4/ip_masq_${mod}.o ]; then
MASQ_PRESENT="err"
fi
done
#------------------------------ se esistono, attiva mascheramento
if [ -z ${MASQ_PRESENT} ]; then
echo -e "\t\t\t\t[ ${GREEN}OK ${WHITE}]"
echo -n "Installazione dei moduli necessari al Mascheramento : "
for mod in ${IP_MASQ_MODULES} ; do
/sbin/insmod "ip_masq_${mod}"
done
echo -e "\t\t[ ${GREEN}OK ${WHITE}]"
echo -n "Attivazione IP forwarding : "
echo 1 > /proc/sys/net/ipv4/ip_forward
echo -e "\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
echo -n "Impostazione della POLICY di inoltro a DENY : "
$IPCHAINS -P forward DENY
$IPCHAINS -A forward -p all -s $LOCALNET -d $ANYWHERE -j MASQ
echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]"
echo -n "Impostazione Timeout mascheramento connessioni TCP a 10 ore : "
$IPCHAINS -M -S 36000 0 0
echo -e "\t[ ${GREEN}OK ${WHITE}]"
echo -n "Blocco e log di tutto il resto : "
$IPCHAINS -A forward -j DENY -s $ANYWHERE -d $ANYWHERE -l
echo -e "\t\t\t\t[ ${GREEN}OK ${WHITE}]"
#------------------------------ se non esistono, avverti e continua senza
else
echo -e "\t\t\t\t[ ${RED}NO ${WHITE}]"
echo
echo -e "${RED}Errore!!! Moduli per il Mascheramento "
echo -e "non presenti nel sistema. Ricompilare il kernel col "
echo -e "supporto per firewall e masquerading.${WHITE}"
echo
fi
else
echo -en "${YELLOW}Mascheramento : ${WHITE}"
echo -e "\t\t\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
fi
;;
#------------------------------ opzione stop dello script
stop)
clear
echo "Disattivazione del Firewall in corso..."
$IPCHAINS -F
$IPCHAINS -P input ACCEPT
$IPCHAINS -P forward ACCEPT
MASQ_PRESENT=""
for mod in ${IP_MASQ_MODULES} ; do
if [ ! -e /lib/modules/$CURRENT_KERNEL/ipv4/ip_masq_${mod}.o ]; then
MASQ_PRESENT="err"
fi
done
if [ -z ${MASQ_PRESENT} ] ; then
echo -n "Rimozione dei moduli necessari al Mascheramento : "
for mod in ${IP_MASQ_MODULES} ; do
/sbin/rmmod "ip_masq_${mod}"
done
echo -e "\t\t[ ${GREEN}OK ${WHITE}]"
echo -n "Disattivazione IP forwarding : "
echo 0 > /proc/sys/net/ipv4/ip_forward
echo -e "\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
fi
echo -e "${YELLOW}ATTENZIONE: IL FIREWALL NON E' PIU' OPERATIVO${WHITE}"
;;
#------------------------------ opzione status dello script
status)
clear
echo "Impostazioni attuali del firewall : "
echo -e "Indirizzo IP locale sull'interfaccia ${YELLOW}$INTERFACE${WHITE} : \
${RED}$LOCALIP${WHITE}"
$IPCHAINS -L
;;
#------------------------------ nessuna o errata opzione fornita allo script
*)
clear
echo -e "${BLUE}############################################################${WHITE}"
echo -en "${BLUE}###${YELLOW} Script di impostazione "
echo -e "${MAGENTA}FIREWALL ${YELLOW}v7.0 ${BLUE}###${WHITE}"
echo -e "${BLUE}############################################################${WHITE}"
echo -e "${YELLOW}Utilizzo:${WHITE} firewall start|stop|status"
echo -e "\t${CYAN}start${WHITE} = attiva il firewall"
echo -e "\t${CYAN}stop${WHITE} = disattiva il firewall"
echo -e "\t${CYAN}status${WHITE} = impostazioni correnti del firewall"
echo
echo -e "${RED}ATTENZIONE: ${YELLOW}ricorda che l'interfaccia \
${RED}ppp0${YELLOW} e' attiva"
echo -e "solo DOPO aver effettuato la connessione a Internet."
echo -en "${WHITE}Interfacce attualmente attive nel PC: "
for irf in ${INTERFACES} ; do
echo -en "${RED}${irf}${WHITE} "
done
echo -e "\n\a"
;;
esac
exit 0
THIS IS THE END, MY ONLY FRIEND (by JIM).