Debian - 6wall

Un article de Wiki.OmBreNoiRe.net.

Vous être en train de lire Comment installer un serveur sécurisé sur Debian.

Sommaire Install Aptitude Locales SSHd Shorewall 6wall DHCP3-server Bind9 VsFTPd Apache/MySQL Mail BackupManager

Sommaire

Attention !
6wall est un firewall IPv6, il ne gère ni ne filtre l'IPv4. Vous DEVEZ donc utiliser un autre firewall IPv4 en plus de 6wall, comme Shorewall dont le fonctionnement est expliqué sur ces pages !

Introduction

6wall est un firewall basé sur Shorewall 1.4 qui gère uniquement l'IPv6.

C'est à la base un paquet pour Linux Embedded Appliance Firewalls (LEAF), donc rien à voir avec Debian mis à part que c'est du Linux :)

Il permet donc de garder à peu prêt la même syntaxe qu'avec le Shorewall avec certaines petites différences :

  • Il utilise IP6TABLES (normal c'est de l'IPv6)
  • Il n'est pas possible de rediriger les logs avec ULOG dans un fichier dédié (incompatibilité ULOG / IP6TABLES)
  • Commande REDIRECT, DNAT n'existent pas, mais il reste bien entendu les fondamentales à savoir ACCEPT, DROP et REJECT
  • Il faut pas faire make mais /etc/init.d/6wall restart pour faire prendre en compte les mises à jour.

Installation de 6wall

6wall ne se trouve pas sur les dépôts officiels Debian, mais sur mon dépôt perso http://debian.ombrenoire.net

À noter !
C'est M. Flavio Visentin qui a compilé ces paquets pour Debian, si vous souhaitez récupérer 6wall directement auprès de lui, il vous faudra aller sur son site internet. Mais il faudra alors utiliser la commande dpkg -i lepaquet.deb au lieu d'aptitude... C'est pourquoi je vous recommande d'utiliser mon dépôt :)

Vous devez donc ajouter la ligne suivante en haut de votre fichier /etc/apt/sources.list :

Fichier : /etc/apt/sources.list
deb http://debian.ombrenoire.net/etch/6wall ./

Puis on lance les commandes suivantes :

root@monordi:~# aptitude update

root@monordi:~# aptitude install 6wall

Astuce !
Si vous avez une erreur GPG après aptitude update et que vous ne savez pas comment la résoudre, la solution se trouve ici !

But de la configuration

Que vous ayez un serveur avec 1 ou 2 interfaces, la configuration est la même, car avec l'IPv6, il n'est plus question de faire du NAT pour partager la connexion mais directement faire du brouting afin de routing bas niveau (et ainsi distribuer directement une IPv6 à chacunes des machines du réseau, devant chacune s'équiper d'un firewall)

