Voici un premier script basique pour Packet Filter sur OpenBSD 5.4. Cette configuration permet de filtrer ce qui provient de l'Internet à destination du réseau local en IPv4 et en IPv6 et de tout autoriser à sortir depuis le réseau local en double pile.

Sous OpenBSD, pour mettre en place les règles de filtrage il faut éditer le fichier /etc/pf.conf :

# Declaration des macros
ext_if="re1"
int_if="re0"
dmz_if="re2"
localnet=$int_if:network
dnsserver="172.16.55.2"
icmp_types="echoreq"
localv6="2001:0db8::/64"
icmp6_types_ext_if="{ 128, 133, 134, 135, 136 }"
martians = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, \
0.0.0.0/8, 240.0.0.0/4 }"

# Table protection contre le brute force SSH
table <bruteforce> persist

# Ne pas filtrer sur la boucle locale
set skip on lo

# Activation de la protection contre l'usurpation de 'IP
antispoof for $ext_if


# Normalisation de tous les paquets entrants
match in all scrub (no-df max-mss 1440)

# Mise en place d'une politique d'interdiction par defaut
block log inet all
block log inet6 all

# NAT permettant aux IP prives du reseau local de sortir
match out on $ext_if from $localnet to any nat-to $ext_if

# On autorise tout en entrée/sortie sur l'interface interne
pass on $int_if inet
pass on $int_if inet6

# On autorise tout en sortie sur l'interface publique
pass out on $ext_if inet
pass out on $ext_if inet6

# Autoriser Internet a emettre des demandes d'echo ICMP vers le firwall
pass in on $ext_if inet proto icmp all icmp-type $icmp_types keep state

# Autoriser l'acces OpenVPN
pass in on $ext_if inet proto udp from any to $ext_if port 1194
pass log on tun0

# Autoriser SSH depuis internet vers le firewall en bloquant les attaques bruteforce
block quick from <bruteforce>
pass in quick on $ext_if proto tcp from any to $ext_if port ssh \
keep state (max-src-conn 5, max-src-conn-rate 5/60, \
overload <bruteforce> flush global)

block quick inet6 from <bruteforce>
pass in quick on $ext_if inet6 proto tcp from any to $ext_if port ssh \
keep state (max-src-conn 5, max-src-conn-rate 5/60, \
overload <bruteforce> flush global)

# Autoriser ICMP Multicast et RS RA NS NA IPv6 entre le firewall et le routeur du FAI
pass in on $ext_if inet6 proto ipv6-icmp from any to \
($ext_if) icmp6-type $icmp6_types_ext_if keep state
pass in on $ext_if inet6 proto ipv6-icmp from fe80::/8 to \
ff02::1/64
pass in on $int_if inet6 proto ipv6-icmp from fe80::/8 to \
fe80::200:14fe:fdab:c0d9/128
pass in on $int_if inet6 proto ipv6-icmp from fe80::/8 to \
ff02::1/64
pass in on $int_if inet6 proto ipv6-icmp from fe80::/8 to \
2001:0db8::1/128

# On bloque les adresses non-routables sur le NET RFC 1918
block drop in quick on $ext_if from $martians to any
block drop out quick on $ext_if from any to $martians

Les commandes très pratiques qu'il faut retenir :

# Commande qui permet d'observer en temps réel les flux gérés par Packet Filter

tcpdump -n -e -ttt -i pflog0

# Commande permettant d'observer les logs Packet Filter

tcpdump -n -e -ttt -r /var/log/pflog

# Permet d'observer les IP qui ont tenté des attaques brute force sur le service SSH et qui ont été blacklistées

pfctl -t bruteforce -T show

# Permet de recharger la configuration Packet Filter à chaud

pfctl -f /etc/pf.conf

# Permet de vérifier le fichier de configuration /etc/pf.conf sans pour autant charger les règles contenues à l'intérieur

pfctl -nf /etc/pf.conf

Je ne suis pas un expert packet filter. C'est mon premier script. Il est basique mais fonctionne plutôt bien jusqu'à présent. Je suis ouvert bien entendu à toutes suggestions alors n'hésitez pas à me laisser des commentaires.

Enjoy ;)