Serveur Familial - Le Firewall

Par ghislain , 31 décembre, 2024

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.

 

 

Étiquettes