Grâce à cette configuration, on filtre seulement les connexions qui vont vers le serveur (le serveur n'est pas limité en sortie).

Comme d'habitude, c'est du copier-coller, pour plus d'informations, je vous invite à aller sur la doc de 6wall hébergée sur mon site (généré à partir du DocBook.

Pré-requis

Il vous faut tout d'abord une IPv6, je vous avouerai que je ne suis pas un expert dans le domaine du tunneling, etc... mais je sais que kimsufi ou dédibox fournissent en natif l'IPv6.

Avant d'installer et paramétrer 6wall, il faut s'assurer que votre configuration réseau est correcte. Pour cela voici différents fichiers que vous devez éditer afin qu'il contienne à peu prêt les mêmes informations (à adapter pour votre configuration bien sûr) :

Attention !
Afin de simplifier le tutoriel, je n'ai pas affiché les paramètres pour la connexion en IPv4, mais bien entendu, ces paramètres coexistent dans les même fichiers. Pour plus de détail sur la configuration en IPv4 je vous recommande d'aller voir le tutoriel sur Shorewall

Le fichier /etc/hostname

Il contient le nom de votre machine.

Fichier : /etc/hostname
monordi

Le fichier /etc/hosts

Il contient le nom de votre machine sur chacune des adresses des ips.

Fichier : /etc/hosts
[...]

# IPv6
2001:d0d0:1::1     monordi6.mondomaine.net monordi6
2001:d0d0:1::aa:1  autreipv6.mondomaine.net autreipv6

# The following lines are desirable for IPv6 capable hosts
#(added automatically by netbase upgrade)
::1     ip6-localhost ip6-loopback
feo0::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

Plusieurs remarques pour ce fichier :

  • Remplacer 2001:d0d0:1::1 par votre IPv6 fixe
  • Remplacer monordi6 par votre nom de machine (le même que dans /etc/hostname + un 6 par exemple)
  • Remplacer mondomaine.net par votre domaine auquel vous avez rattaché votre machine (déclaré dans vos zones DNS sur le serveur par la suite à l'étape du serveur DNS Bind9 ou chez votre registrar si vous ne désirer pas gérer vos DNS pour ce domaine).
  • 2001:d0d0:1::aa:1 autreipv6.mondomaine.net autreipv6 est un exemple en sachant que l'on peut avoir plusieurs adresses IPv6 sur la même machine.

Le fichier /etc/network/interfaces

Il contient la configuration de vos différentes interfaces.

Attention !
Je pars du principe que votre interface connectée au modem/net s'appelle eth0, si pour une raison ou pour une autre, ce n'était pas le cas : eth1 etc... veuillez remplacer dans les fichiers de configuration qui vont suivre eth0 par votre nom d'interface !
Fichier : /etc/network/interfaces
[...]

iface eth0 inet6 static
        address 2001:d0d0:1::1
        netmask 64

#IPv6 en plus :
post-up /sbin/ifconfig eth0 inet6 add 2001:d0d0:1::aa:1/64
pre-down /sbin/ifconfig eth0 inet6 del 2001:d0d0:1::aa:1/64

Remarques  :

  • 2001:d0d0:1::1 : A remplacer par votre adresse IPv6
  • netmask 64 : A remplacer en fonction de se que vous a donné votre fournisseur (chez kimsufi, c'est 56 par exemple)
  • 2001:d0d0:1::aa:1/64 : A remplacer par l'adresse IPv6 supplémentaire que vous voulez utiliser sur votre serveur (il faut de même pour ajouter d'autres adresses)
Problème connu !
Si votre fournisseur vous donne un bloc /56 vous allez avoir ce warning dans vos logs : kernel: IPv6 addrconf: prefix with wrong length 56. Ce n'est qu'un warning, car le kernel "n'aime pas" recevoir un bloc autre que /64, mais rien de grave, tout fonctionne parfaitement !

Vous pouvez tester votre fichier avec la commande :

root@monordi:~# /etc/init.d/networking restart
Attention !
Tous ces paramètres sont fournis par votre fournisseur, à vous d'en vérifier l'exactitude, si vous commettez une erreur dans ce fichier, surtout dans l'IPv4, la relance de networking (reboot ou manuel) sera fatale et vous aller être condamné à dépanner votre machine

Configuration de 6wall

Presque tout se passe dans /etc/6wall

Sauvegarde configuration d'origine

Comme je vous donne une configuration clé en main, il vaut mieux remplacer directement les fichiers installés par défaut par les miens. Mais on sauvegarde tout de même.

root@monordi:~# cd /etc/6wall

root@monordi:~# mkdir orig
root@monordi:~# mv * orig
mv: ne peut déplacer `orig' vers un sous-répertoire de lui-même `orig/orig'

Création des fichiers de configuration

Avec emacs, il vous suffit de créer chacun des fichiers suivants :

Le fichier /etc/6wall/6wall.conf

Fichier : /etc/6wall/6wall.conf
LOG=info
LOGFILE=/var/log/messages
LOGFORMAT="6wall:%s:%s:"
LOGRATE=
LOGBURST=
BLACKLIST_LOGLEVEL=$LOG
MACLIST_LOG_LEVEL=$LOG
TCP_FLAGS_LOG_LEVEL=$LOG
SITELOCAL_LOG_LEVEL=$LOG
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
SUBSYSLOCK=/var/run/6wall
STATEDIR=/var/lib/6wall
MODULESDIR=/lib/modules
FW=fw
IP_FORWARDING=Keep
MULTIPORT=No
MUTEX_TIMEOUT=60
SHOW_IP6TABLES_COMMANDS=No
BLACKLIST_DISPOSITION=DROP
MACLIST_DISPOSITION=DROP
TCP_FLAGS_DISPOSITION=DROP
Astuce !

Si vous voulez tout de même avoir vos fichiers 6wall en dehors des logs /var/log/syslog et /var/log/messages, il existe une solution qui n'est pas parfaite, mais qui fonctionne bien. Cela consiste à faire passer le niveau du Log à notice qui est peu utilisé en règle général, et à dévier les fichiers notice vers /var/log/6wall en faisant comme ceci :

  • Remplacer dans le fichier /etc/6wall/6wall.conf :
Fichier :
LOG=info
LOGFILE=/var/log/messages

par :

Fichier :
LOG=notice 
LOGFILE=/var/log/6wall
  • Modifier le fichier /etc/syslog.conf en remplaçant :
Fichier : /etc/syslog.conf
*.*;auth,authpriv.none                  -/var/log/syslog

*.=info;*.=notice;*.=warn;\
        auth,authpriv.none;\
        cron,daemon.none;\
        mail,news.none                  -/var/log/messages

par :

Fichier : /etc/syslog.conf
*.*;auth,authpriv.none,kern.!notice     -/var/log/syslog

*.=info;*.=notice;*.=warn;\
        auth,authpriv.none;\
        cron,daemon.none;\
        mail,news.none,kern.!notice     -/var/log/messages
  • Et créer le fichier de log, comme ceci et on redémarre :
root@monordi:~# touch /var/log/6wall

root@monordi:~# chgrp adm /var/log/6wall root@monordi:~# reboot

Le fichier /etc/6wall/blacklist6

Vierge pour l'instant, mais si vous êtes amenés à bloquer des IP, il vous suffira de les ajouter avant la #LAST LINE.

Fichier : /etc/6wall/blacklist6
#
# 6wall - Blacklist File
#
###############################################################################
#ADDRESS/SUBNET         PROTOCOL        PORT


#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
À noter !
  • En ajoutant une IP vous lui interdisez de se connecter à vous, sur TOUS les ports, mais VOUS pouvez encore la contacter.
  • Veuillez à blacklister uniquement TEMPORAIREMENT pour 2 raisons :
    • Certaines IP sont dynamiques
    • Les IP fixes peuvent changer de propriétaire
  • Après avoir modifié ce fichier n'oubliez pas de faire :
root@monordi:~# /etct/init.d/6wall restart

Le fichier /etc/6wall/common6.def

Fourni avec le paquet, je le remet tel quel.

Fichier : /etc/6wall/common6.def
############################################################################
# 6wall 1.0 -- /etc/6wall/common.def
#
# This file defines the rules that are applied before a policy of
# DROP or REJECT is applied. In addition to the rules defined in this file,
# the firewall will also define a DROP rule for each subnet broadcast
# address defined in /etc/6wall/interfaces (including "detect").
#
# Do not modify this file -- if you wish to change these rules, create
# /etc/6wall/common to replace it. It is suggested that you include
# the command ". /etc/6wall/common.def" in your
# /etc/6wall/common file so that you will continue to get the
# advantage of new releases of this file.
#
############################################################################
# Allow ping and traceroute return traffic as long as connection tracking
# is not available
#
run_ip6tables -A common -p icmpv6 --icmpv6-type echo-reply -j ACCEPT
run_ip6tables -A common -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT
############################################################################
# NETBIOS chatter
#
run_ip6tables -A common -p udp --dport 135         -j reject
run_ip6tables -A common -p udp --dport 137:139     -j reject
run_ip6tables -A common -p udp --dport 445         -j reject
run_ip6tables -A common -p tcp --dport 139         -j reject
run_ip6tables -A common -p tcp --dport 445         -j reject
run_ip6tables -A common -p tcp --dport 135        -j reject
############################################################################
# UPnP
#
run_ip6tables -A common -p udp --dport 1900       -j DROP
############################################################################
# AUTH -- Silently reject it so that connections don't get delayed.
#
run_ip6tables -A common -p tcp --dport 113 -j reject
############################################################################
# DNS -- Silenty drop late replies
#
#<ET> connection tracking not yet supported
#run_ip6tables -A common -p udp --sport 53 -mstate --state NEW -j DROP
############################################################################
# Allow Neighbour and Router Advertisement messages
#
run_ip6tables -A common -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT
run_ip6tables -A common -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT
run_ip6tables -A common -p icmpv6 --icmpv6-type neighbour-solicitation -j ACCEPT
run_ip6tables -A common -p icmpv6 --icmpv6-type neighbour-advertisement -j ACCEPT
############################################################################

Le fichier /etc/6wall/host6

Fourni avec le paquet, je le remet tel quel. Il est vide chez moi aussi.

Fichier : /etc/6wall/host6
#
# 6wall - Host6 File
#
###############################################################################


#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Le fichier /etc/6wall/interface6

Fichier : /etc/6wall/interface6
#
# 6wall - Interface6 File
#
###############################################################################
#ZONE    INTERFACE      OPTIONS
net      eth0        nositelocal,tcpflags,blacklist

#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Le fichier /etc/6wall/policy6

Fichier : /etc/6wall/policy6
#
# 6wall - Policy6 File
#
###############################################################################
#SOURCE DEST    POLICY  LOG LEVEL       LIMIT:BURST
fw      net     ACCEPT
net     fw      DROP    $LOG
net     all     DROP    $LOG
all     all     DROP    $LOG

#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

LOGRATE= LOGBURST= BLACKLIST_LOGLEVEL=$LOG MACLIST_LOG_LEVEL=$LOG TCP_FLAGS_LOG_LEVEL=$LOG SITELOCAL_LOG_LEVEL=$LOG PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin SUBSYSLOCK=/var/run/6wall STATEDIR=/var/lib/6wall MODULESDIR=/lib/modules FW=fw IP_FORWARDING=Keep MULTIPORT=No MUTEX_TIMEOUT=60 SHOW_IP6TABLES_COMMANDS=No BLACKLIST_DISPOSITION=DROP MACLIST_DISPOSITION=DROP TCP_FLAGS_DISPOSITION=DROP </pre> }}

