Obtener dirección local interna y pública con javascript (WebRTC / STUNT)
WebRTC (Web Real-Time Communication) es una API que está siendo elaborada por la World Wide Web Consortium (W3C) para permitir a las aplicaciones del navegador realizar llamadas de voz, chat de vídeo y uso compartido de archivos P2P sin necesidad de plugins. Esto permite interactuar con servidores STUNT (Usados asiduamente en VOIP) y por lo tanto obtener información sobre la dirección local y pública de un cliente, algo casi obligatorio cuando los pares se encuentran detrás de NAT.
Firefox y Chrome han implementado WebRTC y se puede hacer uso del mismo fácilmente con Javascript, por lo que prácticamente cualquier web puede obtener las direcciones públicas y de la red LAN de sus visitantes. Estas solicitudes STUN se hacen fuera del procedimiento normal de XMLHttpRequest y no son visibles en la consola de desarrollo ni pueden ser bloqueados por plugins como AdBlockPlus o Ghostery. Se recomienda encarecidamente su desactivación cuando se pretende tener una navegación anónima.
- Demo online: https://diafygi.github.io/webrtc-ips/
- Protocolo STUNT: http://es.wikipedia.org/wiki/STUN
- API WebRTC: http://es.wikipedia.org/wiki/WebRTC
Desactivar WebRTC en Firefox (Motivos de seguridad / Privacidad): Firefox > about:config > media.peerconnection.enabled false.
Prueba de concepto html: https://github.com/diafygi/webrtc-ips
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <h4> Demo for: <a href="https://github.com/diafygi/webrtc-ips"> https://github.com/diafygi/webrtc-ips </a> </h4> <p> This demo secretly makes requests to STUN servers that can log your request. These requests do not show up in developer consoles and cannot be blocked by browser plugins (AdBlock, Ghostery, etc.). </p> <h4>Your local IP addresses:</h4> <ul></ul> <h4>Your public IP addresses:</h4> <ul></ul> <iframe id="iframe" sandbox="allow-same-origin" style="display: none"></iframe> <script> //get the IP addresses associated with an account function getIPs(callback){ var ip_dups = {}; //compatibility for firefox and chrome var RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; var useWebKit = !!window.webkitRTCPeerConnection; //bypass naive webrtc blocking using an iframe if(!RTCPeerConnection){ //NOTE: you need to have an iframe in the page right above the script tag // //<iframe id="iframe" sandbox="allow-same-origin" style="display: none"></iframe> //<script>...getIPs called in here... // var win = iframe.contentWindow; RTCPeerConnection = win.RTCPeerConnection || win.mozRTCPeerConnection || win.webkitRTCPeerConnection; useWebKit = !!win.webkitRTCPeerConnection; } //minimal requirements for data connection var mediaConstraints = { optional: [{RtpDataChannels: true}] }; //firefox already has a default stun server in about:config // media.peerconnection.default_iceservers = // [{"url": "stun:stun.services.mozilla.com"}] var servers = undefined; //add same stun server for chrome if(useWebKit) servers = {iceServers: [{urls: "stun:stun.services.mozilla.com"}]}; //construct a new RTCPeerConnection var pc = new RTCPeerConnection(servers, mediaConstraints); function handleCandidate(candidate){ //match just the IP address var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3})/ var ip_addr = ip_regex.exec(candidate)[1]; //remove duplicates if(ip_dups[ip_addr] === undefined) callback(ip_addr); ip_dups[ip_addr] = true; } //listen for candidate events pc.onicecandidate = function(ice){ //skip non-candidate events if(ice.candidate) handleCandidate(ice.candidate.candidate); }; //create a bogus data channel pc.createDataChannel(""); //create an offer sdp pc.createOffer(function(result){ //trigger the stun server request pc.setLocalDescription(result, function(){}, function(){}); }, function(){}); //wait for a while to let everything done setTimeout(function(){ //read candidate info from local description var lines = pc.localDescription.sdp.split('\n'); lines.forEach(function(line){ if(line.indexOf('a=candidate:') === 0) handleCandidate(line); }); }, 1000); } //insert IP addresses into the page getIPs(function(ip){ var li = document.createElement("li"); li.textContent = ip; //local IPs if (ip.match(/^(192\.168\.|169\.254\.|10\.|172\.(1[6-9]|2\d|3[01]))/)) document.getElementsByTagName("ul")[0].appendChild(li); //assume the rest are public IPs else document.getElementsByTagName("ul")[1].appendChild(li); }); </script> </body> </html>
Obtener dirección IPv4 / IPv6 pública en terminal
# IPv4 wget -4 -O - -q icanhazip.com 88.130.0.24 #IPv6 wget -6 -O - -q icanhazip.com 2001:16b8:209c:7e00:468a:5bff:fe24:c029