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).