Información :
fechas
- Publicar : : Friday 07 february 2020
- Enmienda : Monday 07 september 2026
- 7509 vistas
Cuota :
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-solicitationetneighbor-advertisement(découverte des voisins)router-solicitationetrouter-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 ACCEPT002$ 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 ACCEPT002$ ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT003$ ip6tables -A INPUT -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT004$ ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT005$ ip6tables -A INPUT -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT006$ ip6tables -A INPUT -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT007$ ip6tables -A INPUT -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT008# Bloquer tout autre trafic ICMPv6 entrant009$ 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/bash002 003# Define internal and external interfaces004INT_IF="eth0" # Your internal network interface005EXT_IF="eth1" # Your external (Internet-facing) interface006 007# Clear existing rules (DANGEROUS on production systems without prior planning!)008ip6tables -F009ip6tables -X010ip6tables -Z011 012# Set default policies to DROP (secure by default)013ip6tables -P INPUT DROP014ip6tables -P FORWARD DROP015ip6tables -P OUTPUT ACCEPT # Allow outbound traffic by default for now016 017# --- Allow established and related connections ---018# This is crucial for stateful firewalling.019ip6tables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT020ip6tables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT021 022# --- Allow Loopback traffic ---023ip6tables -A INPUT -i lo -j ACCEPT024ip6tables -A OUTPUT -o lo -j ACCEPT025 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 ACCEPT030ip6tables -A INPUT -i $INT_IF -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT031 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 ACCEPT035ip6tables -A INPUT -i $EXT_IF -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT036ip6tables -A INPUT -i $INT_IF -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT037ip6tables -A INPUT -i $INT_IF -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT038 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 ACCEPT042ip6tables -A INPUT -i $INT_IF -p icmpv6 --icmpv6-type echo-request -j ACCEPT043 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 external046ip6tables -A INPUT -i $INT_IF -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT047 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 ACCEPT054ip6tables -A FORWARD -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT055ip6tables -A FORWARD -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT056ip6tables -A FORWARD -p icmpv6 --icmpv6-type parameter-problem -j ACCEPT057 058# Allow Router Solicitation/Advertisement for internal hosts passing through the firewall059ip6tables -A FORWARD -i $INT_IF -o $EXT_IF -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT060ip6tables -A FORWARD -i $EXT_IF -o $INT_IF -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT061 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 ACCEPT065ip6tables -A FORWARD -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT066 067# Allow Echo Request/Reply for forwarded traffic (e.g., internal host pinging external)068ip6tables -A FORWARD -p icmpv6 --icmpv6-type echo-request -j ACCEPT069ip6tables -A FORWARD -p icmpv6 --icmpv6-type echo-reply -j ACCEPT070 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 ACCEPT081# ip6tables -A OUTPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT082# ...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 811 lignes
001#!/bin/bash002### BEGIN INIT INFO003# Provides: firewall-ipv6004# Required-Start: $remote_fs $syslog005# Required-Stop: $remote_fs $syslog006# Default-Start: 2 3 4 5007# Default-Stop: 0 1 6008# Short-Description: Start daemon at boot time009# Description: Enable service provided by daemon.010### END INIT INFO011 012# --------------------------------------------------------------------------013# Author : O.Romain.Jaillet-ramey (orj@lab3w.fr)014# Description : Firewall IPv6 ICMPv6 - ULA / MULTICAST / SWAN015# Date Created : 2020-02-07016# Date Modified : 2026-08-24017# ------------------------------018 019#####-------------------------- VARIABLES ----------------------------######020 021# ip6tables command path022 023IP6TABLE="/sbin/ip6tables"024 025# Interface network026 027LOOP_IF="lo"028 029NET_IF="eth0"030VPN_IF="eth0"031 032INCUS_IF="incusbr0"033LXC_IF="lxcbr0"034 035# Addresses IPv6036 037NET_IP="2a02:4780:28:5295:0000:0000:0000:0001"038VPN_IP="fee1::1"039 040INCUS_IP="fc00:4780:28:5295::fd"041LXC_IP="fc00::10:0:3:fd"042 043# Networks IPv6044 045LAN_IPs="fc01::10:0:0:0/80"046SLAN_IPs="fee1::/16"047 048# SSH service port049 050port_ssh="22"051 052# TCP and UDP ports to open053 054TCP_OK="514 4949 5201" # SYSLOG MUNIN IPERF055UDP_OK="123 161 514 546 547" # NTP SNMP SYSLOG DHCP056 057# IPs that normally have SSH access to the server058 059SSH_OK="fc00::/7 fec0::/10"060 061# IPs that normally have RSYNC access to the server062 063RSYNC_OK="fc00::/7 fec0::/10"064 065# ------------------------------066 067WAN_ADDR="${NET_IP} ${VPN_IP}"068 069#####-------------------------- VARIABLES ----------------------------######070 071 072#####-------------------------- FONCTIONS ----------------------------######073 074#####075# Set sysctl parameters076#####077function kernel()078{079# Don't accept source routed packets.080/bin/echo "0" > /proc/sys/net/ipv6/conf/all/accept_source_route081 082# Disable ICMP redirect acceptance.083/bin/echo "0" > /proc/sys/net/ipv6/conf/all/accept_redirects084 085# Enable the following lines only if a router!086# Enabling IPv6 forwarding disables route-advertisement reception.087# A static gateway will need to be assigned.088#089echo "1" >/proc/sys/net/ipv6/conf/all/forwarding090#091#End router forwarding rules092 093echo " "+ KERNEL : [OK]094}095 096#####097# We log the rest of the communications098#####099 100function logging()101{102# Log103$IP6TABLE -A INPUT -j LOG --log-prefix "INPUT-v6:"104$IP6TABLE -A FORWARD -j LOG --log-prefix "FORWARD-v6:"105$IP6TABLE -A OUTPUT -j LOG --log-prefix "OUTPUT-v6:"106 107echo " "+ LOGGING : [OK]108}109 110#####111# We accept everything from and for the local "lo"112#####113 114function loopback()115{116$IP6TABLE -A INPUT -i lo -j ACCEPT117$IP6TABLE -A FORWARD -i lo -j ACCEPT118$IP6TABLE -A FORWARD -o lo -j ACCEPT119$IP6TABLE -A OUTPUT -o lo -j ACCEPT120 121echo " "+ LOOPBACK : [OK]122}123 124#####125# We set the general rules (DROP||ACCEPT)126#####127 128function policy()129{130$IP6TABLE -P INPUT $1131$IP6TABLE -P FORWARD $1132$IP6TABLE -P OUTPUT $1133 134echo " "+ POLICY $1 : [OK]135}136 137#####138# Set the RT (routage) rules (DROP||ACCEPT)139#####140 141function policy_rt()142{143# Filter all packets that have RH0 headers:144ip6tables -A INPUT -m rt --rt-type 0 --rt-segsleft 0 -j $1145ip6tables -A FORWARD -m rt --rt-type 0 --rt-segsleft 0 -j $1146ip6tables -A OUTPUT -m rt --rt-type 0 --rt-segsleft 0 -j $1147 148echo " "+ POLICY RT $1 : [OK]149}150 151 152#####153# Block SYN-ACK type attacks154#####155 156function synflood()157{158## SYN-FLOODING PROTECTION159$IP6TABLE -N Syn-FLOOD160# tcp flags:0x17/0x02161$IP6TABLE -A INPUT -i $NET_IF -p tcp --syn -j Syn-FLOOD162$IP6TABLE -A Syn-FLOOD -m limit --limit 1/s --limit-burst 4 -j RETURN163$IP6TABLE -A Syn-FLOOD -j DROP164## Make sure NEW tcp connections are SYN packets165# tcp flags:!0x17/0x02 state NEW166$IP6TABLE -I INPUT -i $NET_IF -p tcp ! --syn -m state --state NEW -j DROP167########168 169########170# ip6tables v1.8.11 (nf_tables): `-f' is not supported in IPv6, use -m frag instead171# $IP6TABLE -A INPUT -f -j DROP172$IP6TABLE -A INPUT -p tcp --tcp-flags ALL ALL -j DROP173$IP6TABLE -A INPUT -p tcp --tcp-flags ALL NONE -j DROP174 175echo " "+ SYNFLOOD PROTECTION : [OK]176}177 178#####179# Accepts responses to requests sent from itself.180#####181 182function generique()183{184# Allow established, related packets back in185$IP6TABLE -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT186$IP6TABLE -A OUTPUT -j ACCEPT187 188echo " "+ GENERIQUE : [OK]189 190}191 192#####193# Set the rules for IPv6 addresses194#####195 196function ipv6_link_local()197{198echo " |";199echo " + IPv6 - Addrs Link-Local Unicast -----------------------";200 201# Allow Link-Local addresses202# network range : fe80:0000:0000:0000:0000:0000:0000:0000-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff203 204echo " |\";205$IP6TABLE -A INPUT -s fe80::/10 -j ACCEPT206$IP6TABLE -A FORWARD -s fe80::/10 -d fe80::/10 -j ACCEPT207$IP6TABLE -A OUTPUT -d fe80::/10 -j ACCEPT208echo " | +--→ "fe80::/10 : ACCEPT;209echo " | |";210echo " | "+ IPv6 - Addrs Link-Local : [OK]211 212}213 214#####215# Set rules for Multicast216#####217 218function ipv6_multicast()219{220echo " |";221echo " + IPv6 - Addrs Multicast -----------------------";222 223# Allow multicast224# network range : ff00:0000:0000:0000:0000:0000:0000:0000-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff225 226echo " |\";227$IP6TABLE -A INPUT -d ff00::/8 -j ACCEPT228$IP6TABLE -A FORWARD -s ff00::/8 -d ff00::/8 -j ACCEPT229$IP6TABLE -A OUTPUT -d ff00::/8 -j ACCEPT230 231echo " | +--→ "ff00::/8 : ACCEPT;232echo " | |";233echo " |" + IPv6 - Addrs Multicast : [OK]234}235 236#####237# Set the rules for (ULA) Local IPv6 addresses (DROP||ACCEPT)238#####239 240function ipv6_ula()241{242echo " |";243echo " + IPv6 - Addrs Unique Locale Area -----------------------";244 245# Allow Link-Local addresses246# network range : fe80:0000:0000:0000:0000:0000:0000:0000-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff247 248echo " |\";249$IP6TABLE -A INPUT -s fc00::/7 -j $1250$IP6TABLE -A FORWARD -s fc00::/7 -d fc00::/7 -j $1251$IP6TABLE -A OUTPUT -d fc00::/7 -j DROP252 253echo " | +--→ "fc00::/7 : DROP;254echo " | |";255echo " |" + IPv6 - Addrs Unique Locale Area : [OK]256 257}258 259#####260# Set rules for (SLA) secure IPv6 addresses (DROP||ACCEPT)261#####262 263function ipv6_strongswan()264{265# Default ------------------266echo " |";267echo " + IPv6 - Addrs Site-Local Secure Area Network -------------------------";268 269# Allow Secure Area Network addresses270# network range : fec0:0000:0000:0000:0000:0000:0000:0000-feff:ffff:ffff:ffff:ffff:ffff:ffff:ffff271 272echo " |\";273$IP6TABLE -A INPUT -s fec0::/10 -j $1274$IP6TABLE -A FORWARD -s fec0::/10 -d fec0::/10 -j $1275$IP6TABLE -A OUTPUT -d fec0::/10 -j $1276echo " | +--→ "fec0::/10 : DROP;277echo " | |";278echo " | "+ IPv6 - Addrs Secure Area Network : [OK]279 280# Add ------------------281 282echo " |";283# Allow Forwarding SLAN (fec0::/10) <> ULA (fc00::/7)284# network range : fc00:0000:0000:0000:0000:0000:0000:0000-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff285 286echo " + IPv6 - Forwarding Addrs SWAN 2 ULA Networks -------------------------";287echo " |\";288$IP6TABLE -A FORWARD -s fec0::/10 -d fc00::/7 -j ACCEPT289$IP6TABLE -A FORWARD -d fec0::/10 -s fc00::/7 -j ACCEPT290 291# $IP6TABLE -I FORWARD -s fec0::/10 -d fc00::/7 -p icmpv6 -j ACCEPT292# $IP6TABLE -I FORWARD -d fec0::/10 -s fc00::/7 -p icmpv6 -j ACCEPT293 294echo " | +--→ fec0::/10 <â†> fc00::/7 : ACCEPT";295echo " | |";296echo " | "+ IPv6 - Forwarding Addrs SWAN 2 ULA Networks : [OK]297echo " |";298 299}300 301#####302# Set rules for your Local IPv6 addresses (ULA)303#####304 305function ipv6_lan()306{307echo " |";308echo " + IPv6 - Addrs Unique Locale Area - On Site -----------------------";309 310# Allow Link-Local addresses311# network range : fe80:0000:0000:0000:0000:0000:0000:0000-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff312 313echo " |\";314for ip in $LAN_IPs ;315do316 317$IP6TABLE -A INPUT -s $ip -j ACCEPT318$IP6TABLE -A FORWARD -s $ip -d fc00::/7 -j ACCEPT319$IP6TABLE -A FORWARD -d $ip -s fc00::/7 -j ACCEPT320 321$IP6TABLE -A FORWARD -s $ip -d fec0::/10 -j ACCEPT322$IP6TABLE -A FORWARD -d $ip -s fec0::/10 -j ACCEPT323 324$IP6TABLE -A OUTPUT -d $ip -j ACCEPT325 326echo " | +--→ "$ip : ACCEPT;327 328done329 330echo " | |";331echo " |" + IPv6 - Addrs Unique Locale Area - On Site : [OK]332 333}334 335#####336# FORWARDING between cards (vmbr0 ←> vmbr1)337#####338 339function ipv6_forwarding()340{341# Allow forwarding342# $IP6TABLE -A FORWARD -m state --state NEW -i $VM1_IF -o $WAN_IF -s $SUBNETPREFIX -j ACCEPT343# $IP6TABLE -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT344 345$IP6TABLE -A FORWARD -i $WAN_IF$VM1_IF -o $VM1_IF -j ACCEPT346$IP6TABLE -A FORWARD -o $WAN_IF -i $VM1_IF -j ACCEPT347 348echo " "+ IPv6 - FORWARDING : [OK]349}350 351#####352# IPV6 NAT : Allow IPv6 ULAs to use the IPv6 GUA address for browsing (hides IPv6 ULAs)353#####354 355function ipv6_nat()356{357# NET FOR LXC EXCEPT TO THE ULA NETWORK# NET FOR LXC EXCEPT TO THE ULA NETWORK358$IP6TABLE -t nat -A POSTROUTING -o $WAN_IF -s $CT_WEB ! -d fc00::/7 -j MASQUERADE359 360echo " | |";361echo " |" + NAT V6 : [OK]362}363 364#####365# Set rules for your secure IPv6 addresses (SLA)366#####367 368function ipv6_slan()369{370echo " |";371echo " + IPv6 - Addrs Unique Locale Area - On Secure Sites -----------------------";372 373# Allow Link-Local addresses374# network range : fe80:0000:0000:0000:0000:0000:0000:0000-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff375 376echo " |\";377for ip in $SLAN_IPs ;378do379 380$IP6TABLE -A INPUT -s $ip -j ACCEPT381$IP6TABLE -A FORWARD -s $ip -d fc00::/7 -j ACCEPT382$IP6TABLE -A FORWARD -d $ip -s fc00::/7 -j ACCEPT383 384$IP6TABLE -A FORWARD -s $ip -d fec0::/10 -j ACCEPT385$IP6TABLE -A FORWARD -d $ip -s fec0::/10 -j ACCEPT386 387$IP6TABLE -A OUTPUT -d $ip -j ACCEPT388 389echo " | +--→ "$ip : ACCEPT;390 391done392 393echo " | |";394echo " |" + IPv6 - Addrs Unique Locale Area - On Secure Sites : [OK]395 396}397 398 399#####400# Global Unicast IPv6 addresses are accepted; they can be audited.401#####402 403function ipv6_addrs()404{405echo " |";406echo " + IPv6 - Addrs WAN ----------------------------------------------------";407echo " |\";408 409for ip in ${WAN_ADDR};410do411# Allow established, related packets back in412# $IP6TABLE -A INPUT -d $ip -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT413$IP6TABLE -A INPUT -d $ip -j ACCEPT414# Allow anything out on the internet415$IP6TABLE -A OUTPUT -s $ip -j ACCEPT416 417echo " | +-→ "${ip} : ACCEPT;418done419echo " | |";420echo " | "+ IPv6 - Addrs WAN : [OK]421echo " |";422}423 424 425####426# Stéphane Bortzmeyer's rule: DROP ICMP LIMIT 1/sec per IPv6 /128427# To be inserted after the aICMPv6 chain (so it takes precedence via -I)428####429 430function icmpv6_limit()431{432 433$IP6TABLE -I INPUT -p icmpv6 --icmpv6-type echo-request434-m hashlimit --hashlimit-name ICMP435--hashlimit-above 1/second --hashlimit-burst 1436--hashlimit-mode srcip437--hashlimit-srcmask 128 -j DROP438 439echo " "+ ICMPV6 - LIMIT 1/second DROP : [OK]440}441 442#####443# Script to capture ICMPv6 packets by type, by Stephane Huc444#####445 446function icmpv6_huc()447{448# Allow dedicated ICMPv6 packettypes, do this in an extra chain because we need it everywhere449$IP6TABLE -N aICMPs450# Destination unreachable451$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 1 -j ACCEPT # destination-unreachable; Must Not Be Dropped452# Packet too big453$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 2/0 -j ACCEPT # packet too big; Must Not Be Dropped454# Time exceeded455$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 3/0 -j ACCEPT # time exceeded456$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 3/1 -j ACCEPT # time exceeded457# Parameter problem458$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 4/0 -j ACCEPT # parameter pb: Erroneous header field encountered459$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 4/1 -j ACCEPT # parameter pb: Unrecognized Next Header Type encountered460$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 4/2 -j ACCEPT # parameter pb: Unrecognized IPv6 option encountered461 462# Echo Request (protect against flood)463# $IP6TABLE -I aICMPs -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 DROP464$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 128/0 -j ACCEPT465# $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 128/0 -m limit --limit 1/sec --limit-burst 1 -j ACCEPT # ping tool: echo request message466# Echo Reply467# $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 129/0 -m limit --limit 1/sec --limit-burst 1 -j ACCEPT # ping tool: echo reply message468$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 129/0 -j ACCEPT469echo " "+ ICMPV6 - DEFAULT : [OK]470 471# link-local multicast receive notification mssg (need link-local src address, with hop-limit: 1)472$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 130/0 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT473$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 131/0 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT474$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 132/0 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT475echo " "+ ICMPV6 - LINK-LOCAL : [OK]476 477# address configuration and routeur selection mssg (received with hop limit = 255)478$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 133/0 -m hl --hl-eq 255 -j ACCEPT # Router Solicitation479$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 134/0 -s fe80::/64 -m hl --hl-eq 255 -j ACCEPT # Router Advertisement480$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 135/0 -m hl --hl-eq 255 -j ACCEPT # Neighbor Solicitation481$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 136/0 -m hl --hl-eq 255 -j ACCEPT # Neighbor Advertisement482 483$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 137/0 -j DROP # Redirect Message484$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 138/0 -j DROP # Router Renumbering (Rechargement du routeur)485 486$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 139/0 -j DROP # ICMP Node Information Query487$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 140/0 -j DROP # ICMP Node Information Response488 489$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 141/0 -d ff02::1 -m hl --hl-eq 255 -j ACCEPT # Inverse Neighbor Discovery Solicitation Message490$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 142/0 -m hl --hl-eq 255 -j ACCEPT # Inverse Neighbor Discovery Advertisement Message491echo " "+ ICMPV6 - ADD CONF '&' ROUTEUR SELECTION : [OK]492 493# link-local multicast receive notification mssg (need link-local src address, with hop-limit: 1)494$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 143 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT495# needed for mobylity496$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 144/0 -j DROP497$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 145/0 -j DROP498$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 146/0 -j DROP499$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 147 -j DROP500# SEND certificate path notification mssg (received with hop limit = 255)501$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 148 -m hl --hl-eq 255 -j ACCEPT # Certification Path Solicitation Message502$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 149 -m hl --hl-eq 255 -j ACCEPT # Certification Path Advertisement Message503# multicast routeur discovery mssg (need link-local src address and hop limit = 1)504$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 151 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT505$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 152 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT506$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 153 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT507echo " "+ ICMPV6 - MULTICAST ROUTEUR DISCOVERY : [OK]508#509$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 200 -j DROP # private experimentation510$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 201 -j DROP # private experimentation511$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 255 -j DROP # expansion error messages ICMPv6512echo " "+ ICMPV6 - EXPERIMENTATION : [OK]513 514#515# Only the ROUTEUR is allowed to ping us (read FAQ this is a requirement)516 517# $IP6TABLE -A INPUT -p icmpv6 -m limit --limit 5/s --limit-burst 4 -j aICMPs518# $IP6TABLE -A OUTPUT -m state ! --state INVALID -j aICMPs519# $IP6TABLE -A FORWARD -p icmpv6 -j ACCEPT520 521 522$IP6TABLE -I INPUT -p icmpv6 -j aICMPs523$IP6TABLE -I FORWARD -p icmpv6 -j aICMPs524$IP6TABLE -I OUTPUT -p icmpv6 -j aICMPs525 526echo " "+ ICMPV6 - INLIMIT + OUTPUT : [OK]527}528 529#####530# Enable SSH access for specific IPs + limit access to 3 hits per minute/IP531#####532 533function ssh_ok()534{535for host in $SSH_OK536do537$IP6TABLE -A INPUT -s $host -p tcp --dport $port_ssh -j ACCEPT538$IP6TABLE -A OUTPUT -d $host -p tcp --sport $port_ssh -j ACCEPT539done540 541$IP6TABLE -A INPUT -p tcp --dport $port_ssh -m state --state NEW -m recent --set --name SSH542$IP6TABLE -A INPUT -p tcp --dport $port_ssh -m recent --update --seconds 60 --hitcount 3 --rttl --name SSH -j DROP543$IP6TABLE -A INPUT -p tcp --dport $port_ssh -j ACCEPT544 545echo " "+ SSH : [OK]546}547 548#####549# Enabling RSYNC access for specific IPs550#####551 552function rsync_ok()553{554for host in $RSYNC_OK555do556$IP6TABLE -A INPUT -s $host -p tcp --dport 873 -j ACCEPT557$IP6TABLE -A INPUT -s $host -p udp --dport 873 -j ACCEPT558$IP6TABLE -A OUTPUT -d $host -p tcp --sport 873 -j ACCEPT559$IP6TABLE -A OUTPUT -d $host -p udp --sport 873 -j ACCEPT560done561 562echo " "+ RSYNC : [OK]563}564 565#####566# Opening TCP and UDP ports567#####568 569function tcp_ok()570{571for port in $TCP_OK572do573$IP6TABLE -A INPUT -p tcp --dport $port -j ACCEPT574$IP6TABLE -A OUTPUT -p tcp --sport $port -j ACCEPT575done576 577echo " "+ TCP : [OK]578}579 580function udp_ok()581{582for port in $UDP_OK583do584$IP6TABLE -A INPUT -p udp --dport $port -j ACCEPT585$IP6TABLE -A OUTPUT -p udp --sport $port -j ACCEPT586done587 588echo " "+ UDP : [OK]589}590 591 592#####593# Open HTTP(S) access to the LAN & NET interface594#####595 596function server_http()597{598# CT_WEB="fc01::10:10:0:10"599 600HTTP_PORTS="80 443"601for port in $HTTP_PORTS602do603# service Web local and/or another machine604# $IP6TABLE -A INPUT -p tcp --dport $port -j ACCEPT605$IP6TABLE -A INPUT -m state --state NEW -m tcp -p tcp --dport $port -j ACCEPT606$IP6TABLE -A INPUT -m state --state ESTABLISHED,RELATED -m tcp -p tcp --dport $port -j ACCEPT607 608$IP6TABLE -A OUTPUT -m state --state ESTABLISHED,RELATED -m tcp -p tcp --sport $port -j ACCEPT609# $IP6TABLE -A OUTPUT -p tcp --sport $port -j ACCEPT610# Web service is on another machine, a container or a local machine611# $IP6TABLE -t nat -A PREROUTING -d $WAN_IP -p tcp --dport $port -j DNAT --to-destination [$CT_WEB]:$port612done613echo " "+ APACHE : [OK]614}615 616#####617# Open DNS(S) access to the NET interface618#####619 620function server_dns()621{622DNS_PORTS_TCP="53"623624for port in $DNS_PORTS_TCP625do626# service Bind9 local and/or another machine627$IP6TABLE -A INPUT -m state --state NEW -m tcp -p tcp --dport $port -j ACCEPT628# $IP6TABLE -A INPUT -m state --state ESTABLISHED,RELATED -m tcp -p tcp --dport $port -j ACCEPT629$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 DROP630$IP6TABLE -A OUTPUT -m state --state ESTABLISHED,RELATED -m tcp -p tcp --sport $port -j ACCEPT631$IP6TABLE -A OUTPUT -p tcp --sport $port -j LOG --log-prefix "OUTPUT-T-NAMED:"632done633 634DNS_PORTS_UDP="53"635 636for port in $DNS_PORTS_UDP637do638# service Bind9 local and/or another machine639$IP6TABLE -A INPUT -i $WAN_IF -p udp --dport $port -m state --state NEW -m recent --set --name NAMED640# $IP6TABLE -A INPUT -i $WAN_IF -p udp --dport $port -m state --state ESTABLISHED,RELATED -m recent --set --name NAMED641$IP6TABLE -A INPUT -i $WAN_IF -p udp --dport $port -m recent --update --seconds 60 --hitcount 10 --rttl --name NAMED -j DROP642$IP6TABLE -A OUTPUT -m state --state ESTABLISHED,RELATED -m udp -p udp --sport $port -j ACCEPT643$IP6TABLE -A OUTPUT -p udp --sport $port -j LOG --log-prefix "OUTPUT-U-NAMED:"644done645 646echo " "+ DNS : [OK]647}648 649#####650# DROP PORTs651#####652 653function ports_drop()654{655network="::0/0"656 657PORTS_DROP=$1658 659for port in $PORTS_DROP660do661$IP6TABLE -A INPUT -s $network -p tcp --dport $port -j DROP662$IP6TABLE -A INPUT -s $network -p udp --dport $port -j DROP663$IP6TABLE -A OUTPUT -d $network -p tcp --sport $port -j DROP664$IP6TABLE -A OUTPUT -d $network -p udp --sport $port -j DROP665done666echo " "+ DROP PROTOCOL UDP/TCP : $PORTS_DROP [OK]667}668 669function ports_blacklist()670{671# $IP6TABLE -X black672$IP6TABLE -N BLACK673$IP6TABLE -A BLACK -m recent --set --name BLACKLIST -j DROP674 675# UDP/TCP (port/47)676# $IP6TABLE -X CHECK_GRE677$IP6TABLE -N CHECK_GRE678$IP6TABLE -I CHECK_GRE 1 -m recent --update --name BLACKLIST --reap --seconds 86400 -j DROP679 680$IP6TABLE -I CHECK_GRE 2 -m recent --update --name TIMER --reap --seconds 60 --hitcount 3 -j BLACK681$IP6TABLE -I CHECK_GRE 3 -m recent --set --name TIMER -j ACCEPT682 683# UDP/TCP (port/47)684$IP6TABLE -A INPUT -p TCP --dport 47 -m state --state NEW -j CHECK_GRE685$IP6TABLE -A INPUT -p UDP --dport 47 -m state --state NEW -j CHECK_GRE686 687echo " "+ BLACKLIST PROTOCOL : [OK]688}689 690 691#####692# Checking protocol for UPDATE693#####694 695function blacklist_chain()696{697 698# $IP6TABLE -X BLACK699$IP6TABLE -N BLACK700$IP6TABLE -A BLACK -m recent --set --name BLACKLIST -j DROP701 702echo " "+ BLACK CHAIN : [OK]703}704 705function proto_check()706{707CHAIN=$1708 709# UDP/TCP (port/47)710# $IP6TABLE -X CHECK_GRE711$IP6TABLE -N $CHAIN712$IP6TABLE -I $CHAIN 1 -m recent --update --name BLACKLIST --reap --seconds 86400 -j DROP713 714$IP6TABLE -I $CHAIN 2 -m recent --update --name TIMER --reap --seconds 60 --hitcount 3 -j BLACK715$IP6TABLE -I $CHAIN 3 -m recent --set --name TIMER -j ACCEPT716 717echo " "+ PROTOCOL VERFIF : $CHAIN [OK]718}719 720function checking_gre()721{722network="::0/0"723 724# UDP/TCP (port/47)725$IP6TABLE -A INPUT -p TCP --dport 47 -m state --state NEW -j CHECK_GRE726$IP6TABLE -A INPUT -p UDP --dport 47 -m state --state NEW -j CHECK_GRE727 728$IP6TABLE -A OUTPUT -p TCP --sport 47 -m state --state NEW -j CHECK_GRE729$IP6TABLE -A OUTPUT -p UDP --sport 47 -m state --state NEW -j CHECK_GRE730 731echo " "+ BLACKLIST PROTOCOL GRE : [OK]732}733 734#####-------------------------- FONCTIONS ----------------------------######735 736 737 738 739 740#####-------------------------- START / STOP ----------------------------######741 742case "$1" in743 744start|restart)745$0 stop746echo "$0 Starting"747kernel748loopback749 750policy_rt DROP751 752synflood753 754blacklist_chain755proto_check CHECK_GRE756checking_gre757 758ports_drop 81759 760icmpv6_huc761icmpv6_limit762 763ipv6_multicast764 765ssh_ok766rsync_ok767tcp_ok768udp_ok769 770server_http771vserver_dns772 773ipv6_lan774ipv6_slan775 776# ipv6_forwarding777# ipv6_nat778 779ipv6_strongswan DROP780ipv6_ula DROP781 782ipv6_addrs783 784generique785 786logging787 788policy DROP789;;790 791stop)792echo "$0 Stop"793$IP6TABLE -F794$IP6TABLE -t nat -F795$IP6TABLE -Z796$IP6TABLE -X797policy ACCEPT798;;799status)800echo "$0 Status"801$IP6TABLE -L -vn802$IP6TABLE -L -vn -t nat803;;804 805*)806echo "usage : $0 (status|start|stop|restart)"807;;808 809esac810 811#####-------------------------- 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-ipv6002update-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 -vn002ip6tables -L INPUT -vn003ip6tables -L FORWARD -vn004ip6tables -L OUTPUT -vn005ip6tables -L aICMPs -vn
La table NAT (Network Translation Address) - çà existe ;) ^^ :
Script avec 1 ligne
001ip6tables -L -vn -t nat
Voilà un exemple de My Firewall IPv6 ICMPv6 - ULA / MULTICAST / SWAN ; Si cela peut vous aider de mieux comprendre la syntaxe ip6tables et à être un "minimum" sécurisé.
Cordialement,
Romain


