Informations :
Dates
- Publish : : Friday 07 february 2020
- Modification : Thursday 22 may 2025
- 5482 views
Share :
NdM : 2025/05/22 - Ajout d'informations
NdM : 2024/10/02 - Ajout de la fonction ipv6_ula() et nat_v6()
NdM : 2024/03/24 - Modification de la fonction ipv6_strongswan()
NdM : 2023/07/01 - Ajout de la fonction server_dns()
Je vais d'écrire comment-faire un pare-feu IPv6 - ICMPv6.
Installer les paquets qui sont des logiciels/commandes réseaux IPv6 en plus d'iptables
.
Script avec 1 ligne
001apt install iptables iputils-ping dnsutils net-tools whois ipv6toolkit thc-ipv6 ipv6pref
Importance du pare-feu ICMPv6 :
Même si ICMPv6 est essentiel pour le bon fonctionnement d'IPv6 (découverte des voisins, configuration automatique, etc.), certains types de messages ICMPv6 peuvent être utilisés à des fins malveillantes (attaques par déni de service, reconnaissance du réseau).Il est donc important de configurer un pare-feu pour contrôler le trafic ICMPv6 entrant et sortant ; Merci à Stéphane Huc pour sa documentation Firewall ICMPv6.
Outil principal : ip6tables
Sous Linux, le pare-feu pour IPv6 est géré par l'outil ip6tables
, qui est l'équivalent d'iptables
pour IPv4.
Types de messages ICMPv6 à considérer :
Messages essentiels à autoriser (en entrée et/ou en sortie) :
neighbor-solicitation
etneighbor-advertisement
(découverte des voisins)router-solicitation
etrouter-advertisement
(configuration automatique)packet-too-big
(gestion de la MTU du chemin)time-exceeded
(indique que le paquet a dépassé sa durée de vie)destination-unreachable
(indique que la destination est inaccessible)
Messages potentiellement à limiter ou bloquer (en entrée) :
- Certains types de messages echo-request (ping IPv6) peuvent être limités pour prévenir les attaques par inondation.
- D'autres types de messages moins critiques peuvent être bloqués en fonction de vos besoins de sécurité.
Exemples de règles ip6tables
:
Autoriser tous les messages ICMPv6 entrants et sortants (approche permissive, à adapter) :
Script avec 2 lignes
001$ ip6tables -A INPUT -p icmpv6 -j ACCEPT
002$ ip6tables -A OUTPUT -p icmpv6 -j ACCEPT
Bloquer tous les messages ICMPv6 entrants :
Script avec 1 ligne
001$ ip6tables -A INPUT -p icmpv6 -j DROP
Autoriser uniquement certains types de messages ICMPv6 entrants (approche plus restrictive) :
Script avec 9 lignes
001$ ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
002$ ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
003$ ip6tables -A INPUT -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT
004$ ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT
005$ ip6tables -A INPUT -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT
006$ ip6tables -A INPUT -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT
007$ ip6tables -A INPUT -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT
008# Bloquer tout autre trafic ICMPv6 entrant
009$ ip6tables -A INPUT -p icmpv6 -j DROP
ICMPv6 (Internet Control Message Protocol version 6) fait partie intégrante d'IPv6 et joue un rôle plus crucial que ICMPv4 dans IPv4. Bien qu'il soit courant de bloquer de nombreux messages ICMPv4 dans les pare-feu, le faire sans discernement avec ICMPv6 peut gravement altérer les fonctionnalités du réseau IPv6.
Pourquoi ICMPv6 est essentiel :
Contrairement à IPv4, qui s'appuie sur ARP pour la résolution des adresses locales et sur des protocoles distincts pour d'autres fonctions, IPv6 utilise largement ICMPv6 pour :
Protocole de découverte de voisins (NDP Neighbor Discovery Protocol) :
Ce protocole est essentiel pour :
- Sollicitation de routeur (RS Router Solicitation) (type 133) et Annonce de routeur (RA Router Advertisement) (type 134) : Utilisées par les hôtes pour trouver des routeurs et obtenir des informations de configuration réseau (préfixes, passerelle par défaut, serveurs DNS).
- Sollicitation de voisin (NS Neighbor Solicitation) (Type 135) et Annonce de voisin (NA Neighbor Advertisement) (Type 136) : Utilisées pour la résolution d'adresses (comme ARP dans IPv4), la détection d'adresses dupliquées (DAD) et la détection d'inaccessibilité des voisins.
- Découverte du MTU du chemin (PMTUD Path MTU Discovery) : S'appuie sur les messages « Paquet trop gros » (Type 2 Packet Too Big) pour empêcher la fragmentation et garantir un transfert de données efficace. Le blocage de ces messages peut entraîner des « trous noirs | black holes » où les connexions échouent en raison de paquets trop volumineux.
- Rapport d'erreurs | Error Reporting : Les messages « Destination inaccessible » (Type 1 Destination Unreachable), « Délai dépassé » (Type 3 Time Exceeded) et « Problème de paramètre » (Type 4 Parameter Problem) sont essentiels pour le diagnostic et le dépannage du réseau.
- Découverte d'écouteurs multicast (MLD Multicast Listener Discovery) : Utilisée pour gérer l'appartenance aux groupes multicast.
Pare-feu ICMPv6 - Bonnes pratiques :
L'approche générale du pare-feu ICMPv6 consiste à autoriser les messages nécessaires au fonctionnement du réseau tout en rejetant le trafic potentiellement malveillant ou inutile. La RFC 4890 (« Recommandations pour le filtrage des messages ICMPv6 dans les pare-feu ») fournit des instructions détaillées.
Voici une description des types ICMPv6 courants et de leur gestion par les pare-feu :
1. Messages à NE PAS IGNORER (essentiels pour les fonctionnalités de base) :
Ces messages sont généralement requis pour la connectivité IPv6 de base et doivent être autorisés :
- Destination inaccessible (Type 1 Destination Unreachable) : Tous les codes. Essentiel pour signaler les problèmes d'accessibilité réseau.
- Paquet trop volumineux (Type 2 Packet Too Big) : Tous les codes. Absolument essentiel pour la découverte du MTU du chemin. Son blocage entraînera des problèmes de connectivité.
- Temps dépassé (Type 3 Time Exceeded) : Code 0 (Limite de sauts dépassée | Hop Limit Exceeded). Important pour diagnostiquer les boucles de routage et les hôtes inaccessibles. Le code 1 (Temps de réassemblage des fragments dépassé | Fragment Reassembly Time Exceeded) peut généralement être ignoré s'il n'est pas lié à une session active. Problème de paramètre (type 4 Parameter Problem) : Codes 1 (type d'en-tête suivant non reconnu Unrecognized Next Header Type) et 2 (option IPv6 non reconnue | Unrecognized IPv6 Option). Essentiels pour signaler les problèmes liés aux champs d'en-tête IPv6. Le code 0 (champ d'en-tête erroné | Erroneous Header Field) peut parfois être ignoré s'il n'est pas lié à une session active.
- Sollicitation de voisin (type 135 Neighbor Solicitation) et Annonce de voisin (type 136 Neighbor Advertisement) : Essentielles au fonctionnement de la liaison locale, à la résolution d'adresses et à la détection des doublons. Elles doivent toujours être autorisées sur la liaison locale.
- Sollicitation de routeur (type 133 Router Solicitation) et Annonce de routeur (type 134 Router Advertisement) : Nécessaires pour que les hôtes obtiennent la configuration réseau. Doivent être autorisées sur les interfaces client.
2. Messages qui ne devraient normalement pas être ignorés (important dans de nombreux scénarios) :
Il est généralement judicieux de les autoriser, bien que des politiques de sécurité spécifiques puissent en décider autrement.
- Requête d'écho (type 128 Echo Request) et Réponse d'écho (type 129 Echo Reply) : (Ping). Souvent bloquées en IPv4 pour des raisons de sécurité (pour empêcher le mappage réseau), le vaste espace d'adressage d'IPv6 complique considérablement l'analyse. Leur blocage en IPv6 peut entraver le dépannage et les tests de connectivité. Il est souvent recommandé de les autoriser, éventuellement avec une limitation de débit, pour prévenir les attaques par déni de service.
- Requête d'écouteur multicast (type 130 Multicast Listener Query), Rapport d'écouteur multicast (type 131 Multicast Listener Report), Écouteur multicast terminé (type 132 Multicast Listener Done), Rapport d'écouteur multicast v2 (type 143 Multicast Listener Report v2) : Requis pour la découverte d'écouteur multicast (MLD Multicast Listener Discovery), essentielle à l'efficacité de la distribution du trafic multicast.
Considérations clés concernant les pare-feu pour ICMPv6 :
- Pare-feu à état (Stateful Firewalls) : La plupart des pare-feu modernes sont à état. Cela signifie qu'ils suivent les connexions actives et autorisent automatiquement les messages ICMPv6 liés à une session établie (par exemple, un message « Paquet trop volumineux (Packet Too Big) » pour une connexion TCP en cours). Cela simplifie grandement la création de règles.
- Règles par interface/zone (Per-Interface/Zone Rules) : Les règles ICMPv6 doivent être appliquées contextuellement. Par exemple, les annonces de routeur sont attendues sur les réseaux clients internes, mais pas sur les interfaces WAN externes.
- Limitation de débit (Rate Limiting) : Même pour les types ICMPv6 autorisés, comme les requêtes d’écho (Echo Request), envisagez de mettre en œuvre une limitation de débit afin de limiter les attaques par déni de service (DoS attacks) potentielles.
- Journalisation (Logging) : Enregistrez les paquets ICMPv6 perdus, notamment lors du déploiement initial d’IPv6 ou du dépannage, afin d’identifier les erreurs de configuration ou les comportements réseau inattendus.
- Conséquences pour la sécurité (Security Implications) : Si le blocage d’ICMPv6 peut perturber certaines fonctionnalités, autoriser sans discernement tout le trafic ICMPv6 peut exposer votre réseau à certains types d’attaques. Une approche équilibrée est cruciale.
- Attaques par épuisement du cache voisin (Neighbor Cache Exhaustion Attacks) : Inonder/Flooder un réseau avec des messages NS/NA (Neighbor Solicitation/Neighbor Advertisement) peut épuiser le cache voisin des périphériques, entraînant un déni de service. Les pare-feu peuvent disposer de mécanismes de protection contre ce phénomène.
- Inondation/usurpation d’adresses de routeur (Router Advertisement Flooding/Spoofing) : Des agents d’accès malveillants (Malicious RAs) peuvent rediriger le trafic ou annoncer des préfixes incorrects. Les pare-feu doivent être configurés pour prévenir de telles attaques, notamment aux frontières du réseau.
Exemples de règles de pare-feu (conceptuelles) :
- Autoriser les protocoles ICMPv6 établis/liés (Allow established/related ICMPv6) : autoriser icmpv6 tout état établi, lié (state established,related).
- Autoriser la sollicitation de routeur entrante (type 133) sur les interfaces internes : autoriser icmpv6 type 133 depuis le réseau interne vers tout.
- Autoriser l'annonce de routeur sortante (type 134) depuis les routeurs internes : autoriser icmpv6 type 134 depuis le routeur interne vers tout.
- Autoriser la sollicitation de voisin (type 135) et l'annonce de voisin (type 136) sur les liaisons locales : autoriser icmpv6 type 135, 136 pour n'importe quel lien local.
- Autoriser les paquets trop volumineux (type 2) entrants et sortants.
- Autoriser les demandes d'écho (type 128) et les réponses d'écho (type 129) (avec limitation de débit si nécessaire).
- Refuser tous les autres messages ICMPv6 entrants par défaut.
En résumé, un pare-feu ICMPv6 efficace nécessite une compréhension fine de son rôle dans IPv6. L'approche « refuser tout », courante dans IPv4, n'est pas adaptée. Privilégiez plutôt l'autorisation explicite des messages ICMPv6 essentiels tout en maintenant une politique de refus par défaut pour tout le reste du trafic.
Exemple : Pare-feu Linux ip6tables
ip6tables
vous offre un contrôle précis. Cet exemple définit les règles de base pour un réseau « interne » connecté à « Internet ».
Script avec 84 lignes
001#!/bin/bash
002 003# Define internal and external interfaces
004INT_IF="eth0" # Your internal network interface
005EXT_IF="eth1" # Your external (Internet-facing) interface
006 007# Clear existing rules (DANGEROUS on production systems without prior planning!)
008ip6tables -F
009ip6tables -X
010ip6tables -Z
011 012# Set default policies to DROP (secure by default)
013ip6tables -P INPUT DROP
014ip6tables -P FORWARD DROP
015ip6tables -P OUTPUT ACCEPT # Allow outbound traffic by default for now
016 017# --- Allow established and related connections ---
018# This is crucial for stateful firewalling.
019ip6tables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
020ip6tables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
021 022# --- Allow Loopback traffic ---
023ip6tables -A INPUT -i lo -j ACCEPT
024ip6tables -A OUTPUT -o lo -j ACCEPT
025 026# --- ICMPv6 Rules for INPUT Chain (Traffic to the Firewall itself) ---
027 028# Allow Router Advertisements (if this machine is a host that needs to receive them)
029ip6tables -A INPUT -i $EXT_IF -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT
030ip6tables -A INPUT -i $INT_IF -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT
031 032# Allow Neighbor Solicitation and Advertisement (essential for local link operation)
033# Limited to local link (fe80::/10) for security, though often allowed more broadly for simplicity.
034ip6tables -A INPUT -i $EXT_IF -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
035ip6tables -A INPUT -i $EXT_IF -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
036ip6tables -A INPUT -i $INT_IF -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
037ip6tables -A INPUT -i $INT_IF -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
038 039# Allow Echo Request (ping) to the firewall (optional, but good for troubleshooting)
040# You might want to rate-limit this on the external interface.
041ip6tables -A INPUT -i $EXT_IF -p icmpv6 --icmpv6-type echo-request -j ACCEPT
042ip6tables -A INPUT -i $INT_IF -p icmpv6 --icmpv6-type echo-request -j ACCEPT
043 044# Allow Router Solicitation (if this machine is a host that needs to send them)
045ip6tables -A INPUT -i $EXT_IF -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT # Unlikely from external
046ip6tables -A INPUT -i $INT_IF -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT
047 048 049# --- ICMPv6 Rules for FORWARD Chain (Traffic passing through the Firewall) ---
050 051# Allow essential ICMPv6 error messages (Packet Too Big, Unreachable, Time Exceeded, Parameter Problem)
052# These are absolutely critical for IPv6 functionality and PMTUD.
053ip6tables -A FORWARD -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT
054ip6tables -A FORWARD -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT
055ip6tables -A FORWARD -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT
056ip6tables -A FORWARD -p icmpv6 --icmpv6-type parameter-problem -j ACCEPT
057 058# Allow Router Solicitation/Advertisement for internal hosts passing through the firewall
059ip6tables -A FORWARD -i $INT_IF -o $EXT_IF -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT
060ip6tables -A FORWARD -i $EXT_IF -o $INT_IF -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT
061 062# Allow Neighbor Solicitation/Advertisement for traffic crossing segments (if applicable)
063# Typically handled by local link, but sometimes needed for proxy NDP etc.
064ip6tables -A FORWARD -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
065ip6tables -A FORWARD -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
066 067# Allow Echo Request/Reply for forwarded traffic (e.g., internal host pinging external)
068ip6tables -A FORWARD -p icmpv6 --icmpv6-type echo-request -j ACCEPT
069ip6tables -A FORWARD -p icmpv6 --icmpv6-type echo-reply -j ACCEPT
070 071 072# --- Log and drop anything else (for debugging dropped packets) ---
073# It's good practice to log before dropping during initial setup.
074# ip6tables -A INPUT -j LOG --log-prefix "Dropped INPUT: "
075# ip6tables -A FORWARD -j LOG --log-prefix "Dropped FORWARD: "
076# ip6tables -A OUTPUT -j LOG --log-prefix "Dropped OUTPUT: "
077 078# For OUTBOUND chain (usually ACCEPT by default for client machines, but can be restricted for servers)
079# If default OUTPUT policy is DROP, you'd need rules here for outgoing ICMPv6, e.g.:
080# ip6tables -A OUTPUT -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT
081# ip6tables -A OUTPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
082# ...and so on for necessary outgoing ICMPv6 types.
083 084echo "ip6tables rules applied."
Explication de l'exemple d'ip6tables
ci-dessus :
- Politique d'abandon par défaut (Default Drop Policy) : Définir les politiques par défaut sur DROP est l'approche la plus sécurisée, garantissant que tout ce qui n'est pas explicitement autorisé est bloqué.
- RELATED,ESTABLISHED : Il s'agit de la pierre angulaire du pare-feu avec état. Elle autorise le trafic de retour pour les connexions provenant du pare-feu ou transitant par celui-ci, ainsi que le trafic associé, comme les messages « Packet Too Big ».
- INPUT vs. FORWARD :
- Les règles INPUT s'appliquent au trafic destiné au pare-feu lui-même.
- Les règles FORWARD s'appliquent au trafic traversant le pare-feu (agissant comme un routeur).
- Types ICMPv6 spécifiques : Chaque règle cible un type ICMPv6 spécifique à l'aide de l'option --icmpv6-type. Vous pouvez utiliser des noms (comme router-advertisement) ou des nombres (comme 134).
- Spécificité de l'interface (Interface Specificity) : L'utilisation de -i (interface d'entrée) et de -o (interface de sortie) permet de préciser où les règles s'appliquent.
- Journalisation (Logging) : Les règles LOG commentées sont très utiles pour déterminer les causes des abandons de trafic. Ces exemples illustrent l'équilibre critique requis pour un pare-feu ICMPv6 : autoriser ce qui est nécessaire au bon fonctionnement du réseau et refuser explicitement tout le reste. Consultez toujours la RFC 4890 pour des conseils complets et adaptez ces exemples à la topologie de votre réseau et à vos exigences de sécurité.
Mon Pare-feu Linux firewall-ipv6.sh
:
Je me suis concocté un script firewall-ipv6.sh
en quelques lignes, avec des fonctions complémentaires :
J'ai ajouté une fonction icmpv6_limit()
pour la protection à 1 ping/seconde par adresse IPv6::/128 (--icmpv6-type 128/0
que Stéphane Bortzmeyer nous expliquer (ici et là) :) Au dessus de 1 ping par seconde (ICMPv6 echo-request) on DROP l'explosion de PING, et cela par une seule IPv6 source (--hashlimit-srcmask 128
).
J'ai ajouté une fonction pour filtrer les paquets ICMPv6 depuis IPtables pour les requetes des routeurs : c'est la fonction icmpv6_huc()
; j'ai pris comme exemple la page Firewall ICMPv6 (modifiée le 13 Juillet 2023) très instructive de Stéphane Huc.
NdMoi-même : Il faut lancer/executer la fonction en dessous de (pour qu'elle soit lancer après) la fonction icmpv6_huc
pour que la règle ip6tables -I INPUT -p icmpv6 ... -j DROP
soit au dessus de la chaîne aICMPs ;)
NdMoi-même 20250522 : J'ai inverssé l'ordre de certaines fonctions et il faut que je tate 2, 3 choses supplémentaires ; je reviens vite ajouter/modifier cette page ;)
Script avec 539 lignes
001#!/bin/bash
002### BEGIN INIT INFO
003# Provides: firewall-ipv6
004# Required-Start: $remote_fs $syslog
005# Required-Stop: $remote_fs $syslog
006# Default-Start: 2 3 4 5
007# Default-Stop: 0 1 6
008# Short-Description: Start daemon at boot time
009# Description: Enable service provided by daemon.
010### END INIT INFO
011#####-------------------------- VARIABLES ----------------------------######
012 013# iptables command path
014IP6TABLE="/sbin/ip6tables"
015 016# network interface
017LOOP_IF="lo"
018 019WAN_IF="vmbr0"
020VM1_IF="vmbr1"
021 022# Network and IPs
023#SUBNETPREFIX="2607:5300:0060:9389::/64"
024 025#WAN_IP="2607:5300:60:9389::1"
026 027#CT_DNS="fc01::10:10:0:1"
028#CT_WEB="fc01::10:10:0:10"
029 030# port du service ssh
031port_ssh="22"
032 033# rsync service port
034port_rsync="873"
035 036# tcp and udp ports to open
037TCP_OK="514 4949" # SYSLOG MUNIN
038UDP_OK="123 161 514 547" # NTP SNMP SYSLOG DHCP
039 040# IP addresses that have ssh access to the server
041SSH_OK="2001:0bc8:25bb:ff00::/56 fc00::/7 fec0::/10"
042 043# ip accessing the server in rsync
044RSYNC_OK="2001:0bc8:25bb:ff00::/56 fc00::/7 fec0::/10"
045 046#####
047# Set the sysctl
048#####
049function kernel()
050{
051# Don't accept source routed packets.
052/bin/echo "0" > /proc/sys/net/ipv6/conf/all/accept_source_route
053 054# Disable ICMP redirect acceptance.
055/bin/echo "0" > /proc/sys/net/ipv6/conf/all/accept_redirects
056 057# Enable the following lines only if a router!
058# Enabling IPv6 forwarding disables route-advertisement reception - accept_ra=0|2
059# A static gateway will need to be assigned.
060#
061echo "1" > /proc/sys/net/ipv6/conf/all/forwarding
062#
063#End router forwarding rules
064 065echo " "+ KERNEL : [OK]
066}
067 068#####
069# Accept everything from and to the local "lo"
070#####
071 072function loopback()
073{
074$IP6TABLE -A INPUT -i lo -j ACCEPT
075$IP6TABLE -A FORWARD -i lo -j ACCEPT
076$IP6TABLE -A FORWARD -o lo -j ACCEPT
077$IP6TABLE -A OUTPUT -o lo -j ACCEPT
078 079echo " "+ LOOPBACK : [OK]
080}
081 082#####
083# Setting the general rules (DROP||ACCEPT)
084#####
085 086function policy()
087{
088$IP6TABLE -P INPUT $1
089$IP6TABLE -P FORWARD $1
090$IP6TABLE -P OUTPUT $1
091 092echo " "+ POLICY $1 : [OK]
093}
094 095#####
096# ACCEPT THE ESTABLISHED, RELATED REQUESTS
097#####
098 099function generique()
100{
101# Allow anything out on the internet
102$IP6TABLE -A OUTPUT -o $WAN_IF -j ACCEPT
103# Allow established, related packets back in
104$IP6TABLE -A INPUT -i $WAN_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
105 106echo " "+ GENERIQUE : [OK]
107}
108 109#####
110# We set the rules for local IPv6 addresses (ULA) - here it's open
111#####
112 113function ipv6_ula()
114{
115echo " |";
116echo " + IPv6 - Addrs Unique Locale Area -----------------------";
117 118# Allow Link-Local addresses
119# network range : fc00:0000:0000:0000:0000:0000:0000:0000-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
120 121echo " |";
122$IP6TABLE -A INPUT -s fc00::/7 -j ACCEPT
123$IP6TABLE -A FORWARD -s fc00::/7 -d fc00::/7 -j ACCEPT
124$IP6TABLE -A OUTPUT -d fc00::/7 -j ACCEPT
125echo " | +-→ "fc00::/7 : ACCEPT;
126echo " | |";
127echo " |" + IPv6 - Addrs Unique Locale Area : [OK]
128 129}
130 131#####
132# We set the rules for multicast IPv6 addresses - here it's open
133#####
134function ipv6_multicast()
135{
136echo " |";
137echo " + IPv6 - Addrs Multicast -----------------------";
138 139# Allow multicast
140# network range : ff00:0000:0000:0000:0000:0000:0000:0000-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
141 142echo " |";
143$IP6TABLE -A INPUT -d ff00::/8 -j ACCEPT
144$IP6TABLE -A FORWARD -s ff00::/8 -d ff00::/8 -j ACCEPT
145$IP6TABLE -A OUTPUT -d ff00::/8 -j ACCEPT
146echo " | +-→ "ff00::/8 : ACCEPT;
147echo " | |";
148echo " |" + IPv6 - Addrs Multicast : [OK]
149}
150 151#####
152# We set the rules for link-local IPv6 addresses (LLA) - here it's open
153#####
154function ipv6_link_local()
155{
156echo " |";
157echo " + IPv6 - Addrs Link-Local Unicast -----------------------";
158 159# Allow Link-Local addresses
160# network range : fe80:0000:0000:0000:0000:0000:0000:0000-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff
161 162echo " |";
163$IP6TABLE -A INPUT -s fe80::/10 -j ACCEPT
164$IP6TABLE -A FORWARD -s fe80::/10 -d fe80::/10 -j ACCEPT
165$IP6TABLE -A OUTPUT -d fe80::/10 -j ACCEPT
166echo " | +-→ "fe80::/10 : ACCEPT;
167echo " | |";
168echo " | "+ IPv6 - Addrs Link-Local : [OK]
169 170}
171 172#####
173# We set the rules for secure local IPv6 addresses (VPN/strongSwan) (SLA) - here it's open for inter-site networks
174#####
175 176function ipv6_strongswan()
177{
178# Default ------------------
179echo " |";
180echo " + IPv6 - Addrs Site-Local Secure Area Network -------------------------";
181 182# Allow Secure Area Network addresses
183# network range : fec0:0000:0000:0000:0000:0000:0000:0000-feff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
184 185echo " |";
186$IP6TABLE -A INPUT -s fec0::/10 -j ACCEPT
187$IP6TABLE -A FORWARD -s fec0::/10 -d fec0::/10 -j ACCEPT
188$IP6TABLE -A OUTPUT -d fec0::/10 -j ACCEPT
189echo " | +-→ "fec0::/10 : ACCEPT;
190echo " | |";
191echo " | "+ IPv6 - Addrs Secure Area Network : [OK]
192 193# Add ------------------
194 195echo " |";
196# Allow Forwarding SLAN (fec0::/10) <> ULA (fc00::/7)
197# network range : fc00:0000:0000:0000:0000:0000:0000:0000-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
198 199echo " + IPv6 - Forwarding Addrs SWAN 2 ULA Networks -------------------------";
200echo " |";
201$IP6TABLE -A FORWARD -s fec0::/10 -d fc00::/7 -j ACCEPT
202$IP6TABLE -A FORWARD -d fec0::/10 -s fc00::/7 -j ACCEPT
203echo " | +-→ fec0::/10 <?> fc00::/7 : ACCEPT";
204echo " | |";
205echo " | "+ IPv6 - Forwarding Addrs SWAN 2 ULA Networks : [OK]
206echo " |";
207 208}
209 210#####
211# We allow ICMPv6 requests to pass
212#####
213 214function icmpv6_generique()
215{
216$IP6TABLE -I INPUT -p icmpv6 -j ACCEPT
217$IP6TABLE -I FORWARD -p icmpv6 -j ACCEPT
218$IP6TABLE -I OUTPUT -p icmpv6 -j ACCEPT
219 220echo " "+ ICMPV6 - ACCEPT : [OK]
221}
222 223####
224# Stephane Bortzmeyer's rule: DROP ICMP LIMIT 1/sec per IPv6::/128
225# Send after the aICMPv6 chain (so that it is above -I)
226####
227 228function icmpv6_limit()
229{
230# Au dessus de 1 ping par seconde (ICMPv6 echo-request) on DROP l'explosion PING d'une seule source IPv6 (masque 128)
231$IP6TABLE -I INPUT -p icmpv6 --icmpv6-type 128/0 -m hashlimit --hashlimit-name ICMP --hashlimit-above 1/second --hashlimit-burst 1 --hashlimit-mode srcip --hashlimit-srcmask 128 -j DROP
232 233echo " "+ ICMPV6 - LIMIT 1/second DROP : [OK]
234}
235 236 237#####
238# Adaptation of Stephane Huc's script for ICMPv6
239#####
240 241function icmpv6_huc()
242{
243# Allow dedicated ICMPv6 packettypes, do this in an extra chain because we need it everywhere
244$IP6TABLE -N aICMPs
245246
# Destination unreachable
247$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 1 -j ACCEPT # destination-unreachable; Must Not Be Dropped
248249
# Packet too big
250$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 2/0 -j ACCEPT # packet too big; Must Not Be Dropped
251252
# Time exceeded
253$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 3/0 -j ACCEPT # time exceeded
254$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 3/1 -j ACCEPT # time exceeded
255256
# Parameter problem
257$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 4/0 -j ACCEPT # parameter pb: Erroneous header field encountered
258$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 4/1 -j ACCEPT # parameter pb: Unrecognized Next Header Type encountered
259$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 4/2 -j ACCEPT # parameter pb: Unrecognized IPv6 option encountered
260 261# Echo Request (protect against flood)
262# Commenter cette ligne
263# $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 128/0 -m limit --limit 1/sec --limit-burst 1 -j ACCEPT # ping tool: echo request message
264$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 128/0 -j ACCEPT
265266
# Echo Reply
267# Commenter cette ligne
268# $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 129/0 -m limit --limit 5/sec --limit-burst 10 -j ACCEPT # ping tool: echo reply message
269$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 128/0 -j ACCEPT
270 271echo " "+ ICMPV6 - DEFAULT : [OK]
272 273# link-local multicast receive notification mssg (need link-local src address, with hop-limit: 1)
274$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 130/0 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT
275$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 131/0 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT
276$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 132/0 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT
277echo " "+ ICMPV6 - LINK-LOCAL : [OK]
278 279# address configuration and routeur selection mssg (received with hop limit = 255)
280$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 133/0 -m hl --hl-eq 255 -j ACCEPT # Router Solicitation
281$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 134/0 -s fe80::/64 -m hl --hl-eq 255 -j ACCEPT # Router Advertisement
282$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 135/0 -m hl --hl-eq 255 -j ACCEPT # Neighbor Solicitation
283$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 136/0 -m hl --hl-eq 255 -j ACCEPT # Neighbor Advertisement
284285
$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 137/0 -j DROP # Redirect Message
286$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 138/0 -j DROP # Router Renumbering (Rechargement du routeur)
287288
$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 139/0 -j DROP # ICMP Node Information Query
289$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 140/0 -j DROP # ICMP Node Information Response
290291
$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 141/0 -d ff02::1 -m hl --hl-eq 255 -j ACCEPT # Inverse Neighbor Discovery Solicitation Message
292$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 142/0 -m hl --hl-eq 255 -j ACCEPT # Inverse Neighbor Discovery Advertisement Message
293echo " "+ ICMPV6 - ADD CONF '&' ROUT€ SELECTION : [OK]
294 295# link-local multicast receive notification mssg (need link-local src address, with hop-limit: 1)
296$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 143 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT
297298
# needed for mobylity
299$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 144/0 -j DROP
300$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 145/0 -j DROP
301$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 146/0 -j DROP
302$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 147 -j DROP
303304
# SEND certificate path notification mssg (received with hop limit = 255)
305$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 148 -m hl --hl-eq 255 -j ACCEPT # Certification Path Solicitation Message
306$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 149 -m hl --hl-eq 255 -j ACCEPT # Certification Path Advertisement Message
307308
# multicast routeur discovery mssg (need link-local src address and hop limit = 1)
309$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 151 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT
310$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 152 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT
311$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 153 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT
312echo " "+ ICMPV6 - MULTICAST ROUT€ DISCOVERY : [OK]
313314
#
315$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 200 -j DROP # private experimentation
316$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 201 -j DROP # private experimentation
317$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 255 -j DROP # expansion error messages ICMPv6
318echo " "+ ICMPV6 - EXPERIMENTATION : [OK]
319 320# Only the ROUT€ is allowed to ping us (read FAQ this is a requirement)
321#$IP6TABLE -A INPUT -p icmpv6 -m limit --limit 5/s --limit-burst 4 -j aICMPs
322#$IP6TABLE -A OUTPUT -m state ! --state INVALID -j aICMPs
323 324$IP6TABLE -I INPUT -p icmpv6 -j aICMPs
325$IP6TABLE -I FORWARD -p icmpv6 -j aICMPs
326$IP6TABLE -I OUTPUT -p icmpv6 -j aICMPs
327328
echo " "+ ICMPV6 - INLIMIT + OUTPUT : [OK]
329}
330 331#####
332# FORWARDING between cards (vmbr0 ←> vmbr1)
333#####
334 335function ipv6_forwarding()
336{
337# Allow forwarding
338# $IP6TABLE -A FORWARD -m state --state NEW -i $VM1_IF -o $WAN_IF -s $SUBNETPREFIX -j ACCEPT
339# $IP6TABLE -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
340 341$IP6TABLE -A FORWARD -i $VM1_IF -o $WAN_IF -j ACCEPT
342$IP6TABLE -A FORWARD -o $VM1_IF -i $WAN_IF -j ACCEPT
343 344echo " "+ IPv6 - FORWARDING : [OK]
345}
346 347#####
348# NAT V6
349#####
350function nat_v6()
351{
352# NET FOR LXC EXCEPT TO THE ULA NETWORK# NET FOR LXC EXCEPT TO THE ULA NETWORK
353$IP6TABLE -t nat -A POSTROUTING -o $WAN_IF -s $CT_WEB ! -d fc00::/7 -j MASQUERADE
354 355echo " "+ NAT : [OK]
356}
357 358#####
359# Opening SSH access to certain IPs
360# Opening SSH access to everyone for 3 requests per minute
361#####
362 363function ssh_ok()
364{
365for host in $SSH_OK
366do
367$IP6TABLE -A INPUT -s $host -p tcp --dport $port_ssh -j ACCEPT
368$IP6TABLE -A OUTPUT -d $host -p tcp --sport $port_ssh -j ACCEPT
369done
370 371$IP6TABLE -A INPUT -p tcp --dport $port_ssh -m state --state NEW -m recent --set --name SSH
372$IP6TABLE -A INPUT -p tcp --dport $port_ssh -m recent --update --seconds 60 --hitcount 3 --rttl --name SSH -j DROP
373$IP6TABLE -A INPUT -p tcp --dport $port_ssh -j ACCEPT
374 375echo " "+ SSH : [OK]
376}
377 378#####
379# Opening RSYNC access to certain IP addresses
380#####
381 382function rsync_ok()
383{
384for host in $RSYNC_OK
385do
386$IP6TABLE -A INPUT -s $host -p tcp --dport $port_rsync -j ACCEPT
387$IP6TABLE -A OUTPUT -d $host -p tcp --sport $port_rsync -j ACCEPT
388done
389 390echo " "+ RSYNC : [OK]
391}
392 393#####
394# Opening TCP and UPD ports
395#####
396 397function tcp_ok()
398{
399for port in $TCP_OK
400do
401$IP6TABLE -A INPUT -p tcp --dport $port -j ACCEPT
402$IP6TABLE -A OUTPUT -p tcp --sport $port -j ACCEPT
403done
404 405echo " "+ TCP : [OK]
406}
407 408function udp_ok()
409{
410for port in $UDP_OK
411do
412$IP6TABLE -A INPUT -p udp --dport $port -j ACCEPT
413$IP6TABLE -A OUTPUT -p udp --sport $port -j ACCEPT
414done
415 416echo " "+ UDP : [OK]
417}
418 419#####
420# Open HTTP(S) access to the LAN & NET interface
421#####
422 423function server_http()
424{
425# on a 1 seule IPv6::/128 GLOBAL UNICAST ADDRESS (VPS) -→ on a donc fait un network ULA (Unique Local Addresses) for les containers
426# CT_WEB="fc01::10:10:0:10"
427 428HTTP_PORTS="80 443"
429for port in $HTTP_PORTS
430do
431# service Web local and/or another machine
432$IP6TABLE -A INPUT -m state --state NEW -m tcp -p tcp --dport $port -j ACCEPT
433$IP6TABLE -A INPUT -m state --state ESTABLISHED,RELATED -m tcp -p tcp --dport $port -j ACCEPT
434# $IP6TABLE -A INPUT -p tcp --dport $port -j ACCEPT
435# $IP6TABLE -A OUTPUT -p tcp --sport $port -j ACCEPT
436$IP6TABLE -A OUTPUT -m state --state ESTABLISHED,RELATED -m tcp -p tcp --sport $port -j ACCEPT
437# Web service is on another machine, a container or a local machine
438# $IP6TABLE -t nat -A PREROUTING -d $WAN_IP -p tcp --dport $port -j DNAT --to-destination [$CT_WEB]:$port
439done
440echo " "+ APACHE : [OK]
441}
442 443#####
444# Open DNS(S) access to the NET interface
445#####
446 447function server_dns()
448{
449# on a 1 seule IPv6::/128 GLOBAL UNICAST ADDRESS (VPS) -→ on a donc fait un network ULA (Unique Local Addresses) for les containers
450# CT_DNS="fc01::10:10:0:1"
451452
DNS_PORTS_TCP="53"
453for port in $DNS_PORTS_TCP
454do
455# service Bind9 local and/or another machine
456$IP6TABLE -A INPUT -m state --state NEW -m tcp -p tcp --dport $port -j ACCEPT
457# $IP6TABLE -A INPUT -m state --state ESTABLISHED,RELATED -m tcp -p tcp --dport $port -j ACCEPT
458$IP6TABLE -A INPUT -i $WAN_IF -p tcp --dport $port -m hashlimit --hashlimit-name NAMED --hashlimit-above 20/second --hashlimit-mode srcip --hashlimit-burst 20 --hashlimit-srcmask 128 -j DROP
459$IP6TABLE -A OUTPUT -m state --state ESTABLISHED,RELATED -m tcp -p tcp --sport $port -j ACCEPT
460$IP6TABLE -A OUTPUT -p tcp --sport $port -j LOG --log-prefix "OUTPUT-T-NAMED:"
461# Bind9 service is on another machine, a container or a local machine
462# $IP6TABLE -t nat -A PREROUTING -d $WAN_IP -p tcp --dport $port -j DNAT --to-destination [$CT_DNS]:$port
463done
464 465DNS_PORTS_UDP="53"
466for port in $DNS_PORTS_UDP
467do
468# service Bind9 local and/or another machine
469$IP6TABLE -A INPUT -i $WAN_IF -p udp --dport $port -m state --state NEW -m recent --set --name NAMED
470# $IP6TABLE -A INPUT -i $WAN_IF -p udp --dport $port -m state --state ESTABLISHED,RELATED -m recent --set --name NAMED
471$IP6TABLE -A INPUT -i $WAN_IF -p udp --dport $port -m recent --update --seconds 60 --hitcount 10 --rttl --name NAMED -j DROP
472$IP6TABLE -A OUTPUT -m state --state ESTABLISHED,RELATED -m udp -p udp --sport $port -j ACCEPT
473$IP6TABLE -A OUTPUT -p udp --sport $port -j LOG --log-prefix "OUTPUT-U-NAMED:"
474# Bind9 service is on another machine, a container or a local machine
475# $IP6TABLE -t nat -A PREROUTING -d $WAN_IP -p udp --dport $port -j DNAT --to-destination [$CT_DNS]:$port
476done
477 478echo " "+ DNS : [OK]
479}
480 481 482 483#####-------------------------- START / STOP ----------------------------######
484case "$1" in
485 486start|restart)
487$0 stop
488echo "$0 Starting"
489kernel
490loopback
491 492# old function
493# icmpv6_generique
494# new function with --icmpv6-type
495icmpv6_huc
496icmpv6_limit
497498
# nat_v6
499500
ssh_ok
501rsync_ok
502tcp_ok
503udp_ok
504 505server_http
506server_dns
507508
ipv6_ula
509ipv6_multicast
510ipv6_link_local
511ipv6_strongswan
512ipv6_forwarding
513 514generique
515 516policy DROP
517;;
518 519stop)
520echo "$0 Stop"
521$IP6TABLE -F
522$IP6TABLE -t nat -F
523$IP6TABLE -Z
524$IP6TABLE -X
525policy ACCEPT
526;;
527status)
528echo "$0 Status"
529$IP6TABLE -L -vn
530$IP6TABLE -L -vn -t nat
531;;
532 533*)
534echo "usage : $0 (status|start|stop|restart)"
535;;
536 537esac
538 539#####-------------------------- START / STOP ----------------------------######
Pour le rendre executable pour l'utilisateur : chmod u+x firewall-ipv6.sh
:
Pour executer le script : sh firewall-ipv6.sh (status|start|stop|restart)
Activer le firewall au démarage et à l'arrêt de la machine : Runlevels de l'init(ialisation) # Default-Start : 2 3 4 5 # Default-Stop : 0 1 6
.
Script avec 2 lignes
001Puis aprés vous pouvez lancer le script en executantln -s /root/firewall-ipv6.sh /etc/init.d/firewall-ipv6
002update-rc.d firewall-ipv6 defaults
/etc/init.d/firewall-ipv6 (status|start|stop|restart)
Sauvegarder/restaurer votre configuration firewall.
J'ajoute 2 commandes qui peuvent être utile :) et qui peuvent servir pour NuFW.
Sauvegarder votre configuration firewall actuelle :
Script avec 1 ligne
001ip6tables-save > /etc/firewall-ipv6.conf
Restaurer votre configuration firewall :
Script avec 1 ligne
001ip6tables-restore < /etc/firewall-ipv6.conf
Visualiser votre firewall INPUT (entrée), FORWARD (transfert entre vos cartes réseaux), OUTPUT (sortie) et celle dédiée aux paquets ICMPs que nous avons créé :
Chain INPUT, FORWARD, OUTPUT, aICMPs.
Script avec 5 lignes
001ip6tables -L -vn
002ip6tables -L INPUT -vn
003ip6tables -L FORWARD -vn
004ip6tables -L OUTPUT -vn
005ip6tables -L aICMPs -vn
La table NAT (Network Translation Address) - çà existe ;) ^^ :
Script avec 1 ligne
001ip6tables -L -vn -t nat
Cordialement,
Romain