Premier jet du firewall

This commit is contained in:
Hugo LEVY-FALK 2018-10-14 18:49:38 +02:00
commit 20bded8f0a
10 changed files with 355 additions and 0 deletions

10
archi.nft Normal file
View file

@ -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"

23
checkmac.nft Normal file
View file

@ -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 :)

78
firewall.nft Normal file
View file

@ -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
}

37
zones/adherent.nft Normal file
View file

@ -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;
}
}

24
zones/admin.nft Normal file
View file

@ -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 {
}
}

37
zones/aloes.nft Normal file
View file

@ -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;
}
}

27
zones/dmz.nft Normal file
View file

@ -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
}
}

37
zones/federez.nft Normal file
View file

@ -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;
}
}

53
zones/prerezotage.nft Normal file
View file

@ -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;
}
}

29
zones/supelec.nft Normal file
View file

@ -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 {
}
}