diff --git a/archi.nft b/archi.nft index a1ad84f..9d24e48 100644 --- a/archi.nft +++ b/archi.nft @@ -15,3 +15,4 @@ define website = 193.48.225.242 define intranet = 193.48.225.247 define bounce_server = 193.48.225.247 + diff --git a/checkmac.nft b/checkmac.nft index b1eeab4..eb0c101 100644 --- a/checkmac.nft +++ b/checkmac.nft @@ -1,12 +1,8 @@ # Table checkmac, à bas le spoof d'ips. -table inet firewall { +table 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 - } } } diff --git a/firewall.nft b/firewall.nft old mode 100644 new mode 100755 index a3d3c1b..15fdd66 --- a/firewall.nft +++ b/firewall.nft @@ -1,11 +1,19 @@ -#! /sbin/nft -f +#! /usr/sbin/nft -f # Remise à zéro des règles du pare-feu flush ruleset # Inclusion des dépendances include "archi.nft" +include "global_policy.nft" include "checkmac.nft" +include "zones/adherent.nft" +include "zones/aloes.nft" +include "zones/federez.nft" +include "zones/supelec.nft" +include "zones/admin.nft" +include "zones/dmz.nft" +include "zones/prerezotage.nft" include "nat.nft" # Table principale @@ -19,7 +27,7 @@ table inet firewall { policy drop; # Applique la politique globale - jump global + #jump global # Filtre sur les interfaces entrantes, ne pas accepter # directement dans la chaine, mais retourner. @@ -57,12 +65,7 @@ table inet firewall { chain input { type filter hook input priority 0; - policy drop; - # Nos passerelles font beaucoup de choses... - tcp dport {http, https, ssh, dns, dhcp, radius} accept; - # On a le droit de parler avec nous même. - iif lo accept; - counter + policy accept; } chain output { @@ -72,5 +75,3 @@ table inet firewall { } -table nat { -} diff --git a/firewall.py b/firewall.py old mode 100644 new mode 100755 diff --git a/global_policy.nft b/global_policy.nft index 529ff24..f6bdbf5 100644 --- a/global_policy.nft +++ b/global_policy.nft @@ -1,5 +1,5 @@ -table inet firewall { +table firewall { chain global { # Interdiction de l'encapsulation ipv6 dans ipv4 ip protocol 6 drop; @@ -7,6 +7,6 @@ table inet firewall { # Gestion de l'ICMP : # On empêche le ping flood icmp type echo-request limit rate over 50/second drop; - icmp accept; + ip protocol icmp accept; } } diff --git a/nat.nft b/nat.nft index e34f776..68f4d98 100644 --- a/nat.nft +++ b/nat.nft @@ -1,38 +1,25 @@ #! /sbin/nft -f -table nat { - +table ip nat { chain prerouting { type nat hook prerouting priority 0; - # Sur le vlan prerezotage on fait du dnat vers un serveur de bounce car - # sur les clients récents on émet une requête http vers un serveur - # connu et on attend une réponse 204 pour voir que tout va bien. Si on - # ne l'a pas on ouvre un navigateur avec la réponse. C'est exactement - # ce que l'on veut pour les adhérents non rézotés qui sont sur ce vlan: - # les rediriger vers l'intranet. - meta iifname $if_prerezotage tcp dport {http,https} ip daddr != { $intranet, $comnpay, $website } dnat $bounce_server; + meta iifname $if_prerezotage ip daddr != { $intranet, $comnpay, $website } tcp dport {http,https} dnat $bounce_server; } chain postrouting { type nat hook postrouting priority 100 - # Pour les machines du VLAN de prérézotage, on fait un simple - # masquerade derrière l'IP du routeur car on a pas besoin de loguer - # étant donné que l'on limite les destinations possibles par ailleurs. - meta iifname $if_prerezotage masquerade,persistent - # NAT adherent - meta iifname $if_adherent meta oifname $if_supelec snat ip saddr map @adherent_nat_address : ip saddr map @adherent_nat_port; - # NAT federez - meta iifname $if_federez meta oifname $if_supelec snat ip saddr map @federez_nat_address : ip saddr map @federez_nat_port; - # NAT ALOES - meta iifname $if_adherent meta oifname $if_supelec snat ip saddr map @aloes_nat_address : ip saddr map @aloes_nat_port; - # NAT Server - meta iifname $if_admin meta oifname $if_supelec snat ip saddr map @server_nat_address : ip saddr map @server_nat_port; - # NAT prerezotage - meta iifname $if_prerezotage meta oifname $if_supelec snat ip saddr map @prerezotage_nat_address : ip saddr map @prerezotage_nat_port; + meta oifname != $if_supelec return + + meta iifname vmap { + $if_adherent : goto adh_nat, + $if_admin : goto adm_nat, + $if_aloes : goto aloes_nat, + $if_federez : goto federez_nat, + $if_prerezotage : goto prerezotage_nat, + } - # Le reste du local est mis en masquerade derrière le routeur ip saddr 10.0.0.0/8 masquerade } diff --git a/zones/adherent.nft b/zones/adherent.nft index b77ead9..68c8a36 100644 --- a/zones/adherent.nft +++ b/zones/adherent.nft @@ -2,62 +2,37 @@ 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, - } - } - chain to_adh { - meta iifname allowed_to_adh accept; - drop; + accept } chain from_adh { # On passe d'abord par le checkmac pour éviter le spoof d'ip: - not ip saddr . ether saddr @ip_mac drop; + #ip saddr . ether saddr != @ip_mac drop } } -table nat { +table ip nat { # On nate les users derrière les IPs 193.48.225.11 à 193.48.225.140 en # attribuant les plages de ports 11135-65535 par tranche de 1700 ports. # On a donc 32 Ips de 10.69.0.0/20 derrière chaque Ip. + # exemple: 10.69.0.1-10.69.0.31 : 193.48.225.11 + # On peut aussi ajouter dynamiquement des éléments : + # nft add element nat adherent_nat_address {10.69.0.1-10.69.0.31 : 193.48.225.11} map adherent_nat_address { type ipv4_addr: ipv4_addr - flags interval - elements = { - # exemple: 10.69.0.1-10.69.0.31 : 193.48.225.11 - # On peut aussi ajouter dynamiquement des éléments : - # nft add element nat adherent_nat_address {10.69.0.1-10.69.0.31 : 193.48.225.11} - - } } + # exemple: 10.69.0.1 : 11135-12834 + # On peut aussi ajouter dynamiquement des éléments : + # nft add element nat adherent_nat_port {10.69.0.1 : 11135-12834} map adherent_nat_port { type ipv4_addr: inet_service flags interval - elements = { - # exemple: 10.69.0.1 : 11135-12834 - # On peut aussi ajouter dynamiquement des éléments : - # nft add element nat adherent_nat_port {10.69.0.1 : 11135-12834} - } + } + chain adh_nat { + ip protocol tcp snat ip saddr map @adherent_nat_address : ip saddr map @adherent_nat_port + ip protocol udp snat ip saddr map @adherent_nat_address : ip saddr map @adherent_nat_port } } diff --git a/zones/admin.nft b/zones/admin.nft index 985f580..4c05af1 100644 --- a/zones/admin.nft +++ b/zones/admin.nft @@ -2,20 +2,8 @@ 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; + accept } chain from_admin { @@ -27,24 +15,23 @@ table nat { # On nate les admins derrière les IPs 193.48.225.215 à 193.48.225.224 en # attribuant les plages de ports 11135-65535 par tranche de 1700 ports. # On a donc 32 Ips de 10.7.0.0/24 derrière chaque Ip. + # exemple: 10.7.0.1-10.7.0.31 : 193.48.225.215 + # On peut aussi ajouter dynamiquement des éléments : + # nft add element nat federez_nat_address {10.7.0.1-10.7.0.31 : 193.48.225.215} map admin_nat_address { type ipv4_addr: ipv4_addr flags interval - elements = { - # exemple: 10.7.0.1-10.7.0.31 : 193.48.225.215 - # On peut aussi ajouter dynamiquement des éléments : - # nft add element nat federez_nat_address {10.7.0.1-10.7.0.31 : 193.48.225.215} - - } } + # exemple: 10.7.0.1 : 11135-12834 + # On peut aussi ajouter dynamiquement des éléments : + # nft add element nat federez_nat_port {10.7.0.1 : 11135-12834} map admin_nat_port { type ipv4_addr: inet_service flags interval - elements = { - # exemple: 10.7.0.1 : 11135-12834 - # On peut aussi ajouter dynamiquement des éléments : - # nft add element nat federez_nat_port {10.7.0.1 : 11135-12834} - } + } + chain adm_nat { + ip protocol tcp snat ip saddr map @admin_nat_address : ip saddr map @admin_nat_port + ip protocol udp snat ip saddr map @admin_nat_address : ip saddr map @admin_nat_port } } diff --git a/zones/aloes.nft b/zones/aloes.nft index 43f226d..ecc26a7 100644 --- a/zones/aloes.nft +++ b/zones/aloes.nft @@ -2,36 +2,13 @@ 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 { - meta iifname allowed_to_aloes accept; - drop; + accept } chain from_aloes { # On passe d'abord par le checkmac pour éviter le spoof d'ip: - not ip saddr . ether saddr @ip_mac drop; + #ip saddr . ether saddr != @ip_mac drop; } } @@ -40,24 +17,23 @@ table nat { # On nate ALOES derrière l'IP 193.48.225.214 # attribuant les plages de ports 11135-65535 par tranche de 1700 ports. # On a donc 32 Ips de 10.66.0.0/27 derrière l'Ip. + # exemple: 10.66.0.1-10.66.0.31 : 193.48.225.214 + # On peut aussi ajouter dynamiquement des éléments : + # nft add element nat federez_nat_address {10.66.0.1-10.66.0.31 : 193.48.225.214} map aloes_nat_address { type ipv4_addr: ipv4_addr flags interval - elements = { - # exemple: 10.66.0.1-10.66.0.31 : 193.48.225.214 - # On peut aussi ajouter dynamiquement des éléments : - # nft add element nat federez_nat_address {10.66.0.1-10.66.0.31 : 193.48.225.214} - - } } + # exemple: 10.66.0.1 : 11135-12834 + # On peut aussi ajouter dynamiquement des éléments : + # nft add element nat federez_nat_port {10.66.0.1 : 11135-12834} map aloes_nat_port { type ipv4_addr: inet_service flags interval - elements = { - # exemple: 10.66.0.1 : 11135-12834 - # On peut aussi ajouter dynamiquement des éléments : - # nft add element nat federez_nat_port {10.66.0.1 : 11135-12834} - } + } + chain aloes_nat { + ip protocol tcp snat ip saddr map @aloes_nat_address : ip saddr map @aloes_nat_port + ip protocol udp snat ip saddr map @aloes_nat_address : ip saddr map @aloes_nat_port } } diff --git a/zones/dmz.nft b/zones/dmz.nft index fad7e9a..87a65df 100644 --- a/zones/dmz.nft +++ b/zones/dmz.nft @@ -6,49 +6,33 @@ table inet firewall { # Définition de la DMZ set z_dmz { - type ipv4_addr; + type ipv4_addr flags interval - elements = { - # Si l'on souhaite ajouter des ranges d'ip c'est ici - 193.48.225.224/27, - } + elements = {193.48.225.224/27} } set dmz_allowed_tcp_in { type ipv4_addr . inet_service - flags interval - elements = { - } } set dmz_allowed_tcp_out { type ipv4_addr . inet_service - flags interval - elements = { - } } set dmz_allowed_udp_in { type ipv4_addr . inet_service - flags interval - elements = { - } } set dmz_allowed_udp_out { type ipv4_addr . inet_service - flags interval - elements = { - } } - chain to_dmz { - ip daddr . tcp dport @dmz_allowed_tcp_in accept; - ip daddr . udp dport @dmz_allowed_udp_in accept; - drop; + #ip daddr . tcp dport @dmz_allowed_tcp_in accept + #ip daddr . udp dport @dmz_allowed_udp_in accept + accept } chain from_dmz { - not ip saddr . tcp dport @dmz_allowed_tcp_out drop; - not ip saddr . udp dport @dmz_allowed_udp_out drop; + #ip saddr . tcp dport != @dmz_allowed_tcp_out drop + #ip saddr . udp dport != @dmz_allowed_udp_out drop } } diff --git a/zones/federez.nft b/zones/federez.nft index de38b60..788d9f8 100644 --- a/zones/federez.nft +++ b/zones/federez.nft @@ -2,31 +2,8 @@ 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 { - meta iifname allowed_to_federez accept; - drop; + accept } chain from_federez { @@ -38,24 +15,23 @@ table nat { # On nate les users derrière les IPs 193.48.225.141 à 193.48.225.172 en # attribuant les plages de ports 11135-65535 par tranche de 1700 ports. # On a donc 32 Ips de 10.20.0.0/21 derrière chaque Ip. + # exemple: 10.20.0.1-10.20.0.31 : 193.48.225.141 + # On peut aussi ajouter dynamiquement des éléments : + # nft add element nat federez_nat_address {10.20.0.1-10.20.0.31 : 193.48.225.141} map federez_nat_address { type ipv4_addr: ipv4_addr flags interval - elements = { - # exemple: 10.20.0.1-10.20.0.31 : 193.48.225.141 - # On peut aussi ajouter dynamiquement des éléments : - # nft add element nat federez_nat_address {10.20.0.1-10.20.0.31 : 193.48.225.141} - - } } + # exemple: 10.20.0.1 : 11135-12834 + # On peut aussi ajouter dynamiquement des éléments : + # nft add element nat federez_nat_port {10.20.0.1 : 11135-12834} map federez_nat_port { type ipv4_addr: inet_service flags interval - elements = { - # exemple: 10.20.0.1 : 11135-12834 - # On peut aussi ajouter dynamiquement des éléments : - # nft add element nat federez_nat_port {10.20.0.1 : 11135-12834} - } + } + chain federez_nat { + ip protocol tcp snat ip saddr map @federez_nat_address : ip saddr map @federez_nat_port + ip protocol udp snat ip saddr map @federez_nat_address : ip saddr map @federez_nat_port } } diff --git a/zones/prerezotage.nft b/zones/prerezotage.nft index a5d9187..03a2d1e 100644 --- a/zones/prerezotage.nft +++ b/zones/prerezotage.nft @@ -2,20 +2,8 @@ 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; + type ipv4_addr flags interval elements = { $comnpay, @@ -23,53 +11,20 @@ table inet firewall { } } - # 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 { - # On accepte les connexions que depuis certaines ips. - meta iifname allowed_to_prerezotage accept; - drop; + accept } chain from_prerezotage { - # Si on ne sort pas vers une ip autorisée, ça dégage. - not ip daddr allowed_daddr_prerezotage drop; + ip daddr != @allowed_daddr_prerezotage drop } } table nat { - # On nate les admins derrière les IPs 193.48.225.173 à 193.48.225.182 en - # attribuant les plages de ports 11135-65535 par tranche de 1700 ports. - # On a donc 32 Ips de 10.68.0.0/24 derrière chaque Ip. - map admin_nat_address { - type ipv4_addr: ipv4_addr - flags interval - elements = { - # exemple: 10.68.0.1-10.68.0.31 : 193.48.225.173 - # On peut aussi ajouter dynamiquement des éléments : - # nft add element nat federez_nat_address {10.68.0.1-10.68.0.31 : 193.48.225.173} - - } - } - map admin_nat_port { - type ipv4_addr: inet_service - flags interval - elements = { - # exemple: 10.68.0.1 : 11135-12834 - # On peut aussi ajouter dynamiquement des éléments : - # nft add element nat federez_nat_port {10.68.0.1 : 11135-12834} - } + chain prerezotage_nat { + masquerade } } diff --git a/zones/supelec.nft b/zones/supelec.nft index 395f546..ea0c334 100644 --- a/zones/supelec.nft +++ b/zones/supelec.nft @@ -2,25 +2,8 @@ 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 { - meta iifname allowed_to_supelec accept; - drop; + accept } chain from_supelec {