Newsgroup: it.comp.sicurezza.varie
Titolo: Firewall su Linux, un consiglio

Salve a tutti,
	ho fatto uno script per utilizzare il firewall su Linux, e
mi piacerebbe conoscere la vs. opnione !!!!! TIA.
	Considerate che si tratta di una macchina connessa in
dial-up a IOL e su cui girano postifx per la posta locale e per mandarla
(fetchmail per scaricarla), nonche' leafnode e apache per gli utenti
locali; questo implica che non conosco a priori il mio IP, ove possibile
ho sostituito con l'interfaccia, ma non "copre tutto".
	Ho avuto 2 problemi:
		- Esiste una maniera per indicare una specifica porta
		quando si trattano frammenti ?????? Ho dovuto aggiungere
		una rule del tipo
		/sbin/ipchains -f -p tcp -s 0/0 -j ACCEPT
		ma questo lascia entrare "cani e porci"...........
		- La parte relativa a FTP non funziona, ma prima dovrei
		ripassarmi le RFC, perche' mi sa' che ho preso un granchio,
		per adesso ignoratela.
	Ancora vi ringrazo e mi prosto. Saluti, Maurizio.
	Ecco lo script:
#!/bin/sh
#
# Firewall Rules....
#
echo "Set POLICY"
/sbin/ipchains -P input DENY
echo "Allow local network traffic"
/sbin/ipchains -A input -i lo -j ACCEPT
echo "Filtering spoofed address"
/sbin/ipchains -A input -i ! lo -s 127.0.0.1 -j DENY
echo "Allow DNS resolution - 194.20.24.1"
/sbin/ipchains -A input -p tcp -s 194.20.24.1 53 -j ACCEPT
/sbin/ipchains -A input -p udp -s 194.20.24.1 53 -j ACCEPT
/sbin/ipchains -f -A input -s 194.20.24.1 -j ACCEPT
echo "Allow DNS resolution - 194.20.24.2"
/sbin/ipchains -A input -p tcp -s 194.20.24.2 53 -j ACCEPT
/sbin/ipchains -A input -p udp -s 194.20.24.2 53 -j ACCEPT
/sbin/ipchains -f -A input -s 194.20.24.2 -j ACCEPT
echo "Protect local servers, if running"
/sbin/ipchains -A input -p tcp -s 0/0 80 -i ! lo -y -j DENY
/sbin/ipchains -A input -p tcp -s 0/0 21 -i ! lo -y -j DENY
/sbin/ipchains -A input -p tcp -s 0/0 25 -i ! lo -y -j DENY
/sbin/ipchains -A input -p tcp -s 0/0 110 -i ! lo -y -j DENY
/sbin/ipchains -A input -p tcp -s 0/0 119 -i ! lo -y -j DENY
echo "Allow HTTP"
/sbin/ipchains -A input -p tcp -s 0/0 80 -j ACCEPT
/sbin/ipchains -A input -f -p tcp -s 0/0 -j ACCEPT # This allows all TCP frag.
echo "Allow SMTP"
/sbin/ipchains -A input -p tcp -s 195.210.91.154 25 -j ACCEPT
echo "Allow POP3"
/sbin/ipchains -A input -p tcp -s 195.210.91.162 110 -j ACCEPT
echo "Allow NNTP"
/sbin/ipchains -A input -p tcp -s 195.210.91.217 119 -j ACCEPT
echo "Allow FTP"
/sbin/ipchains -A input -p tcp -s 0/0 20 -j ACCEPT
/sbin/ipchains -A input -p tcp -s 0/0 21 -j ACCEPT
echo "Allow remote auth request"
/sbin/ipchains -A input -p tcp -d 0/0 113 -j ACCEPT
echo "Allow some ICMP traffic"
/sbin/ipchains -A input -p icmp -s 0/0 0 -j ACCEPT
/sbin/ipchains -A input -p icmp -s 0/0 3 -j ACCEPT
/sbin/ipchains -A input -p icmp -s 0/0 11 -j ACCEPT
#echo "List Firewalling rule"
#/sbin/ipchains -L input

 /sbin/ipchains -A input -p tcp -s 0/0 21 -j ACCEPT
Ricordati di settare i TOS per ftp come dal mio esempio...
-- 
Pierluigi De Rosa (
tho...@durin.khazad-dum.net
).
<<      LINUX: the choice of a GNU generation     >>
<<   For my real address... ask the Balrog.       >>
* Sostenete la Lega per la Soppressione dei Troll *

 Ricordati di settare i TOS per ftp come dal mio esempio...
OK !!!!!!!!!!!!!!!!!!!!!!!!!
	Grazie ancora per l'aiuto. Saluti, Maurizio.

 OK !!!!!!!!!!!!!!!!!!!!!!!!!
Fammi sapere se funzia o no :-)


 Fammi sapere se funzia o no :-)
YEAH !!!!!!!!!
		Saluti, Maurizio.

 YEAH !!!!!!!!!
Bene, molto bene... buon divertimento allora col tuo nuovo FW !!!!! :-)


 Bene, molto bene... buon divertimento allora col tuo nuovo FW !!!!! :-)
GRAZIE PER L'AIUTO !!!!!!!

 Bene, molto bene... buon divertimento allora col tuo nuovo FW !!!!! :-)
Ciao Thorin,
	grazie ai tuoi consigli ho fatto qualche modifica allo scrpt.....
	Ci sono ancora alcune cosette da sistemare:
		- Da una macchina remota da cui accetto pacchetti sarebbe
			in teoria possibile bypassare il firewall,
			ad esempio, se io ho la rule:
			-A input -p tcp -s 0/0 80 -d $LOCALIP ! 80 -j ACCEPT
			una qualunque macchina remota potrebbe mandare
			pacchetti con source porte 80 e VERREBBERO
			ACCETTATI purche' non verso la 80 locale, modifichero'
			in
			-A input -p tcp -s 0/0 80 -d $LOCALIP >1024 -j ACCEPT
		- Da quanto sopra dovrei aggiungere una sezione 
			"costom port protection", ad es. se qualcuno
			avesse in esecuzione Postgres (porta 5000 e qualcosa)
			questo non verrebbe protetto :-(
		- Varie ed eventuali.....
Ad ogni modo ecco fin dove sono arrivato, lo script e' da' lanciare in
un' ppp0-local oppure a mano ( ./firewall up ppp0 ) dopo la connessione.
GRAZIE & SALUTI, Maurizio.
#/bin/sh
#
# Script per la configurazione del Firewall di 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 firewall e l' opzione "always defragment".
#
# Relase : 0.1.0
#
#
# Definizione delle variabili d'ambiente necessarie
#
IPCHAINS="/sbin/ipchains"
LOCALIP=`/sbin/ifconfig $2 | grep inet | cut -d : -f 2 | cut -d \  -f 1`
#
# Definizione dei servzi utilizzabili
#
DNS1="ON"
DNS2="ON"
HTTP="ON"
SMTP="ON"
FTP="OFF"
NNTP="ON"
POP3="ON"
ICMP="ON"
AUTH="ON"
#
# Definizione degli IP dei servizi del provaider
#
DNS1_IP="194.20.24.1"
DNS2_IP="194.20.24.2"
SMTP_IP="195.210.91.154"
NNTP_IP="195.210.91.217"
POP3_IP="195.210.91.162"
#
# Non toccare nulla da qui in poi........
# .....a meno che non ne capiate piu' del sottoscritto :-)))))))
#
#
# Operazioni sul Firewall:
#	- up = accensione del firewall
#	- down = ritorno alle imposizioni di default
#	- status = stampa a video la configurazione del firewall
#
#		NOTA: E' RICHIESTA L'INDICAZIONE DELL' INTERFACCIA
#		DI RETE, SE NESSNA E' ATTIVA INDICARE lo
#
case "$1" in
	up)
echo "Attivazione del Firewall in corso"
echo "IP locale: $LOCALIP"
echo "Flushing delle regole eventualmente presenti"
$IPCHAINS -F input
echo "Impostazione della POLICY a DENY"
$IPCHAINS -P input DENY
echo "Permesso al traffico locale"
$IPCHAINS -A input -i lo -j ACCEPT
echo -n "Attivazione del Source Addres 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 "Fatto !!!"
	else
	echo "SAV non disponibile, utilizzo di ipcahis."
	$IPCHAINS -A input -s 127.0.0.1 -i lo -j ACCEPT
fi
echo "Attivazione dei servizi richiesti"
echo -n "Risoluzione dei nomi di dominio - server primario - : "
if [ $DNS1 = "ON" ]
	then
	$IPCHAINS -A input -p tcp -s $DNS1_IP 53 -d $LOCALIP ! 53 -j ACCEPT
	$IPCHAINS -A input -p udp -s $DNS1_IP 53 -d $LOCALIP ! 53 -j ACCEPT
	echo "FATTO !!!"
	else
	echo "Servizio non richiesto."
fi
echo -n "Risoluzione dei nomi di dominio - server secondario -: "
if [ $DNS2 = "ON" ]
	then
	$IPCHAINS -A input -p tcp -s $DNS2_IP 53 -d $LOCALIP ! 53 -j ACCEPT
	$IPCHAINS -A input -p udp -s $DNS2_IP 53 -d $LOCALIP ! 53 -j ACCEPT
	echo "FATTO !!!"
	else
	echo "Servizio non richiesto."
fi
echo -n "Navigazione WEB : "
if [ $HTTP = "ON" ]
	then
	$IPCHAINS -A input -p tcp -s 0/0 80 -d $LOCALIP ! 80 -j ACCEPT
	echo "FATTO !!!"
	else
	echo "Servizio non richiesto."
fi
echo -n "Invio posta : "
if [ $SMTP = "ON" ]
	then
	$IPCHAINS -A input -p tcp -s $SMTP_IP 25 -d $LOCALIP ! 25 -j ACCEPT
	echo "Fatto !!!"
	else
	echo "Servizio non richiesto."
fi
echo -n "Ritiro posta : "
if [ $POP3 = "ON" ]
	then
	$IPCHAINS -A input -p tcp -s $POP3_IP 110 -d $LOCALIP ! 110 -j ACCEPT
	echo "Fatto !!!"
	else
	echo "Servizio non richiesto."
fi
echo -n "Usenet : "
if [ $NNTP = "ON" ]
	then
	$IPCHAINS -A input -p tcp -s $NNTP_IP 119 -d $LOCALIP ! 119 -j ACCEPT
	echo "Fatto !!!"
	else
	echo "Servizio non richiesto."
fi
echo -n "File Transfer Protocol : "
if [ $FTP = "ON" ]
	then
	echo "ATTENZIONE -- SERVIZIO NON OPERATIVO."
	else
	echo "Servizio non richiesto."
fi
echo -n "Traffico ICMP : "
if [ $ICMP = "ON" ]
	then
	$IPCHAINS -A input -p icmp -s 0/0 0 -d $LOCALIP -j ACCEPT
	$IPCHAINS -A input -p icmp -s 0/0 3 -d $LOCALIP -j ACCEPT
	$IPCHAINS -A input -p icmp -s 0/0 11 -d $LOCALIP -j ACCEPT
	echo "Fatto !!!"
	else
	echo "Servizio non richiesto."
fi
echo -n "Richieste di identificazione : "
if [ $AUTH = "ON" ]
	then
	$IPCHAINS -Ainput -p tcp -d $LOCALIP 113 -j ACCEPT
	echo "Fatto !!!"
	else
	echo "Servizio non richiesto."
fi
	;;
	down)
	echo "ATTENZIONE IL FIREWALL NON E' PIU' OPERATIVO"
$IPCHAINS -F input
$IPCHAINS -P input ACCEPT
	;;
	status)
	echo "Ecco le attuali impostazioni per il firewall"
$IPCHAINS -L input
	;;
	ip)
	echo "IP locale : $LOCALIP"
	;;
	*)
	echo "Utilizzo: firewall up|down|status interfaccia"
	echo "	up = attivazione del firewall"
	echo "	down = disabilitazione"
	echo "	status = stampa le impostazioni correnti del firewall"
	echo "	interfaccia = indicare l' interfaccia attiva, altrimenti lo"
	;;
esac

 			questo non verrebbe protetto :-(
Se lo usi e' consigliabile farlo...


 Se lo usi e' consigliabile farlo...
Non e' in uso, quello in RH6 e' bacato (si sono dimenticati i file di
template !!!!!!!) almeno nella versione che ho io (internet news di giugno);
tuttavia volevo una cosina fatta bene..............
	Ciao & Grazie, Maurizio.

 marcare l' "always defragment" e togliere le parti relative ai frammenti.
Ok...


tho...@durin.khazad-dum.net
 wrote:
[....]
Ciao Thorin,
	penso di essere arrivato ad una soluzione abbastanza decente:
ho aggiunto la parte di "Custom Port Protection" (fino a tre, indicate
sulla linea di comando, non mi soddisfa molto e sto' cercando di capire
un poco meglio la gestione degli array negli shell scripts...vedremo),
l' FTP adesso e' attivo e settando i TOS come indicavi qualche miglioramento
c'e' ma il problema rimane il vecchio 33,6 che mi porto appresso.......
Lo posto di seguito ed ancora ti ringrazio per l'aiuto.....
		Saluti, Maurizio.
#/bin/sh
#
# Script per la configurazione del Firewall di 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 firewall e l' opzione "always defragment".
#
# Relase : 0.4.1
#
#
# Definizione delle variabili d'ambiente necessarie
#
IPCHAINS="/sbin/ipchains"
LOCALIP=`/sbin/ifconfig $2 | grep inet | cut -d : -f 2 | cut -d \  -f 1`
#
# Definizione dei servzi utilizzabili
# ON=Servizio attivo     OFF=Servizio non richiesto
#
DNS1="ON"
DNS2="ON"
HTTP="ON"
SMTP="ON"
FTP="ON"





$IPCHAINS -F input

$IPCHAINS -P input DENY




echo -n "Attivazione della Custom Port Protection : "
if [ $# = 2 ]
	then
	echo "Servizio non richiesto."
	else
	if [ $# = 3 ]
		then
		$IPCHAINS -A input -p tcp -d $LOCALIP $3 -j DENY
		echo -n $3
		echo -n " "
	fi
	if [ $# = 4 ]
		then
		$IPCHAINS -A input -p tcp -d $LOCALIP $4 -j DENY
		echo -n $4
		echo -n " "
	fi
	if [ $# = 5 ]
		then
		$IPCHAINS -A input -p tcp -d $LOCALIP $5 -j DENY
		echo -n $5
		echo -n " "
	fi
	echo "Fatto !!!"
fi
echo -n "Risoluzione dei nomi di dominio - server primario - : "
if [ $DNS1 = "ON" ]
	then
	$IPCHAINS -A input -p tcp -s $DNS1_IP 53 -d $LOCALIP >1024 -j ACCEPT
	$IPCHAINS -A input -p udp -s $DNS1_IP 53 -d $LOCALIP >1024 -j ACCEPT
	echo "FATTO !!!"
	else
	echo "Servizio non richiesto."
fi
echo -n "Risoluzione dei nomi di dominio - server secondario -: "
if [ $DNS2 = "ON" ]
	then
	$IPCHAINS -A input -p tcp -s $DNS2_IP 53 -d $LOCALIP >1024 -j ACCEPT
	$IPCHAINS -A input -p udp -s $DNS2_IP 53 -d $LOCALIP >1024 -j ACCEPT
	echo "FATTO !!!"
	else
	echo "Servizio non richiesto."
fi
echo -n "Navigazione WEB : "
if [ $HTTP = "ON" ]
	then
	$IPCHAINS -A input -p tcp -s 0/0 80 -d $LOCALIP >1024 -j ACCEPT
	echo "FATTO !!!"
	else
	echo "Servizio non richiesto."
fi
echo -n "Invio posta : "
if [ $SMTP = "ON" ]
	then
	$IPCHAINS -A input -p tcp -s $SMTP_IP 25 -d $LOCALIP >1024 -j ACCEPT
	echo "Fatto !!!"
	else
	echo "Servizio non richiesto."
fi
echo -n "Ritiro posta : "
if [ $POP3 = "ON" ]
	then
	$IPCHAINS -A input -p tcp -s $POP3_IP 110 -d $LOCALIP >1024 -j ACCEPT
	echo "Fatto !!!"
	else
	echo "Servizio non richiesto."
fi
echo -n "Usenet : "
if [ $NNTP = "ON" ]
	then
	$IPCHAINS -A input -p tcp -s $NNTP_IP 119 -d $LOCALIP >1024 -j ACCEPT
	echo "Fatto !!!"
	else
	echo "Servizio non richiesto."
fi
echo -n "File Transfer Protocol : "
if [ $FTP = "ON" ]
	then
$IPCHAINS -A input -p tcp -s 0/0 21 -d $LOCALIP >1024 -j ACCEPT -t 0x01 0x10
$IPCHAINS -A input -p tcp -s 0/0 20 -d $LOCALIP >1024 -j ACCEPT -t 0x01 0x08
	echo "Fatto !!!"
	else
	echo "Servizio non richiesto."
fi
echo -n "Traffico ICMP : "
if [ $ICMP = "ON" ]
	then
	$IPCHAINS -A input -p icmp -s 0/0 0 -d $LOCALIP -j ACCEPT
	$IPCHAINS -A input -p icmp -s 0/0 3 -d $LOCALIP -j ACCEPT
	$IPCHAINS -A input -p icmp -s 0/0 11 -d $LOCALIP -j ACCEPT
	echo "Fatto !!!"
	else
	echo "Servizio non richiesto."
fi
echo -n "Richieste di identificazione : "
if [ $AUTH = "ON" ]
	then
	$IPCHAINS -A input -p tcp -d $LOCALIP 113 -j ACCEPT


 un poco meglio la gestione degli array negli shell scripts...vedremo),
Ok, gli do' uno sguardo... si mi sembra a posto... ma in quelle custom
port cosa tratti?


 port cosa tratti?
La possibilita' di inserire blocchi di determinate porte effimere
(in corrispondenza di servers che pescano alto), che altrimenti verrebbero
lasciate aperte in corrispondenza di source port quali 20,21,80 e 53,25,110,
119 spoofando il source address.........una sorta di paranoia intrinseca,
insomma  ]8-))))))))))))))))
		Ciao, Maurizio.

 insomma  ]8-))))))))))))))))
