Debian - 6wall
Un article de Wiki.OmBreNoiRe.net.
|
Sommaire → Install → Aptitude → Locales → SSHd → Shorewall → 6wall → DHCP3-server → Bind9 → VsFTPd → Apache/MySQL → Mail → BackupManager |
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
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 :
deb http://debian.ombrenoire.net/etch/6wall ./
Puis on lance les commandes suivantes :
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) :
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.
monordi
Le fichier /etc/hosts
Il contient le nom de votre machine sur chacune des adresses des ips.
[...] # 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.
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 !
[...]
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)
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 :
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:~# 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
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
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 :
LOG=info LOGFILE=/var/log/messages
par :
LOG=notice LOGFILE=/var/log/6wall
- Modifier le fichier /etc/syslog.conf en remplaçant :
*.*;auth,authpriv.none -/var/log/syslog
*.=info;*.=notice;*.=warn;\
auth,authpriv.none;\
cron,daemon.none;\
mail,news.none -/var/log/messages
par :
*.*;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 :
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.
# # 6wall - Blacklist File # ############################################################################### #ADDRESS/SUBNET PROTOCOL PORT #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
- 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 :
Le fichier /etc/6wall/common6.def
Fourni avec le paquet, je le remet tel quel.
############################################################################ # 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.
# # 6wall - Host6 File # ############################################################################### #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
Le 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
# # 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> }}
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 :
LOG=info LOGFILE=/var/log/messages
par :
LOG=notice LOGFILE=/var/log/6wall
- Modifier le fichier /etc/syslog.conf en remplaçant :
*.*;auth,authpriv.none -/var/log/syslog
*.=info;*.=notice;*.=warn;\
auth,authpriv.none;\
cron,daemon.none;\
mail,news.none -/var/log/messages
par :
*.*;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 :
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.
# # 6wall - Blacklist File # ############################################################################### #ADDRESS/SUBNET PROTOCOL PORT #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
- 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 :
Le fichier /etc/6wall/common6.def
Fourni avec le paquet, je le remet tel quel.
############################################################################ # 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.
# # 6wall - Hosts6 File # ############################################################################### #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
Le 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
# # 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).
# # 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 :
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
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 :
# 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:~# chmod 640 *
root@monordi:~# chmod 755 orig
root@monordi:~# /etc/init.d/6wall restart
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 :
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.

