#!/usr/sbin/nft -f
# Géré par Ansible — ne pas modifier manuellement

flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;

        # Loopback
        iif lo accept

        # Connexions établies
        ct state established,related accept

        # ICMP
        ip protocol icmp accept
        ip6 nexthdr icmpv6 accept

        # SSH depuis le LAN domestique et le LAN cluster
        tcp dport 22 ip saddr { 192.168.1.0/24, 192.168.10.0/24 } accept

        # DNS + DHCP (dnsmasq)
        udp dport 53 ip saddr 192.168.10.0/24 accept
        tcp dport 53 ip saddr 192.168.10.0/24 accept
        udp dport 67 iif {{ lan_interface }} accept

        # NFS
        tcp dport { 111, 2049 } ip saddr 192.168.10.0/24 accept
        udp dport { 111, 2049 } ip saddr 192.168.10.0/24 accept

        # Services données (accès cluster uniquement)
        tcp dport { 5432, 6333, 6334, 9000, 9001 } ip saddr 192.168.10.0/24 accept

        # Monitoring — node_exporter (scraping par Prometheus : nœuds cluster + pods 10.42/16)
        tcp dport 9100 ip saddr { 192.168.10.0/24, 10.42.0.0/16 } accept

        # AlertManager webhook → Hermes monitor (pods k8s 10.42/16 + nœuds cluster)
        tcp dport 9093 ip saddr { 192.168.10.0/24, 10.42.0.0/16 } accept

        # Hermes gateway (accès LAN domestique + cluster + pods k8s pour alertmanager webhook)
        tcp dport 8080 ip saddr { 192.168.1.0/24, 192.168.10.0/24, 10.42.0.0/16 } accept

        # Hermes dashboard (poste admin uniquement)
        tcp dport 9119 ip saddr {{ hermes_dashboard_allowed_ip }} accept

        # LiteLLM proxy (pods k8s 10.42/16 + nœuds cluster + LAN domestique pour client vocal)
        tcp dport 4000 ip saddr { 192.168.1.0/24, 192.168.10.0/24, 10.42.0.0/16 } accept

        # Postfix relay SMTP (pods k8s 10.42/16 + nœuds cluster)
        tcp dport 25 ip saddr { 192.168.10.0/24, 10.42.0.0/16 } accept

        # Hermes auto-improve trigger server (pods k8s 10.42/16 + nœuds cluster)
        tcp dport 9095 ip saddr { 192.168.10.0/24, 10.42.0.0/16 } accept

        log prefix "nft-drop: " drop
    }

    chain forward {
        type filter hook forward priority 0; policy drop;

        # Forwarding LAN cluster → WAN (NAT sortant)
        iif {{ lan_interface }} oif {{ wan_interface }} ct state new,established,related accept

        # Forwarding LAN domestique → LAN cluster (accès admin depuis le poste perso)
        iif {{ wan_interface }} oif {{ lan_interface }} ip saddr 192.168.1.0/24 ct state new,established,related accept

        # Réponses WAN → cluster (connexions initiées depuis le cluster)
        iif {{ wan_interface }} oif {{ lan_interface }} ct state established,related accept
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }
}

table ip nat {
    chain prerouting {
        type nat hook prerouting priority -100;
    }

    chain postrouting {
        type nat hook postrouting priority 100;

        # NAT masquerade pour le LAN cluster
        oif {{ wan_interface }} ip saddr 192.168.10.0/24 masquerade
    }
}
