ip转换相关知识详解

判断某个ip是否在一个网段(ip+掩码)内

大学学的计算机网络已经忘了一大半,今天接到一个需求,需要判断用户的请求ip是否在办公网网段,如果是,那么就要做出相应的提示。

一开始我以为,办公网段就只需要截取前三位就行,比如:22.3.4.6 所在网段就是22.3.4就可以。

可是安全管理员给我发的却不是这样。而是以下这样的。

192.168.1.64/26

192.168.0.0/23

192.168.0.0/24

192.168.0.0/32

这些是什么意思呢?

前面的192.168.1.64表示ip后面的26表示掩码,就是表示192.168.1.64的前26位不能动,ip分为四部分,每一辈分占8位,一共32位,也就是说32位中有26位是不能动的,前面的192.168.1占8*3=24位不能动。后面的64是0100 0000 前面已经有24位不能动了,所以后面还有2位不能动就是01不能动。所以网段就是192.168.1.64-192.168.1.127

同理192.168.0.0/23就是前23位不能动,192.168不能动 8*2=16位 后面有7位不能动后面的0就是0000 0000其中前7位不能动,后一位随便是0或者1 所以网段是192.168.0-192.168.1

192.168.0.0/24前24位不能动,192.168.0不能动 8*3=24位 后面有8位随便动 所以网段是192.168.0

192.168.0.0/32是前32位都不能动所以网段是 192.168.0.0

package com.ip;public class IpTest {public static void main(String[] args) {System.out.println(isInRange("192.168.1.127", "192.168.1.64/26"));System.out.println(isInRange("192.168.1.2", "192.168.0.0/23"));System.out.println(isInRange("192.168.0.1", "192.168.0.0/24"));System.out.println(isInRange("192.168.0.0", "192.168.0.0/32"));}public static boolean isInRange(String ip, String cidr) {String[] ips = ip.split("\\.");int ipAddr = (Integer.parseInt(ips[0]) << 24)| (Integer.parseInt(ips[1]) << 16)| (Integer.parseInt(ips[2]) << 8) | Integer.parseInt(ips[3]);int type = Integer.parseInt(cidr.replaceAll(".*/", ""));int mask = 0xFFFFFFFF << (32 - type);String cidrIp = cidr.replaceAll("/.*", "");String[] cidrIps = cidrIp.split("\\.");int cidrIpAddr = (Integer.parseInt(cidrIps[0]) << 24)| (Integer.parseInt(cidrIps[1]) << 16)| (Integer.parseInt(cidrIps[2]) << 8)| Integer.parseInt(cidrIps[3]);return (ipAddr & mask) == (cidrIpAddr & mask);}
}
https://blog.csdn.net/peng2hui1314/article/details/129027169
https://blog.csdn.net/u012045045/article/details/102514535

根据IP地址/掩码位(CIDR)和起始IP-终止IP计算网段(IPV4和IPV6)

计算IP列表

IPV4

  • 需要的jar包
			<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.7</version></dependency>

代码示例

    /*** 获取IPV4 CIDR形式下所有的ipv4** @param cidr IPV4的CIDR格式 (192.168.1.0/24)*/private static R getIpsV4ByCidr(String cidr) {String ip = cidr.split("/")[0];int mask = Integer.parseInt(cidr.split("/")[1]);String ipFrom = Ipv4Util.getBeginIpStr(ip, mask);String ipTo = Ipv4Util.getEndIpStr(ip, mask);if (Ipv4Util.countByIpRange(ipFrom, ipTo) > 1024) {return R.warn("最多可以支持1024个IP");}return R.ok().addData(Ipv4Util.list(ip, mask, true));}/*** 获取IPV4 区间范围下所有的ipv4** @param ipFrom IPV4的起始ip* @param ipTo   IPV4的结束ip*/private static R getIpsV4ByRange(String ipFrom, String ipTo) {if (Ipv4Util.countByIpRange(ipFrom, ipTo) > 1024) {return R.warn("最多可以支持1024个IP");}return R.ok().addData(Ipv4Util.list(ipFrom, ipTo));}

IPV6

需要的jar包

		<dependency><groupId>com.googlecode.java-ipv6</groupId><artifactId>java-ipv6</artifactId><version>0.17</version></dependency>

代码示例

/*** 获取IPV6 CIDR形式下所有的ipv6** @param cidr IPV6的CIDR格式 (fe80::2001/64)*/private static R getIpsV6ByCidr(String cidr) {List<String> ipv6List = Lists.newArrayList();IPv6Network network = IPv6Network.fromString(cidr);if (network.size().compareTo(new BigInteger(String.valueOf(1024))) > 0) {return R.warn("最多可以支持1024个IP");}network.forEach(e -> ipv6List.add(e.toString()));return R.ok().addData(ipv6List);}/*** 获取IPV6 区间范围下所有的ipv6** @param ipFrom IPV6的起始ip* @param ipTo   IPV6的结束ip*/private static R getIpsV6ByRange(String ipFrom, String ipTo) {List<String> ipv6List = Lists.newArrayList();IPv6AddressRange ipv6Range = IPv6AddressRange.fromFirstAndLast(IPv6Address.fromString(ipFrom), IPv6Address.fromString(ipTo));if (ipv6Range.size().compareTo(new BigInteger(String.valueOf(1024))) > 0) {return R.warn("最多可以支持1024个IP");}ipv6Range.forEach(e -> ipv6List.add(e.toString()));return R.ok().addData(ipv6List);}

IP校验

IPV4

public static boolean fieldIPv4Valid(String matchParams) {String ipv4Format = "^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})$";boolean flag = matchParams.matches(ipv4Format);return flag;}

IPV6

public static boolean fieldIPv6Valid(String matchParams)  {String ipv6Format = "^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$";boolean flag = matchParams.matches(ipv6Format);return flag;}
https://blog.csdn.net/qq_41936784/article/details/121371597

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查看网站支持的tls版本

f12 打开chrome 开发面板本文由 trykle 发布联系方式:QQ 294986636本文地址:https://www.cnblogs.com/trykle/p/18798939

解析PromQL并修改添加Label

最近做的项目中用到了Prometheus做预警服务,其中Prometheus使用promql语言来查询。项目中用户通过UI或者自己手动输入PromQL时候是缺少一些系统参数的,所以需要在用户输入完成以后同步到Prometheus时候将这部分缺失的信息给添加回去,这里就需要修改用户写的PromQL了。 实现思…

学习安装配置vue

1.先将nodejs下载2.在我们的安装目录下,创建名为node_cache和node_global的两个文件夹 3.打开cmd窗口,执行如下命令,将npm的全局模块目录和缓存目录配置到刚才创建的那两个目录。 npm config set prefix “D:\soft2024.7.6\nodejs\node_global” npm config set cache “D:\…

K8s Ingress, 你这个老6

Ingress 这个老6,结合nodeport和ClusterIp两种服务类型,你在引流这一块玩的花啊。 入口一夫当关,对内如鱼得水。本文是有态度马甲的第185篇原创。 本文记录了k8s中核心对象Ingress的产生背景和实现机制。 我们都知道k8s Service是一种将Pods通过网络暴露出来的抽象,每个服务…

C# .NET core 中处理图像,SkiaSharp,ImageSharp,NetVips,Magick.net多维度对比

2025年有哪些图像处理库,我们可以在项目中使用哪些库?本文列出了最流行的现有库。 .NET Core图片处理库SkiaSharp(https://github.com/mono/SkiaSharp) Magick.net(https://github.com/dlemstra/Magick.NET) ImageSharp(https://github.com/SixLabors/ImageSharp) NetV…

20243317 实验二《Python程序设计》实验报告

课程:《Python程序设计》 班级: 2433 姓名: 邓雅文 学号:20243317 实验教师:王志强老师 实验日期:2025年3月26日 必修/选修: 公选课 一、实验内容 1、掌握python中函数定义与调用相关知识点 大致框架与C语言相同,同样有实参,形参,可能有返回值,形式如下: def 函数名…

MEBCY-v2

MERCY-v2 信息收集 查找目标主机ip ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:84:b2:cc, IPv4: 192.168.158.143 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.158.1 00:50:56:c…

人群密度分析预警摄像机

人群密度分析预警摄像机是可以实时地统计出一个指定区域内的总人数。当所监视区域的人员数量达到设定的阀值时摄像机输出报警信号。可设置人数阈值和时间阈值。用于设置触发进入区域内的人数值,达到该设定的阈值则摄像机输出报警信号。人数阈值可以手动设置,系统默认值为5人,…

CloudFlare DNS实现根域名跳转WWW域名,301跳转

0. 目的 托管在CloudFlare上的域名,已配置好www.bktai.com,想在用户访问根域名https://bktai.com时,重定向到 https://www.bktai.com. 为什么是重定向而不是同时可以访问?搜索引擎会搜到重复的内容,且维护两套路径都能正常工作,会造成混乱。 1. 配置根域名 点击自己要设置…

day:32 jmeter及性能测试——介绍

一、性能测试介绍 1、什么叫做性能测试? (1)通过某些工具或手段来检测软件的某些指标是否达到了要求,这就是性能测试 (2)指通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试 2、性能测试的时间? 在功能测试完成后才能进行性能测试…

第六周第五天

所用时间:405分钟 代码量(行):689 博客量(篇):20 了解到的知识点: 1.VLAN的创建与划分 今天进行了计算机网络的实验一,在昨天下载的packet tracer上进行,实现了VLAN的创建与划分,进行跨交换机的相同vlan之间的计算机和不同vlan之间的计算机的通信实验2.树状结构查询…

独立按键控制LED数码管

前言 通过1个独立按键,控制LED数码管显示字符。 结合之前我的两篇文章独立按键控制LED流水灯方向 https://www.cnblogs.com/luckydoog/p/18796974数码管静态显示 https://www.cnblogs.com/luckydoog/p/18797690效果原理 提前在程序里存储共阴极数码管的编码表,能表示的字符范…