Astuce !

Si vous voulez tout de même avoir vos fichiers 6wall en dehors des logs /var/log/syslog et /var/log/messages, il existe une solution qui n'est pas parfaite, mais qui fonctionne bien. Cela consiste à faire passer le niveau du Log à notice qui est peu utilisé en règle général, et à dévier les fichiers notice vers /var/log/6wall en faisant comme ceci :

  • Remplacer dans le fichier /etc/6wall/6wall.conf :
Fichier :
LOG=info
LOGFILE=/var/log/messages

par :

Fichier :
LOG=notice 
LOGFILE=/var/log/6wall
  • Modifier le fichier /etc/syslog.conf en remplaçant :
Fichier : /etc/syslog.conf
*.*;auth,authpriv.none                  -/var/log/syslog

*.=info;*.=notice;*.=warn;\
        auth,authpriv.none;\
        cron,daemon.none;\
        mail,news.none                  -/var/log/messages

par :

Fichier : /etc/syslog.conf
*.*;auth,authpriv.none,kern.!notice     -/var/log/syslog

*.=info;*.=notice;*.=warn;\
        auth,authpriv.none;\
        cron,daemon.none;\
        mail,news.none,kern.!notice     -/var/log/messages
  • Et créer le fichier de log, comme ceci et on redémarre :
