Android: NAT Traversal?

Il me semble que les nouveaux appareils Android fonctionnent derrière un NAT, où l’adresse locale est un opérateur interne ou un réseau local et l’adresse publique est le routeur ou l’adresse externe atsortingbuée par l’opérateur.

Néanmoins, les téléphones plus récents ne renvoient pas la même adresse à l’aide de l’interface réseau que lors de l’access à un service de détection IP.

Par conséquent, la connexion via P2P SocketChannels directe échoue de manière inhérente.

Existe-t-il des solutions de contournement courantes à ce problème conçues pour la plate-forme Android? Quelqu’un peut-il clarifier la cause de ce problème de sécurité semblable à un NAT?

Tous les liens vers des tutoriels ou des exemples de parcours NAT Java ( PAS d’ essais ou de thèses) seraient également appréciés (car je ne suis pas sûr de savoir comment le mettre en œuvre en Java).

J’accepterai bien sûr toute autre solution que quiconque aurait à offrir!

Presque tous les téléphones ou PC que vous toucherez n’auront jamais d’adresse IP publique statique, ce qui nécessitera une traversée NAT. Ce n’est pas à cause de l’appareil; le transporteur ou le FAI a mis des routeurs entre votre appareil et l’internet public. Selon votre application, vous pouvez généralement utiliser des bibliothèques de traversée NAT, telles que ice4j ou STUNT .

Je le fais dans mon propre projet et j’ai trouvé que ce problème n’était pas si compliqué.

Voici un serveur d’écho UDP très simple dans node.js

var dgram = require('dgram'); var socket = dgram.createSocket('udp4'); socket .on('listening', function() { var address = socket.address(); console.log('socket listening ' + address.address + ':' + address.port); }) .on('error', function(err) { console.log('socket error:\n' + err.stack); socket.close(); }) .on('message', function(message, rinfo) { console.log('message: ' + message + ' from ' + rinfo.address + ':' + rinfo.port); var msg = new Buffer(rinfo.address + ':' + rinfo.port); socket .send(msg, 0, msg.length, rinfo.port, rinfo.address, function(err, bytes) { //socket.close(); }); }) .bind(15000); 

Un client Android simplement envoyer un msg à ce serveur de noeud

  System.out.println("UDP hole punching======================="); class IOth extends Thread { @Override public void run() { Ssortingng sendMsg = "UDP hole punching"; byte[] buf = sendMsg.getBytes(); DatagramPacket packet; System.out.println(HPremoteHost); // node server IP System.out.println(HPremotePort); // 15000 try { packet = new DatagramPacket(buf, buf.length, InetAddress.getByName(HPremoteHost), HPremotePort); ds.send(packet); } catch (Exception e) { System.out.println("error================"); System.out.println(e); } } } IOth io00 = new IOth(); io00.start(); 

Le client UDP sur le client Android obtient un message général et votre propre adresse IP et port global via UDPholepunching

  class IOLoop extends Thread { @Override public void run() { try { Ssortingng msg = "Native.UDPserver.open"; SocketAddress sockAddress; Ssortingng address; byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); while (true) { try { ds.receive(packet); sockAddress = packet.getSocketAddress(); address = sockAddress.toSsortingng(); msg = new Ssortingng(buf, 0, packet.getLength()); System.out.println(msg + " received !!! by " + address); //this case is UDP HolePunching reaction if (address.equals(HPaddress1)) { System.out.println(msg + "hole punched"); //So you can obtain own Global ip& port here. //exchange this information //`remoteHost` `remotePort` to another client //with some method (signaling server) } } catch (IOException e) { } } } catch (Exception e) { } } } IOLoop io00 = new IOLoop(); io00.start(); 

remoteHost UDP de client Android utilisant l’adresse IP remoteHost remotePort autre client

  class IOth extends Thread { @Override public void run() { Ssortingng sendMsg = "This is a test message"; byte[] buf = sendMsg.getBytes(); DatagramPacket packet; try { packet = new DatagramPacket(buf, buf.length, InetAddress.getByName(remoteHost), remotePort); ds.send(packet); } catch (Exception e) { } } } IOth io00 = new IOth(); io00.start(); 

Regardez http://sourceforge.net/projects/jnat-pmplib/ C’est une implémentation de NAT-PMP en Java.

J’ai réussi à établir des sockets simplement en transférant les sockets que vous utilisez lors de la connexion à votre routeur. Cela a fonctionné pour moi.

METTRE À JOUR

Découvrez votre adresse IP via cmd.exe si vous utilisez Windows (ipconfig) ou via une session de terminal si vous utilisez Linux (ifconfig). Ensuite, connectez-vous via le navigateur et il devrait y avoir une section de sécurité. Accédez à la redirection de port et ouvrez les ports que vous utilisez pour établir ServerSocket et Socket. Utilisez TCP comme protocole. Veuillez noter que cela ne s’applique que si vous essayez de vous connecter depuis l’extérieur de votre réseau local sans fil.