Это возможно сделать в пользовательском пространстве с целью iptables QUEUE или NFQUEUE, я думаю. Клиентское приложение подключается к очереди и получает все соответствующие пакеты, которые оно может изменить, прежде чем они будут повторно введены (оно также может отбросить их, если захочет).
Существует клиентская библиотека libnetfilter_queue, с которой нужно связать. К сожалению, документация минимальна, но есть несколько постов и примеров рассылки.
По соображениям производительности вы не захотите делать это с каждым пакетом, а только с конкретными совпадающими, которым вы должны соответствовать, используя стандартные правила iptables. Если этого недостаточно, вам нужно написать свой собственный модуль ядра netfilter.