function getIPs(callback) { var ip_dups = {}; //compatibility for firefox and chrome var RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; var mediaConstraints = { optional: [{ RtpDataChannels: false }] }; //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 (window.webkitRTCPeerConnection) servers = { iceServers: [{ urls: "stun:stun.services.mozilla.com" }] }; //construct a new RTCPeerConnection var pc = new RTCPeerConnection(servers, mediaConstraints); //listen for candidate events pc.onicecandidate = function (ice) { //skip non-candidate events if (ice.candidate) { //match just the IP address var ip_regex = /([0-9]{1,3}(.[0-9]{1,3}){3})/ if (ip_regex.exec(ice.candidate.candidate) != null) { var ip_addr = ip_regex.exec(ice.candidate.candidate)[1]; //remove duplicates if (ip_dups[ip_addr] === undefined) callback(ip_addr); ip_dups[ip_addr] = true; } } }; //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 () {}); } getIPs(function(ip){ console.log(ip) })