root@monordi:~# touch /var/log/6wall

root@monordi:~# chgrp adm /var/log/6wall root@monordi:~# reboot

Le fichier /etc/6wall/blacklist6

Vierge pour l'instant, mais si vous êtes amenés à bloquer des IP, il vous suffira de les ajouter avant la #LAST LINE.

Fichier : /etc/6wall/blacklist6
#
# 6wall - Blacklist File
#
###############################################################################
#ADDRESS/SUBNET         PROTOCOL        PORT


#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
À noter !
  • En ajoutant une IP vous lui interdisez de se connecter à vous, sur TOUS les ports, mais VOUS pouvez encore la contacter.
  • Veuillez à blacklister uniquement TEMPORAIREMENT pour 2 raisons :
    • Certaines IP sont dynamiques
    • Les IP fixes peuvent changer de propriétaire
  • Après avoir modifié ce fichier n'oubliez pas de faire :
root@monordi:~# /etct/init.d/6wall restart

Le fichier /etc/6wall/common6.def

Fourni avec le paquet, je le remet tel quel.

Fichier : /etc/6wall/common6.def
############################################################################
# 6wall 1.0 -- /etc/6wall/common.def
#
# This file defines the rules that are applied before a policy of
# DROP or REJECT is applied. In addition to the rules defined in this file,
# the firewall will also define a DROP rule for each subnet broadcast
# address defined in /etc/6wall/interfaces (including "detect").
#
# Do not modify this file -- if you wish to change these rules, create
# /etc/6wall/common to replace it. It is suggested that you include
# the command ". /etc/6wall/common.def" in your
# /etc/6wall/common file so that you will continue to get the
# advantage of new releases of this file.
#
############################################################################
# Allow ping and traceroute return traffic as long as connection tracking
# is not available
#
run_ip6tables -A common -p icmpv6 --icmpv6-type echo-reply -j ACCEPT
run_ip6tables -A common -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT
############################################################################
# NETBIOS chatter
#
run_ip6tables -A common -p udp --dport 135         -j reject
run_ip6tables -A common -p udp --dport 137:139     -j reject
run_ip6tables -A common -p udp --dport 445         -j reject
run_ip6tables -A common -p tcp --dport 139         -j reject
run_ip6tables -A common -p tcp --dport 445         -j reject
run_ip6tables -A common -p tcp --dport 135        -j reject
############################################################################
# UPnP
#
run_ip6tables -A common -p udp --dport 1900       -j DROP
############################################################################
# AUTH -- Silently reject it so that connections don't get delayed.
#
run_ip6tables -A common -p tcp --dport 113 -j reject
############################################################################
# DNS -- Silenty drop late replies
#
#<ET> connection tracking not yet supported
#run_ip6tables -A common -p udp --sport 53 -mstate --state NEW -j DROP
############################################################################
# Allow Neighbour and Router Advertisement messages
#
run_ip6tables -A common -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT
run_ip6tables -A common -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT
run_ip6tables -A common -p icmpv6 --icmpv6-type neighbour-solicitation -j ACCEPT
run_ip6tables -A common -p icmpv6 --icmpv6-type neighbour-advertisement -j ACCEPT
############################################################################

