Informations :
Dates
- Publish : : Friday 07 february 2020
- Modification : Saturdy 01 july 2023
- 3237 views
Share :
NdM : 2023/07/01 - Ajout de la function server_dns()
Je vais d'écrire comment-faire un pare-feu IPv6 - ICMPv6.
Si vous n'avez pas installé les paquets d'admin IPv6. Je vous suggère d'installer ces paquets grâce à la commande apt install iputils-ping dnsutils net-tools whois ipv6toolkit thc-ipv6 ipv6pref
qui sont logiciels/commandes réseaux IPv6.
Stephane Huc a changé son nom de domaine - Le nouveau est : http://doc.huc.fr.eu.org
Il nous avait envoyé un tutoriel sur comment filtrer les paquets ICMPv6 depuis IPtables pour les requetes des routeurs.
Je vous ai concocté un script firewall-ipv6.sh
ici avec quelques lignes supplémentaires comme le forward entre les cartes et autres :
J'ai ajouté une protection à 1 ping/seconde par adresse IPv6::/128 (function icmpv6_limit
(ligne 155)) (--icmpv6-type 128/0
) de Stéphane Bortzmeyer :) qui fait qu'au dessus de 1 ping par seconde (ICMPv6 echo-request) on DROP l'explosion de PING, d'une seule IPv6 source (--hashlimit-srcmask 128
).
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 ;)
Il faut autoriser les echo-request
et echo-reply
en -j ACCEPT
dans la chaine aICMPs
de Stéphane Huc sinon on est limité(e) à un ping par seconde pour tout le monde qui pourait pinguer l'IPv6 (la même adresse IPv6).
Puis c'est OKay çà PING et çà DROP comme on veut - De la machine elle-même et de l'extérieur ;)
Script avec 435 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# chemin commande iptables
014IP6TABLE="/sbin/ip6tables"
015 016# interface reseau
017LOOP_IF="lo"
018 019#WAN_IP="2607:5300:60:9389::1"
020 021WAN_IF="vmbr0"
022VM1_IF="vmbr1"
023 024# Network and IPs
025SUBNETPREFIX="2607:5300:0060:9389::/64"
026 027# port du service ssh
028port_ssh="22"
029 030# port du service rsync
031port_rsync="873"
032 033# ports tcp et udp a ouvrir
034TCP_OK="514 4949" # SYSLOG MUNIN
035UDP_OK="123 161 514 547" # NTP SNMP SYSLOG DHCP
036 037# ip qui ont acces en ssh au serveur
038SSH_OK="2001:0bc8:25bb:ff00::/56"
039 040# ip accedant au serveur en rsync
041RSYNC_OK="2001:0bc8:25bb:ff00::/56"
042 043#####
044# on fixe les sysctl
045#####
046function kernel()
047{
048# Don't accept source routed packets.
049/bin/echo "0" > /proc/sys/net/ipv6/conf/all/accept_source_route
050 051# Disable ICMP redirect acceptance.
052/bin/echo "0" > /proc/sys/net/ipv6/conf/all/accept_redirects
053 054# Enable the following lines only if a router!
055# Enabling IPv6 forwarding disables route-advertisement reception - accept_ra=0|2
056# A static gateway will need to be assigned.
057#
058echo "1" > /proc/sys/net/ipv6/conf/all/forwarding
059#
060#End router forwarding rules
061 062echo " "+ KERNEL : [OK]
063}
064 065#####
066# on accepte tout de et pour "lo" local
067#####
068 069function loopback()
070{
071$IP6TABLE -A INPUT -i lo -j ACCEPT
072$IP6TABLE -A FORWARD -i lo -j ACCEPT
073$IP6TABLE -A FORWARD -o lo -j ACCEPT
074$IP6TABLE -A OUTPUT -o lo -j ACCEPT
075 076echo " "+ LOOPBACK : [OK]
077}
078 079#####
080# on fixe les regles general (DROP||ACCEPT)
081#####
082 083function policy()
084{
085$IP6TABLE -P INPUT $1
086$IP6TABLE -P FORWARD $1
087$IP6TABLE -P OUTPUT $1
088 089echo " "+ POLICY $1 : [OK]
090}
091 092#####
093# ACCEPT LES REQUETES DEMANDEES
094#####
095 096function generique()
097{
098# Allow anything out on the internet
099$IP6TABLE -A OUTPUT -o $WAN_IF -j ACCEPT
100# Allow established, related packets back in
101$IP6TABLE -A INPUT -i $WAN_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
102 103echo " "+ GENERIQUE : [OK]
104}
105 106#####
107# on fixe les regles des adresses IPv6
108#####
109 110function ipv6_link_multicast()
111{
112echo " |";
113echo " + IPv6 - Addrs Link-Local/Multicast -----------------------";
114 115# Allow Link-Local addresses
116echo " |";
117$IP6TABLE -A INPUT -s fe80::/10 -j ACCEPT
118$IP6TABLE -A FORWARD -s fe80::/10 -d fe80::/10 -j ACCEPT
119$IP6TABLE -A OUTPUT -s fe80::/10 -j ACCEPT
120echo " +--→ "fe80::/10 : ACCEPT;
121echo " |";
122echo " "+ IPv6 - Addrs Link-Local : [OK]
123 124# Allow multicast
125echo " |";
126$IP6TABLE -A INPUT -d ff00::/8 -j ACCEPT
127$IP6TABLE -A FORWARD -s ff00::/8 -d ff00::/8 -j ACCEPT
128$IP6TABLE -A OUTPUT -d ff00::/8 -j ACCEPT
129echo " +--→ "ff00::/8 : ACCEPT;
130echo " |";
131echo " "+ IPv6 - Addrs Multicast : [OK]
132}
133 134#####
135# On laisse passer les requetes ICMPv6
136#####
137 138function icmpv6_generique()
139{
140$IP6TABLE -I INPUT -p icmpv6 -j ACCEPT
141$IP6TABLE -I FORWARD -p icmpv6 -j ACCEPT
142$IP6TABLE -I OUTPUT -p icmpv6 -j ACCEPT
143 144echo " "+ ICMPV6 - ACCEPT : [OK]
145}
146 147####
148# La regle de Stephane Bortzmeyer DROP ICMP LIMIT 1/sec par IPv6::/128
149# A envoyer apres la chaine aICMPv6 (pour qu'elle soit au dessus -I)
150####
151 152function icmpv6_limit()
153{
154# Au dessus de 1 ping par seconde (ICMPv6 echo-request) on DROP l'explosion PING d'une seule source IPv6 (masque 128)
155$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
156 157echo " "+ ICMPV6 - LIMIT 1/second DROP : [OK]
158}
159 160 161#####
162# Le script de Stephane Huc
163#####
164 165function icmpv6_huc()
166{
167# Allow dedicated ICMPv6 packettypes, do this in an extra chain because we need it everywhere
168$IP6TABLE -N aICMPs
169170
# Destination unreachable
171$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 1 -j ACCEPT # destination-unreachable; Must Not Be Dropped
172173
# Packet too big
174$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 2/0 -j ACCEPT # packet too big; Must Not Be Dropped
175176
# Time exceeded
177$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 3/0 -j ACCEPT # time exceeded
178$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 3/1 -j ACCEPT # time exceeded
179180
# Parameter problem
181$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 4/0 -j ACCEPT # parameter pb: Erroneous header field encountered
182$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 4/1 -j ACCEPT # parameter pb: Unrecognized Next Header Type encountered
183$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 4/2 -j ACCEPT # parameter pb: Unrecognized IPv6 option encountered
184 185# Echo Request (protect against flood)
186# Commenter cette ligne
187# $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 128/0 -m limit --limit 1/sec --limit-burst 1 -j ACCEPT # ping tool: echo request message
188$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 128/0 -j ACCEPT
189190
# Echo Reply
191# Commenter cette ligne
192# $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 129/0 -m limit --limit 5/sec --limit-burst 10 -j ACCEPT # ping tool: echo reply message
193$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 128/0 -j ACCEPT
194 195echo " "+ ICMPV6 - DEFAULT : [OK]
196 197# link-local multicast receive notification mssg (need link-local src address, with hop-limit: 1)
198$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 130/0 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT
199$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 131/0 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT
200$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 132/0 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT
201echo " "+ ICMPV6 - LINK-LOCAL : [OK]
202 203# address configuration and routeur selection mssg (received with hop limit = 255)
204$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 133/0 -m hl --hl-eq 255 -j ACCEPT # Router Solicitation
205$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 134/0 -s fe80::/64 -m hl --hl-eq 255 -j ACCEPT # Router Advertisement
206$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 135/0 -m hl --hl-eq 255 -j ACCEPT # Neighbor Solicitation
207$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 136/0 -m hl --hl-eq 255 -j ACCEPT # Neighbor Advertisement
208209
$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 137/0 -j DROP # Redirect Message
210$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 138/0 -j DROP # Router Renumbering (Rechargement du routeur)
211212
$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 139/0 -j DROP # ICMP Node Information Query
213$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 140/0 -j DROP # ICMP Node Information Response
214215
$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 141/0 -d ff02::1 -m hl --hl-eq 255 -j ACCEPT # Inverse Neighbor Discovery Solicitation Message
216$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 142/0 -m hl --hl-eq 255 -j ACCEPT # Inverse Neighbor Discovery Advertisement Message
217echo " "+ ICMPV6 - ADD CONF '&' ROUT€ SELECTION : [OK]
218 219# link-local multicast receive notification mssg (need link-local src address, with hop-limit: 1)
220$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 143 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT
221222
# needed for mobylity
223$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 144/0 -j DROP
224$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 145/0 -j DROP
225$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 146/0 -j DROP
226$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 147 -j DROP
227228
# SEND certificate path notification mssg (received with hop limit = 255)
229$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 148 -m hl --hl-eq 255 -j ACCEPT # Certification Path Solicitation Message
230$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 149 -m hl --hl-eq 255 -j ACCEPT # Certification Path Advertisement Message
231232
# multicast routeur discovery mssg (need link-local src address and hop limit = 1)
233$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 151 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT
234$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 152 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT
235$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 153 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT
236echo " "+ ICMPV6 - MULTICAST ROUT€ DISCOVERY : [OK]
237238
#
239$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 200 -j DROP # private experimentation
240$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 201 -j DROP # private experimentation
241$IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 255 -j DROP # expansion error messages ICMPv6
242echo " "+ ICMPV6 - EXPERIMENTATION : [OK]
243 244# Only the ROUT€ is allowed to ping us (read FAQ this is a requirement)
245#$IP6TABLE -A INPUT -p icmpv6 -m limit --limit 5/s --limit-burst 4 -j aICMPs
246#$IP6TABLE -A OUTPUT -m state ! --state INVALID -j aICMPs
247 248$IP6TABLE -I INPUT -p icmpv6 -j aICMPs
249$IP6TABLE -I FORWARD -p icmpv6 -j aICMPs
250$IP6TABLE -I OUTPUT -p icmpv6 -j aICMPs
251252
echo " "+ ICMPV6 - INLIMIT + OUTPUT : [OK]
253}
254 255#####
256# FORWARDING entre les cartes (vmbr0 ←> vmbr1)
257#####
258 259function ipv6_forwarding()
260{
261# Allow forwarding
262$IP6TABLE -A FORWARD -m state --state NEW -i $VM1_IF -o $WAN_IF -s $SUBNETPREFIX -j ACCEPT
263$IP6TABLE -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
264 265# $IP6TABLE -A FORWARD -i $VM1_IF -o $WAN_IF -j ACCEPT
266# $IP6TABLE -A FORWARD -o $VM1_IF -i $WAN_IF -j ACCEPT
267 268echo " "+ IPv6 - FORWARDING : [OK]
269}
270 271#####
272# ouverture des acces SSH a certaines IP
273#####
274 275function ssh_ok()
276{
277for host in $SSH_OK
278do
279$IP6TABLE -A INPUT -s $host -p tcp --dport $port_ssh -j ACCEPT
280$IP6TABLE -A OUTPUT -d $host -p tcp --sport $port_ssh -j ACCEPT
281done
282 283$IP6TABLE -A INPUT -p tcp --dport $port_ssh -m state --state NEW -m recent --set --name SSH
284$IP6TABLE -A INPUT -p tcp --dport $port_ssh -m recent --update --seconds 60 --hitcount 3 --rttl --name SSH -j DROP
285$IP6TABLE -A INPUT -p tcp --dport $port_ssh -j ACCEPT
286 287echo " "+ SSH : [OK]
288}
289 290#####
291# ouverture des acces RSYNC a certaines IP
292#####
293 294function rsync_ok()
295{
296for host in $RSYNC_OK
297do
298$IP6TABLE -A INPUT -s $host -p tcp --dport $port_rsync -j ACCEPT
299$IP6TABLE -A OUTPUT -d $host -p tcp --sport $port_rsync -j ACCEPT
300done
301 302echo " "+ RSYNC : [OK]
303}
304 305#####
306# ouverture des ports tcp et upd
307#####
308 309function tcp_ok()
310{
311for port in $TCP_OK
312do
313$IP6TABLE -A INPUT -p tcp --dport $port -j ACCEPT
314$IP6TABLE -A OUTPUT -p tcp --sport $port -j ACCEPT
315done
316 317echo " "+ TCP : [OK]
318}
319 320function udp_ok()
321{
322for port in $UDP_OK
323do
324$IP6TABLE -A INPUT -p udp --dport $port -j ACCEPT
325$IP6TABLE -A OUTPUT -p udp --sport $port -j ACCEPT
326done
327 328echo " "+ UDP : [OK]
329}
330 331#####
332# ouverture des acces HTTP(S) a linterface LAN & NET
333#####
334 335function server_http()
336{
337# CT_WEB="2607:5300:60:9389:15:1:a:10"
338 339HTTP_PORTS="80 443"
340for port in $HTTP_PORTS
341do
342# SOIT le service est sur LHOTE SOIT dans un VServer
343$IP6TABLE -A INPUT -m state --state NEW -m tcp -p tcp --dport $port -j ACCEPT
344# $IP6TABLE -A INPUT -p tcp --dport $port -j ACCEPT
345# $IP6TABLE -A OUTPUT -p tcp --sport $port -j ACCEPT
346$IP6TABLE -A OUTPUT -m state --state ESTABLISHED,RELATED -m tcp -p tcp --sport $port -j ACCEPT
347# le server Web est sur une autre machine, une container ou une machine locale
348# $IP6TABLE -t nat -A PREROUTING -d $WAN_IP -p tcp --dport $port -j DNAT --to-destination [$CT_WEB]:$port
349done
350echo " "+ APACHE : [OK]
351}
352 353#####
354# ouverture des acces DNS(S) a linterface NET
355#####
356 357function server_dns()
358{
359DNS_PORTS_TCP="53"
360for port in $DNS_PORTS_TCP
361do
362# SOIT le service est sur LHOTE SOIT dans un VServer
363$IP6TABLE -A INPUT -m state --state NEW -m tcp -p tcp --dport $port -j ACCEPT
364$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
365# $IP6TABLE -t nat -A PREROUTING -d $WAN_IP -p tcp --dport $port -j DNAT --to-destination [$CT_DNS]:$port
366$IP6TABLE -A OUTPUT -m state --state ESTABLISHED,RELATED -m tcp -p tcp --sport $port -j ACCEPT
367$IP6TABLE -A OUTPUT -p tcp --sport $port -j LOG --log-prefix "OUTPUT-T-NAMED:"
368done
369 370DNS_PORTS_UDP="53"
371for port in $DNS_PORTS_UDP
372do
373# SOIT le service est sur LHOTE SOIT dans un VServer
374$IP6TABLE -A INPUT -i $WAN_IF -p udp --dport $port -m state --state NEW -m recent --set --name NAMED
375$IP6TABLE -A INPUT -i $WAN_IF -p udp --dport $port -m recent --update --seconds 60 --hitcount 10 --rttl --name NAMED -j DROP
376# $IP6TABLE -t nat -A PREROUTING -d $WAN_IP -p udp --dport $port -j DNAT --to-destination [$CT_DNS]:$port
377$IP6TABLE -A OUTPUT -m state --state ESTABLISHED,RELATED -m udp -p udp --sport $port -j ACCEPT
378$IP6TABLE -A OUTPUT -p udp --sport $port -j LOG --log-prefix "OUTPUT-U-NAMED:"
379done
380 381echo " "+ DNS : [OK]
382}
383 384 385 386#####-------------------------- START / STOP ----------------------------######
387case "$1" in
388 389start|restart)
390$0 stop
391echo "$0 Starting"
392kernel
393loopback
394 395generique
396397
# icmpv6_generique
398icmpv6_huc
399icmpv6_limit
400401
ipv6_link_multicast
402ipv6_forwarding
403404
ssh_ok
405rsync_ok
406tcp_ok
407udp_ok
408 409server_http
410server_dns
411412
policy DROP
413;;
414 415stop)
416echo "$0 Stop"
417$IP6TABLE -F
418$IPTABLE -t nat -F
419$IP6TABLE -Z
420$IP6TABLE -X
421policy ACCEPT
422;;
423status)
424echo "$0 Status"
425$IP6TABLE -L -vn
426$IP6TABLE -L -vn -t nat
427;;
428 429*)
430echo "usage : $0 (status|start|stop|restart)"
431;;
432 433esac
434 435#####-------------------------- 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