V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yorkyoung
V2EX  ›  程序员

如何对已知 CIDR 地址块求补集

  •  
  •   yorkyoung · 2020-11-02 15:08:30 +08:00 · 2426 次点击
    这是一个创建于 1486 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有什么工具或方法可以对 CIDR 地址块进行合并、求补集等操作。

    比如已知大陆 CIDR 地址块,得到大陆以外 CIDR 地址块。

    已知:
    8.0.0.0/8
    202.0.0.0/8

    可以得出:
    1.0.0.0/5

    9.0.0.0/8
    10.0.0.0/7
    12.0.0.0/6
    16.0.0.0/4
    32.0.0.0/3
    64.0.0.0/2
    128.0.0.0/2
    192.0.0.0/5
    200.0.0.0/7

    203.0.0.0/8
    204.0.0.0/6
    208.0.0.0/4
    224.0.0.0/3
    第 1 条附言  ·  2020-11-02 18:53:49 +08:00
    经过研究,以下为 0 编程基础的实现方式:

    1 、得到大陆 ip 的 CIDR 块。https://ip.cn/chnroutes.html
    2 、将类似 1.1.8.0/24 的 CIDR 块在线批量转化为地址段。http://ip.chacuo.net/ipconvert
    3 、将所得数据复制粘贴到 Excel,将“可分配地址范围”的小值减一、大值加一得到左边的十进制范围。不直接使用最左边一列是因为上一步转化过程中程序的问题,后半部分数据明显出错。

    4 、IP 起始地址 1.0.0.0 的十进制表示为 16777216 。用每一段的小值减上一段的大值得到新的一组十进制 IP 段,即取余。
    5 、得到十进制的 ip 段后转化为 IP 形式。http://ip.chacuo.net/ipconvert
    6 、将 IP 形式转化为 CIDR 地址块,完成。http://apps.neu.edu.cn/netaggr/

    转换后的结果和过程文件下载链接,已去除内网地址:
    https://drive.google.com/drive/folders/1OlK_SPQXwnUE77ala5QNzbEzlWaB_KPw?usp=sharing
    8 条回复    2020-11-03 09:30:51 +08:00
    jaylee4869
        2
    jaylee4869  
       2020-11-02 15:34:58 +08:00
    没仔细看,google 试试吧
    Showfom
        3
    Showfom  
       2020-11-02 15:37:25 +08:00
    stcheng
        4
    stcheng  
       2020-11-02 15:44:17 +08:00
    蹲一个答案
    之前也碰到了类似的问题:有一系列的 IP 地址,求最后全 IP 段被分成了几段之类的需求,因为没有找到类似的实现,最后自己简单动手写了一个,也用到了楼上提到的 ipaddress 的包,另外就是用到了 LpmDict 的包。
    https://github.com/Azure/sonic-mgmt/blob/master/ansible/roles/test/files/ptftests/fib.py
    楼主的需求相对更加简单一点,也许会更容易实现。
    Mohanson
        5
    Mohanson  
       2020-11-02 15:50:29 +08:00 via Android
    一个 cidr 不就是两个 uint32 吗(上下区间),求个补集不是一分钟的事…
    yorkyoung
        6
    yorkyoung  
    OP
       2020-11-02 18:54:52 +08:00
    bazingaterry
        7
    bazingaterry  
       2020-11-02 22:24:49 +08:00
    yorkyoung
        8
    yorkyoung  
    OP
       2020-11-03 09:30:51 +08:00
    @bazingaterry 这个帖子的链接已经 404 变更后的应该是 https://github.com/x1angli/regional-ip-addresses/blob/master/ipaddr.py
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1017 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 72ms · UTC 20:52 · PVG 04:52 · LAX 12:52 · JFK 15:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.