Linux Netfilter Passe o conteúdo do pacote para o aplicativo de soquete de espaço do usuário

StackOverflow https://stackoverflow.com/questions/1288906

Pergunta

Eu quero escrever um Linux 2.6 netfilter module, que pode verificar a entrada IP Informações sobre pacotes, como Dest-IP, Fonte-IP. Depois disso, passe essas informações para user space aplicativo que (ou seja, Socket App) lidará com essas informações assim que o pacote chegar aos ganchos.

Eu quero tentar duas maneiras:

1. Dentro de netfilter módulo, faça um fifo linha de estrutura, toda vez que o pacote atinge o hook, Coloque as informações do pacote no FIFO. E com a ajuda de /proc/example sistema de arquivo . Toda vez que o aplicativo de espaço do usuário leia o /proc/example Arquivo, obterá informações de pacotes da cabeça do FIFO.

Eu sou um novato de kernel Programa, este programa trava meu kernel várias vezes. -_-! Eu me pergunto isso é possível?

2. Dentro do módulo Netfilter, faça um dispositivo de char, o aplicativo de espaço do usuário lê as informações do pacote deste dispositivo Char. Mas ainda não sei como obter o pacote o mais rápido possível, existe de alguma maneira quando o pacote chegar ao gancho do Netfilter, o kernel enviará algum sinal para o aplicativo de espaço do usuário do INFO, então o aplicativo de espaço do usuário vêm para Escolha as informações do pacote?

Muito obrigado.

Foi útil?

Solução

O que você quer dizer com o mais rápido possível? Você tem alguns requisitos reais/suaves em tempo real?

Se você selecionar a opção 2, poderá obter novos dados rapidamente, abrindo o dispositivo de caracteres sem bloqueio e selecionando () no fd de leitura. Eu fiz algo semelhante com um soquete no nível do kernel, onde os dados do soquete foram apresentados a um processo de nível de usuário por meio de um driver de caracteres. Vi muito pouca latência enquanto atendi o soquete em tempo hábil. O motorista foi usado em um ambiente que tinha alguns requisitos suaves em tempo real e não tivemos nenhum problema em atender a esses requisitos com instalações de kernel comuns.

Dê uma olhada nos drivers de dispositivo Linux, 3ª edição.

Outras dicas

Minha maneira de fazer isso: crie um módulo de kernel para ser fisgado à sua atividade de rede. Em seguida, use o NetLink, que pode conversar com o espaço do usuário do kernel para passar no IPC dos dados.

A opção 1 é possível e viável qual é o problema? Mas geralmente costumo me comunicar entre user-space e kernel space usando netlink

netlink_kernel_create

netlink_kernel_release

nl_sk = netlink_kernel_create(&init_net, 17, 0, recv_cmd, NULL, THIS_MODULE);

netlink_kernel_release(nl_sk);

netlink_unicast

Não tenho certeza sobre o primeiro método, mas usando o segundo, o aplicativo de espaço do usuário pode usar uma chamada select () com o dispositivo Char como o único destino - assim que selecionar () retornar, você terá dados para ler . Apenas certifique -se de ler tudo, e não apenas assumir os dados de um pacote.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top