Le fichier /etc/6wall/hosts6

Fourni avec le paquet, je le remet tel quel. Il est vide chez moi aussi.

Fichier : /etc/6wall/hosts6
#
# 6wall - Hosts6 File
#
###############################################################################


#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Le fichier /etc/6wall/interfaces6

Fichier : /etc/6wall/interfaces6
#
# 6wall - Interfaces6 File
#
###############################################################################
#ZONE    INTERFACE      OPTIONS
net      eth0        nositelocal,tcpflags,blacklist

#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Le fichier /etc/6wall/zones6

Fichier : /etc/6wall/zones6
#
# 6wall - Zones6 File
#
###############################################################################
#ZONE   DISPLAY         COMMENTS
net     Net             Internet

#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Le fichier /etc/6wall/rules6

C'est tout comme pour l'IPv4, LE fichier de configuration que vous allez souvent modifier (ou pas).

Fichier : /etc/6wall/rules6
#
# 6wall - Rules6 File
#
###############################################################################
#ACTION         SOURCE          DEST                            PROTO           DEST            SOURCE
#                                                               PORT            PORT(S)

# Regles pour toutes les IPv6 du serveur
# Accepte le ping
ACCEPT          net             fw                              icmpv6          echo-request

# Accepte le DNS
ACCEPT          net             fw                              udp             53

