Sous FreeBSD : PF
Sources :
https://docs.freebsd.org/en/books/handbook/firewalls/
https://www.openbsd.org/faq/pf/
Ajout d'une liste d'IP malveillantes
Ajout d'une liste d'IP reconnues malicieuses, pour cela nous allons récupérer une liste existante régulièrement :
https://github.com/stamparm/ipsum ( on choisira le level 3 )
Avant cela il faut vérifier le nombre d'entrées supporté dans les tables :
pfctl -sm
Si il y a besoin de les augmenter il faut ajouter la ligne suivante au début du fichier pf.conf :
set limit table-entries <nb entries>
Nous allons ensuite ajouter un script cron dans /etc/cron.d qui va remplacer tous les jours le contenu du fichier ( voir l'article Les tâches planifiées sous FreeBSD et Linux ) :
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
# See crontab(5) for field format.
45 3 * * * root curl https://raw.githubusercontent.com/stamparm/ipsum/refs/heads/master/levels/3.txt > /etc/pf_listsysctl.confs/pf_ipsum_3; pfctl -f /etc/pf.conf
Le fichier pf.conf
Le fichier pf.conf permettant de paramétrer les règles firewall est alors :
######## Define interfaces
ext_if ="em0"
######## Define tables
table <rfc6890> { 0.0.0.0/8 10.0.0.0/8 100.64.0.0/10 127.0.0.0/8 169.254.0.0/16 \
172.16.0.0/12 192.0.0.0/24 192.0.0.0/29 192.0.2.0/24 192.88.99.0/24 \
192.168.0.0/16 198.18.0.0/15 198.51.100.0/24 203.0.113.0/24 \
240.0.0.0/4 255.255.255.255/32 }
table <blocklist> persist file "/etc/pf_lists/pf_ipsum_3"
######## Traffic Normalization
scrub in all fragment reassemble no-df max-mss 1440
scrub on $ext_if all reassemble tcp
######## Default rules
block all
set skip on lo0
######## Cloud, block traffic from non routable IP
block in quick on egress from <rfc6890>
block return out quick on egress to <rfc6890>
######## Block all traffic from bad reputation IP
block drop in quick from <blocklist>
######## Remote Access, never remove
pass in proto tcp to port ssh
# Allow ping
pass in inet proto icmp icmp-type { echoreq }
pass out proto { udp } to port { domain }
pass out proto { tcp } to port {ssh domain http https }
pass out inet proto icmp icmp-type { echoreq }
######## Open server ports
pass in proto { tcp } to port { http https }
antispoof for $ext_if inet
Démarrage automatique
Pour que PF se lance automatiquement au démarrage du système et en chargeant la configuration contenue dans le fichier /etc/pf.conf il faut exécuter :
sysrc pf_enable="YES"
sysrc pflog_enable="YES"
Sous Linux : NFTables
Iptables est aujourd'hui un wrapper sur NFTables, donc que vous utilisiez les commande NFTable ou IPTables il se produit la même chose en arrière plan.
Pour cela on utilisera un script se paramétrage :
#!/bin/bash
IP_PUB="XX.XX.XX.XX"
IPT="/sbin/iptables"
# Remise a 0
$IPT -F
$IPT -t nat -F
# Les connexions entrantes sont bloquées par défaut
$IPT -P INPUT DROP
# Les connexions destinées à être routées sont acceptées par défaut
$IPT -P FORWARD ACCEPT
# Les connexions sortantes sont acceptées par défaut
$IPT -P OUTPUT ACCEPT
#############################
# DROP MALFORMED TCP FLAGS #
#############################
$IPT -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j BADFLAGS
$IPT -A INPUT -p tcp --tcp-flags ALL ALL -j BADFLAGS
$IPT -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j BADFLAGS
$IPT -A INPUT -p tcp --tcp-flags ALL NONE -j BADFLAGS
$IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j BADFLAGS
$IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j BADFLAGS
##########################
# INPUT FILTERING RULES #
##########################
# Allow all on loopback
$IPT -A INPUT -i lo -j ACCEPT
# Allow ICMP
$IPT -A INPUT -p icmp -j ACCEPT
# Accepter les packets entrants relatifs à des connexions déjà
# établies : cela va plus vite que de devoir réexaminer toutes
# les règles pour chaque paquet.
$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPT -A INPUT -p tcp --dport 22 -j ACCEPT
# http
$IPT -A INPUT -p tcp --dport http -j ACCEPT
# https
$IPT -A INPUT -p tcp --dport https -j ACCEPT
# Allow input smtp
$IPT -A INPUT -p tcp --dport smtp -j ACCEPT
# Allow input smtps
$IPT -A INPUT -p tcp --dport 587 -j ACCEPT
# Allow input imap(s)
#$IPT -A INPUT -p tcp --dport 143 -j ACCEPT
#$IPT -A INPUT -p tcp --dport 993 -j ACCEPT
##########################
# OUTPUT FILTERING RULES #
##########################
# Allow output DNS
$IPT -A OUTPUT -p tcp --dport domain -j ACCEPT
$IPT -A OUPUT -p udp --dport domain -j ACCEPT
# Allow output NTP
$IPT -A INPUT -p udp --dport 123 -j ACCEPT
# Allow output Web
$IPT -A OUPUT -p udp --dport http -j ACCEPT
$IPT -A OUPUT -p udp --dport https -j ACCEPT
# End
$IPT -A INPUT -j LOG --log-prefix "iptables denied: " --log-level 4
$IPT -A INPUT -j REJECT
Afin de persister la configuration vous devrez transformer ce script en script de service afin une action start et une action stop qui purge toutes les règles.