Informations :
Dates
- Publish : : Friday 07 february 2020
- Modification : Monday 13 april 2020
- 2955 views
Share :
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 html
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 html :) 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 html 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 401 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 # 058 echo "1" > /proc/sys/net/ipv6/conf/all/forwarding 059 # 060 #End router forwarding rules 061 062 echo " "+ 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 076 echo " "+ 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 089 echo " "+ 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 103 echo " "+ GENERIQUE : [OK] 104} 105 106##### 107# on fixe les regles des adresses IPv6 108##### 109 110function ipv6_link_multicast() 111{ 112 echo " |"; 113 echo " + IPv6 - Addrs Link-Local/Multicast -----------------------"; 114 115 # Allow Link-Local addresses 116 echo " |"; 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 120 echo " +--→ "fe80::/10 : ACCEPT; 121 echo " |"; 122 echo " "+ IPv6 - Addrs Link-Local : [OK] 123 124 # Allow multicast 125 echo " |"; 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 129 echo " +--→ "ff00::/8 : ACCEPT; 130 echo " |"; 131 echo " "+ 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 144 echo " "+ 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 157 echo " "+ 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 169 170 # Destination unreachable 171 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 1 -j ACCEPT # destination-unreachable; Must Not Be Dropped 172 173 # Packet too big 174 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 2/0 -j ACCEPT # packet too big; Must Not Be Dropped 175 176 # 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 179 180 # 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 189 190 # 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 195 echo " "+ 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 201 echo " "+ 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 208 209 $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) 211 212 $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 214 215 $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 217 echo " "+ 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 221 222 # 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 227 228 # 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 231 232 # 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 236 echo " "+ ICMPV6 - MULTICAST ROUT€ DISCOVERY : [OK] 237 238 # 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 242 echo " "+ 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 251 252 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 268 echo " "+ IPv6 - FORWARDING : [OK] 269} 270 271##### 272# ouverture des acces SSH a certaines IP 273##### 274 275function ssh_ok() 276{ 277 for host in $SSH_OK 278 do 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 281 done 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 287 echo " "+ SSH : [OK] 288} 289 290##### 291# ouverture des acces RSYNC a certaines IP 292##### 293 294function rsync_ok() 295{ 296 for host in $RSYNC_OK 297 do 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 300 done 301 302 echo " "+ RSYNC : [OK] 303} 304 305##### 306# ouverture des ports tcp et upd 307##### 308 309function tcp_ok() 310{ 311 for port in $TCP_OK 312 do 313 $IP6TABLE -A INPUT -p tcp --dport $port -j ACCEPT 314 $IP6TABLE -A OUTPUT -p tcp --sport $port -j ACCEPT 315 done 316 317 echo " "+ TCP : [OK] 318} 319 320function udp_ok() 321{ 322 for port in $UDP_OK 323 do 324 $IP6TABLE -A INPUT -p udp --dport $port -j ACCEPT 325 $IP6TABLE -A OUTPUT -p udp --sport $port -j ACCEPT 326 done 327 328 echo " "+ 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 339 HTTP_PORTS="80 443" 340 for port in $HTTP_PORTS 341 do 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 349 done 350 echo " "+ APACHE : [OK] 351} 352 353#####-------------------------- START / STOP ----------------------------###### 354case "$1" in 355 356start|restart) 357$0 stop 358echo "$0 Starting" 359 kernel 360 loopback 361 362 generique 363 364# icmpv6_generique 365 icmpv6_huc 366 icmpv6_limit 367 368 ipv6_link_multicast 369 ipv6_forwarding 370 371 ssh_ok 372 rsync_ok 373 tcp_ok 374 udp_ok 375 376 server_http 377 378 policy DROP 379;; 380 381stop) 382 echo "$0 Stop" 383 $IP6TABLE -F 384 $IPTABLE -t nat -F 385 $IP6TABLE -Z 386 $IP6TABLE -X 387 policy ACCEPT 388 ;; 389status) 390 echo "$0 Status" 391 $IP6TABLE -L -vn 392 $IP6TABLE -L -vn -t nat 393 ;; 394 395*) 396echo "usage : $0 (status|start|stop|restart)" 397;; 398 399esac 400 401#####-------------------------- 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) html # Default-Start : 2 3 4 5 # Default-Stop : 0 1 6
.
Script avec 2 lignes
001ln -s /root/firewall-ipv6.sh /etc/init.d/firewall-ipv6 002update-rc.d firewall-ipv6 defaultsPuis aprés vous pouvez lancer le script en executant
/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 html.
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