Etape 2 – Le firewall IPv4 : Shorewall

Etape 2 – Le firewall IPv4 : Shorewall

Vous êtes ici :
Article 4/11 de la série suivante :
Toute la configuration ici se fait pour l’IPv4, pour activer l’IPv6 veuillez-vous référer à l’étape 3

1. Configuration de base

1.1 Installation

apt update
apt upgrade
apt install --yes shorewall
Suite à un bug dans la version actuelle il faut également taper 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
[...]

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.