当前位置: 首页 > article >正文

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.kler.cn/a/537599.html

相关文章:

  • 备忘录模式
  • 【C++高并发服务器WebServer】-12:TCP详解及实现
  • k8存储卷管理
  • docker多个容器的相互通信
  • UNI-MOL: A UNIVERSAL 3D MOLECULAR REPRESENTATION LEARNING FRAMEWORK
  • 网络工程师 (22)网络协议
  • ximalaya(三) playUriList值解密--webpack
  • 基于html写一个音乐动态爱心盒子有音乐和导航基本功能实现
  • webpack配置之---output.chunkFilename
  • Effective Python:(12)
  • sqli-labs靶场实录(二): Advanced Injections
  • 适用于 Windows 的 Zed 编辑器的非官方稳定版。通过 scoop 或 pwsh 脚本轻松安装。不隶属于 Zed Industries
  • FPGA的IP核接口引脚含义-快解
  • kamailio的路由模块由lua脚本实现
  • 如何将3DMAX中的3D文件转换为AutoCAD中的2D图形?
  • 后端java工程师经验之谈,工作7年,mysql使用心得
  • java Jvm 双亲委派模型
  • 【Ubuntu】本地部署Deep Seek(深度求索)大模型的保姆级教程 | 详细教程
  • ubuntu文件同步
  • MyCAT 2实现mysql8主从同步读写分离
  • 通讯录管理小程序
  • 【AI大模型】Cherry Studio和Deepseek模型搭建本地知识库+硅基流动API调用+本地ollama模型调用
  • 政采云业务网关实践:使用 Higress 统一替代 APISIX/Kong/Istio Ingress
  • 【AI日记】25.02.08
  • 【梦想终会实现】Linux驱动学习6
  • 部署open webui 调用ollama启动的deepseek