2010-03-20 6 views
0

Je suis en train de concevoir un code c simple pour appeler la commande iptables en fonction du besoin. Je veux juste laisser tomber les paquets d'une adresse ip particulière en utilisant mon code c. C'est pourquoi je dois utiliser la commande iptables en fonction de l'entrée donnée. est-il possible d'appeler la commande en utilisant le code c? si c'est alors comment ??? merci d'avance ..Je veux juste utiliser la commande iptables dans mon programme c

Répondre

2

En supposant que votre programme s'exécute en tant que root, utilisez simplement fork() et exec(), et passez la commande iptables à exec(). Quelque chose comme

if (0 == fork()) { 
    execl("/sbin/iptables", ...); // supply the proper arguments to iptables. 
} 

Edit: Je vois d'autres personnes que le système() est une meilleure façon que la fourche/exec.

Il semble que Neha ne sache pas comment utiliser sprintf pour formater la commande afin qu'elle contienne une adresse IP stockée dans une autre variable. Je pense qu'il devrait ressembler à ceci:

char *host_to_block = .... 
char comm[1000]; 
snprintf(comm, sizeof(comm), "iptables -A INPUT -s %s -j DROP", host_to_block); 
system(comm); 

Notez que ce sera une vulnérabilité de sécurité sauf si vous avez le code pour vérifier que host_to_block contient une adresse IP et non une autre commande shell. Vous pouvez utiliser la question suivante pour référence si la source de la chaîne n'est pas déjà connue pour être valide:

how to validate an ip address

+1

Plutôt que d'utiliser system(), alors utilisez fork suivi d'un execl de/sbin/iptables et placez l'adresse IP dans son propre élément dans le tableau args. De cette façon, vous n'exécutez pas de processus shell, et il n'y a aucun moyen d'injection de shell (accessoirement, c'est légèrement plus efficace, mais pas pertinent) – MarkR

+0

J'ai eu des problèmes avec system() call avec suid exec et j'ai dû revenir à execl(). Même avec execl je devais ajouter usleep (5000) après chaque appel d'iptables pour contourner l'erreur "ressource temporairement indisponible". – anttir

1

Il est possible de le faire sans utiliser le système() ou exec *() Cependant, je suis sûr que vous êtes également intéressé par la réalisation de votre projet :)

Si, toutefois, vous n'avez besoin que d'une fonctionnalité très rudimentaire d'iptables dans votre programme, ou si vous avez besoin d'une gestion précise des erreurs, vous pouvez obtenir le source au paquet iptables. Avancé: l'étude des crochets iptables ioctl et des modules de netfiltres correspondants est connue pour être une tâche de liquéfaction de l'esprit.

+0

+1 pour mentionner l'interface sous-jacente de l'OS, c'est-à-dire la manière correcte de le faire. –

+0

L'appel de/sbin/iptables est la bonne façon de le faire, selon le site Web de Netfilter. Les interfaces du noyau (ou en fait la bibliothèque C) ne sont pas destinées à être une API stable. – MarkR

+0

Linux a un ABI stable, indépendamment de ce que ce site peut dire. Linux dit "nous ne cassons jamais l'espace utilisateur". Donc, c'est bien d'utiliser cette API. –

Questions connexes