#!/usr/sbin/nft -f # felhom OOB belt — STATIC table (TASK H1). Installed by host-install; loaded on boot by # felhom-oob-nft.service. The agent mutates ONLY the two SETS (@operator_ips, @ssh_port) via the # narrow FELHOM_OOB sudoers — it NEVER touches the rules [trap 4], so the enforcement semantics are # fixed here and cannot be changed by the agent. # # Enforcement (scoped to iifname "wg-felhom" — the offsite tunnel — so :22 and every other interface # are UNTOUCHED [SF-3/OF-5]): # - ESTABLISHED,RELATED replies always pass (covers the PBS path + reply traffic; PMTU-safe). # - felhom-sshd's port is reachable from the operator /32 (in @operator_ips) over the tunnel ONLY. # - any other tunnel source to that port is DROPPED at the host (defense-in-depth vs the endpoint). # - the port is unreachable OFF the tunnel entirely. # Empty sets (before the agent's first sync) = the port rules match nothing = no enforcement yet # (felhom-sshd is not started until the agent renders its config either). priority -5 sits just above # the default; policy accept so this table only ever ADDS drops for the felhom-sshd port. # # Idempotent load: create-then-delete-then-define (a re-run/boot yields a clean table with EMPTY sets; # the agent refills them within one tick). table inet felhom_oob delete table inet felhom_oob table inet felhom_oob { set operator_ips { type ipv4_addr } set ssh_port { type inet_service } chain input { type filter hook input priority -5; policy accept; ct state established,related accept iifname "wg-felhom" tcp dport @ssh_port ip saddr @operator_ips accept iifname "wg-felhom" tcp dport @ssh_port drop tcp dport @ssh_port iifname != "wg-felhom" drop } }