This commit is contained in:
Hugo Levy-Falk 2019-02-09 10:23:05 +01:00 committed by root
parent f160b51e33
commit 31ee6ef787
13 changed files with 86 additions and 265 deletions

View file

@ -15,3 +15,4 @@ define website = 193.48.225.242
define intranet = 193.48.225.247 define intranet = 193.48.225.247
define bounce_server = 193.48.225.247 define bounce_server = 193.48.225.247

View file

@ -1,12 +1,8 @@
# Table checkmac, à bas le spoof d'ips. # Table checkmac, à bas le spoof d'ips.
table inet firewall { table firewall {
set ip_mac { set ip_mac {
type ipv4_addr . ether_addr 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
}
} }
} }

21
firewall.nft Normal file → Executable file
View file

@ -1,11 +1,19 @@
#! /sbin/nft -f #! /usr/sbin/nft -f
# Remise à zéro des règles du pare-feu # Remise à zéro des règles du pare-feu
flush ruleset flush ruleset
# Inclusion des dépendances # Inclusion des dépendances
include "archi.nft" include "archi.nft"
include "global_policy.nft"
include "checkmac.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" include "nat.nft"
# Table principale # Table principale
@ -19,7 +27,7 @@ table inet firewall {
policy drop; policy drop;
# Applique la politique globale # Applique la politique globale
jump global #jump global
# Filtre sur les interfaces entrantes, ne pas accepter # Filtre sur les interfaces entrantes, ne pas accepter
# directement dans la chaine, mais retourner. # directement dans la chaine, mais retourner.
@ -57,12 +65,7 @@ table inet firewall {
chain input { chain input {
type filter hook input priority 0; type filter hook input priority 0;
policy drop; policy accept;
# 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
} }
chain output { chain output {
@ -72,5 +75,3 @@ table inet firewall {
} }
table nat {
}

0
firewall.py Normal file → Executable file
View file

View file

@ -1,5 +1,5 @@
table inet firewall { table firewall {
chain global { chain global {
# Interdiction de l'encapsulation ipv6 dans ipv4 # Interdiction de l'encapsulation ipv6 dans ipv4
ip protocol 6 drop; ip protocol 6 drop;
@ -7,6 +7,6 @@ table inet firewall {
# Gestion de l'ICMP : # Gestion de l'ICMP :
# On empêche le ping flood # On empêche le ping flood
icmp type echo-request limit rate over 50/second drop; icmp type echo-request limit rate over 50/second drop;
icmp accept; ip protocol icmp accept;
} }
} }

35
nat.nft
View file

@ -1,38 +1,25 @@
#! /sbin/nft -f #! /sbin/nft -f
table nat { table ip nat {
chain prerouting { chain prerouting {
type nat hook prerouting priority 0; type nat hook prerouting priority 0;
# Sur le vlan prerezotage on fait du dnat vers un serveur de bounce car meta iifname $if_prerezotage ip daddr != { $intranet, $comnpay, $website } tcp dport {http,https} dnat $bounce_server;
# 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;
} }
chain postrouting { chain postrouting {
type nat hook postrouting priority 100 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 oifname != $if_supelec return
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 vmap {
meta iifname $if_federez meta oifname $if_supelec snat ip saddr map @federez_nat_address : ip saddr map @federez_nat_port; $if_adherent : goto adh_nat,
# NAT ALOES $if_admin : goto adm_nat,
meta iifname $if_adherent meta oifname $if_supelec snat ip saddr map @aloes_nat_address : ip saddr map @aloes_nat_port; $if_aloes : goto aloes_nat,
# NAT Server $if_federez : goto federez_nat,
meta iifname $if_admin meta oifname $if_supelec snat ip saddr map @server_nat_address : ip saddr map @server_nat_port; $if_prerezotage : goto prerezotage_nat,
# NAT prerezotage }
meta iifname $if_prerezotage meta oifname $if_supelec snat ip saddr map @prerezotage_nat_address : ip saddr map @prerezotage_nat_port;
# Le reste du local est mis en masquerade derrière le routeur
ip saddr 10.0.0.0/8 masquerade ip saddr 10.0.0.0/8 masquerade
} }

View file

@ -2,62 +2,37 @@
table inet firewall { 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 { chain to_adh {
meta iifname allowed_to_adh accept; accept
drop;
} }
chain from_adh { chain from_adh {
# On passe d'abord par le checkmac pour éviter le spoof d'ip: # 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 # 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. # 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. # 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 { map adherent_nat_address {
type ipv4_addr: ipv4_addr 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 { map adherent_nat_port {
type ipv4_addr: inet_service type ipv4_addr: inet_service
flags interval flags interval
elements = { }
# exemple: 10.69.0.1 : 11135-12834 chain adh_nat {
# On peut aussi ajouter dynamiquement des éléments : ip protocol tcp snat ip saddr map @adherent_nat_address : ip saddr map @adherent_nat_port
# nft add element nat adherent_nat_port {10.69.0.1 : 11135-12834} ip protocol udp snat ip saddr map @adherent_nat_address : ip saddr map @adherent_nat_port
}
} }
} }

View file

@ -2,20 +2,8 @@
table inet firewall { 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 { chain to_admin {
# On devrait toujours pouvoir contacter un admin :) accept
accept;
} }
chain from_admin { 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 # 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. # 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. # 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 { map admin_nat_address {
type ipv4_addr: ipv4_addr type ipv4_addr: ipv4_addr
flags interval 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 { map admin_nat_port {
type ipv4_addr: inet_service type ipv4_addr: inet_service
flags interval flags interval
elements = { }
# exemple: 10.7.0.1 : 11135-12834 chain adm_nat {
# On peut aussi ajouter dynamiquement des éléments : ip protocol tcp snat ip saddr map @admin_nat_address : ip saddr map @admin_nat_port
# nft add element nat federez_nat_port {10.7.0.1 : 11135-12834} ip protocol udp snat ip saddr map @admin_nat_address : ip saddr map @admin_nat_port
}
} }
} }

View file

@ -2,36 +2,13 @@
table inet firewall { 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 { chain to_aloes {
meta iifname allowed_to_aloes accept; accept
drop;
} }
chain from_aloes { chain from_aloes {
# On passe d'abord par le checkmac pour éviter le spoof d'ip: # 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 # On nate ALOES derrière l'IP 193.48.225.214
# attribuant les plages de ports 11135-65535 par tranche de 1700 ports. # 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. # 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 { map aloes_nat_address {
type ipv4_addr: ipv4_addr type ipv4_addr: ipv4_addr
flags interval 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 { map aloes_nat_port {
type ipv4_addr: inet_service type ipv4_addr: inet_service
flags interval flags interval
elements = { }
# exemple: 10.66.0.1 : 11135-12834 chain aloes_nat {
# On peut aussi ajouter dynamiquement des éléments : ip protocol tcp snat ip saddr map @aloes_nat_address : ip saddr map @aloes_nat_port
# nft add element nat federez_nat_port {10.66.0.1 : 11135-12834} ip protocol udp snat ip saddr map @aloes_nat_address : ip saddr map @aloes_nat_port
}
} }
} }

View file

@ -6,49 +6,33 @@ table inet firewall {
# Définition de la DMZ # Définition de la DMZ
set z_dmz { set z_dmz {
type ipv4_addr; type ipv4_addr
flags interval flags interval
elements = { elements = {193.48.225.224/27}
# Si l'on souhaite ajouter des ranges d'ip c'est ici
193.48.225.224/27,
}
} }
set dmz_allowed_tcp_in { set dmz_allowed_tcp_in {
type ipv4_addr . inet_service type ipv4_addr . inet_service
flags interval
elements = {
}
} }
set dmz_allowed_tcp_out { set dmz_allowed_tcp_out {
type ipv4_addr . inet_service type ipv4_addr . inet_service
flags interval
elements = {
}
} }
set dmz_allowed_udp_in { set dmz_allowed_udp_in {
type ipv4_addr . inet_service type ipv4_addr . inet_service
flags interval
elements = {
}
} }
set dmz_allowed_udp_out { set dmz_allowed_udp_out {
type ipv4_addr . inet_service type ipv4_addr . inet_service
flags interval
elements = {
}
} }
chain to_dmz { chain to_dmz {
ip daddr . tcp dport @dmz_allowed_tcp_in accept; #ip daddr . tcp dport @dmz_allowed_tcp_in accept
ip daddr . udp dport @dmz_allowed_udp_in accept; #ip daddr . udp dport @dmz_allowed_udp_in accept
drop; accept
} }
chain from_dmz { chain from_dmz {
not ip saddr . tcp dport @dmz_allowed_tcp_out drop; #ip saddr . tcp dport != @dmz_allowed_tcp_out drop
not ip saddr . udp dport @dmz_allowed_udp_out drop; #ip saddr . udp dport != @dmz_allowed_udp_out drop
} }
} }

View file

@ -2,31 +2,8 @@
table inet firewall { 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 { chain to_federez {
meta iifname allowed_to_federez accept; accept
drop;
} }
chain from_federez { 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 # 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. # 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. # 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 { map federez_nat_address {
type ipv4_addr: ipv4_addr type ipv4_addr: ipv4_addr
flags interval 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 { map federez_nat_port {
type ipv4_addr: inet_service type ipv4_addr: inet_service
flags interval flags interval
elements = { }
# exemple: 10.20.0.1 : 11135-12834 chain federez_nat {
# On peut aussi ajouter dynamiquement des éléments : ip protocol tcp snat ip saddr map @federez_nat_address : ip saddr map @federez_nat_port
# nft add element nat federez_nat_port {10.20.0.1 : 11135-12834} ip protocol udp snat ip saddr map @federez_nat_address : ip saddr map @federez_nat_port
}
} }
} }

View file

@ -2,20 +2,8 @@
table inet firewall { 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 { set allowed_daddr_prerezotage {
type ipv4_addr; type ipv4_addr
flags interval flags interval
elements = { elements = {
$comnpay, $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 { chain to_prerezotage {
# On accepte les connexions que depuis certaines ips. accept
meta iifname allowed_to_prerezotage accept;
drop;
} }
chain from_prerezotage { chain from_prerezotage {
# Si on ne sort pas vers une ip autorisée, ça dégage. ip daddr != @allowed_daddr_prerezotage drop
not ip daddr allowed_daddr_prerezotage drop;
} }
} }
table nat { table nat {
# On nate les admins derrière les IPs 193.48.225.173 à 193.48.225.182 en chain prerezotage_nat {
# attribuant les plages de ports 11135-65535 par tranche de 1700 ports. masquerade
# 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}
}
} }
} }

View file

@ -2,25 +2,8 @@
table inet firewall { 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 { chain to_supelec {
meta iifname allowed_to_supelec accept; accept
drop;
} }
chain from_supelec { chain from_supelec {