IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau Discussion :

ip_forward pour la lib c!


Sujet :

Réseau

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2009
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 218
    Par défaut ip_forward pour la lib c!
    Bonjour!

    Je n'ai réussi à trouver la réponse concrète nulle part! Je ne sais si c'est simplement impossible ce que je cherche.

    En effet j'aimerais savoir s'il possible d'activer l'ip forwarding sur son linux, sans se servir du fameux echo 1 > /proc/sys/net/ipv4/ip_forward , mais plutôt à travers une fonction de la libc, ou une autre librairie linux.

    Sous bsd la focntion ipfw permet de manipuler le firewalling, mais elle n'existe pas sous linux, et je n'ai trouvé aucun paramètre à passer à ioctl pour l'activation de l'ip forwarding.

    Or je dois écrire un programme qui active le forwarding, et je ne veux pas faire un tricks qui invoque un script externe qui se contentera d'activer le forwarding via la commande ci-dessus.


    Merci par avance pour votre aide.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Bonjour,

    « /proc » est un pseudo-filesystem qui sert d'interface avec le kernel. Lorsque tu écris dans /proc/sys/net/ipv4/ip_forward, tu n'écris pas dans un fichier de config : tu manipules directement le module chargé du relais du trafic et la prise d'effet est immédiate. Même chose en lecture : ce que tu lis est généré en temps réelles par les différentes routines. C'est donc une interface comme une autre, qui a l'avantage d'être exploitable aussi bien depuis le shell que depuis un programme C et ce, en utilisant les primitives les plus élémentaires. Cela respecte également l'esprit « tout est fichier » d'UNIX qui a tendance à se perdre avec le temps.

    Il est donc tout-à-fait propre d'écrire dans ce fichier avec les primitives habituelles, comme read et write en C.

    Si vraiment ça te défrise, tu peux désormais passer par sysctl, en modifiant la clé net.ipv4.conf.all.forwarding. L'avantage est que tu peux passer ce paramètre dans sysctl.conf pour tout initialiser d'un coup au démarrage mais tu risques de perdre un peu en compatibilité avec les (très) vieux noyaux.

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2009
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 218
    Par défaut
    Merci pour ta réponse!

    J'ai justement essayer avec sysctl(2), mais je ne trouve pas la macro correspondant à l'ip forwarding dans les includes systèmes, pour la passer dans le tableau d'int représentant l'attribut name de la structure _systcl_args;

    Je suis encore en train de fouiller de ce côté là.

    Je sais que je peux passer par proc et tout le reste mais, je veux que le noyau soit modifier par le processus courant au travers d'une fonction.

    Merci.

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2009
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 218
    Par défaut
    Bon!

    J'avoue que je cherche à faire compliqué ce qui se fait simple à coup de write ou de sysctl en ligne de commande. Mais pourquoi j'arrive pas à obtenir le résultat avec sysctl(2)?
    Voici un petit code de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    #define _GNU_SOURCE
    #include <unistd.h>
    #include <sys/syscall.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <linux/sysctl.h>
    #include <netinet/ip.h>
     
    int _sysctl(struct __sysctl_args *args );
     
     
    int main(void)
    {
      struct __sysctl_args args;
      int forwarding = 1;
      size_t len;
    };                                                                                                                                       
      int mib[] =
        {
         //CTL_NET
          CTL_KERN,
          //PF_INET,
         /IPPROTO_IP,            
         //NET_IPV4_CONF_FORWARDING
         NET_IPV4_FORWARD
        };
     
      memset(&args, 0, sizeof(struct __sysctl_args));
      args.name = mib;
      args.nlen = sizeof(mib)/sizeof(mib[0]);
      args.newval = &forwarding;
      args.oldlenp = len;
      args.oldval = NULL;
      len = sizeof(&forwarding);
     
      if (syscall(SYS__sysctl, &args) == -1) {
        perror("_sysctl");
        exit(EXIT_FAILURE);
      }
     
      printf("The ip_forward flag is set to %d\n", forwarding);
      exit(EXIT_SUCCESS);
    }
    Avec la macro CTL_NET, j'obtient une erreur du genre : "_sysctl : Not a directory"

    Et avec la macro CTL_KERN j'ai la valeur initial de forwarding qui est affichée selon que je la passe à 0 ou 1, et un cat sur le /proc/sys/net/ipv4/ip_forward me donne ceci dans tous les cas, que je lance le binaire compilé en root ou user simple:

    ~/mes_tests$ cat /proc/sys/net/ipv4/ip_forward
    0
    Merci de me dire si quelqu'un comprend et voit le souci.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Bon. Je pensais que sysctl était apparu relativement récemment par rapport à l'entrée de /proc/sys que je t'ai indiquée mais, apparemment, ce n'est même pas le cas. Voici ce que je lis dans les man pages de Développez et de ma Fedora 16 :

    Citation Envoyé par man 2 sysctl
    BOGUES
    Les noms des objets peuvent varier d'une version à l'autre du noyau. CET APPEL-SYSTEME N'A AUCUN INTERET POUR LES APPLICATIONS. Utilisez l'interface /proc/sys à la place.

    et

    Citation Envoyé par man 8 sysctl
    DESCRIPTION
    sysctl est utilisé pour modifier les paramètres du noyau en cours d'exécution. Les paramètres utilisables sont ceux listés dans le répertoire /proc/sys. Procfs est nécessaire pour utiliser sysctl(8) sous Linux. Vous pouvez utiliser sysctl(8) aussi bien pour lire que pour écrire des paramètres.

    Citation Envoyé par man 2 sysctl

    DESCRIPTION
    N'utilisez pas cet appel système ! Consultez la section NOTES.

    CONFORMITÉ
    Cet appel système est spécifique à Linux et ne devrait pas être employé dans les programmes destinés à être portables. Un appel sysctl() est présent dans Linux depuis la version 1.3.57. Il existait dans BSD 4.4. Seul Linux dispose du miroir /proc/sys et les conventions de noms d'objets diffèrent entre Linux et BSD 4.4, mais les déclarations de la fonction sysctl() sont identiques sur les deux systèmes.

    NOTES
    La glibc ne fournit pas de fonction autour de cet appel système ; utilisez syscall(2) pour l'appeler. Ou plutôt... ne l'appelez pas : l'utilisation de cet appel système est déconseillée depuis bien longtemps, et il est tellemnt indésirable qu'il disparaitra bientôt dans une prochaine version du noyau. Supprimez-le dès à présent de vos programmes ; Utilisez l'interface /proc/sys à la place.

    BOGUES
    Les noms des objets peuvent varier d'une version à l'autre du noyau, ce qui rend cet appel système sans intérêt pour les applications.

    Tous les objets disponibles ne sont pas correctement documentés.

    Ça a le mérite d'être clair !

    Ça veut dire que si tu veux utiliser l'appel système « à la BSD », tu dois passer par syscall() et, visiblement, ça a été fait volontairement pour décourager les coders de faire cela (ce n'est cependant qu'une hypothèse personnelle).

    On lit donc que la commande shell « sysctl » s'appuie de toutes façons sur /proc et si on examine la sortie de sysctl -a dans un shell, on s'aperçoit que les clés sont en fait exactement les fichiers, hors répertoires, listés sous « /proc/sys ». Ça veut aussi dire que j'aurais pu te faire utiliser directement la clé « net.ipv4.ip_forward ».

    Je comprends qu'écrire dans un fichier avec des choses aussi primitives que read et write ait l'air un peu « amateur » lorsque l'on en est à modifier les paramètres du noyau mais, en réalité et à l'usage, c'est ce qui s'avère le plus propre et le plus unifié sur un SysV, si tant est qu'il ne s'agisse pas de modifier un fichier de configuration consultatif mais bien de communiquer et de changer en temps réel l'état des routines du noyau (ce qui est le cas).

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2009
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 218
    Par défaut
    Bonjour!

    On se comprend bien , mais ce que tu n'as sûrement pas remarqué c'est que j'ai bien utilisé syscall(2), car j'ai moi aussi lu le man de sysctl(2).

    Voici le bloc où je fais l'appel dans mon code :

    if (syscall(SYS__sysctl, &args) == -1) {
    perror("_sysctl");
    exit(EXIT_FAILURE);
    }
    Merci encore pour ton attention!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/09/2011, 14h14
  2. Déconnecter les warnings pour une lib uniquement
    Par kase74 dans le forum Code::Blocks
    Réponses: 3
    Dernier message: 05/05/2009, 23h07
  3. lib à utiliser pour les puissances x^y
    Par chris670 dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 10/12/2005, 18h00
  4. La LIB pour résoudre ODBC ?
    Par dede92 dans le forum Windows
    Réponses: 3
    Dernier message: 20/12/2004, 14h23
  5. Quelle lib pour vos GUI?
    Par mandale dans le forum Choisir un environnement de développement
    Réponses: 5
    Dernier message: 03/08/2004, 17h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo