L’OS FreeBSD est très bien classé en ce qui concerne la stabilité (voir le top des uptimes ici) et la qualité de son stack IP. C’est donc un candidat idéal pour y bâtir le routeur/firewall de votre réseau. Nous allons dans ce billet faire une installation “from scratch” d’un Firewall sous FreeBSD 7.0 et la configuration des services de bases.
Installation de FreeBSD depuis les sources
On insère le CD d’installationdans le lecteur et après le démarrage sur ce média, on lance une installation de type Custom avec les caractéristiques suivantes:
Partition: on choisi une partition libre sur un disque dur. On y installe le boot manager standard
Label: on met le label SWAP sur un disque de taille 2xRAM puis le label / sur le reste du disque
Distribution: on ne chipote pas et on selectionne la distribution Developer
Media: CD
Commit: On lance l’installation
Une fois l’installation faite, on reboote et on se logue avec l’utilisateur root (ne pas oublier de changer le password grâce à la commande passwd).
On garde les ports à jour
Un “port” dans le langage FreeBSDien, est une application packagée pour cet OS. La liste des “ports” ainsi que les sources, se trouve dans le répertoire /usr/ports. Pour installer un port la méthode la plus simple est la suivante:
# pkg_add -r <nom du port>
Les puristes préféreront aller dans le répertoire /usr/ports/<categorie>/<nom du port> et faire la fameuse séquence: make install; make clean.
Avant de commencer la configuration du Firewall, on va s’assurer que le serveur est à jour et qu’il le restera dans l’avenir (cad que les ports sont bien à jour). Pour cela, nous allons utiliser la commande Csup et les utilitaires PortUpgrade.
# pkg_add -r portupgrade
# mkdir /usr/local/etc
# mkdir /usr/local/etc/csup
# cp /usr/share/example/cvsup/ports-supfile /usr/local/etc/csup
> Penser à éditer le fichier et à remplir le champs *default host=cvsup.fr.FreeBSD.org
# cp /usr/share/example/cvsup/stable-supfile /usr/local/etc/csup
> Penser à éditer le fichier et à remplir le champs *default host=cvsup.fr.FreeBSD.org
# chown 644 /usr/local/etc/csup/*
# export alias cvsup=”csup”
Pour lancer une mise à jour du répertoire /usr/ports, il faut utiliser les commandes suivantes:
# /usr/bin/csup /usr/local/etc/csup/ports-supfile
# /usr/local/sbin/portsdb -Fu
La première ligne met à jour les ports, la seconde met à jour la base de donnée des ports.
Afin d’automatiser tout cela, je vous propose d’utiliser un petit crontab de famille:
# vi /usr/local/bin/daily.sh
/usr/bin/csup /usr/local/etc/csup/ports-supfile
/usr/local/sbin/portsdb -Fu
/usr/local/sbin/portversion -v -l | /usr/bin/mail [email protected]
La dernière ligne du script permet d’envoyer un mail quand des ports installés ne sont plus à jour.
# crontab -e
23 0 * * * /usr/local/thales/bin/daily.sh 2>&1 >>/dev/null
et le noyau aussi…
Le noyau (ou kernel) est un élément important pour la sécurité de votre Firewall. Je vous invite à lire le billet suivant pour apprendre à le maintenir à jour.
On commence les choses sérieuses
A ce point, vous devez maintenant avoir un système à jour, près a affronter les différentes étapes pour la transformation en Firewall de compétition.
Comme on aime bien commencer par la base, nous allons d’abord recompiler le noyau (kernel) afin d’y mettre les options dont nous allons avoir besoin. Pour faire un Firewall, il faut un outil de filtrage de paquets IP. FreeBSD est fourni en standard avec PF (Packet Filter). Plus par habitude que pour des raisons cartésiennes, je lui préfère IPFW. Nous allons donc inclure les options suivantes dans le fichier de configuration du noyau (cette étape est seulement nécessaire si vous voulez faire du NAT avec votre Firewall, sinon, vous pouvez charger IPFW comme un module).
# cd /usr/src/sys/i386/conf/
# cp GENERIC FIREWALL
# vi FIREWALL
…
options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=5
options IPFIREWALL_DEFAULT_TO_ACCEPT
Pour l’activation du NAT, il faut ajouter dans le même fichier, l’option suivant:
options IPDIVERT
Enfin si vous souhaitez “router” des paquets multicast (rien que ça…) il faut ajouter l’option:
options MROUTING
Pour recompiler le noyau, il suffit de suivre cette procédure. (il n’est pas nécessaire de faire les étapes de type world si vous ne souhaitez que recompiler le noyau)
Une fois votre nouveau kernel actif, il faut modifer le fichier de démarrage rc.conf pour lancer le Firewall et le NAT:
On vient donc de demander au système de lancer le Firewall (firewall_enable=”YES”) et le NAT (ipnat_enable=”YES”) lors de la séquence de boot du serveur. Deux fichiers de configuration contenant les règles (/etc/ipfw.rules et /etc/ipnat.rules) seront utilisés.# vi /etc/rc.conf
…
firewall_enable=”YES”
firewall_script=”/etc/ipfw.rules”
ipnat_enable=”YES”
ipnat_script=”/etc/ipnat.rules”
Exemples de fichiers de configuration IPFW et NAT (à modifier selon vos besoins).
Pour le Firewall (fichier /etc/ipfw.rules):
#!/bin/sh
#########
ipfw -q flush
# Nom logique des interfaces
int_internet=”em0″
int_lan=”bce0″
# Rules
ipfw add permit ip from any to any via ${int_lan}
ipfw add permit ip from any to any out via ${int_internet} setup keep-state
ipfw add check-state
ipfw add deny log ip from any to any
Pour le NAT:
map em0 from 192.168.1.0/24 -> <votre adresse IP publique>/32
Maintenant, il faut autoriser votre serveur à transférer des paquets d’une interface réseau à une autre (le transformer en routeur quoi…), pour cela il faut:
# sysctl -w net.inet.ip.forwarding=1
# vi /etc/rc.conf
…
gateway_enable=”YES”
Et comment on surveille la bête ?
Si vous avez eu la bonne idée de loguer tout les paquets rejetés par votre IPFW (comme nous l’avons fait dans notre dernière règle), le fichier /var/log/security devrait s’enrichir automatiquement. Un bon moyen de surveiller l’activité de son Firewall est donc de taper la commande suivante:
# tail -f /var/log/security
Apr 21 13:17:37 al-firewall1 /kernel: ipfw: 65534 Deny UDP 10.10.234.12:1026 -:53 in via ste3
Apr 21 13:17:37 al-firewall1 /kernel: ipfw: 65534 Deny UDP 212.4.59.10:2142 -:2142 in via ste0
Apr 21 13:17:37 al-firewall1 /kernel: ipfw: 65534 Deny TCP 10.10.234.10:4607 38.114.169.152:843 in via ste3
Apr 21 13:17:37 al-firewall1 /kernel: ipfw: 65534 Deny UDP 212.4.59.10:2142 -:2142 in via ste0
Apr 21 13:17:38 al-firewall1 /kernel: ipfw: 65534 Deny TCP 10.10.234.12:3510 74.222.141.242:7000 in via ste3
Apr 21 13:17:38 al-firewall1 /kernel: ipfw: 65534 Deny TCP 10.10.234.10:4611 38.114.169.152:843 in via ste3
Pour une présentation un peu plus lisible, j’ai écris un script perl (IPFWlogmonitor) que vous pouvez télécharger ici.
Vous en voulez encore ?
Pour moi, quelques utilitaires sont indispensables:
- iperf: test de performance entre deux points du réseau
- iftop: pour avoir en temps réel une idée du débit sur vos interfaces réseau
- snort: c’est un IDS libre qui complétera agréablement votre Firewall
Conclusion
Vous voilà donc avec une configuration stable et performante pour votre routeur/firewall. A vous de la maintenir en l’état