#!/sbin/nft -f

# Profil captive-portal du firewall.
# Profil particulier, qui vient se rajouter au profil présent précédemment. Il faut le voir comme une surcouche.
# Cette distinction est importante : c'est un profil qui ne fonctionne pas en mode "drop all, but whitelist these"
# Celui-ci fonctionne plutôt en mode "whitelist these, and let next profile decide what to do with remaining packets".
# Le whitelist par le captive-portal est fait en marquant les paquets acceptés. Si le profil sur lequel repose le captive-portal voit un paquet
# marqué, il l'acceptera.
# Le profil captive-portal ne fait donc pas de drop/accept, il se base sur le marquage.
# Cela permet au profil captive-portal de venir se "plugguer" au profil external :
# captive-portal applique les règles propres au vpn, sans déranger les spécificités de la connexion sur laquelle il repose

# Entrée
# Ce profil ne gère aucune règle entrante

# Sortie
# Les accès sortants sont ouverts sur le port 443 et 80, pour pouvoir se connecter à l'interface du portail captif
# Les autres accès sortants ne sont pas refusés, c'est au profil suivant de les gérer

# Ne surtout pas faire un flush ruleset

# TODO : améliorer cette version open-bar

include "/etc/scibian-firewall/utils/variables"

table inet captive-portal {
    chain output {
        # Le profil captive-portal venant se greffer à un autre profil, on doit d'abord passer dans les règles du profil captive-portal
        # avant d'aller dans celles de l'autre profil. On a donc une priorité à -1.
        # Le profil captive-portal marque les paquets comme valides, plutot que de les accept/drop. Si le profil suivant voit
        # un paquet marqué par le captive-portal, il l'acceptera
        type filter hook output priority -1; policy accept;

        # On marque les paquets sortants sur les port 443 et 80 comme valides
        # Ainsi, ils ne seront pas rejetés plus loin par le profil firewall sur lequel repose le profil captive-portal
        tcp dport { 80, 443 } mark set $packet_accepted_by_captive
    }
}
