2010-11-26 17 views
5

Je cherche à écrire une application utilisateur qui peut accrocher dans une pile de réseau d'OS, renifler les paquets volants passé et modifier ceux qui le souhaitent.Réécriture paquets réseau à la volée en utilisant libnetfilter_queue

Après beaucoup de recherche sur Google, il apparaît pour moi que la méthode la plus simple (mais raisonnablement robuste) de le faire (sur n'importe quelle plate-forme) est le projet libnetfilter_queue de Linux. Cependant, j'ai du mal à trouver une documentation raisonnable pour le projet, en dehors de la documentation limitée official. Ses principales caractéristiques (comme indiqué par le premier lien sont)

  • réception de paquets en attente du sous-système nfnetlink_queue noyau
  • émission verdicts et/ou réinjection paquets modifiés au sous-système nfnetlink_queue noyau

L'emphase est la mienne. Comment est-ce que je voulais dire exactement? J'ai essayé de modifier le code sample fourni, mais peut-être que je suis mal compris quelque chose. Le code fonctionne en mode NFQNL_COPY_PACKET, donc suis en recevant le paquet entier - mais mes modifications semblent être limitées à ma propre application - comme on pouvait s'y attendre, étant donné la sémantique "copie". Mon sentiment est que je suis censé faire usage de NF_QUEUE en quelque sorte, mais je ne l'ai pas tout à fait grokked. Des pointeurs?

(! S'il y a un mécanisme plus simple pour ce faire, qui est aussi multi-plateforme, j'aimerais entendre parler)

Répondre

11

Je ne peux pas croire que j'ai manqué cela auparavant. Aussi réticent que je le suis à poster des questions sur SO, je pensais que je ne travaillerais jamais celui-ci moi-même. :)

Je n'ai pas regardé le prototype de fonction correctement. Il se trouve dans la fonction « verdict » (décrit ci-dessous),

int nfq_set_verdict(struct nfq_q_handle *qh, 
    u_int32_t id, 
    u_int32_t verdict, 
    u_int32_t data_len, 
    const unsigned char *buf  
) 

Les deux derniers paramètres sont pour que les données soient retournées à la pile de réseau. Évident avec le recul, mais je l'ai manqué complètement car la fonction print_pkt ne prend pas les données de paquet en tant que paramètre, mais l'extrait du struct nfq_data.

La clé est de NF_ACCEPT le paquet et de transmettre le paquet modifié de manière appropriée au noyau.

+0

Sedate, avez-vous l'expérience de l'utilisation de Java (JNI)? Je suis curieux de savoir si cela diminue la performance. –

+0

@TinaJasmin Malheureusement, je n'ai aucune expérience avec JNI, donc je ne suis pas sûr de la quantité de performance qui serait touchée. Désolé, je ne peux pas être plus utile. –

0

Juste une supposition sauvage de creuser autour du code source: essayez explicitement ajouter la charge utile mutilé en utilisant nfnl_addattr_l(…, NFQA_PAYLOAD, …)?