Como reinjetar o pacote nos iptables?

2

Eu tenho um pacote dentro de um pacote e um tunelamento. Então, essencialmente, é da seguinte forma:
[IP HEADER 1][IP HEADER 2][PAYLOAD]
Depois de ler o primeiro cabeçalho (feito por uma biblioteca) eu vou pegar o pacote:
[IP HEADER 2][PAYLOAD]
na cadeia INPUT do iptables . Eu quero reinjetar o pacote para o início do iptables, ou seja, na cadeia PREROUTING. O objetivo final é encaminhar o pacote para um host remoto (é por isso que eu quero que o pacote esteja na cadeia PREROUTING). Eu li alguma coisa sobre a libipq, mas não tenho certeza se essa é a melhor maneira de fazê-lo. Qualquer sugestão selvagem também ajudaria.

Eu já postei esta pergunta em 'stackoverflow', mas como não houve respostas, então eu pensei que é mais adequado para 'serverfault'.

    
por Amit S 30.11.2010 / 14:40

3 respostas

3

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:

  1. Suas regras iptables / netfilter para enviar pacotes para o usuário-terra e
  2. 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.

    
por 30.11.2010 / 18:22
1

IIRC, para reinjetar (para o início da cadeia, no entanto!), use NF_REPEAT como um veredicto.

    
por 01.12.2010 / 01:39
0

Parece que a libipq foi preterida por libnetfilter_queue . A documentação declara:

issuing verdicts and/or reinjecting altered packets to the kernel nfnetlink_queue subsystem

parece o que você está procurando ...

    
por 30.11.2010 / 15:09