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