2010-04-19 8 views
0

J'ai configuré un serveur DNS sur une machine. Je veux capturer les réponses de DNS avant que la machine envoie, et changez quelques champs dedans et alors envoyez le paquet.pcap et iptables tussle

Je suis seulement capable de changer les champs dans le paquet mon code pcap (écrit en C) capture, ce qui semble être une copie, car le paquet original est également transmis.

J'ai essayé iptables d'abandonner des paquets provenant de la machine, mais il abandonne aussi les paquets injectés par pcap.

Y a-t-il un moyen de s'en sortir?

merci

+0

Une solution plus simple (de loin) serait de modifier le code source du serveur de noms ... – bortzmeyer

Répondre

1

Si vous êtes à la recherche d'une PPCE seule solution, vous allez devoir intercepter le paquet de requête DNS, examiner et assembler la bonne réponse avant que les réponses du serveur DNS. Cela ne semble pas vraiment fiable parce que si le serveur DNS a une entrée en cache, il est probable que vous répondiez avant que votre code personnalisé pour assembler un paquet et l'envoyer puisse finir.

La méthode la plus fiable consiste à écrire un module de noyau qui est un hook netfilter. Les hooks de Netfilter sont capables d'examiner un paquet et d'en influencer le traitement en plusieurs points avant qu'un paquet quitte une machine. Accrochez-le au niveau NF_IP_LOCAL_OUT. Vous pouvez ensuite examiner le paquet sortant et voir s'il s'agit d'une réponse DNS correspondant à vos critères. La prochaine partie que je n'ai pas faite, mais puisque vous avez un accès direct au skb (socket buffer) comme paramètre d'entrée à votre fonction hook personnalisée, vous pouvez modifier le paquet là et retourner NF_ACCEPT pour passer la réponse au client . Si vous aviez besoin d'effectuer un traitement sur la requête elle-même, vous pouvez vous connecter à NF_IP_LOCAL_IN à la place et le gérer de différentes manières, y compris en le transmettant à un programme d'espace utilisateur.

Il existe de nombreux exemples sur Google pour la programmation du noyau Linux (recherche: Linux Kernel Module Programming) et aussi des exemples de hook netfilter.