OpenBSD Transparent Firewall howto

openbsd

OpenBSD Transparent Firewall Howto

Nota: Questo howto necessita come requisito minimo una preparazione di base, su sistemi UNIX/BSD/linux like.

Premessa

Nella configurazione tradizionale un firewall hardware possiede normalmente 2 o più schede di rete (NIC). Ad ogni scheda di rete è necessario assegnare un IP. Normalmente si assegna sul lato WAN l'indirizzo IP pubblico, sul lato LAN quello della rete privata da proteggere e all'eventuale terza scheda di rete che si utilizza solitamenter per la DMZ un terzo IP diverso dagli atri due.

Con OpenBSD è possibile configurare un firewall completamente trasparente, ossia un dispositivo con n+2 schede di rete senza alcun IP assegnato.

Questa configurazione è molto valida sotto alcuni punti di vista. Intanto non vengono utilizzati preziosi indirizzi IP. In secondo luogo il firewall non è raggiungibile in alcun modo dall'esterno (ne da WAN ne da LAN), ma solo da console poichè è trasparente.

I requisiti minimi per la macchina OpenBSD sono molto esigui:

  • CPU x86 compatibile 133MHz or superiore
  • 64 MB di RAM
  • 1 GB hard disk
  • 2 NICs
  • OpenBSD 3.0 o superiore

Dopo avere installato OpenBSD (bastano 15 minuti), sarà sufficiente effettuare le seguenti configurazioni.

Disattivare tutti i servizi inutili: Nel file /etc/rc.conf effettuare le seguenti variazioni check_quotas=NO ntpd=NO sendmail_flags=NO sshd_flags=NO inetd=NO

Settare le schede in bridge mode:

Supponendo che le schede di rete della macchina si chiamino rl0 e rl1 (il nome potrebbe essere diverso a seconda del tipo di scheda di rete), effettuare le seguenti operazioni:ifconfig rl0 delete echo 'up' > /etc/hostname.rl0 ifconfig rl1 delete echo 'up' > /etc/hostname.rl1 echo 'add rl0 add rl1 up' > /etc/bridgename.bridge0 Riavviando la macchina, con il comando ifconfig -a trovere una voce simile a questa: bridge0: flags=41 <UP,RUNNING> mtu 1500. Ciò significa che la modalità bridge è operativa. Ora occorre abilitare il packet filtering, modificando nel file /etc/rc.conf la rigaPF=NO con PF=YESbisogna anche abilitare il packet forwarding decommentando nel file /etc/sysctl.conf la riga


net.inet.ip.forwarding=1

Adesso bisogna definire le regole di filter. Visto che siamo in modalità bridge sarà sufficiente applicare le regole ad una sola interfaccia di rete.

Il file da modificare è /etc/pf.conf secondo l'esempio sotto indicato:
# Esempio minimo di filtro.# Tutto blindato dalla WAN verso la LAN. Tutto libero dalla LAN verso la WAN # # #definizione delle schede di rete int_if = "rl0" ext_if = "rl1" # Tutto libero per $int pass in quick on $int_if all pass out quick on $int_if all # Tutto bloccato per $ext in entrata con log block in log on $ext_if all # Tutto libero per $ext in uscita pass out on $ext_if proto udp all keep state pass out on $ext_if proto tcp all modulate state pass out on $ext_if proto icmp all keep state Volendo rispondere al ping dall'esterno togliere il commento alla riga seguente # pass in on $ext_if proto icmp all keep state

Testare il funzionamento

Non ci resta che provare tutto, con il comando pfctl -f /etc/pf.conf Per vedere i pacchetti filtrati dalla macchina usare il comando: tcpdump -i pflog0
Per vedere quali sono le regole caricate in memoria: pfctl -s rules Buon lavoro a tutti e buone sperimentazioni OpenBSD

Fast Q&A (Questions and Answers)


Q. Come pulire lo schermo al logout dell'utente?
A. Cambiare nel file /etc/gettytab la sezione P|Pc|Pc console:\
:np:sp#9600:
aggiungendo la linea ":cl=\E[H\E[2J:" alla fine in modo che diventi: P|Pc|Pc console:\ :np:sp#9600:\ :cl=\E[H\E[2J: Q. (ri)creare il database di locate:
A.
# /usr/libexec/locate.updatedb oppure # sh /etc/weekly Q. settare il proxy:
A. # export ftp_proxy="http://proxy.provider.dd:port/"
# export http_proxy="http://proxy.provider.dd:port/"
# per salvare i dati aggiungere le righe sopra al file .profile
Q. cambiare la shell di default:
A. # pkg_add bash_xx.x.tgz # echo "/usr/bin/local/bash" >> /etc/shells # chsh -s bash - per caricare la tastiera italiana:
# kbd it Q. montare il cdrom
A. # mkdir /mnt/cdrom (se non esiste giÓ)
# mount -v -t cd9660 /dev/cd0a /mnt/cdrom
Q. montare un floppy tipo BSD
A. # mkdir /mnt/floppy (se non esiste giÓ)
# mount /dev/fd0a /mnt/floppy

Q. m ontare un floppy tipo DOS
A.
# mkdir /mnt/floppy (se non esiste giÓ)
# mount -v -t msdos /dev/fd0a /mnt/floppy
Q. smontare un floppy
A. # umount /mnt/floppy Q. aggiungere un pacchetto:
A. # pkg_add -v filenamexxx.tgz oppure
# pkg_add -v ftp.site.com/[path-to-package]/filename
Q. rimuovere un pacchetto:
A. # pkg_delete filenamexxx.tgz Q. info su un pacchetto:
A. # pkg_info filenamexxx.tgz Q. settare la data:
A. # date YYYYMMDDHHMM es.
# date 199901271504 Set the current date to January 27th, 1999 3:04pm.
Q. eliminare la richiesta del tipo di terminale al login
A. modificare il file .profile dentro a /root, cancellando
il punto interrogativo dalla linea:
eval '/usr/bin/tset -sQ \?$TERM'

Riferimenti:
http://www.muine.org/~hoang/openpf.html
http://ezine.daemonnews.org/200207/transpfobsd.html