Para o aspecto de apenas extrair informações, é possível fazer isso com iptables usando correspondências AUDIT (ou possivelmente correspondências LOG se você não precisar de grandes quantidades de informação).
Para o caso de permitir ou não conexões em tempo real com base em algumas regras complexas, não tenho certeza se você pode fazer isso de forma confiável no Linux. As opções incluem:
- Seccomp-BPF, mas não tenho certeza se ele pode fazer isso (e o filtro seria estático, uma vez instanciado em um determinado processo).
- Substituindo várias chamadas de soquete usando LD_PRELOAD ou algum outro método. Isso não é confiável porque é fácil ignorar (fazer syscalls diretos é trivial e você também pode
dlopen()
de qualquer libc e fazer chamadas dessa maneira). - O grupo de controle
net_cls
. Isso requer uma configuração de firewall, pode afetar as conexões ativas e pode não funcionar exatamente como você deseja (será necessário um daemon que mova os processos para o grupo de controle apropriado à medida que eles são iniciados). - Se você pode tolerar que alguns dados entrem na rede, você pode usar o alvo NFLOG do iptables e observar conexões interessantes (se você quiser uma avaliação em tempo real, será necessário registrar todas as novas conexões e analisar as coisas no espaço do usuário) e feche de forma reativa as conexões que você não deseja.
- Você pode executar cada aplicativo em seu próprio namespace de rede e forçar o tráfego de saída através do sistema host e, em seguida, usar o roteamento de políticas com base na origem para controlar o que sai da rede real.
Dito isso, você pode querer reavaliar por que precisa disso. A menos que você esteja alimentando sua tomada de decisão a partir de uma rede neural ou alguma outra abordagem heurística (ambos são opções problemáticas por várias razões), você estará quase sempre melhor codificando as coisas diretamente para o firewall (o iptables pode fazer algumas coisas seriamente complexas, como corresponder apenas conexões usando um protocolo IP específico a uma porta específica iniciada por um determinado UID a uma taxa aleatória distribuída uniformemente e enviar os pacotes não correspondentes a um destino diferente) ou usar ferramentas de agendamento ou outros ganchos para atualizar o firewall regras dinamicamente (por exemplo, alterar as regras de firewall quando o sistema deve estar sem uso ou apenas permitir novas conexões originadas de um determinado UID quando esse usuário estiver logado).