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 C Discussion :

Connexion entre deux machines sur des interfaces spécifiques


Sujet :

Réseau C

  1. #1
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut Connexion entre deux machines sur des interfaces spécifiques
    Bonjour,

    Je vous écrit car je perd un peu pieds dans ce que je fais.

    Pour mettre en situation :

    J'ai deux machines : C (Chief) et W (Worker).
    C et W sont connectée entre elles par un tunnel OpenVpn, W étant le client OpenVpn.

    L'interface OpenVpn de C est fixe et connue.
    Prenons par exemple "10.8.0.10".

    L'interface OpenVpn de W est variable, mais est récupérable via un "ifconfig" (en regardant l'interface "tun0").
    Prenons par exemple "10.8.1.140".

    Je ne vais travailler que sur W, W étant une machine sous Debian 8.
    Sur W, je doit soit attendre une communication de C (création d'un serveur de socket sur W), soit communiquer avec C (création d'une socket simple sur W).

    J'ai lu ce sujet, dans lequel on précise qu'une connexion TCP est identifié par un set de 5 valeurs : {<protocol>, <src addr>, <src port>, <dest addr>, <dest port>}

    Pour le serveur de socket, il suffit de décider arbitrairement d'un port que W va écouter (1004 par exemple) et sur lequel C va se connecter.
    Je pense savoir ce que je fais mais j'aimerais avoir confirmation :

    Dans un premiers temps, on créer la socket, la binder, puis listen. Cela permettra de mettre les 3 premières valeur de mon set aux bonnes valeurs.

    La gestion des erreurs est faites, mais a volontairement été supprimé pour raccourcir le code.
    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
    void vpnServer_InitializeSocket(vpnserver_s *self)
    {
    	struct sockaddr_in sin;
     
    	self->sock = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0);
     
    	memset(&sin, 0, sizeof(sin));
    	sin.sin_addr.s_addr = inet_addr("10.8.1.140");
    	sin.sin_port = htons(1004);
    	sin.sin_family = AF_INET;
     
    	bind(self->sock, (struct sockaddr *)&sin, sizeof(sin);
     
    	listen(self->sock, self->nbMaxClient);
     
    	self->max = self->sock;
    }
    Ensuite, lors d'une connexion sur le port 1004 de l'interfaces 10.8.1.140 (soit l'interface OpenVpn, ce que je veux), je vais regarder qui se connecte et décider si oui ou non je l'ajoute.

    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
    bool CpvpnServer_AddClient(cpvpnserver_s *self)
    {
    	int                sock                          = -1;
    	struct sockaddr_in incomming                     = {0};
    	socklen_t          incommingLen                  = sizeof(incomming);
    	char               incommingIp[INET6_ADDRSTRLEN];
     
     
    	/* As-t-on la place d'ajouter un client ? */
    	if (self->nbClient >= self->nbMaxClient) {
    		return ;
    	}
     
    	/* On récupère la socket */
    	sock = accept(self->sock, (struct sockaddr *)&incomming, &incommingLen);
     
    	/* on regarde qui se connecte */
    	inet_ntop(incomming.sin_family, &incomming.sin_addr, incommingIp, INET6_ADDRSTRLEN);
    	if (strcmp(incommingIp, "10.8.0.10") != 0) {
    		return ;
    	}
     
    	/* Mise à jour de la structure */
    	self->max = sock > self->max ? sock : self->max;
    	self->clients[self->nbClient] = sock;
    	++self->nbClient;
    }
    Donc la normalement, on est d'accord que mon serveur de socket ne peut accepter que des connexion qui passe au travers de mon vpn ?



    Ensuite, et c'est la que je patauge, c'est lorsque je veux connecter W sur un port spécifique de C à travers OpenVpn.
    Mettons que le port soit le 1098.

    Idem, la gestion des erreurs est faites, mais a volontairement été supprimé pour raccourcir le code.
    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
    int SocketToOpenVpn(int port)
    {
    	struct sockaddr_in serv_addr;
    	int                sock                            = -1;
     
    	sock = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
     
    	memset(&serv_addr, 0, sizeof(serv_addr));
    	serv_addr.sin_family = AF_INET;
    	serv_addr.sin_port = htons(port);
    	inet_pton(AF_INET, "10.8.0.10", &serv_addr.sin_addr);
     
    	connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr);
     
    	return (sock);
    }
    Ce qui me gêne ici, c'est que je vois pas pourquoi ma socket serait obligé de passer par l'interface OpenVpn. Il "suffirait" que le tunnel OpenVpn soit down et qu'une machine attaquante soit connecter avec le port 1098 et avec l'interfaces "10.8.0.10" disponible pour que je me connecte comme une fleur sur ce dernier, ce que je ne désire évidemment pas.

    j'ai pensé à ajouter bind avec le connect comme je l'avais fait avec le serveur de socket, mais étrangement, même si le code fonctionne (il y a bien une connexion et un envoie de donnée), je n'arrive pas a retrouver ces données sur C.
    Est-ce la bonne piste ?

    Ai-je une erreur de raisonnement, compréhension dans ce que je fais ?

    Merci de votre lecture.
    Cordialement.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 17
    Points : 18
    Points
    18
    Par défaut
    Si je comprend bien, tu cherches à être sûr de passer par l'interface du vpn (en émission comme en réception) ?
    Tu peux utiliser la fonction setsockopt un bon exemple ICI

    Sinon tu peux jouer avec la commande 'ip' qui te permet de créer une ''''pseudo VM'''' (netns) relier à ton interface tun0 et d'y exécuter ton programme (ou bash directement). De cette manière tu seras sûr de ne passer que par tun0 et non eth0 même si tun0 est down Intro

  3. #3
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Je répond tardivement.

    En fait, il faut tout simplement utiliser "bind" pour binder la socket sur l'interface du tunnel vpn (récupéré avant).
    Le fait que je ne voyais pas les donnée arriver était dû à une erreur de manipulation de ma part (je regardais le mauvais fichier).

    Cordialement

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

Discussions similaires

  1. Connexion entre deux fichiers ici des ODB différents
    Par mpaka dans le forum HyperFileSQL
    Réponses: 1
    Dernier message: 08/10/2015, 10h23
  2. Réponses: 4
    Dernier message: 13/10/2010, 14h11
  3. Réponses: 2
    Dernier message: 18/02/2009, 14h16
  4. Réponses: 2
    Dernier message: 10/10/2008, 20h35
  5. connexion entre deux machines
    Par polace dans le forum Réseau
    Réponses: 3
    Dernier message: 15/11/2007, 19h38

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