#!/sbin/nft -f

# Profil edf-vdi 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 le seul 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 vdi est fait en marquant les paquets acceptés. Si le profil sur lequel repose le vdi voit un paquet
# marqué, il l'acceptera.
# Le profil vdi ne fait donc pas de drop/accept, il se base sur le marquage.
# Cela permet au profil vdi de venir se "plugguer" au profil internal.

# Ne surtout pas faire un flush ruleset

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

table inet edf-vdi {
    chain input {
        # Le profil vdi venant se greffer à un autre profil, on doit d'abord passer dans les règles du profil vdi
        # avant d'aller dans celles de l'autre profil. On a donc une priorité à -2.
        # Le -2 est choisi pour passer avant le profil vpn est éviter les conflicts avec celui-ci.
        # Le profil vdi marque les paquets comme valides, plutôt que de les accept/drop. Si le profil suivant voit
        # un paquet marqué par le profil vdi, il l'acceptera.
        type filter hook input priority -2; policy accept;

        # On accepte les paquets des connexions initiées par le poste sur l'interface ethernet du profil vdi
        iifname $ethernet_interfaces ct state established,related mark set $packet_accepted_by_vdi

        # On accepte les connexions sur le port 1494 TCP entrantes sur l'interface ethernet
        iifname $ethernet_interfaces tcp dport 1494 mark set $packet_accepted_by_vdi

        # On accepte les connexions sur le port 1494 UDP entrantes sur l'interface ethernet
        iifname $ethernet_interfaces udp dport 1494 mark set $packet_accepted_by_vdi

        # On accepte les connexions sur le port 2598 TCP entrantes sur l'interface ethernet
        iifname $ethernet_interfaces tcp dport 2598 mark set $packet_accepted_by_vdi

        # On accepte les connexions sur le port 2598 UDP entrantes sur l'interface ethernet
        iifname $ethernet_interfaces udp dport 2598 mark set $packet_accepted_by_vdi
    }

    chain output {
        # Le profil vdi venant se greffer à un autre profil, on doit d'abord passer dans les règles du profil vdi
        # avant d'aller dans celles de l'autre profil. On a donc une priorité à -2.
        # Le -2 est choisi pour passer avant le profil vpn est éviter les conflicts avec celui-ci.
        # Le profil vdi marque les paquets comme valides, plutôt que de les accept/drop. Si le profil suivant voit
        # un paquet marqué par le profil vdi, il l'acceptera
        type filter hook output priority -2; policy accept;

        # On marque les paquets sortants sur l'interface du profil vdi comme valides
        # Ainsi, ils ne seront pas rejetés plus loin par le profil firewall sur lequel repose le profil vdi
        oifname $ethernet_interfaces mark set $packet_accepted_by_vdi
    }
}
