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

avec Java Discussion :

Se connecter sur une machine distante derrière un NAT


Sujet :

avec Java

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 91
    Points : 133
    Points
    133
    Par défaut Se connecter sur une machine distante derrière un NAT
    Bonjour à tous,

    Suite a ce thread ( http://www.developpez.net/forums/d11...ocket-threads/ ), j'aurais une question a propos des connections clients-serveurs.

    Y'a-t-il un moyen de se connecter directement sur une machine qui est derriere un NAT, par un autre moyen que le mappage de port ?

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    Je dirai que non a priori. A moins que la connection ne se fasse dans "l'autre sens"
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 91
    Points : 133
    Points
    133
    Par défaut
    Dans l'autre sens ?

    Si les deux soft, client et serveurs sont derrière, ça reviendra au même puisque le serveur ne pourra pas accéder au client, non?

    N'y a t-il pas moyen d'envoyer une requête en broadcast sur le réseau local, de vérifier si un serveur est en écoute, et quand la connection est effectuée, repérer la machine sur le réseau local ?

    Merci néanmoins pour ta réponse.

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    Citation Envoyé par Al_th Voir le message
    Dans l'autre sens ?

    Si les deux soft, client et serveurs sont derrière, ça reviendra au même puisque le serveur ne pourra pas accéder au client, non?

    N'y a t-il pas moyen d'envoyer une requête en broadcast sur le réseau local, de vérifier si un serveur est en écoute, et quand la connection est effectuée, repérer la machine sur le réseau local ?

    Merci néanmoins pour ta réponse.
    Non ca ne revient pas au même De plus tu parles de derreire, mais derriere quoi ? S'ils sont sur le meme reseau, il n'y a donc pas de problèmes ...

    Mais pour revenir a l'autre histoire :

    Si une machine A ne px acceder a B parce que celle ci est derriere un routeur qui ne redirige pas certains port vers B... Ca ne veux pas pour autant dire que B n'ait pas d'acces a A directement (si A est directement connecté sur internet).

    Il est donc possible d'etablir une connection dans l'autre sens (B devant connaitre l'adresse de A) pour que B ouvre la connection et ainsi obtenir une socket de communication qui va de toute facon dans les 2 sens ... je me demande même si SSHD ne faisait pas ca pour justement pallier ce genre de problèmes.

    Si tu es derriere un NAT, tu n'es pas censé savoir quels sont les machines qui sont derriere la dite machine qui fait le NAT. Sachant qu'en plus y'a du NAT comment vu tu communiquer avec "l'autre reseau" ?
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 91
    Points : 133
    Points
    133
    Par défaut
    Je vais faire un petit schéma pour m'expliquer peut etre un peu mieux, je n'ai pas été très clair

    Serveur -- Routeur ==INTERNET== Routeur -- Client
    Dans cette configuration, si je cherche a acceder au routeur du serveur, et que j'ai son adresse IP, je n'ai pas de soucis il me semble, du moins pour arriver au routeur. Cependant, tout ce qui se trouve dans le réseau local du routeur est opaque.

    Je suis d'accord que si je suis une machine qui est connecté directement sur le réseau, une connection du serveur vers moi est faisable. En fait ma question, sur un plan pratique, serait de réussir a mettre mon serveur de chat sur une machine chez moi (machine connectée sur une freebox), et de pouvoir me connecter dessus en étant sur une autre machine, par exemple une des machines de ma fac.

    Merci d'avance !

  6. #6
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    On est d'accord.

    Cependant, sans configurer de redirection sur ton routeur ou le serveur se trouve, tu ne saurais pas t'y connecter.

    D'ou il restait la solution que ca soit le serveur qui tente de joindre le client et non l'inverse, mais si tu te deplace (change d'ip pour l'eventuel client) ... ca va etre impossible en effet. A part cela peut etre que quelqu'un va te trouver une autre solution ^^
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 91
    Points : 133
    Points
    133
    Par défaut
    D'accord, c'est donc plus compliqué que ce que je pensais.

    Et en connaissant l'adresse ip du serveur sur le sous réseau derriere le NAT, n'y a-t-il pas moyen d'y accéder quand même ?

    Pour reprendre encore une fois mon idée de serveur chez moi, je suis derriere une freebox. Il me semble qu'il est possible d'attribuer a une machine n'importe quelle adresse ip dans la range du sous réseau dans son propre sous réseau (si j'ai envie d'être en 192.168.0.240, ca me regarde non ?).

    Une fois ceci connu, est-il possible de modifier les paquets, pour qu'ils aient déja le bon chemin en tête, en modifiant le header du paquet par exemple ?

    Je me doute que le sous forum java n'est peut être pas adapté, donc si un modérateur pense qu'il serait plus adapté autre part, qu'il se sente libre de le déplacer, bien entendu.

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Al_th Voir le message
    Une fois ceci connu, est-il possible de modifier les paquets, pour qu'ils aient déja le bon chemin en tête, en modifiant le header du paquet par exemple ?
    Non, les protocoles IP, TCP/IP, UDP/IP et ICMP, n'ont aucun mécanisme de ce genre. À la base, le principe du NAS est un bricolage, un hack, basé sur le hasard qu'il soit possible de faire ça avec IP. On ne peut pas pousser ce bricolage beaucoup plus loin.

    Il existe, par contre, une tétrachiée de protocoles de niveau applicatif et qui acceptent une couche supplémentaire précisément pour ce besoin-là. Par contre, pour que ça marche, il faut que le NAS connaisse le protocole employé et décide de l'honorer (question de sécurité.)
    Et, bien sûr, cela impose du même coup l'emploi d'un protocole de ce genre.

    Je n'ai pas vraiment creusé la liste, ces contraintes m'ont toujours semblé trop fortes.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Points : 149
    Points
    149
    Par défaut
    Lorsque tu es derrière un routeur, c'est ton routeur qui a l'adresse IP publique (donc visible sur internet). Ton serveur, qui se trouve sur le réseau local du routeur a quant à lui une adresse IP privée (visible uniquement dans le réseau local).

    Ce qui induit de manière logique que quelque soit le nombre de PC connectés derrière ton routeur, ils ont tous la même adresse IP publique ! Le seul moyen de les différencier reste l'adresse MAC de chaque poste du réseau privé. C'est à cela que sert le routeur.

    Lorsque tu as un serveur derrière un routeur, ton routeur lorsqu'il va recevoir un paquet (ou une trame je sais plus trop quel est le terme à utiliser pour la couche 1 du modèle OSI ), il sait seulement que l'adresse IP de destination est la sienne (puisqu'elle est publique !).

    Comme ton serveur est un serveur justement (a contrario des autres postes), le serveur écoute sur un port spécifique (ex: le port 33222), donc, si le routeur reçoit un paquet avec pour destination le port 33222, il va savoir automatiquement à qui il devra faire suivre le paquet sur le réseau local ! C'est à ça que sert le NAT ! S'il n'y a pas de NAT, il ne saura pas à qui est destiné le paquet puisque la personne souhaitant initialiser une connexion avec le serveur, ne connaitra que l'adresse IP publique du serveur, hors, pour que le routeur puisse rediriger, il a besoin de connaître l'adresse MAC du poste en question, cela ne peut-être fait qu'après la réponse du serveur qui incluera son adresse MAC dans le paquet de retour.

    Si tu modifies l'en-tête de tes paquets après, en théorie je pense que c'est faisable mais, cela reste à voir car tout est encapsulé avec les différentes couches (sachant que ton appli se situe au niveau 7, le plus haut donc, soit tu modifies plein de drivers pour changer ça mais c'est impossible, soit tu réussi à intercepter ton paquet en sortie de carte réseau et tu le modifie (pas facile non plus ) Donc le NAT reste le plus simple ! (Il sert à ça d'ailleurs )

  10. #10
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 91
    Points : 133
    Points
    133
    Par défaut
    Je connais déja les "bases" du NAT, mais il y a encore quelques détails avec lesquels je ne suis pas familiarisés.

    Imaginons que j'ai deux ordinateurs d'un même sous réseau, derriere une box qui a une ip publique 62.108.70.199, ils se connectent tout les deux sur google, en utilisant un navigateur internet. Et font tout les deux une requête au même moment.

    Le NAT gêre tout ca parfaitement, mais la question c'est : comment fait-il ? Il ne peut pas s'appuyer sur les ports, vu que le port utilisé est le même dans les deux cas (80), il ne peut non plus s'appuyer sur la destination du paquet rentrant, vu qu'il s'agit de l'ip publique de la box. Ou se trouve l'information qui certifie que le paquet va arriver a bon port dans ce cas ?

    PS : Je dérive peut être un peu, mais j'vous remercie néanmoins d'apporter des réponses a mes questions, encore une fois

  11. #11
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Al_th Voir le message
    Imaginons que j'ai deux ordinateurs d'un même sous réseau, derriere une box qui a une ip publique 62.108.70.199, ils se connectent tout les deux sur google, en utilisant un navigateur internet. Et font tout les deux une requête au même moment.

    Le NAT gêre tout ca parfaitement, mais la question c'est : comment fait-il ? Il ne peut pas s'appuyer sur les ports, vu que le port utilisé est le même dans les deux cas (80), il ne peut non plus s'appuyer sur la destination du paquet rentrant, vu qu'il s'agit de l'ip publique de la box. Ou se trouve l'information qui certifie que le paquet va arriver a bon port dans ce cas ?
    Comme je l'ai dit, c'est à l'aide d'un bricolage, qui se trouve être possible du fait d'un heureux hasard. Ce n'était pas étudié pour, mais quand le besoin s'est fait sentir, il s'est trouvé que c'était possible.

    Tu dis que deux machines différentes cachées derrière le même NAT peuvent se connecter à une même machine dans l'Internet et que le NAT sais très bien redistribuer les réponses.
    Mais en fait, une même machine a parfaitement le droit d'ouvrir deux (ou des milliers de) connexions sur le même port d'une même machine distante, et pourtant chacune de ces connexions est traitées individuellement sans se mélanger. C'est pareil : comment le driver TCP/IP fait-il pour savoir à quelle connexion appartient quelle réponse ?
    Pour rendre ça possible, les protocoles donnent des numéros de série aux connections qu'ils ouvrent. Ces séries sont uniques à chaque connexion.

    Le NAT se contente de modifier les numéros de séries qu'on lui demande de transmettre, pour faire la différence entre les machines qu'il cache, puis lorsqu'il reçoit la réponse il modifie à nouveau les numéros qu'il transmet, pour que les machines qu'il cache ne se rendent pas compte qu'il y a eu changement. Il modifie aussi les numéros d'IP des machines qui sont derrière lui pour les remplacer par la sienne, et il se sert des numéros de série pour savoir par quelle IP remplacer la sienne dans le sens inverse. C'est une sorte d'attaque de man in the middle, sauf que ce n'est pas pour nuire, c'est pour servir.
    De ce fait, le NAT devient invisible. Mais ce n'est possible que quand une connexion commence de l'intérieur vers l'extérieur.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 91
    Points : 133
    Points
    133
    Par défaut
    C'est exactement ce que je cherchais a savoir.

    Merci beaucoup pour cette explication thelvin !

  13. #13
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Points : 149
    Points
    149
    Par défaut
    Citation Envoyé par thelvin
    Comme je l'ai dit, c'est à l'aide d'un bricolage, qui se trouve être possible du fait d'un heureux hasard. Ce n'était pas étudié pour, mais quand le besoin s'est fait sentir, il s'est trouvé que c'était possible.
    Moi personnellement je pense que si 2 PC se connectent en même temps à un même serveur, quelque soit son type, le port utilisé etc. c'est l'adresse MAC qui est utilisée par le routeur car dans les paquets contenant les requêtes qui vont initialiser les connexions, l'adresse MAC de l'émetteur est présente !

    C'est d'ailleurs la tâche principale d'un routeur, redistribuer à la bonne adresse MAC un paquet qui a pour adresse de destination l'adresse publique. Le NAT est justement là pour savoir où rediriger le paquet lorsque l'adresse MAC n'est pas renseignée !

    Après cela reste mon opinion, je peux me tromper !

  14. #14
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Dark_TeToN Voir le message
    Après cela reste mon opinion, je peux me tromper !
    Non seulement tu le peux, mais tu le fais.
    - Ce que tu décris là est le rôle d'un répéteur, pas d'un routeur. D'un switch, si tu préfères, dans notre monde moderne. Certes, un NAT peut intégrer un ou des switches, mais il fait aussi bien plus que cela : il relie des réseaux entre eux.
    - L'adresse MAC ne sort pas du réseau interne.
    - Le rôle d'un NAT, qui n'est qu'un routeur qui fait aussi NAT, est de router en fonction de l'adresse IP. Il peut cumuler le double rôle de serveur DHCP, ou de serveur d'attributions d'IP quelconque, et il va, dans ce cas, utiliser les adresses MAC des machines concernées pour retrouver ses petits. C'est à peu près la seule raison pour laquelle il s'intéresserait aux adresses MAC.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Points : 149
    Points
    149
    Par défaut
    OK !

    Merci pour ces précisions thelvin

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

Discussions similaires

  1. Script sh qui se connecte sur une machine distante
    Par corgato dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 29/08/2012, 18h42
  2. [C#]Accéder à un répertoire partagé sur une machine distante
    Par spaceclic dans le forum Windows Forms
    Réponses: 15
    Dernier message: 14/05/2007, 15h43
  3. Tuer un processus sur une machine distante
    Par nuke_y dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 16/11/2004, 09h55
  4. Réponses: 8
    Dernier message: 13/07/2004, 09h00
  5. [Débutant] Connexion sur une machine distante protégée
    Par arthix dans le forum Développement
    Réponses: 3
    Dernier message: 28/08/2003, 09h46

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