Etape 2 – Le firewall IPv4 : Shorewall
- Introduction
- Etape 1 (V1) – Installation – Boot EFI & ZFS on Debian Bullseye avec Proxmox (sans cryptage / serveur local)
- Prochainement: Etape 1 (V2) – Installation – Disque crypté LUKS RAID & Debian Bullseye avec Proxmox
- Etape 1 (V1) – Installation – ZFS Native Encryption & Debian Bullseye avec Proxmox
- Etape 2 – Le firewall IPv4 : Shorewall
- Etape 3 – Le firewall IPv6 : Shorewall6
- Etape 4 – Le serveur DHCP : isc-dhcp-server
- Etape 5 – Le serveur DNS : Bind9
- Etape 6 – La base de données : MariaDB
- Etape 7 – Le serveur WEB : Nginx & SSL (Let’s Encrypt)
- Etape 8 – Le partage de fichier : SAMBA (Compatible Time Machine Monterey)
- Etape 9 – Le serveur de MAIL : Postfix / Dovecot / Rspamd
1. Configuration de base
1.1 Installation
apt update
apt upgrade
apt install --yes shorewall
systemctl enable shorewall
pour s’assurer que shorewall se lance bien au démarrage de la machine. 1.2 Fichiers de configuration
1.2.1 – Fichier /etc/logrotate.d/shorewall
/var/log/shorewall-init.log {
weekly
rotate 4
compress
missingok
create 0640 root adm
}
/var/log/shorewall.log {
weekly
rotate 4
compress
missingok
create 0640 root adm
}
touch /var/log/shorewall.log
chown root:adm /var/log/shorewall.log
chmod 0640 /var/log/shorewall.log
1.2.2 – Fichier /etc/rsyslog.d/40-shorewall.conf
# Log Shorewall messages to /var/log/shorewall.log.
:msg, contains, "Shorewall:" /var/log/shorewall.log
& stop
systemctl restart rsyslog.service
1.2.3 – Fichier /etc/default/shorewall
# prevent startup with default configuration
# set the following varible to 1 in order to allow Shorewall to start
startup=1
# If your Shorewall configuration requires detection of the ip address of a ppp
# interface, you must list such interfaces in "wait_interface" to get Shorewall
# to wait until the interface is configured. Otherwise the script will fail
# because it won't be able to detect the IP address.
#
# Example:
# wait_interface="ppp0"
# or
# wait_interface="ppp0 ppp1"
# or, if you have defined in /etc/shorewall/params
# wait_interface=
#
# Global start/restart options
#
OPTIONS=""
#
# Start options
#
STARTOPTIONS=""
#
# Restart options
#
RELOADOPTIONS=""
#
# Restart options
#
RESTARTOPTIONS=""
#
# Init Log -- if /dev/null, use the STARTUP_LOG defined in shorewall.conf
#
INITLOG=/dev/null
#
# Set this to 1 to cause '/etc/init.d/shorewall stop' to place the firewall in
# a safe state rather than to open it
#
SAFESTOP=1
# EOF
1.2.4 – Fichier /etc/shorewall/shorewall.conf
###############################################################################
#
# Shorewall Version 5 -- /etc/shorewall/shorewall.conf
#
###############################################################################
# S T A R T U P E N A B L E D
###############################################################################
STARTUP_ENABLED=Yes
###############################################################################
# V E R B O S I T Y
###############################################################################
VERBOSITY=1
###############################################################################
# P A G E R
###############################################################################
PAGER=
###############################################################################
# F I R E W A L L
###############################################################################
FIREWALL=
###############################################################################
# L O G G I N G
###############################################################################
BLACKLIST_LOG_LEVEL=
INVALID_LOG_LEVEL=
LOG_BACKEND=
LOG_MARTIANS=Yes
LOG_VERBOSITY=2
LOGALLNEW=
LOGFILE=/var/log/messages
LOGFORMAT="Shorewall:%s:%s:"
LOGTAGONLY=No
LOGLIMIT=
MACLIST_LOG_LEVEL=info
RELATED_LOG_LEVEL=
RPFILTER_LOG_LEVEL=info
SFILTER_LOG_LEVEL=info
SMURF_LOG_LEVEL=info
STARTUP_LOG=/var/log/shorewall-init.log
TCP_FLAGS_LOG_LEVEL=info
UNTRACKED_LOG_LEVEL=
###############################################################################
# L O C A T I O N O F F I L E S A N D D I R E C T O R I E S
###############################################################################
ARPTABLES=
CONFIG_PATH=${CONFDIR}/shorewall:${SHAREDIR}/shorewall
GEOIPDIR=/usr/share/xt_geoip/LE
IPTABLES=
IP=
IPSET=
LOCKFILE=
MODULESDIR=
NFACCT=
PERL=/usr/bin/perl
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
RESTOREFILE=restore
SHOREWALL_SHELL=/bin/sh
SUBSYSLOCK=
TC=
###############################################################################
# D E F A U L T A C T I O N S / M A C R O S
###############################################################################
ACCEPT_DEFAULT="none"
DROP_DEFAULT="Drop"
NFQUEUE_DEFAULT="none"
QUEUE_DEFAULT="none"
REJECT_DEFAULT="Reject"
###############################################################################
# R S H / R C P C O M M A N D S
###############################################################################
RCP_COMMAND='scp ${files} ${root}@${system}:${destination}'
RSH_COMMAND='ssh ${root}@${system} ${command}'
###############################################################################
# F I R E W A L L O P T I O N S
###############################################################################
ACCOUNTING=Yes
ACCOUNTING_TABLE=filter
ADD_IP_ALIASES=No
ADD_SNAT_ALIASES=No
ADMINISABSENTMINDED=Yes
AUTOCOMMENT=Yes
AUTOHELPERS=Yes
AUTOMAKE=Yes
BASIC_FILTERS=No
BLACKLIST="NEW,INVALID,UNTRACKED"
CHAIN_SCRIPTS=No
CLAMPMSS=No
CLEAR_TC=Yes
COMPLETE=No
DEFER_DNS_RESOLUTION=Yes
DISABLE_IPV6=No
DOCKER=No
DELETE_THEN_ADD=Yes
DETECT_DNAT_IPADDRS=No
DONT_LOAD=
DYNAMIC_BLACKLIST=Yes
EXPAND_POLICIES=Yes
EXPORTMODULES=Yes
FASTACCEPT=No
FORWARD_CLEAR_MARK=
HELPERS=
IGNOREUNKNOWNVARIABLES=No
IMPLICIT_CONTINUE=No
INLINE_MATCHES=Yes
IPSET_WARNINGS=Yes
IP_FORWARDING=Off
KEEP_RT_TABLES=No
LOAD_HELPERS_ONLY=Yes
MACLIST_TABLE=filter
MACLIST_TTL=
MANGLE_ENABLED=Yes
MAPOLDACTIONS=No
MINIUPNPD=No
MARK_IN_FORWARD_CHAIN=No
MODULE_SUFFIX="ko ko.xz"
MULTICAST=No
MUTEX_TIMEOUT=60
NULL_ROUTE_RFC1918=No
OPTIMIZE=All
OPTIMIZE_ACCOUNTING=No
REJECT_ACTION=
REQUIRE_INTERFACE=No
RESTART=restart
RESTORE_DEFAULT_ROUTE=Yes
RESTORE_ROUTEMARKS=Yes
RETAIN_ALIASES=No
ROUTE_FILTER=No
SAVE_ARPTABLES=No
SAVE_IPSETS=No
TC_ENABLED=Internal
TC_EXPERT=No
TC_PRIOMAP="2 3 3 3 2 3 1 1 2 2 2 2 2 2 2 2"
TRACK_PROVIDERS=Yes
TRACK_RULES=No
USE_DEFAULT_RT=Yes
USE_PHYSICAL_NAMES=No
USE_RT_NAMES=No
VERBOSE_MESSAGES=Yes
WARNOLDCAPVERSION=Yes
WORKAROUNDS=No
ZERO_MARKS=No
ZONE2ZONE=-
###############################################################################
# P A C K E T D I S P O S I T I O N
###############################################################################
BLACKLIST_DISPOSITION=DROP
INVALID_DISPOSITION=CONTINUE
MACLIST_DISPOSITION=REJECT
RELATED_DISPOSITION=ACCEPT
RPFILTER_DISPOSITION=DROP
SMURF_DISPOSITION=DROP
SFILTER_DISPOSITION=DROP
TCP_FLAGS_DISPOSITION=DROP
UNTRACKED_DISPOSITION=CONTINUE
################################################################################
# P A C K E T M A R K L A Y O U T
################################################################################
TC_BITS=
PROVIDER_BITS=
PROVIDER_OFFSET=
MASK_BITS=
ZONE_BITS=0
#LAST LINE -- DO NOT REMOVE
2. Scénario 1 – Home Server (2 interfaces)
2.1 Principe général
Le serveur que vous êtes en train de configurer est le centre névralgique de votre domicile (ou de votre bureau).
C’est donc ce serveur qui est en charge de :
– protéger votre réseau local de l’extérieur (internet)
– mais aussi de partager l’accès à l’internet
Nous allons donc mettre en place :
– Un firewall chargé également du partage internet : Shorewall
– Un serveur DHCP afin de distribuer les adresses IP : DHCP
– Un serveur DNS pour identifier facilement les machines sur le réseau : Bind9
2.2 Prérequis
- Vous devez au minimum avoir 2 interfaces réseaux :
– Une vers l’internet (réseau WAN)
– L’autre vers le réseau local (réseau LAN)
- Il faut identifier ces 2 cartes réseaux et les configurer (normalement fait à l’étape précédente mais pour mémoire) dans cet exemple eno1 et eno2 :
ip addr show
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eno1: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:1a:1b:1c:1d:1e brd ff:ff:ff:ff:ff:ff
inet 123.123.123.123/24 brd 123.123.123.255 scope global dynamic eno1
valid_lft forever preferred_lft forever
2: eno2: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:2a:2b:2c:2d:2e brd ff:ff:ff:ff:ff:ff
inet 192.168.0.1/24 brd 192.168.0.255 scope global dynamic eno1
valid_lft forever preferred_lft forever
- On crée les fichiers de configuration réseau (utilisez l’utilitaire
emacs
installé précédemment), à adapter selon votre environnement réseau :
auto eno1
iface eno1 inet dhcp
auto eno2
iface eno2 inet static
address 192.168.0.1
netmask 255.255.255.0
2.3 Configuration
Shorewall utilise de multiples fichier qui se trouvent dans /etc/shorewall
.
Chacun de ces fichiers a un rôle bien précis.
2.3.1 – Fichier shorewall.conf
je ne reprends ici que les élements à modifier par rapport au spécifié plus haut :
[...]
CLAMPMSS=Yes
IP_FORWARDING=On
[...]
2.3.2 – Fichier interfaces
###############################################################################
?FORMAT 2
###############################################################################
#ZONE INTERFACE OPTIONS
net eno1 dhcp,tcpflags,nosmurfs,routefilter,logmartians,sourceroute=0
loc eno2 dhcp,tcpflags,nosmurfs,routefilter,logmartians
- ?FORMAT 2 : Définie le format du fichier (2 étant la version actuelle)
- On nomme « net » la zone correspondant au traffic de l’interface eno1 et « loc » celle de l’interface eno2 (les noms des zones doivent correspondre à celle définies dans le fichier
/etc/shorewall/zones
- Les options :
- dhcp : si l’IP de l’interface est attribuée par un serveur DHCP ou car cette interface est celle où tourne un serveur DHCP
- tcpflags (par défaut) : permets de vérifier si les packets TCP n’ont pas une certaine combinaison illégale
- nosmurfs : filtre les packets « smurfs »
- routefilter : active la filtration des routes par le kernel (à savoir que même sans ce paramètre, il est possible que l’interface soit tout de même filtrée…)
- logmartians : log les packets dont l’adresse source est impossible
- sourceroute=0 : désactive les « source-routed IP packets » (à mettre uniquement sur l’interface relié à l’internet)
2.3.3 – Fichier zones
###############################################################################
#ZONE TYPE OPTIONS IN OUT
# OPTIONS OPTIONS
fw firewall
net ipv4
loc ipv4
2.3.4 – Fichier policy
###############################################################################
#SOURCE DEST POLICY LOG LEVEL LIMIT:BURST
#
# Policies for traffic originating from the local LAN (loc)
#
loc net ACCEPT
loc $FW REJECT info
loc all REJECT info
#
# Policies for traffic originating from the firewall ($FW)
#
$FW net ACCEPT
$FW loc ACCEPT
$FW all REJECT info
#
# Policies for traffic originating from the Internet zone (net)
#
net all DROP info
# THE FOLLOWING POLICY MUST BE LAST
all all REJECT info
2.3.5 – Fichier snat
###########################################################################################################################################
#ACTION SOURCE DEST PROTO PORT IPSEC MARK USER SWITCH ORIGDEST PROBABILITY
#
MASQUERADE 192.168.0.0/24 eno1
- 192.168.0.0/24 : À modifier par le réseau et sous réseau qui sera utilisé dans votre LAN.
- eno1 : spécifie l’interface reliée à l’internet
2.3.6 – Fichier stoppedrules
###############################################################################
#ACTION SOURCE DEST PROTO DEST SOURCE
# PORT(S) PORT(S)
ACCEPT eno2 -
ACCEPT - eno2
Ici on spécifie le comportement lorsque le Shorewall est stoppé. Par défaut on laisse tout ouvert même si cette situation ne devrait jamais arriver.
Il faut donc remplacer par le nom de l’interface connectée au réseau local (dans cet exemple eno2)
2.3.7 – Fichier rules
######################################################################################################################################################################################################
#ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL RATE USER/ MARK CONNLIMIT TIME HEADERS SWITCH HELPER
# PORT PORT(S) DEST LIMIT GROUP
?SECTION ALL
?SECTION ESTABLISHED
?SECTION RELATED
?SECTION INVALID
?SECTION UNTRACKED
?SECTION NEW
# Accepter les connections DNS depuis le FW et vers le FW depuis le réseau local :
DNS(ACCEPT) loc $FW
DNS(ACCEPT) $FW net
# Accepter les connections SSH depuis partout
ACCEPT all $FW tcp 22
- Ce fichier est essentiel, c’est ici qu’il faudra spécifier les ports ouverts (ou les redirections de port)
- DNS(ACCEPT) … : c’est une macro (voir dans le répertoire
/usr/share/shorewall
pour connaitre les macros disponibles) qui permet de ne pas avoir à taper une règle à la main (personnellement je n’aime pas les utiliser) - ACCEPT all $FW tcp 22: Shorewall accepte les paquets de n’importe où vers le serveur en TCP sur le port 22 (SSH)
3. Scénario 2 – Standalone Server (1 interface)
3.1 Principe général
Le serveur que vous êtes en train de configurer ne partagera pas de connexion internet. Il va servir par exemple à stocker des données ou héberger un site web.
3.2 Configuration
Shorewall utilise de multiples fichier qui se trouvent dans /etc/shorewall
.
Chacun de ces fichiers a un rôle bien précis.
3.2.1 – Fichier shorewall.conf
Normalement vous n’avez pas à modifier le fichier spécifié plus haut. Les différences avec le fichier à 2 interfaces sont les suivantes :
[...]
CLAMPMSS=No
IP_FORWARDING=Off
[...]
3.2.2 – Fichier interfaces
###############################################################################
?FORMAT 2
###############################################################################
#ZONE INTERFACE OPTIONS
net eno1 dhcp,tcpflags,nosmurfs,routefilter,logmartians,sourceroute=0
w
- ?FORMAT 2 : Définie le format du fichier (2 étant la version actuelle)
- On nomme « net » la zone correspondant au traffic de l’interface eno1 et « loc » celle de l’interface eno2 (les noms des zones doivent correspondre à celle définies dans le fichier
/etc/shorewall/zones
- Les options :
- dhcp : si l’IP de l’interface est attribuée par un serveur DHCP ou car cette interface est celle où tourne un serveur DHCP
- tcpflags (par défaut) : permets de vérifier si les packets TCP n’ont pas une certaine combinaison illégale
- nosmurfs : filtre les packets « smurfs »
- routefilter : active la filtration des routes par le kernel (à savoir que même sans ce paramètre, il est possible que l’interface soit tout de même filtrée…)
- logmartians : log les packets dont l’adresse source est impossible
- sourceroute=0 : désactive les « source-routed IP packets » (à mettre uniquement sur l’interface relié à l’internet)
3.2.3 – Fichier zones
###############################################################################
#ZONE TYPE OPTIONS IN OUT
# OPTIONS OPTIONS
fw firewall
net ipv4
3.2.4 – Fichier policy
###############################################################################
#SOURCE DEST POLICY LOG LEVEL LIMIT:BURST
net all DROP info
# THE FOLLOWING POLICY MUST BE LAST
all all REJECT info
3.2.5 – Fichier rules
######################################################################################################################################################################################################
#ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL RATE USER/ MARK CONNLIMIT TIME HEADERS SWITCH HELPER
# PORT PORT(S) DEST LIMIT GROUP
### Connexions sortantes autorisées ($FW -> NET)
# DNS
ACCEPT $FW net tcp,udp 53
# NTP
ACCEPT $FW net udp 123
# WEB (apt)
ACCEPT $FW net tcp 80
# HKP (apt)
ACCEPT $FW net tcp,udp 11371
# Ping
ACCEPT $FW net icmp
# SSH
ACCEPT $FW net tcp 22
### Connexions entrantes (NET -> $FW)
# DNS
ACCEPT net $FW tcp,udp 53
# PING
ACCEPT all $FW icmp 8
# SSH
ACCEPT all $FW tcp 22
- Ce fichier est essentiel, c’est ici qu’il faudra spécifier les ports ouverts (ou les redirections de port)
- ACCEPT all $FW tcp 22: Shorewall accepte les paquets de n’importe où vers le serveur en TCP sur le port 22 (SSH)
4. Configuration additionnelle
4.1 – Fichier blrules
(facultatif)
Si vous le souhaitez vous pouvez filtrer selon l’adresse MAC les machines autorisées à se connecter à l’interface.
Il suffit de créer le fichier /etc/shorewall/blrules
:
#
# Shorewall -- /etc/shorewall/blrules
#
# For information about entries in this file, type "man shorewall-blrules"
#
# Please see http://shorewall.net/blacklisting_support.htm for additional
# information.
#
##############################################################################################################################################################
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST RATE USER MARK CONNLIMIT TIME HEADERS SWITCH HELPER
BLACKLIST net:1.2.3.4 all
4.2 Désactivation de l’IPV6
4.2.1 – Modification du fichier /etc/sysctl.conf
- Ajouter à la fin du fichier
/etc/sysctl.conf
:
[...]
#Desactivation IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
4.2.2 – Modification du fichier /etc/shorewall/shorewall.conf
[...]
DISABLE_IPV6=Yes
[...]