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 bounce_server = 193.48.225.247

View file

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

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

0
firewall.py Normal file → Executable file
View file

View file

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

35
nat.nft
View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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