互联网私有IP地址列表

news2024/11/26 22:23:39

最近因为业务需要,要判断用户的IP是否私有IP,
以前知道的私有IP,基本上只有如下几个(注意:这不是正确答案):

  • 10.0.0.0/8(10.0.0.0-10.255.255.255)
  • 172.16.0.0/12(172.16.0.0-172.31.255.255)
  • 192.168.0.0/16(192.168.0.0-192.168.255.255)
  • 再加一个本地IP:
    127.0.0.0/8(127.0.0.0-127.255.255.255)
    localhost
  • 以前考MCSE的时候,还知道一个Windows在DHCP未获取到IP时,会自动分配的:
    169.254.0.0/16(169.254.0.0-169.254.255.255)

之前知道的就这些了,问了一下ChatGPT老师,说还有一些,如图:
在这里插入图片描述
基于以往印象中,GPT老师的不靠谱情况,去google查了一些资料,最后搜索到官方的定义文档,对互联网保留地址做了一个清单说明,还贴心的提供了csv格式下载:
https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml

这个网址是iana的官方网站,iana负责全球的IP地址分配,具体说明参考百度百科:
IANA ( Internet Assigned Numbers Authority,互联网号码分配机构)负责协调全球DNS的根域名、IP地址分配和其他互联网协议资源。

不过iana给的清单还有一些重复,维基百科帮它做了一下合并,整理为17项,参考地址:
https://en.wikipedia.org/wiki/Reserved_IP_addresses

IP地址段IP范围IP个数范围说明
0.0.0.0/80.0.0.0–0.255.255.25516,777,216Software一般用于当前网络或路由等特殊用途
10.0.0.0/810.0.0.0–10.255.255.25516,777,216Private network用于大型的私有网络本地通信
100.64.0.0/10100.64.0.0–100.127.255.2554,194,304Private network运营商NAT用,即ISP与客户间通信的地址
127.0.0.0/8127.0.0.0–127.255.255.25516,777,216Host本地主机环回地址。
169.254.0.0/16169.254.0.0–169.254.255.25565,536Subnet一般在DHCP无法获取到地址时,为本机分配的地址
172.16.0.0/12172.16.0.0–172.31.255.2551,048,576Private network用于中型的私有网络本地通信。
192.0.0.0/24192.0.0.0–192.0.0.255256Private networkIETF协议分配。
192.0.2.0/24192.0.2.0–192.0.2.255256Documentation分配为TEST-NET-1,做文档和示例
192.88.99.0/24192.88.99.0–192.88.99.255256Internet保留。以前用于从IPv6到IPv4中继
192.168.0.0/16192.168.0.0–192.168.255.25565,536Private network用于小型的私有网络本地通信。
198.18.0.0/15198.18.0.0–198.19.255.255131,072Private network用于对2个独立子网间的通信通过基准测试
198.51.100.0/24198.51.100.0–198.51.100.255256Documentation分配为TEST-NET-2,做文档和示例
203.0.113.0/24203.0.113.0–203.0.113.255256Documentation分配为TEST-NET-2,做文档和示例
224.0.0.0/4224.0.0.0–239.255.255.255268,435,456Internet用于IP多播(以前的D类网络)
233.252.0.0/24233.252.0.0–233.252.0.255256Documentation指定为 MCAST-TEST-NET,文档和示例
240.0.0.0/4240.0.0.0–255.255.255.254268,435,455Internet保留以备将来使用(以前的E类网络)
255.255.255.255/32255.255.255.2551Subnet保留,用于“有限广播”目标地址

注:
IPv6的保留地址参考这里:
https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml


# 转换代码

文章的最后,贴一些转换用的代码吧:

Javascript版本的代码

有5个方法,可以看下面代码的注释:

/**
 * 判断给定的ip,是否属于 IANA定义的保留地址(即私有地址)
 * @param ip 给定的ip
 * @returns {boolean} 是否私有地址
 */
