De fato, iptables
usa a interface netlink para se comunicar com o kernel. Ele abre um soquete de netlink para xtables
e, em seguida, emite comandos por meio desse soquete. O controle de acesso é executado quando o soquete é aberto, não para comandos individuais, portanto, as mesmas permissões são necessárias para listar e modificar regras. A única maneira de permitir que um usuário liste as regras, mas não as modifique, é dar a elas um executável setuid (ou setcap) cuidadosamente escrito.
Seria bom se houvesse uma interface para o netfilter em /proc
, mas até onde sei, a tarefa de implementá-lo nunca foi concluída.