SNAT
This commit is contained in:
parent
f160b51e33
commit
31ee6ef787
13 changed files with 86 additions and 265 deletions
|
@ -15,3 +15,4 @@ define website = 193.48.225.242
|
|||
define intranet = 193.48.225.247
|
||||
define bounce_server = 193.48.225.247
|
||||
|
||||
|
||||
|
|
|
@ -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
21
firewall.nft
Normal file → Executable 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
0
firewall.py
Normal file → Executable 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
35
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
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue