IP地址查询工具

快速获取本地IP地址和公网IP地址,支持IPv4和IPv6,显示地理位置和运营商信息

本地IP地址

显示本机的内部网络IP地址

正在获取...
正在获取...

公网IP地址

显示您当前的外网IP地址及地理位置信息

正在获取...
国家/地区: -
省份/州: -
城市: -
运营商: -
时区: -
ASN: -

IP地址验证

验证IP地址格式的有效性

CIDR计算器

计算CIDR网段的信息

代码示例

以下是如何在不同编程语言中获取IP地址和验证IP格式的代码示例:

JavaScript 获取公网IP

// 使用 fetch API 获取公网IP
async function getPublicIP() {
    try {
        const response = await fetch('https://api.ipify.org?format=json');
        const data = await response.json();
        console.log('公网IP:', data.ip);
        return data.ip;
    } catch (error) {
        console.error('获取IP失败:', error);
    }
}

// 获取详细的IP信息(包含地理位置)
async function getIPDetails() {
    try {
        const response = await fetch('https://ipapi.co/json/');
        const data = await response.json();
        console.log('IP信息:', {
            ip: data.ip,
            city: data.city,
            region: data.region,
            country: data.country_name,
            isp: data.org
        });
        return data;
    } catch (error) {
        console.error('获取IP详情失败:', error);
    }
}

// 验证IPv4地址
function isValidIPv4(ip) {
    const pattern = /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
    return pattern.test(ip);
}

