Concordo com a resposta do Sr.Shunz. Use libnetfilter_queue . Para usá-lo, você precisará de uma versão do kernel Linux 2.6.14 ou posterior construída com suporte a nfnetlink_queue. Existem duas partes para configurar:
- Suas regras
iptables
/ netfilter para enviar pacotes para o usuário-terra e - seu programa user-land, que processará os pacotes conforme desejado e os retornará ao netfilter.
A regra iptables
pode ser algo assim:
IN_INTERFACE=eth0
SOURCE_NETWORK=192.168.66.0/24
QUEUE_NUM=1
iptables -t raw -A PREROUTING -i $IN_INTERFACE -s $SOURCE_NETWORK -j NFQUEUE --queue-num $QUEUE_NUM
Isso enviará todos os pacotes que chegam através de uma interface específica de uma rede específica para o seu processo de usuário, que está escutando na fila número 1.
Seu programa, que provavelmente terá que ser escrito em C ou C ++, usará a API libnetfilter_queue . Desculpe, não vou escrever nenhum código aqui (existe um código de exemplo nos documentos da API com os quais eu fiz o link), mas a idéia básica é que o seu programa irá:
- leia cada pacote enviado para a fila,
- faça as modificações desejadas no pacote,
- e finalmente, especifique um "veredicto" para o netfilter, dizendo se ACEITAR ou DROPAR o pacote. Presumivelmente, você estará ACEITANDO a maior parte do tempo.
Eu pessoalmente não usei esta API, mas minha leitura dos documentos é que ACEITAR um pacote na verdade significa reinjetá-lo, conforme modificado, de volta no netfilter, para continuar percorrendo os conjuntos de regras iptables
. Eu posso estar errado neste ponto, então você pode querer investigar mais antes de se comprometer com este curso de desenvolvimento.