commit 20bded8f0a5f01c6f0b97a3aa47c99322af133f0 Author: Hugo LEVY-FALK Date: Sun Oct 14 18:49:38 2018 +0200 Premier jet du firewall diff --git a/archi.nft b/archi.nft new file mode 100644 index 0000000..a2d1593 --- /dev/null +++ b/archi.nft @@ -0,0 +1,10 @@ +# Variables prpres à l'architecture pour le pare-feu + +# Interfaces de la machine +define if_adherent = "eth0" +define if_admin = "eth1" +define if_federez = "eth2" +define if_supelec = "eth3" +define if_aloes = "eth4" +define if_prerezotage = "eth5" +define if_dmz = "eth6" diff --git a/checkmac.nft b/checkmac.nft new file mode 100644 index 0000000..b1eeab4 --- /dev/null +++ b/checkmac.nft @@ -0,0 +1,23 @@ +# Table checkmac, à bas le spoof d'ips. + +table inet firewall { + set ip_mac { + type ipv4_addr . ether_addr + elements = { + # On peut en mettre en dur ici + # Par exemple : 10.69.6.91 . 20:68:9d:dd:89:ab + } + } +} + +# Note : +# - On pourra afficher le set checkmac comme ceci : +# nft list set firewall ip_mac +# +# - On pourra ajouter des éléments comme ceci : +# nft add element firewall ip_mac { 10.69.6.91 . aa:bb:cc:dd:ee:ff } +# +# - En retirer : +# nft delete element firewall ip_mac { 10.69.6.91 . aa:bb:cc:dd:ee:ff } +# +# Le tout à la volée :) diff --git a/firewall.nft b/firewall.nft new file mode 100644 index 0000000..68d6af6 --- /dev/null +++ b/firewall.nft @@ -0,0 +1,78 @@ +#! /sbin/nft -f + +# Remise à zéro des règles du pare-feu +flush ruleset + +# Inclusion des dépendances +include "archi.nft" +include "checkmac.nft" + +# Table principale +table inet firewall { + + chain dispatch { + # Définition de la chaîne. On s'occupe du forward. + type filter hook forward priority 0; + + # Politique par défaut : tout jeter. + policy drop; + + # Filtre sur les interfaces entrantes, ne pas accepter + # directement dans la chaine, mais retourner. + # Par convention pour le routage, on vérifie dans la chaîne to_ que + # le passage d'un vlan à l'autre est autorisé. + # + # On utilise des jumps pour revenir ici une fois la chaîne évaluée. + meta iif vmap { + if_adherent : jump from_adh, + if_admin : jump from_admin, + if_federez : jump from_federez, + if_supelec : jump from_supelec, + if_aloes : jump from_aloes, + if_prerezotage : jump from_prerezotage, + if_dmz: jump from_dmz + } + + # Filtre sur les interfaces sortantes, ne pas retourner : drop ou + # accept + # On utilise des goto pour ne pas revenir ici une fois la chaîne + # évaluée. + meta oif vmap { + if_adherent : goto to_adh, + if_admin : goto to_admin, + if_federez : goto to_federez, + if_supelec : goto to_supelec, + if_aloes : goto to_aloes, + if_prerezotage : goto to_prerezotage, + if_dmz: goto to_dmz + } + + # Un compteur qui doit être à 0 si on a bien fait notre travail. + counter + } + + chain input { + type filter hook input priority 0; + policy drop; + # Nos passerelles font beaucoup de choses... + tcp dport {http, https, ssh, dns, dhcp} accept; + # On a le droit de parler avec nous même. + iif lo accept; + counter + } + + chain output { + type filter hook output priority 0; + policy accept; + } + +} + +table nat { +# TODO : on met 27 Ips internes par ip publiques +# Users : 193.48.225.10-119 +# Prerezotage 193.48.225.240-254 +# Aloes : 193.48.225.120-129 +# Federez : 193.48.225.130-199 +# Server : 193.48.225.200-209 +} diff --git a/zones/adherent.nft b/zones/adherent.nft new file mode 100644 index 0000000..967b238 --- /dev/null +++ b/zones/adherent.nft @@ -0,0 +1,37 @@ +#! /sbin/nft -f + +table inet firewall { + + # Définition de la zone Adhérents + + set z_adh { + type ipv4_addr; + flags interval + elements = { + # Si l'on souhaite ajouter des ranges d'ip c'est ici + 10.69.0.0/24, + } + } + + # Interfaces depuis lesquelles on autorise la communication vers + # adherent + set allowed_to_adh = { + type string; + elements = { + $if_admin, + $if_supelec, + $if_adherent, # Utile ? + } + } + + chain to_adh { + iifname allowed_to_adh accept; + drop; + } + + chain from_adh { + # On passe d'abord par le checkmac pour éviter le spoof d'ip: + not ip saddr . ether saddr @ip_mac drop; + } + +} diff --git a/zones/admin.nft b/zones/admin.nft new file mode 100644 index 0000000..5728c7b --- /dev/null +++ b/zones/admin.nft @@ -0,0 +1,24 @@ +#! /sbin/nft -f + +table inet firewall { + + # Définition de la zone Adhérents + + set z_admin { + type ipv4_addr; + flags interval + elements = { + # Si l'on souhaite ajouter des ranges d'ip c'est ici + 10.7.0.0/24, + } + } + + chain to_admin { + # On devrait toujours pouvoir contacter un admin :) + accept; + } + + chain from_admin { + } + +} diff --git a/zones/aloes.nft b/zones/aloes.nft new file mode 100644 index 0000000..5eeb7bb --- /dev/null +++ b/zones/aloes.nft @@ -0,0 +1,37 @@ +#! /sbin/nft -f + +table inet firewall { + + # Définition de la zone + + set z_aloes { + type ipv4_addr; + flags interval + elements = { + # Si l'on souhaite ajouter des ranges d'ip c'est ici + 10.66.0.0/24, + } + } + + # Interfaces depuis lesquelles on autorise la communication vers + # aloes + set allowed_to_aloes = { + type string; + elements = { + $if_admin, + $if_supelec, + $if_aloes, # Utile ? + } + } + + chain to_aloes { + iifname allowed_to_aloes accept; + drop; + } + + chain from_aloes { + # On passe d'abord par le checkmac pour éviter le spoof d'ip: + not ip saddr . ether saddr @ip_mac drop; + } + +} diff --git a/zones/dmz.nft b/zones/dmz.nft new file mode 100644 index 0000000..cd31be0 --- /dev/null +++ b/zones/dmz.nft @@ -0,0 +1,27 @@ +#! /sbin/nft -f + + +table inet firewall { + + # Définition de la DMZ + + set z_dmz { + type ipv4_addr; + flags interval + elements = { + # Si l'on souhaite ajouter des ranges d'ip c'est ici + 193.48.225.1-193.48.225.9, + } + } + + chain to_dmz { + # DMZ, tout le monde entre + accept; + } + + chain from_dmz { + # DMZ, tout le monde sort + } + +} + diff --git a/zones/federez.nft b/zones/federez.nft new file mode 100644 index 0000000..d18bc73 --- /dev/null +++ b/zones/federez.nft @@ -0,0 +1,37 @@ +#! /sbin/nft -f + +table inet firewall { + + # Définition de la zone Federez + + set z_federez { + type ipv4_addr; + flags interval + elements = { + # Si l'on souhaite ajouter des ranges d'ip c'est ici + 10.20.0.0/24, + } + } + + # Interfaces depuis lesquelles on autorise la communication vers + # federez + set allowed_to_federez = { + type string; + elements = { + $if_admin, + $if_supelec, + $if_federez, # Utile ? + } + } + + chain to_federez { + iifname allowed_to_federez accept; + drop; + } + + chain from_federez { + # On passe d'abord par le checkmac pour éviter le spoof d'ip: + not ip saddr . ether saddr @ip_mac drop; + } + +} diff --git a/zones/prerezotage.nft b/zones/prerezotage.nft new file mode 100644 index 0000000..e5745fe --- /dev/null +++ b/zones/prerezotage.nft @@ -0,0 +1,53 @@ +#! /sbin/nft -f + +# Ips que l'on autorise à contacter +define comnpay = 46.255.53.0/24; +# Pour le site d'accueil +define isis = 193.48.225.242 + +table inet firewall { + + # Définition de la zone Prérézotage + + set z_prerezotage { + type ipv4_addr; + flags interval + elements = { + # Si l'on souhaite ajouter des ranges d'ip c'est ici + 10.68.0.0/16, + } + } + + # Adresses de destination autorisées + set allowed_daddr_prerezotage { + type ipv4_addr; + flags interval + elements = { + $comnpay, + $isis + } + } + + # Interfaces depuis lesquelles on autorise la communication vers + # le prérézotage + set allowed_to_prerezotage = { + type string; + elements = { + $if_admin, + $if_prerezotage, + $if_supelec, + $if_prerezotage, # Utile ? + } + } + + chain to_prerezotage { + iifname allowed_to_prerezotage accept; + drop; + } + + chain from_prerezotage { + # Si c'est pas pour une ip autorisée, ça dégage. + not ip daddr allowed_daddr_prerezotage drop; + } + +} diff --git a/zones/supelec.nft b/zones/supelec.nft new file mode 100644 index 0000000..a9fed28 --- /dev/null +++ b/zones/supelec.nft @@ -0,0 +1,29 @@ +#! /sbin/nft -f + +table inet firewall { + + # Définition de la zone Supélec + + # Interfaces depuis lesquelles on autorise la communication vers + # supelec + set allowed_to_supelec = { + type string; + elements = { + $if_adherent, + $if_admin, + $if_federez, + $if_aloes, + $if_prerezotage, + $if_dmz + } + } + + chain to_supelec { + iifname allowed_to_supelec accept; + drop; + } + + chain from_supelec { + } + +}