# Accepte le port Web (80) uniquement sur 1 IP
ACCEPT          net             fw:2001:d0d0:1::aa:1            tcp             80


#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

La structure de se fichier est simple, pour ouvrir un port vous n'avez qu'à ajouter une ligne sous se format :

Règle Firewall : Ouverture d'un port
ACCEPT net fw PROTOCOLE PORT

En remplaçant :

  • PROTOCOLE par tcp ou udp
  • PORT par le numéro du port d'écoute

Vous pouvez d'ailleurs cibler un peu plus vos requêtes:

  • Mettre net:IP IP étant une IPv6 externe, en faisant cela vous n'accepter les requêtes QUE de cette IP
  • Mettre $FW:IP IP étant l'une de vos IPv6 sur le serveur
À noter !
  • Faites des règles les plus précises possibles (à chaque fois que vous ajouter une règle, vous faites un trou dans votre firewall. Il vaut mieux plein de petit trou que peu de grand trou.
  • Après avoir modifié ce fichier n'oubliez pas de faire :
root@monordi:~# /etct/init.d/6wall restart

Modification du fichier /etc/default/6wall

Se fichier est configurer pour empêcher 6wall de se lancer par défaut sans configuration. Maintenant qu'il est configuré il faut le modifier comme ceci :

Fichier : /etc/default/6wall
# prevent startup with default configuration
# set the below variable to 1 in order to allow shorewall to start
startup=1

Premier lancement de 6wall

root@monordi:~# cd /etc/6wall

root@monordi:~# chmod 640 *
root@monordi:~# chmod 755 orig
root@monordi:~# /etc/init.d/6wall restart

Attention !
Si vous êtes connecté en IPv6 au serveur, NE FERMEZ PAS LA SESSION SSH EN COURS ! Essayez tout de suite d'en ouvrir une autre en parallèle, si cela fonctionne c'est que 6wall ne bloque pas le port, ce qui indique soit qu'il ne fonctionne pas, soit qu'il est bien configuré ;)

Verification du filtrage

C'est le même format que pour Shorewall : ils se trouvent par défaut dans /var/log/syslog et {filename|/var/log/messages}} sauf si vous avez appliqué l'astuce de pour modifier la localisation des logs expliquées plus haut.

Modification de la configuration

A chaque fois que je vous aller modifier un fichier (normalement vous n'avez plus qu'à modifier /etc/6wall/rules6 et /etc/6wall/blacklist6) n'oubliez de réaliser la commande suivante :

root@monordi:~# /etc/init.d/6wall restart

Conclusion

Votre serveur dispose maintenant d'un firewall IPv6 fiable!

Vous pouvez passer à l'installation d'un serveur DHCp si vous êtes en train de configurer un serveur destiné à distribuer des services pour votre réseau local ou bien directement à la configuration de Bind 9, le serveur DNS si vous êtes en train de configurer un serveur standalone.

Affichages
Boîte à outils