Informations :
Dates
- Publish : : Friday 07 february 2020
- Modification : Monday 13 april 2020
Share :
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 met 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 150)) (--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 394 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 019WAN_IF="vmbr0" 020VM1_IF="vmbr1" 021 022# Network and IPs 023SUBNETPREFIX="2607:5300:0060:9389::/64" 024 025# port du service ssh 026port_ssh="22" 027 028# port du service rsync 029port_rsync="873" 030 031# ports tcp et udp a ouvrir 032TCP_OK="514 4949" # SYSLOG MUNIN 033UDP_OK="123 161 514 547" # NTP SNMP SYSLOG DHCP 034 035# ip qui ont acces en ssh au serveur 036SSH_OK="2001:0bc8:25bb:ff00::/56" 037 038# ip accedant au serveur en rsync 039RSYNC_OK="2001:0bc8:25bb:ff00::/56" 040 041##### 042# on fixe les sysctl 043##### 044function kernel() 045{ 046 # Don't accept source routed packets. 047 /bin/echo "0" > /proc/sys/net/ipv6/conf/all/accept_source_route 048 049 # Disable ICMP redirect acceptance. 050 /bin/echo "0" > /proc/sys/net/ipv6/conf/all/accept_redirects 051 052 # Enable the following lines only if a router! 053 # Enabling IPv6 forwarding disables route-advertisement reception - accept_ra=0|2 054 # A static gateway will need to be assigned. 055 # 056 echo "1" > /proc/sys/net/ipv6/conf/all/forwarding 057 # 058 #End router forwarding rules 059 060 echo " "+ KERNEL : [OK] 061} 062 063##### 064# on accepte tout de et pour "lo" local 065##### 066 067function loopback() 068{ 069 $IP6TABLE -A INPUT -i lo -j ACCEPT 070 $IP6TABLE -A FORWARD -i lo -j ACCEPT 071 $IP6TABLE -A FORWARD -o lo -j ACCEPT 072 $IP6TABLE -A OUTPUT -o lo -j ACCEPT 073 074 echo " "+ LOOPBACK : [OK] 075} 076 077##### 078# on fixe les regles general (DROP||ACCEPT) 079##### 080 081function policy() 082{ 083 $IP6TABLE -P INPUT 084 $IP6TABLE -P FORWARD 085 $IP6TABLE -P OUTPUT 086 087 echo " "+ POLICY : [OK] 088} 089 090##### 091# ACCEPT LES REQUETES DEMANDEES 092##### 093 094function generique() 095{ 096 # Allow anything out on the internet 097 $IP6TABLE -A OUTPUT -o $WAN_IF -j ACCEPT 098 # Allow established, related packets back in 099 $IP6TABLE -A INPUT -i $WAN_IF -m state --state ESTABLISHED,RELATED -j ACCEPT 100 101 echo " "+ GENERIQUE : [OK] 102} 103 104##### 105# on fixe les regles des adresses IPv6 106##### 107 108function ipv6_link_multicast() 109{ 110 echo " |"; 111 echo " + IPv6 - Addrs Link-Local/Multicast -----------------------"; 112 113 # Allow Link-Local addresses 114 echo " |"; 115 $IP6TABLE -A INPUT -s fe80::/10 -j ACCEPT 116 $IP6TABLE -A FORWARD -s fe80::/10 -d fe80::/10 -j ACCEPT 117 $IP6TABLE -A OUTPUT -s fe80::/10 -j ACCEPT 118 echo " +---> "fe80::/10 : ACCEPT; 119 echo " |"; 120 echo " "+ IPv6 - Addrs Link-Local : [OK] 121 122 # Allow multicast 123 echo " |"; 124 $IP6TABLE -A INPUT -d ff00::/8 -j ACCEPT 125 $IP6TABLE -A FORWARD -s ff00::/8 -d ff00::/8 -j ACCEPT 126 $IP6TABLE -A OUTPUT -d ff00::/8 -j ACCEPT 127 echo " +---> "ff00::/8 : ACCEPT; 128 echo " |"; 129 echo " "+ IPv6 - Addrs Multicast : [OK] 130} 131 132##### 133# On laisse passer les requetes ICMPv6 134##### 135 136function icmpv6_generique() 137{ 138 $IP6TABLE -I INPUT -p icmpv6 -j ACCEPT 139 $IP6TABLE -I FORWARD -p icmpv6 -j ACCEPT 140 $IP6TABLE -I OUTPUT -p icmpv6 -j ACCEPT 141 142 echo " "+ ICMPV6 - ACCEPT : [OK] 143} 144 145#### 146# La regle de Stephane Bortzmeyer DROP ICMP LIMIT 1/sec par IPv6::/128 147# A envoyer apres la chaine aICMPv6 (pour qu'elle soit au dessus -I) 148#### 149 150function icmpv6_limit() 151{ 152 # Au dessus de 1 ping par seconde (ICMPv6 echo-request) on DROP l'explosion PING d'une seule source IPv6 (masque 128) 153 $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 154 155 echo " "+ ICMPV6 - LIMIT 1/second DROP : [OK] 156} 157 158 159##### 160# Le script de Stephane Huc 161##### 162 163function icmpv6_huc() 164{ 165 # Allow dedicated ICMPv6 packettypes, do this in an extra chain because we need it everywhere 166 $IP6TABLE -N aICMPs 167 168 # Destination unreachable 169 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 1 -j ACCEPT # destination-unreachable; Must Not Be Dropped 170 171 # Packet too big 172 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 2/0 -j ACCEPT # packet too big; Must Not Be Dropped 173 174 # Time exceeded 175 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 3/0 -j ACCEPT # time exceeded 176 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 3/1 -j ACCEPT # time exceeded 177 178 # Parameter problem 179 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 4/0 -j ACCEPT # parameter pb: Erroneous header field encountered 180 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 4/1 -j ACCEPT # parameter pb: Unrecognized Next Header Type encountered 181 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 4/2 -j ACCEPT # parameter pb: Unrecognized IPv6 option encountered 182 183 # Echo Request (protect against flood) 184 # Commenter cette ligne 185# $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 128/0 -m limit --limit 1/sec --limit-burst 1 -j ACCEPT # ping tool: echo request message 186 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 128/0 -j ACCEPT 187 188 # Echo Reply 189 # Commenter cette ligne 190# $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 129/0 -m limit --limit 5/sec --limit-burst 10 -j ACCEPT # ping tool: echo reply message 191 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 128/0 -j ACCEPT 192 193 echo " "+ ICMPV6 - DEFAULT : [OK] 194 195 # link-local multicast receive notification mssg (need link-local src address, with hop-limit: 1) 196 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 130/0 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT 197 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 131/0 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT 198 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 132/0 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT 199 echo " "+ ICMPV6 - LINK-LOCAL : [OK] 200 201 # address configuration and routeur selection mssg (received with hop limit = 255) 202 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 133/0 -m hl --hl-eq 255 -j ACCEPT # Router Solicitation 203 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 134/0 -s fe80::/64 -m hl --hl-eq 255 -j ACCEPT # Router Advertisement 204 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 135/0 -m hl --hl-eq 255 -j ACCEPT # Neighbor Solicitation 205 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 136/0 -m hl --hl-eq 255 -j ACCEPT # Neighbor Advertisement 206 207 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 137/0 -j DROP # Redirect Message 208 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 138/0 -j DROP # Router Renumbering (Rechargement du routeur) 209 210 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 139/0 -j DROP # ICMP Node Information Query 211 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 140/0 -j DROP # ICMP Node Information Response 212 213 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 141/0 -d ff02::1 -m hl --hl-eq 255 -j ACCEPT # Inverse Neighbor Discovery Solicitation Message 214 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 142/0 -m hl --hl-eq 255 -j ACCEPT # Inverse Neighbor Discovery Advertisement Message 215 echo " "+ ICMPV6 - ADD CONF '&' ROUT€ SELECTION : [OK] 216 217 # link-local multicast receive notification mssg (need link-local src address, with hop-limit: 1) 218 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 143 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT 219 220 # needed for mobylity 221 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 144/0 -j DROP 222 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 145/0 -j DROP 223 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 146/0 -j DROP 224 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 147 -j DROP 225 226 # SEND certificate path notification mssg (received with hop limit = 255) 227 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 148 -m hl --hl-eq 255 -j ACCEPT # Certification Path Solicitation Message 228 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 149 -m hl --hl-eq 255 -j ACCEPT # Certification Path Advertisement Message 229 230 # multicast routeur discovery mssg (need link-local src address and hop limit = 1) 231 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 151 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT 232 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 152 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT 233 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 153 -s fe80::/64 -m conntrack --ctstate NEW -m hl --hl-eq 1 -j ACCEPT 234 echo " "+ ICMPV6 - MULTICAST ROUT€ DISCOVERY : [OK] 235 236 # 237 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 200 -j DROP # private experimentation 238 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 201 -j DROP # private experimentation 239 $IP6TABLE -A aICMPs -p icmpv6 --icmpv6-type 255 -j DROP # expansion error messages ICMPv6 240 echo " "+ ICMPV6 - EXPERIMENTATION : [OK] 241 242 # Only the ROUT€ is allowed to ping us (read FAQ this is a requirement) 243 #$IP6TABLE -A INPUT -p icmpv6 -m limit --limit 5/s --limit-burst 4 -j aICMPs 244 #$IP6TABLE -A OUTPUT -m state ! --state INVALID -j aICMPs 245 246 $IP6TABLE -I INPUT -p icmpv6 -j aICMPs 247 $IP6TABLE -I FORWARD -p icmpv6 -j aICMPs 248 $IP6TABLE -I OUTPUT -p icmpv6 -j aICMPs 249 250 echo " "+ ICMPV6 - INLIMIT + OUTPUT : [OK] 251} 252 253##### 254# FORWARDING entre les cartes (vmbr0 <-> vmbr1) 255##### 256 257function ipv6_forwarding() 258{ 259 # Allow forwarding 260 $IP6TABLE -A FORWARD -m state --state NEW -i $VM1_IF -o $WAN_IF -s $SUBNETPREFIX -j ACCEPT 261 $IP6TABLE -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT 262 263# $IP6TABLE -A FORWARD -i $VM1_IF -o $WAN_IF -j ACCEPT 264# $IP6TABLE -A FORWARD -o $VM1_IF -i $WAN_IF -j ACCEPT 265 266 echo " "+ IPv6 - FORWARDING : [OK] 267} 268 269##### 270# ouverture des acces SSH a certaines IP 271##### 272 273function ssh_ok() 274{ 275 for host in $SSH_OK 276 do 277 $IP6TABLE -A INPUT -s $host -p tcp --dport $port_ssh -j ACCEPT 278 $IP6TABLE -A OUTPUT -d $host -p tcp --sport $port_ssh -j ACCEPT 279 done 280 281 $IP6TABLE -A INPUT -p tcp --dport $port_ssh -m state --state NEW -m recent --set --name SSH 282 $IP6TABLE -A INPUT -p tcp --dport $port_ssh -m recent --update --seconds 60 --hitcount 3 --rttl --name SSH -j DROP 283 $IP6TABLE -A INPUT -p tcp --dport $port_ssh -j ACCEPT 284 285 echo " "+ SSH : [OK] 286} 287 288##### 289# ouverture des acces RSYNC a certaines IP 290##### 291 292function rsync_ok() 293{ 294 for host in $RSYNC_OK 295 do 296 $IP6TABLE -A INPUT -s $host -p tcp --dport $port_rsync -j ACCEPT 297 $IP6TABLE -A OUTPUT -d $host -p tcp --sport $port_rsync -j ACCEPT 298 done 299 300 echo " "+ RSYNC : [OK] 301} 302 303##### 304# ouverture des ports tcp et upd 305##### 306 307function tcp_ok() 308{ 309 for port in $TCP_OK 310 do 311 $IP6TABLE -A INPUT -p tcp --dport $port -j ACCEPT 312 $IP6TABLE -A OUTPUT -p tcp --sport $port -j ACCEPT 313 done 314 315 echo " "+ TCP : [OK] 316} 317 318function udp_ok() 319{ 320 for port in $UDP_OK 321 do 322 $IP6TABLE -A INPUT -p udp --dport $port -j ACCEPT 323 $IP6TABLE -A OUTPUT -p udp --sport $port -j ACCEPT 324 done 325 326 echo " "+ UDP : [OK] 327} 328 329##### 330# ouverture des acces HTTP(S) a linterface LAN & NET 331##### 332 333function server_http() 334{ 335 HTTP_PORTS="80 443" 336 for port in $HTTP_PORTS 337 do 338 # SOIT le service est sur LHOTE SOIT dans un VServer 339 $IP6TABLE -A INPUT -m state --state NEW -m tcp -p tcp --dport $port -j ACCEPT 340# $IP6TABLE -A INPUT -p tcp --dport $port -j ACCEPT 341 $IP6TABLE -A OUTPUT -p tcp --sport $port -j ACCEPT 342# $IP6TABLE -A OUTPUT -m state --state ESTABLISHED,RELATED -m tcp -p tcp --sport $port -j ACCEPT 343 done 344 echo " "+ APACHE : [OK] 345} 346 347#####-------------------------- START / STOP ----------------------------###### 348case "" in 349 350start|restart) 351{text} stop 352echo "{text} Starting" 353 kernel 354 loopback 355 356 generique 357 358# icmpv6_generique 359 icmpv6_huc 360 icmpv6_limit 361 362 ipv6_link_multicast 363 ipv6_forwarding 364 365 ssh_ok 366 rsync_ok 367 tcp_ok 368 udp_ok 369 370 server_http 371 372 policy DROP 373;; 374 375stop) 376 echo "{text} Stop" 377 $IP6TABLE -F 378 $IPTABLE -t nat -F 379 $IP6TABLE -Z 380 $IP6TABLE -X 381 policy ACCEPT 382 ;; 383status) 384 echo "{text} Status" 385 $IP6TABLE -L -vn 386 ;; 387 388*) 389echo "usage : {text} (status|start|stop|restart)" 390;; 391 392esac 393 394#####-------------------------- 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
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)
Cordialement,
Romain