function isPrivateIpAddr(ip) {
    const privateIp = [
        ['0.0.0.0', '0.255.255.255'],  // 0.0.0.0/8
        ['10.0.0.0', '10.255.255.255'],  // 10.0.0.0/8
        ['100.64.0.0', '100.127.255.255'],  // 100.64.0.0/10
        ['127.0.0.0', '127.255.255.255'],  // 127.0.0.0/8
        ['169.254.0.0', '169.254.255.255'],  // 169.254.0.0/16
        ['172.16.0.0', '172.31.255.255'],  // 172.16.0.0/12
        ['192.0.0.0', '192.0.0.255'],  // 192.0.0.0/24
        ['192.0.2.0', '192.0.2.255'],  // 192.0.2.0/24
        ['192.88.99.0', '192.88.99.255'],  // 192.88.99.0/24
        ['192.168.0.0', '192.168.255.255'],  // 192.168.0.0/16
        ['198.18.0.0', '198.19.255.255'],  // 198.18.0.0/15
        ['198.51.100.0', '198.51.100.255'],  // 198.51.100.0/24
        ['203.0.113.0', '203.0.113.255'],  // 203.0.113.0/24
        ['224.0.0.0', '239.255.255.255'],  // 224.0.0.0/4
        ['233.252.0.0', '233.252.0.255'],  // 233.252.0.0/24
        ['240.0.0.0', '255.255.255.254'],  // 240.0.0.0/4
        ['255.255.255.255', '255.255.255.254'],  // 255.255.255.255/32
    ];
    for (const [startIP, endIP] of privateIp) {
        if (inIpAddrRange(ip, startIP, endIP)) {
            return true;
        }
    }
    return false;
}

/**
 * 把 x.x.x.x形式的IP地址,转换为整数返回
 * 注:转换为无符号整型,如 '255.255.255.255'转为4294967295
 * 即: (255*256*256*256) + (255*256*256) + (255*256) + 255
 * @param ip 字符串格式的ip
 * @returns {number} 无符号整数
 */
function ipaddrToNumber(ip) {
    //return (ip.split('.').reduce((acc, cur) => (acc << 8) + parseInt(cur), 0)) >>> 0;
    const ipArr = ip.split('.');
    if (ipArr.length !== 4)
        throw new Error('IP地址格式不对,应该有3个小数点');
    let ret = 0;
    // 验证每个项是否小于等于255
    for (let i = 0; i < 4; i++) {
        const number = parseInt(ipArr[i], 10);
        if (isNaN(number) || number > 255 || number < 0)
            throw new Error('IP地址中的每个项都应在0~255之间');
        ret = (ret << 8) + number;
    }
    // 转无符号数,避免负数返回
    return ret >>> 0;
}

/**
 * 把一个无符号整数,转换为ip地址返回
 * @param number ipaddrToNumber方法计算得出的无符号整数
 * @returns {string} ip地址
 */
function numberToIpAddr(number) {
    if (number < 0 || number > 4294967295) {
        throw new Error('参数应在0~4294967295之间');
    }
    const ipArr = [];
    for (let i = 3; i >= 0; i--) {
        ipArr[i] = (number >>> (8 * (3 - i))) & 255;
    }
    return ipArr.join('.');
}

/**
 * 给定的ip,是否在给定的ip起止范围内
 * @param ip 要判断的ip
 * @param startIP ip范围起始值
 * @param endIp ip范围结束值
 * @returns {boolean} 是否在范围内
 */
function inIpAddrRange(ip, startIP, endIp) {
    const ipNum = ipaddrToNumber(ip);
    const startIPNum = ipaddrToNumber(startIP);
    const endIPNum = ipaddrToNumber(endIp);
    return ipNum >= startIPNum && ipNum <= endIPNum;
}

/**
 * 给定的ip,是否在给定的CIDR ip地址范围内
 * CIDR是用ip网址+子网掩码的表示法,如 192.168.0.0/16
 * @param ip 要判断的ip
 * @param startIP ip网址起始值
 * @param ipMaskNum 子网掩码
 * @returns {boolean} 是否在范围内
 */
function inIpAddrCIDR(ip, startIP, ipMaskNum) {
    const ipMask = parseInt(ipMaskNum, 10);
    if (isNaN(ipMask) || ipMask < 1 || ipMask > 32)
        throw new Error('子网掩码应在1~32之间');
    const ipNum = ipaddrToNumber(ip);
    const startIPNum = ipaddrToNumber(startIP);
    const endIPNum = startIPNum + (Math.pow(2, 32 - ipMask) - 1);
    console.log(startIPNum + ':' + endIPNum);
    return ipNum >= startIPNum && ipNum <= endIPNum;
}

测试代码:
isPrivateIpAddr('192.168.0.1') 结果为 true
ipaddrToNumber('192.168.0.1') 结果为 3232235521
ipaddrToNumber('1.2.3.4') 结果为 16909060
ipaddrToNumber('255.255.255.255') 结果为 4294967295

MySQL的代码

查了一下官方文档,发现MySQL内置了 ip 和 number 互转的函数,文档链接:

SELECT INET_ATON('192.168.0.1') ip1,
              INET_ATON('1.2.3.4') ip2, 
              INET_ATON('255.255.255.255') ip3, 
              INET_NTOA(16909060) ip4;

上面sql得到的结果如下:

ip1ip2ip3ip4
32322355211690906042949672951.2.3.4

跟上面Javascript代码的结果是一致的。
我们只要把私有地址写入一张表,再把某个ip转数字后,去这张表查询是否有范围内的记录即可。

  • 建表:
CREATE TABLE `sysprivateips` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `ipStart` varchar(50) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'ip段起始值',
  `ipEnd` varchar(50) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'ip段结束值',
  `ipMask` tinyint NOT NULL DEFAULT '0' COMMENT '掩码,暂时未用',
  `createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `ipStartNum` bigint GENERATED ALWAYS AS (inet_aton(`ipStart`)) VIRTUAL,
  `ipEndNum` bigint GENERATED ALWAYS AS (inet_aton(`ipEnd`)) VIRTUAL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uqi_ip` (`ipStartNum`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='私有ip列表'
  • 插入所有的私有IP数据:
INSERT INTO `sysprivateips`(`ipStart`,`ipEnd`,`ipMask`)VALUES('0.0.0.0', '0.255.255.255', '8');
INSERT INTO `sysprivateips`(`ipStart`,`ipEnd`,`ipMask`)VALUES('10.0.0.0', '10.255.255.255', '8');
INSERT INTO `sysprivateips`(`ipStart`,`ipEnd`,`ipMask`)VALUES('100.64.0.0', '100.127.255.255', '10');
INSERT INTO `sysprivateips`(`ipStart`,`ipEnd`,`ipMask`)VALUES('127.0.0.0', '127.255.255.255', '8');
INSERT INTO `sysprivateips`(`ipStart`,`ipEnd`,`ipMask`)VALUES('169.254.0.0', '169.254.255.255', '16');
INSERT INTO `sysprivateips`(`ipStart`,`ipEnd`,`ipMask`)VALUES('172.16.0.0', '172.31.255.255', '12');
INSERT INTO `sysprivateips`(`ipStart`,`ipEnd`,`ipMask`)VALUES('192.0.0.0', '192.0.0.255', '24');
INSERT INTO `sysprivateips`(`ipStart`,`ipEnd`,`ipMask`)VALUES('192.0.2.0', '192.0.2.255', '24');
INSERT INTO `sysprivateips`(`ipStart`,`ipEnd`,`ipMask`)VALUES('192.88.99.0', '192.88.99.255', '24');
INSERT INTO `sysprivateips`(`ipStart`,`ipEnd`,`ipMask`)VALUES('192.168.0.0', '192.168.255.255', '16');
INSERT INTO `sysprivateips`(`ipStart`,`ipEnd`,`ipMask`)VALUES('198.18.0.0', '198.19.255.255', '15');
INSERT INTO `sysprivateips`(`ipStart`,`ipEnd`,`ipMask`)VALUES('198.51.100.0', '198.51.100.255', '24');
INSERT INTO `sysprivateips`(`ipStart`,`ipEnd`,`ipMask`)VALUES('203.0.113.0', '203.0.113.255', '24');
INSERT INTO `sysprivateips`(`ipStart`,`ipEnd`,`ipMask`)VALUES('224.0.0.0', '239.255.255.255', '4');
INSERT INTO `sysprivateips`(`ipStart`,`ipEnd`,`ipMask`)VALUES('233.252.0.0', '233.252.0.255', '24');
INSERT INTO `sysprivateips`(`ipStart`,`ipEnd`,`ipMask`)VALUES('240.0.0.0', '255.255.255.254', '4');
INSERT INTO `sysprivateips`(`ipStart`,`ipEnd`,`ipMask`)VALUES('255.255.255.255', '255.255.255.254', '32');
  • OK,现在可以直接用sql,判断是否私有IP了:
    假设要查看 192.168.0.1对应的CIDR地址段,用这个sql:
SELECT CONCAT(ipStart, '/', ipMask) AS CIDR 
  FROM `sysprivateips`
 WHERE ipStartNum<=INET_ATON('192.168.0.1') AND INET_ATON('192.168.0.1')<=ipEndNum

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2045120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot智慧畜牧信息监控系统---附源码39012

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 智慧畜牧信息监控系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.…

碳化硅陶瓷膜过滤器的选购建议

碳化硅陶瓷膜过滤器是一种利用碳化硅陶瓷膜技术进行过滤和分离的设备&#xff0c;其性能和用途广泛。以下是关于碳化硅陶瓷膜过滤器的详细介绍&#xff1a; 一、工作原理 碳化硅陶瓷膜过滤器的工作原理主要包括两个过程&#xff1a; 过滤&#xff1a;通过碳化硅陶瓷膜的微孔结构…

Windows下串口编程与单片机串口设备通信(win32-API)

一、前言 串行通信接口&#xff0c;通常简称为“串口”&#xff0c;是一种数据传输方式&#xff0c;其中信息以连续的比特流形式发送&#xff0c;每个比特在不同的时间点被传输。这与并行通信形成对比&#xff0c;在并行通信中&#xff0c;多个比特同时通过多个线路传输。串口…

运维的利器–监控–zabbix–第二步:建设–部署zabbix agent5.0–客户端是linux系统–实操记录xy

文章目录 部署zabbix agent5.0–客户端是linux系统第一步&#xff1a;安装agent第二&#x1f645;‍&#xff1a;更改agent配置文件第三&#x1f645;‍&#xff1a;防火墙配置第四&#x1f645;‍&#xff1a;启动agent进程第五&#x1f645;‍&#xff1a;网页端添加主机失败…

互联网大厂薪资分布:90%的人月薪拿到2w-5w!你拖后腿了吗?

互联网大厂的高薪&#xff0c;早已是众人皆知&#xff0c;但究竟高到何种程度&#xff1f;普通人的薪资水平在大厂中处于什么位置&#xff1f;我们是否也拥有跻身高薪行列的可能&#xff1f; 带着这些疑问&#xff0c;我们不妨来深入探究一下互联网大厂的薪资分布情况。 如果…

在阿里云ecs上构建一个WordPress博客网站

1、购买ECS 使用抢占式实例&#xff0c;RDS 使用按量付费 2、在安全组的出入方向添加80端口 3、购买一个公网IP绑定该ecs 4、云数据库rds选择按量付费 5、创建一个名为test_user的普通账号 6、创建数据库 7、设置RDS实例白名单 8、远程登录ecs实例 9、安装apache服务及其扩展包…

【PyCharm激活】2024年最新下载安装激活汉化Pycharm教程!(附激活码)

PyCharm激活码&#xff08;下方领取&#xff09;&#xff1a; 一、下载PyCharm 访问官网&#xff1a; 打开浏览器&#xff0c;访问PyCharm官网。 选择版本&#xff1a; PyCharm提供两个版本&#xff1a;专业版&#xff08;Professional&#xff09;和社区版&#xff08;Commun…

企业级 Zabbix 监控

一、zabbix 监控 1、zabbix 监控架构 zabbix的监控架构在实际监控架构中&#xff0c;zabbix根据网络环境、监控规模等 分了如下两种架构&#xff1a; server-client 、server-proxy-client 1、server-client架构也是zabbix的最简单的架构&#xff0c;监控机和被监控机之间不经…

ElasticSearch文档数据关联关系处理

文章目录 ES如何处理关联关系对象类型案例一 适用场景案例二 不适用场景 嵌套对象nested object父子关联关系嵌套文档 VS 父子关系 ES如何处理关联关系 关系型数据库中的范式化&#xff1a; 减少了数据冗余&#xff0c;节省了磁盘空间减少了不必要的更新操作&#xff0c;因为…

SQL注入(head、报错、盲注)

目录 【学习目标、重难点知识】 【学习目标】 【重难点知识】 1. 报错注入 1.1 那么什么是报错注入呢&#xff1f; 1.2 报错注入原理 extractvalue函数 updatexml函数 1.3 靶场解析 靶场练习 2. HEAD注入 2.1 相关全局变量 2.2 靶场解析 burp暴力破解 靶场练习 3…

关于LLC知识6

总阻抗容抗感抗R 容抗和感抗可以互相抵消&#xff0c;但无论容抗或者感抗都不可以和R相互抵消。 容抗、感抗和R可以这样表示。 这里就出现了一个字母&#xff1a;j&#xff08;沿着坐标系逆时针旋转90&#xff09; 所以&#xff0c;总阻抗-j5Ω 所以&#xff0c;无论怎样&a…

虚拟机哪个软件最好用? 苹果电脑用虚拟机运行Windows程序 Mac电脑怎么玩Windows游戏

虚拟化技术就像是科技界的瑞士军刀&#xff0c;macOS用户就像是在寻找最锋利的那把刀。随着计算机技术的不断发展&#xff0c;虚拟机软件在现代信息技术领域中扮演着越来越重要的角色。虚拟机不仅可以帮助用户在一台物理机器上运行多个操作系统&#xff0c;还能有效隔离不同环境…

Windows Server 2016 Standard 修改远程登录服务 Remote Desktop Service 默认端口号

为什么要改默认端口号&#xff1f; 主要是为了安全&#xff0c;如果该服务持续被攻击&#xff0c;会触发系统的安全机制&#xff0c;锁定账号密码&#xff0c;导致无法远程登录服务器。那可就麻烦大了。。。 1 打开注册表 在CMD命令行窗口输入 “regedit” 2 在注册表中&…

CAD二次开发IFoxCAD框架系列(16)- IFoxCad的架构介绍

主要是提供一个最小化的内核&#xff0c;即 DBTrans、SymbolTable、ResultData、SelectFilter 等基础类&#xff0c;其他的功能都通过扩展方法的方式来实现。 DBTrans类 事务管理器是cad .net二次开发非常重要的一部分&#xff0c;只要涉及到读写cad数据的地方几乎都在事务里…

掌握Selenium爬虫的日志管理:调整–log-level选项的用法

介绍 在使用Selenium进行Web数据采集时&#xff0c;日志管理是一个至关重要的部分。日志不仅帮助开发者监控爬虫的运行状态&#xff0c;还能在出现问题时提供有价值的调试信息。Selenium提供了多种日志级别选项&#xff0c;通过调整–log-level参数&#xff0c;开发者可以控制日…

架起高效工作与持续学习之间的桥梁

程序员如何平衡日常编码工作与提升式学习&#xff1f; 在快速迭代的编程世界中&#xff0c;程序员们不仅需要高效完成日常编码任务&#xff0c;还需不断学习新技术、深化专业知识&#xff0c;以应对日益复杂的项目挑战。然而&#xff0c;如何在繁忙琐碎的编码工作与个人成长之…

Facebook的区块链技术:提升数据安全与隐私保护

去中心化的优势 随着数字化时代的快速发展&#xff0c;数据安全和隐私保护已成为全球范围内备受关注的话题。Facebook作为全球最大的社交平台之一&#xff0c;正在积极探索如何通过区块链技术来提升数据的安全性和用户的隐私保护。区块链技术以其去中心化、不可篡改和透明的特…

网络硬盘录像机NVR解決方案:海思3520D模组与全面的NVR方案支持

随着视频监控技术的不断发展&#xff0c;网络硬盘录像机&#xff08;NVR&#xff09;已经成为现代安防系统中不可或缺的一部分。NVR作为视频监控系统的核心设备&#xff0c;不仅负责视频的实时录制和存储&#xff0c;还承担着视频回放、告警触发、远程监控等重要功能。 我们基…

C语言中的⽂件操作

1. 为什么使⽤⽂件&#xff1f; 如果没有⽂件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运⾏程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进⾏持久化…

科望医药两年亏损超16亿:大幅收缩成本,核心产品试验数据欠佳

《港湾商业观察》黄懿 6月27日&#xff0c;科望医药集团&#xff08;下称“科望医药”&#xff09;向港交所提交上市申请&#xff0c;中信证券为其独家保荐人。 科望医药是一家处于临床阶段的生物医药公司&#xff0c;利用新一代疗法创新肿瘤治疗。 该公司大有来头&#xff…