O Netfilter (iptables) tem módulo de fila para enviar quadros para um programa de espaço do usuário. Bibliotecas para diferentes idiomas ( c , python , perl, etc ...) estão disponíveis para examinar pacotes. Depois de processar um quadro, você retornará um veredicto ACCEPT ou DROP, o quadro original ou modificado e uma opção para definir uma marca.
Meu palpite é que você pode usar a marca para manipular esse pacote de maneira diferente no restante da cadeia do netfilter e alterar uma marca de roteamento para escolher uma tabela de roteamento específica.
Essa seria uma solução mais elegante do que o manuseio de dispositivo de nível muito baixo, mas pode ser um problema de desempenho, dependendo da escolha da implementação do espaço do usuário.
Eu usei isso em outro projeto para modificar quadros DHCP recebidos de um cliente quebrado, mas nunca usei a marca.