Linux Netfilter Passe o conteúdo do pacote para o aplicativo de soquete de espaço do usuário
-
18-09-2019 - |
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.
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
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.