Como você está usando o linux é muito fácil, no linux um pacote é representado pela estrutura sk_buff. Você pode usar o netfilter framework com o gancho de pré-roteamento, para manipular o pacote usando seu protocolo e número de porta de destinação. Veja a documentação do framework netfilter.