通过JS获取真实的外网IP和内网IP以及IPv6地址

由于需求需要获取到本机ip地址,查了半天相关只是不知所云,最后偶然得已法,遂试,果然ok,直接看下文。
通过JS获取你真实的外网IP和内网IP以及IPv6地址,就算开代理也没有用,想想真是太6,还能不能愉快的装逼了,效果如下:
通过JS获取真实的外网IP和内网IP以及IPv6地址_第1张图片
该方法在chrome和firefox下通用,代码如下,

[code lang=”” start=”” highlight=””] 
//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;
//bypass naive webrtc blocking
if (!RTCPeerConnection) {
var iframe = document.createElement(‘iframe’);
//invalidate content script
iframe.sandbox = ‘allow-same-origin’;
iframe.style.display = ‘none’;
document.body.appendChild(iframe);
var win = iframe.contentWindow;
window.RTCPeerConnection = win.RTCPeerConnection;
window.mozRTCPeerConnection = win.mozRTCPeerConnection;
window.webkitRTCPeerConnection = win.webkitRTCPeerConnection;
RTCPeerConnection = window.RTCPeerConnection
|| window.mozRTCPeerConnection
|| window.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(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})/
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(){});
}, function(){});
}
//Test: Print the IP addresses into the console
getIPs(function(ip){console.log(ip);});
// getIPs(function(ip){alert("本机IP地址为:"+ip);});

因为Firefox和Chrome支持WebRTC,可以向STUN服务器请求,返回内外网IP,不同于XMLHttpRequest请求,STUN请求开发者工具当中看不到网络请求的。

解决办法

那么,接下来让我们继续装逼——关闭WebRTC。

Chrome
安装插件 https://chrome.google.com/webstore/detail/webrtc-block/nphkkbaidamjmhfanlpblblcadhfbkdm?hl=en

Firefox
用 media.peerconnection.enabled 禁用。BTW,方法网上看到了,电脑没装Firefox,所以你们自己摸索吧。

参考资料
https://github.com/diafygi/webrtc-ips
http://www.v2ex.com/t/167243

你可能感兴趣的:(通过JS获取真实的外网IP和内网IP以及IPv6地址)