From 1b8e3c9fb2d58e087da3c2c623e18f90639c85f2 Mon Sep 17 00:00:00 2001 From: Jeltz Date: Sun, 24 Jan 2021 20:12:26 +0100 Subject: [PATCH] =?UTF-8?q?On=20autorise=20les=20acc=C3=A8s=20("blocage"?= =?UTF-8?q?=20g=C3=A9r=C3=A9=20par=20DNAT)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index bd2253f..38713b1 100755 --- a/main.py +++ b/main.py @@ -540,22 +540,45 @@ class iptables: triggered = f"accueil_{iface}_triggered" allowed = f"accueil_{iface}_allowed" triggers = accueil["triggers"] + ip_redirect = accueil.get("ip_redirect", {}) self.add_mac_ipset(allowed, accueil.get("grace_period", 120)) self.add_mac_ipset(triggered, accueil.get("retry_period", 240)) - self.add_accueil(iface, allowed, triggered, triggers) + self.add_accueil(iface, allowed, triggered, triggers, ip_redirect) - def add_accueil(self, iface, allowed_set, triggered_set, triggers): + def add_accueil(self, iface, allowed_set, triggered_set, triggers, ip_redirect): subtable = f"ACCUEIL-{iface}" self.init_mangle(subtable, decision="-") + + # on laisse passer les machines qui sont temporairement + # autorisées self.add_in_subtable("mangle", subtable, f"-m set --match-set {allowed_set} src -j RETURN") + + # on interdit les machines qui ont accédé à un "trigger" récemment + # mais qui ne sont plus autorisées (règle précédente) self.add_in_subtable("mangle", subtable, f"-m set --match-set {triggered_set} src -j DROP") + + # on autorise l'accès aux "triggers" pour les machines qui n'y ont + # pas accédé récemment, et on les ajoute aux ensembles pour signaler + # l'accès récent for iptype, proto, addr, port in triggers: match = f"-p {proto} -d {addr} --dport {port}" for s in (allowed_set, triggered_set): self.add_in_subtable("mangle", subtable, f"{match} -j SET --add-set {s} src", iptype) self.add_in_subtable("mangle", subtable, f"{match} -j RETURN", iptype) - self.add_in_subtable("mangle", subtable, "-j DROP") + + # ATTENTION: on n'interdit toutes les autres connexions, car c'est géré + # via le profil de ports de re2o + par la redirection configurée + + subtable_redir = f"ACCUEIL-REDIR-{iface}" + self.init_nat(subtable_redir, decision="-") + + # on redirige les machines non temporairement autorisées vers les + # portails captifs + self.add_in_subtable("nat", subtable_redir, f"-m set --match-set {allowed_set} src -j RETURN") + self.ip_redirect(subtable_redir, {"0.0.0.0/0": ip_redirect}) + self.jump_traficfrom("mangle", iface, "PREROUTING", subtable) + self.jump_traficfrom("nat", iface, "PREROUTING", subtable_redir) def nat_prive_ip(self, nat_type): """Nat filaire en v4"""