Ah interessante... non sapevo niente di questa roba... appena
finisco con Postfix penso che mi mettero' a dare un'occhiata alla
documentazione per saperne di piu' :-)


echo -n "Traffico ICMP : "
Cazzo cazzo cazzo! NON BISOGNA BLOCCARE ICMP! Perche` giocate con queste
cose se non avete idea di come funziona IP?
Ribadisco che la migliore protezione rimane:
echo 'ALL EXCEPT identd: ALL EXCEPT LOCALHOST' >> /etc/hosts.deny
-- 
ciao, | [Per rispondere togli "toglimi" dal mio indirizzo.]
Marco | * The Internet is full. Go away.  -- Joel Furr *

 echo 'ALL EXCEPT identd: ALL EXCEPT LOCALHOST' >> /etc/hosts.deny
Quella gia' era imposta, man non tutti i servizi vengono avviati da
inetd tramite wrapper, per quanto quasi tutti abbiano la possibilita'
di definire politiche di accesso basate sull' indirizzo di provenienza.
		Grazie mille, Maurizio.

inetd tramite wrapper, per quanto quasi tutti abbiano la possibilita'
"Non tutti" esclude solo l'MTA e il news server. Entrambi sono
facilmente proteggibili da attacchi esterni senza fare casini inutili
con ipchains.


 la policy a DENY.
Infatti credo che non abbia senso metterla all'inizio dello
script... devi prima mettere le regole generali e poi quelle piu'
restrittive.


/sbin/ipchains -f -A input -s 194.20.24.2 -j ACCEPT
Le query al DNS sono originate dal client verso la porta 53 TCP del
server; non so di preciso come funziona ipchains, ma ogni FW che si
rispetti - a meno di configurazioni diverse - dovrebbe lasciare uscire
cio' che origina dall'interno. La risposta alla query invece e' un
pacchetto UDP (ovvero connectionless, ovvero non gestibile come
connessione established) che origina dalla porta 53 del server, ma non
sai dove sia destinata; quindi per far funzionare il DNS devi aprire
tutto cio' che PROVIENE dalla porta 53 UDP del DNS ed e' destinata a
qualunque porta del client.
Ciao
Luca
P.S. relativamente alla questione DNS: non conosco la sintassi di
ipchains, quindi non riesco a interpretare con precisione le righe di
configurazione: puo' essere che siano gia' corrette.

>/sbin/ipchains -f -A input -s 194.20.24.2 -j ACCEPT
Qui accetto eventuali frammenti originanti da quel server, poi ho
deciso di compilare il kernel con l'ipzione "always defragment"
ed ho eliminato questa parte.
		Ti ringrazio moltissimo per l'interessamento.
		Saluti, Maurizio.