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
Nota: Questi due tipi di servizi sono trattati nelle sezioni DNS e WWWOFFLE del Quick&Easy Configuration 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 dell'ultima versione 2.4.x usano 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:
Network firewalls
IP: firewalling
IP: always defragment
IP: transparent proxy support
IP: masquerading
IP: ICMP masquerading
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. Nel Quick&Easy Configuration HOWTO prendereno in considerazione solo le cose essenziali e solo quelle trattate nello script seguente, per il resto si rimanda al Firewall-Howto e all' Ipchains-Howto, oltre all'ottima sezione degli Appunti di Informatica Libera. L'impostazione tipica di una regola è la seguente:
ipchains <opzione-di-comando> <filtro> [<regola>] [<obiettivo>] |
Le opzioni di comando sono:
-F o --flush : elimina tutte le regole del filtro specificato
-D o --delete : elimina una o più regole dal filtro specificato
-A o --append : aggiunge una regola in coda a quelle del filtro selezionato
-I o --insert : inserisce una regola in una posizione stabilita del filtro selezionato
-R o --replace : sostituisce una regola del filtro selezionato
-L o --list : elenca le regole di un uno o di tutti i filtri
-P o --policy : cambia la politica predefinita per il filtro specificato
I filtri sono (rispettivamente per pacchetti in entrata, uscita e in transito): input, output, forward
Gli obiettivi sono:
ACCEPT : consente il transito del pacchetto
DENY : impedisce il transito del pacchetto, limitandosi a ignorarlo
REJECT : impedisce il transito del pacchetto notificando all'origine il rifiuto (viene inviato un messaggio ICMP specificante che il pacchetto è stato rifiutato)
Le regole invece usano le seguenti opzioni (le parentesi [] indicano qualcosa di opzionale, mentre il ! indica una negazione):
-p [!] {tcp|udp|icmp|all} : stabilisce il protocollo cui si applica la regola (default: all)
-i [!] interfaccia : stabilisce a quale interfaccia si applica la regola
-j obiettivo : stabilisce cosa fare in caso di corrispondenza della regola
-s [!] indirizzo[/maschera] : l'indirizzo sorgente da cui arriva il pacchetto (default : 0.0.0.0/0, cioè ogni indirizzo)
-d [!] indirizzo[/maschera] : l'indirizzo cui è diretto il pacchetto (default : 0.0.0.0/0, cioè ogni indirizzo)
-l : effettua il log di quanto passa attraverso la regola
-n : non risolve i nomi di domini (lascia l'ip numerico)
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. È configurato per l'accesso dialup via ppp (usa l'interfaccia ppp0). Leggete i commenti nel file, modificate dove indicato e andate in pace. Dalla revisione 10 dello script, la configurazione (cioè le parti dello script che NECESSARIAMENTE vanno adeguate al proprio sistema) è stata estrapolata dallo script principale, e posta il un file a parte, che se non modificate lo script sarà /etc/firewall.conf. Per sapere come abilitare il supporto per firewall e masquerading, guardate nella pagina relativa al kernel. Lo script dovrebbe fare la maggior parte dei controlli su esistenza di file, connessione, parametri, e segnalarvi se qualcosa non va. Date i seguenti comandi per settare i giusti proprietari e permessi:
cp firewall /usr/sbin chown root.root /usr/sbin/firewall chmod 744 /usr/sbin/firewall cp firewall.conf /etc chown root.root /etc/firewall.conf chmod 644 /etc/firewall.conf |
Una volta modificato il file di configurazione, potete avviare il firewall DOPO aver stabilito la connessione (prima non esiste l'interfaccia di rete ppp0!) col comando firewall start, e arrestarlo col comando firewall stop. Altri comandi sono: firewall restart, per riavviarlo dopo aver modificato il file di configurazione a connessione attivata, e firewall status, per avere un resoconto delle regole attualmente attive nel sistema. Consiglio di automatizzare questa procedura, inserendo i comandi di avvio e arresto rispettivamente in /etc/ppp/ip-up e /etc/ppp/ip-down. Se usate REDHAT e simili, questi ultimi sono dei file, quindi basta inserire i comandi al loro interno. Se invece usate DEBIAN, questi sono delle directory, e contengono degli script. Per il resto il funzionamento è analogo: i file o gli script nelle dir vengono avviati rispettivamente subito dopo aver stabilito la connessione e subito prima di arrestarla. Esempi di script per Debian sono i seguenti:
#!/bin/bash # script /etc/ppp/ip-up/firewallstart /usr/sbin/firewall start |
e:
#!/bin/bash # script /etc/ppp/ip-up/firewallstop /usr/sbin/firewall stop |
Nota: Per il mascheramento di ICQ, dovete scaricare, compilare e installare il modulo 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".
# In questa versione si usa IPCHAINS, NON IPFWADM o IPTABLES!
# Viene filtrato cio' che entra e permesso alla rete di uscire
#
# $Revisione: 11.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|restart
# start = attiva il firewall
# stop = disattiva il firewall
# status = impostazioni correnti del firewall
# restart = rilegge il file di configurazione
#
# by Antonio Fragola, aka MrShark - The Informaniac
#
# Da questa revisione, le parti variabili sono state spostate in un
# file esterno di configurazione, quindi NON c'e' piu' bisogno di
# intervenire all'interno di questo file, a meno di non volerlo
# personalizzare aggiungendo nuovi servizi eventualmente assenti.
# Segue una serie di funzioni, lo script principale e' alla fine
# ==========================================================================
fw_root () {
#--------------- 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
} # fw_root
# ==========================================================================
fw_cfg () {
#--------------- verifica presenza file di configurazione
CFG="/etc/firewall.conf"
if [ -f $CFG ]; then
# source del file di configurazione
. $CFG
else
clear
echo -e "\aATTENZIONE: il file $CFG non e' presente!"
echo "Da questa revisione, le parti variabili sono state spostate in un"
echo "file esterno di configurazione, quindi NON c'e' piu' bisogno di"
echo "intervenire all'interno di questo file, a meno di non volerlo"
echo "personalizzare aggiungendo nuovi servizi eventualmente assenti."
exit 1
fi
} # fw_cfg
# ==========================================================================
fw_const () {
#--------------- costanti utili
#--------------- le parti variabili sono nel file di configurazione
INTERFACES=`/sbin/ifconfig | grep Link | cut -d \ -f 1`
CURRENT_KERNEL=`uname -r`
INTERFACEMASK="255.255.255.255"
INTERFACEIP=`/sbin/ifconfig $INTERFACE | grep inet | \
cut -d : -f 2 | cut -d \ -f 1`
LOCALIP="$INTERFACEIP/$INTERFACEMASK"
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"
# i client SSH incominciano dalla porta 1023 e vanno a scalare fino alla 513
# per ogni nuova connessione simultanea generata da una porta privilegiata.
# I client possono essere impostati per usare solo porte non privilegiate.
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"
} # fw_const
# ==========================================================================
fw_nointerface () {
#--------------- comunica che non esiste l'interfaccia di rete
clear
echo -e "${RED}ATTENZIONE: ${YELLOW}l'interfaccia "
echo -e "${RED}ppp0${YELLOW} NON e' attiva nel sistema."
echo -e "Firewall NON attivato. Controllare 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
} # fw_nointerface
# ==========================================================================
fw_go () {
#--------------- inizio attivazione e flushing
echo
echo "Attivazione del Firewall in corso..."
echo -e "Indirizzo IP locale sull'interfaccia ${YELLOW}"
echo -e "$INTERFACE${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}]"
} # fw_go
# ==========================================================================
fw_protezioni () {
#--------------- attivazione protezioni varie
echo -n "Permesso traffico locale sull'interfaccia di loopback : "
$IPCHAINS -A input -s $ANYWHERE -i lo -j ACCEPT
echo -e "\t[ ${GREEN}OK ${WHITE}]"
echo -n "Permesso traffico locale sull'interfaccia di rete della LAN : "
$IPCHAINS -A input -i $LOCAL_INTERFACE -s $LOCALNET -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
#--------------- syn cookie
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
#--------------- always defrag
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
#--------------- broadcast echo
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
#--------------- bad error
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
#--------------- icmp redirect
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
for f in /proc/sys/net/ipv4/conf/*/send_redirects; do
echo 0 > $f
done
echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t[ ${RED}NO ${WHITE}]"
fi
#--------------- source route
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
#--------------- i marziani!
echo -n "Log pacchetti spoofed, source routed, redirected : "
if [ -e /proc/sys/net/ipv4/conf/all/log_martians ]; then
for f in /proc/sys/net/ipv4/conf/*/log_martians; do
echo 1 > $f
done
echo -e "\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t[ ${RED}NO ${WHITE}]"
fi
#--------------- impostazione policy
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}]"
} # fw_protezioni
# ==========================================================================
fw_dns () {
#--------------- DNS (53)
echo -n "Server DNS : "
if [ $DNS = "ON" ]; then
for dns in $DNS_IP ; do
$IPCHAINS -A input -i $INTERFACE -p tcp ! -y -s $dns 53 \
-d $LOCALIP $UNPRIVPORTS -j ACCEPT
$IPCHAINS -A input -i $INTERFACE -p udp -s $dns 53 \
-d $LOCALIP $UNPRIVPORTS -j ACCEPT
done
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
} # fw_dns
# ==========================================================================
fw_http () {
#--------------- HTTP (80) e HTTPS (443)
echo -n "Navigazione WEB : "
if [ $HTTP = "ON" ]; then
$IPCHAINS -A input -i $INTERFACE -p tcp ! -y -s 0/0 80 \
-d $LOCALIP $UNPRIVPORTS -j ACCEPT
$IPCHAINS -A input -i $INTERFACE -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
} # fw_http
# ==========================================================================
fw_smtp () {
#--------------- SMTP (25)
echo -n "Invio posta : "
if [ $SMTP = "ON" ]; then
for smtp in $SMTP_IP ; do
$IPCHAINS -A input -i $INTERFACE -p tcp -s $smtp 25 \
-d $LOCALIP $UNPRIVPORTS -j ACCEPT
# $IPCHAINS -A input -i $INTERFACE -p tcp -s $ANYWHERE 25 \
# -d $LOCALIP $UNPRIVPORTS -j ACCEPT
done
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
} # fw_smtp
# ==========================================================================
fw_imap () {
#--------------- IMAP (143)
echo -n "Posta IMAP : "
if [ $IMAP = "ON" ]; then
for imap in $IMAP_IP ; do
$IPCHAINS -A input -i $INTERFACE -p tcp -s $imap 143 \
-d $LOCALIP $UNPRIVPORTS -j ACCEPT
done
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
} # fw_imap
# ==========================================================================
fw_pop3 () {
#--------------- POP3 (110)
echo -n "Prelievo posta : "
if [ $POP3 = "ON" ]; then
for pop3 in $POP3_IP ; do
$IPCHAINS -A input -i $INTERFACE -p tcp -s $pop3 110 \
-d $LOCALIP $UNPRIVPORTS -j ACCEPT
done
echo -e "\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
} # fw_pop3
# ==========================================================================
fw_nntp () {
#--------------- NNTP (119)
echo -n "Newsgroup Usenet : "
if [ $NNTP = "ON" ]; then
for news in $NNTP_IP ; do
$IPCHAINS -A input -i $INTERFACE -p tcp ! -y -s $news 119 \
-d $LOCALIP $UNPRIVPORTS -j ACCEPT
done
echo -e "\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
} # fw_nntp
# ==========================================================================
fw_ftp () {
#--------------- FTP (20/21)
echo -n "File Transfer Protocol : "
if [ $FTP = "ON" ]; then
$IPCHAINS -A input -i $INTERFACE -p tcp ! -y --source-port 21 \
-d $LOCALIP $UNPRIVPORTS -j ACCEPT
# FTP Port Mode (normale)
$IPCHAINS -A input -i $INTERFACE -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 -i $INTERFACE ! -y --source-port $UNPRIVPORTS \
-d $LOCALIP $UNPRIVPORTS -p tcp -j ACCEPT
echo -e "\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
} # fw_ftp
# ==========================================================================
fw_ssh () {
#--------------- SSH (22)
echo -n "Secure Shell : "
if [ $SSH = "ON" ]; then
$IPCHAINS -A input -i $INTERFACE -p tcp ! -y -s $ANYWHERE 22 \
-d $LOCALIP $UNPRIVPORTS -j ACCEPT
$IPCHAINS -A input -i $INTERFACE -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
} # fw_ssh
# ==========================================================================
fw_icmp () {
#--------------- 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
} # fw_icmp
# ==========================================================================
fw_auth () {
#--------------- AUTH (113)
echo -n "Richieste di identificazione : "
if [ $AUTH = "ON" ]; then
$IPCHAINS -A input -i $INTERFACE -p tcp -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
} # fw_auth
# ==========================================================================
fw_irc () {
#--------------- IRC (6667)
echo -n "Internet Relay Chat : "
if [ $IRC = "ON" ]; then
$IPCHAINS -A input -i $INTERFACE -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
} # fw_irc
# ==========================================================================
fw_icq () {
#--------------- ICQ (2000:4000)
echo -n "ICQ : "
if [ $ICQ = "ON" ]; then
$IPCHAINS -A input -i $INTERFACE -p tcp -d $LOCALIP 2000:4000 -j ACCEPT
$IPCHAINS -A input -i $INTERFACE -p udp -d $LOCALIP 4000 -j ACCEPT
$IPCHAINS -A input -i $INTERFACE -p tcp --source-port 2000:4000 \
-d $LOCALIP $UNPRIVPORTS -j ACCEPT
# con il "! -y" non funge il dcc in uscita! si deve impostare
# anche il client ad usare questo range di porte
# $IPCHAINS -A input -i $INTERFACE -p tcp ! -y --source-port 2000:4000 \
# -d $LOCALIP $UNPRIVPORTS -j ACCEPT
$IPCHAINS -A input -i $INTERFACE -p udp --source-port 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
} # fw_icq
# ==========================================================================
fw_napster () {
#--------------- NAPSTER (6699)
echo -n "NAPSTER : "
if [ $NAP = "ON" ]; then
$IPCHAINS -A input -i $INTERFACE -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
} # fw_napster
# ==========================================================================
fw_realaudio () {
#--------------- REALAUDIO (6970:6999)
echo -n "REALAUDIO : "
if [ $RAUD = "ON" ]; then
$IPCHAINS -A input -i $INTERFACE -p udp --source-port $UNPRIVPORTS \
-d $LOCALIP 6970:6999 -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
} # fw_realaudio
# ==========================================================================
fw_whois () {
#--------------- WHOIS (43)
echo -n "WHOIS : "
if [ $WHS = "ON" ]; then
$IPCHAINS -A input -i $INTERFACE -p tcp ! -y --source-port 43 \
-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
} # fw_whois
# ==========================================================================
fw_trojan () {
#--------------- log bo e netbus
# Ogni tanto mi prude e mi va di divertirmi con fakebo! ;-)
# Cosa c'e` dietro queste mie porte? Venite a trovarmi quando
# sono online per saperlo, a vostro rischio e pericolo!!! ;-)
echo -n "Log Bo e Netbus : "
if [ $FAKE = "ON" ]; then
$IPCHAINS -A input -i $INTERFACE -p tcp \
--destination-port 12345:12346 -l -j ACCEPT
$IPCHAINS -A input -i $INTERFACE -p tcp \
--destination-port 31337 -l -j ACCEPT
$IPCHAINS -A input -i $INTERFACE -p udp \
--destination-port 31337 -l -j ACCEPT
#socks per fake proxy
$IPCHAINS -A input -i $INTERFACE -p tcp \
--destination-port 1080 -l -j ACCEPT
#fake telnet
$IPCHAINS -A input -i $INTERFACE -p tcp \
--destination-port 23 -l -j ACCEPT
#fake finger
$IPCHAINS -A input -i $INTERFACE -p tcp \
--destination-port 79 -l -j ACCEPT
#fake http
$IPCHAINS -A input -i $INTERFACE -p tcp \
--destination-port 80 -l -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
} # fw_trojan
# ==========================================================================
fw_jerks () {
#--------------- ip personalizzati da filtrare
echo -n "Internet Jerks : "
if [ $JERK = "ON" ]; then
for jerk in $JERK_IP ; do
$IPCHAINS -A input -i $INTERFACE -s $jerk -j DENY
done
echo -e "\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
else
echo -e "\t\t\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
} # fw_jerks
# ==========================================================================
fw_nolog () {
#--------------- blocco senza log
echo -n "Blocco IGMP e PIM : "
# Rifiuta senza loggarli i pacchetti dei protocolli IGMP (2) e PIM (103)
# Libero ha il vizio di mandare 'sti pacchetti che ingolfano i log! ;-)
$IPCHAINS -A input -i $INTERFACE -p 2 -s $ANYWHERE \
-d $CLASS_D_MULTICAST -j DENY
$IPCHAINS -A input -i $INTERFACE -p 103 -s $ANYWHERE \
-d $CLASS_D_MULTICAST -j DENY
echo -e "\t\t\t\t\t\t[ ${GREEN}OK ${WHITE}]"
} # fw_nolog
# ==========================================================================
fw_blocklog () {
#--------------- 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 -l
$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
# 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.
# Nota: questi indirizzi vengono allocati periodicamente e possono
# quindi variare. Controllare possibilmente ogni mese la nuova lista
# http://www.isi.edu/in-notes/iana/assignments/ipv4-address-space
# Per sicurezza, sono attivi solo le seguenti classi di ip:
#
# 0.*.*.* - Non possono essere bloccati per il DHCP
# 127.*.*.* - LoopBack
# 169.254.*.* - Link Local Networks
# 192.0.2.* - TEST-NET
# 224-255.*.*.*
#
# Gli altri variano troppo spesso ultimamente...
$IPCHAINS -A input -i $INTERFACE -s 127.0.0.0/8 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 169.254.0.0/16 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 192.0.2.0/24 -j DENY -l
$IPCHAINS -A input -i $INTERFACE -s 224.0.0.0/3 -j DENY -l
# $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 36.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 67.0.0.0/8 -j DENY -l
# $IPCHAINS -A input -i $INTERFACE -s 68.0.0.0/6 -j DENY -l
# $IPCHAINS -A input -i $INTERFACE -s 72.0.0.0/5 -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/3 -j DENY -l
# $IPCHAINS -A input -i $INTERFACE -s 197.0.0.0/8 -j DENY -l
# $IPCHAINS -A input -i $INTERFACE -s 218.0.0.0/7 -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
$IPCHAINS -A input -i $INTERFACE -d $ANYWHERE -j DENY -l
echo -e "\t\t\t\t[ ${GREEN}OK ${WHITE}]"
} # fw_blocklog
# ==========================================================================
fw_ver_masqmod () {
#--------------- controllo presenza moduli masquerading
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
} # fw_ver_masqmod
# ==========================================================================
fw_yesmasqmod () {
#--------------- moduli masquerading presenti e si continua
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}" > /dev/null
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 -i $INTERFACE -s $LOCALNET -j MASQ
echo -e "\t\t\t[ ${GREEN}OK ${WHITE}]"
echo -n "Impostazione Timeout mascher. 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}]"
} # fw_yesmasqmod
# ==========================================================================
fw_nomasqmod () {
#--------------- moduli masquerading assenti, informa e continua senza
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
} # fw_nomasqmod
# ==========================================================================
fw_masq () {
#--------------- mascheramento rete locale all' esterno
#--------------- verifica esistenza moduli mascheramento
if [ $MASQ = "ON" ]; then
fw_ver_masqmod
#--------------- se esistono, attiva mascheramento
if [ -z ${MASQ_PRESENT} ]; then
fw_yesmasqmod
#--------------- se non esistono, avverti e continua senza
else
fw_nomasqmod
fi
else
echo -en "${YELLOW}Mascheramento : ${WHITE}"
echo -e "\t\t\t\t\t\t[ ${RED}NO ${WHITE}]"
fi
} # fw_masq
# ==========================================================================
fw_start () {
#--------------- parte start dello script
clear
#--------------- verifica esistenza interfaccia esterna
if [ -z $INTERFACEIP ]; then
#--------------- se non esiste, avverti ed esci con errore 1
fw_nointerface
#--------------- se l'interfaccia esiste, si procede
else
fw_go
fw_protezioni
fw_dns
fw_http
fw_smtp
fw_imap
fw_pop3
fw_nntp
fw_ftp
fw_ssh
fw_icmp
fw_auth
fw_irc
fw_icq
fw_napster
fw_realaudio
fw_whois
fw_trojan
fw_jerks
fw_nolog
fw_blocklog
fw_masq
fi
} # fw_start
# ==========================================================================
fw_stop () {
#--------------- parte stop dello script
clear
echo "Disattivazione del Firewall in corso..."
$IPCHAINS -F
$IPCHAINS -P input ACCEPT
$IPCHAINS -P forward ACCEPT
if [ $MASQ = "ON" ]; then
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}" > /dev/null
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
fi
echo -e "${YELLOW}ATTENZIONE: IL FIREWALL NON E' PIU' OPERATIVO${WHITE}"
} # fw_stop
# ==========================================================================
fw_status () {
#--------------- parte stats dello script
clear
echo "Impostazioni attuali del firewall : "
echo -e "Indirizzo IP locale sull'interfaccia \
${YELLOW}$INTERFACE${WHITE} : ${RED}$LOCALIP${WHITE}"
$IPCHAINS -L -n
} # fw_status
# ==========================================================================
fw_altro () {
#--------------- nessuna o errata opzione fornita allo script
clear
echo -en "${BLUE}#############################"
echo -e "###############################${WHITE}"
echo -en "${BLUE}###${YELLOW} Script di impostazione "
echo -e "${MAGENTA}FIREWALL ${YELLOW}v11.0 ${BLUE}###${WHITE}"
echo -en "${BLUE}#############################"
echo -e "###############################${WHITE}"
echo -e "${YELLOW}Utilizzo:${WHITE} firewall start|stop|status|restart"
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 -e "\t${CYAN}restart${WHITE} = rilegge il file di configurazione"
echo
echo -en "${RED}ATTENZIONE: ${YELLOW}ricorda che l'interfaccia "
echo -e "${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"
} # fw_altro
# ==========================================================================
# script principale
fw_root #--------------- verifica che lo script sia avviato da root
fw_cfg #--------------- verifica presenza file di configurazione
fw_const #--------------- costanti utili
#--------------- le parti variabili sono nel file di configurazione
case "$1" in
start)
fw_start
;;
stop)
fw_stop
;;
restart)
fw_stop
fw_start
;;
status)
fw_status
;;
*)
fw_altro
exit 1
esac
exit 0
|
Segue il file di configurazione:
# ==========================================================================
# ========= Script per la configurazione di un Firewall per Linux ==========
# ==========================================================================
#
# Questo e' il file di configurazione usato dallo script generale di
# firewall/masquerading. Modificate tutto quello che serve per adattarlo
# al vostro sistema. NON dovrebbe essere necessario modificare lo script
# in se', in quanto tutte le cose da modificare sono state spostate qui'
#
# by Antonio Fragola, aka MrShark - The Informaniac
#
# NON rimuovete nulla, cambiate solo le cose indicate.
# Impostate a ON o OFF i servizi che vi servono o meno
# posizione dell'eseguibile "ipchains" - eseguite "which ipchains" da root
IPCHAINS="/sbin/ipchains"
# interfaccia di rete che vi connette a Internet - di solito ppp0
INTERFACE="ppp0"
# masquerading: ON solo se si ha una rete locale che deve accedere a internet.
# Indicate anche l'interfaccia che vi collega alla rete locale per la quale
# volete fare il masquerading, e la classe della vostra rete locale. Inoltre
# indicate quali moduli volete mascherare (per icq serve un modulo NON fornito
# col kernel, leggere nel Quick&Easy Configuration Howto per reperirlo).
MASQ="ON"
LOCAL_INTERFACE="eth0"
LOCALNET="192.168.0.0/16"
IP_MASQ_MODULES="ftp irc" # altri sono: "cuseeme quake vdolive raudio"
# navigazione web
HTTP="ON"
# trasferimento file
FTP="ON"
# risoluzione nomi dominio - indicare gli IP dei server del vostro ISP
DNS="ON"
DNS_IP="193.70.152.25 193.70.192.25 195.130.224.18 195.130.225.129"
# invio email - indicare l'IP del server del vostro ISP
SMTP="ON"
SMTP_IP="193.70.192.50 195.130.225.171"
# ricezione email pop3 - inserite gli IP dei server imap che usate
# (TUTTI quelli da cui volete ricevere email pop3, non solo quelli
# del provider che usate correntemente), nel campo POP3_IP, usando
# uno spazio come separatore tra l'uno e l'altro. Se volete andare
# a capo, usate a fine riga il carattere "\", SENZA lasciare spazi
# dopo di esso!!! Tenete presente che molti provider (come tiscali
# e tin) usano IP multipli per i server, quindi dovrete elencarli
# tutti (cercateli con nslookup)
POP3="ON"
POP3_IP="195.130.225.147 195.130.225.148 195.130.225.149 \
195.130.225.150 195.130.225.151 195.130.225.152 \
195.130.225.153 195.130.225.154 193.70.192.80 \
195.130.225.172 193.70.192.70 62.149.128.10"
# ricezione email imap - inserite gli IP dei server imap che usate
# (TUTTI quelli da cui volete ricevere email imap, non solo quelli
# del provider che usate correntemente), nel campo IMAP_IP, usando
# uno spazio come separatore tra l'uno e l'altro. Se volete andare
# a capo, usate a fine riga il carattere "\", SENZA lasciare spazi
# dopo di esso!!! Tenete presente che molti provider (come tiscali
# e tin) usano IP multipli per i server, quindi dovrete elencarli
# tutti (cercateli con nslookup)
IMAP="OFF"
IMAP_IP="1.2.3.4 2.3.4.5 3.4.5.6"
# news usenet - indicare l'IP del server del vostro ISP
NNTP="ON"
# news.libero.it, shy.datawell.it, news.caspur.it, news.unina.it, news.ecs.net news.cu.mi.it
# NNTP_IP="192.106.1.6 213.26.160.219 193.204.5.75 192.132.34.81 194.21.74.41 193.43.96.1"
NNTP_IP="192.106.1.6 213.26.160.219 192.132.34.81 193.43.96.1"
# controlli vari di connessione - NON DISATTIVARE!
ICMP="ON"
# server identd - SERVE PER ALCUNE CONNESSIONI IRC
AUTH="ON"
# chat irc
IRC="ON"
# chat icq
ICQ="ON"
# connessione a server ssh
SSH="ON"
# napster
NAP="ON"
# realaudio
RAUD="OFF"
# client whois
WHS="ON"
# fakebo - OGNI TANTO MI PRUDE! ;-)
FAKE="ON"
# altri ip personalizzati da aggiungere al firewall - inserite gli
# IP nel campo JERK_IP, usando uno spazio come separatore tra l'uno
# e l'altro. Se volete andare a capo, usate a fine riga il carattere
# "\", SENZA lasciare spazi dopo di esso!!!
JERK="OFF"
JERK_IP="1.1.1.1 2.2.2.2 3.3.3.3"
|
THIS IS THE END, MY ONLY FRIEND (by JIM).