Em plataformas baseadas em Linux, há um soquete netlink que você pode abrir do seu programa Java e determinar se aceita ou não o pacote. Esse soquete pode ser incluído na pilha de rede com uma regra iptables
. Aqui, é claro, você também pode limitar os tipos de pacotes a serem passados para o seu filtro de modo de usuário.
Veja o que o man page tem a dizer sobre o assunto:
ULOG
This target provides userspace logging of matching packets. When this target is set for a rule, the Linux kernel will multicast this packet through a netlink socket. One or more userspace processes may then subscribe to various multicast groups and receive the packets.
Devido à complexidade e sofisticação do projeto netfilter, pode valer a pena pedir soluções para o problema que você está tentando resolver. (Ou talvez seja o que sua outra questão de SE cobriu; eu ainda não olhei)