// 验证IPv6地址
function isValidIPv6(ip) {
    const pattern = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(::[0-9a-fA-F]{1,4}){1,7}|[0-9a-fA-F]{1,4}::([0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,2}::([0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,3}::([0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,4}::([0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}::[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,6}::)$/;
    return pattern.test(ip);
}

Python 获取IP地址

import socket
import requests

# 获取本地IP地址
def get_local_ip():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(("8.8.8.8", 80))
        local_ip = s.getsockname()[0]
        s.close()
        return local_ip
    except Exception as e:
        print(f"获取本地IP失败: {e}")
        return None

# 获取公网IP地址
def get_public_ip():
    try:
        response = requests.get('https://api.ipify.org?format=json')
        return response.json()['ip']
    except Exception as e:
        print(f"获取公网IP失败: {e}")
        return None

# 获取详细的IP信息
def get_ip_details():
    try:
        response = requests.get('https://ipapi.co/json/')
        return response.json()
    except Exception as e:
        print(f"获取IP详情失败: {e}")
        return None

# 验证IPv4地址
import ipaddress

def validate_ip(ip_str):
    try:
        ip = ipaddress.ip_address(ip_str)
        return {
            'valid': True,
            'version': ip.version,
            'is_private': ip.is_private,
            'is_loopback': ip.is_loopback,
            'compressed': ip.compressed,
            'exploded': ip.exploded
        }
    except ValueError:
        return {'valid': False}

# 使用示例
if __name__ == '__main__':
    print(f"本地IP: {get_local_ip()}")
    print(f"公网IP: {get_public_ip()}")
    print(validate_ip("192.168.1.1"))

Java 获取IP地址

import java.net.*;
import java.io.*;
import java.util.regex.*;

public class IPUtil {
    
    // 获取本地IP地址
    public static String getLocalIP() throws Exception {
        InetAddress localHost = InetAddress.getLocalHost();
        return localHost.getHostAddress();
    }
    
    // 获取公网IP地址
    public static String getPublicIP() throws Exception {
        URL url = new URL("https://api.ipify.org");
        BufferedReader reader = new BufferedReader(
            new InputStreamReader(url.openStream())
        );
        String publicIP = reader.readLine();
        reader.close();
        return publicIP;
    }
    
    // 验证IPv4地址
    public static boolean isValidIPv4(String ip) {
        String pattern = 
            "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}" +
            "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
        return ip.matches(pattern);
    }
    
    // 验证IPv6地址
    public static boolean isValidIPv6(String ip) {
        String pattern = 
            "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|" +
            "(::[0-9a-fA-F]{1,4}){1,7}|" +
            "[0-9a-fA-F]{1,4}::([0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}|" +
            "([0-9a-fA-F]{1,4}:){1,2}::([0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}|" +
            "([0-9a-fA-F]{1,4}:){1,3}::([0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}|" +
            "([0-9a-fA-F]{1,4}:){1,4}::([0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}|" +
            "([0-9a-fA-F]{1,4}:){1,5}::[0-9a-fA-F]{1,4}|" +
            "([0-9a-fA-F]{1,4}:){1,6}::)$";
        return ip.matches(pattern);
    }
    
    public static void main(String[] args) throws Exception {
        System.out.println("本地IP: " + getLocalIP());
        System.out.println("公网IP: " + getPublicIP());
        System.out.println("192.168.1.1 valid: " + isValidIPv4("192.168.1.1"));
    }
}

Node.js 获取IP地址

const os = require('os');
const http = require('http');

// 获取所有网络接口的IP地址
function getAllLocalIPs() {
    const interfaces = os.networkInterfaces();
    const ips = {};
    
    for (const name of Object.keys(interfaces)) {
        for (const iface of interfaces[name]) {
            if (!ips[name]) {
                ips[name] = [];
            }
            ips[name].push({
                address: iface.address,
                family: iface.family,
                internal: iface.internal
            });
        }
    }
    
    return ips;
}

// 获取本地IPv4地址
function getLocalIPv4() {
    const interfaces = os.networkInterfaces();
    for (const name of Object.keys(interfaces)) {
        for (const iface of interfaces[name]) {
            if (iface.family === 'IPv4' && !iface.internal) {
                return iface.address;
            }
        }
    }
    return '127.0.0.1';
}

// 获取公网IP(使用第三方API)
function getPublicIP() {
    return new Promise((resolve, reject) => {
        const options = {
            hostname: 'api.ipify.org',
            port: 80,
            path: '/?format=json',
            method: 'GET'
        };
        
        const req = http.request(options, (res) => {
            let data = '';
            res.on('data', (chunk) => {
                data += chunk;
            });
            res.on('end', () => {
                try {
                    const json = JSON.parse(data);
                    resolve(json.ip);
                } catch (e) {
                    reject(e);
                }
            });
        });
        
        req.on('error', reject);
        req.end();
    });
}

// 使用示例
console.log('所有网络接口:', getAllLocalIPs());
console.log('本地IPv4:', getLocalIPv4());
getPublicIP().then(ip => console.log('公网IP:', ip));

什么是IP地址?

IP地址(Internet Protocol Address)是互联网协议地址的简称,是分配给网络上每个设备的唯一标识符。IP地址用于在互联网上标识和定位设备,使设备能够相互通信。

IPv4 地址格式

IPv4(Internet Protocol version 4)是目前最广泛使用的IP地址格式。它由32位二进制数组成,通常表示为4个十进制数,每个数范围在0-255之间,用点号分隔。例如:192.168.1.1

IPv4地址空间大约有43亿个地址(2^32),由于互联网设备的快速增长,IPv4地址已经接近耗尽。

IPv6 地址格式

IPv6(Internet Protocol version 6)是IPv4的继任者,旨在解决IPv4地址耗尽的问题。IPv6由128位二进制数组成,通常表示为8组4位十六进制数,用冒号分隔。例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334

IPv6地址空间极其庞大,可以提供约3.4×10^38个地址,足够为地球上的每一粒沙子分配一个IP地址。

私有IP地址和公网IP地址

  • 公网IP地址:可以在全球互联网上路由的IP地址,用于在互联网上唯一标识一个设备。
  • 私有IP地址:保留用于内部网络的IP地址,不能在互联网上直接访问。常见的私有IP地址范围包括:
    • 10.0.0.0 - 10.255.255.255 (10.0.0.0/8)
    • 172.16.0.0 - 172.31.255.255 (172.16.0.0/12)
    • 192.168.0.0 - 192.168.255.255 (192.168.0.0/16)

CIDR(无类别域间路由)

CIDR是一种IP地址分配和路由的方法,它使用斜线记法来表示IP地址及其关联的网络掩码。例如:192.168.1.0/24表示前24位是网络部分,后8位是主机部分。

常见问题(FAQ)

Q: 本地IP和公网IP有什么区别?

A: 本地IP(私有IP)是在局域网内使用的地址,由路由器分配给局域网内的设备;公网IP是全球互联网上唯一的地址,由ISP分配给路由器。局域网内的设备通过NAT(网络地址转换)共享公网IP访问互联网。

Q: 如何隐藏我的IP地址?

A: 可以使用VPN(虚拟专用网络)、代理服务器或Tor浏览器来隐藏真实IP地址。这些工具会将您的网络流量通过中间服务器路由,从而隐藏您的真实IP。

Q: IPv4和IPv6可以共存吗?

A: 可以。大多数现代操作系统和网络设备都支持双栈(Dual Stack),即同时支持IPv4和IPv6。在过渡期间,两种协议将长期共存。