【问题标题】:Function to search if one network is contained in another network搜索一个网络是否包含在另一个网络中的功能
【发布时间】:2019-09-29 09:42:44
【问题描述】:

我需要一种有效的 Go 方法来获取一个 CIDR 网络并测试它是否完全包含在其他网络中。

例子:

var (
    subnet string = "10.10.10.8/29"
    route string = "10.10.10.0/24"
)

我想测试 'subnet' 是否在 'route' 中并返回 true,因为它是。对于不在 'route' 内或部分在其外的值返回 false。

我有一个解决方案,用于测试单个主机是否在网络中,使用 IP/CIDR 解析和包 net 中的“x.Contains()”。我已尝试将其用于网络,但失败了。

这不起作用:

if route.Contains(subnet) {
    fmt.Println("%s subnet is contained subnet %s",net, route)
}

编辑:这显然有些混乱。此处本段上方的代码片段不适用于我测试一个网络是否在另一个网络中。 SO溢出指南要求我具体说明我尝试过的内容,这就是我将其放在这里的原因。这是我的第一篇 SO 帖子。

我有一些想法比我想在这个牵头的情况下更庞大:

计算'subnet'的第一个IP(网络IP)和最后一个IP(广播IP),使用'net.ParseCIDR()'和已知的子网大小作为常数,然后测试'的网络和广播IP是否子网”与“x.Contains()”在“路由”中。

编辑:我在最初的搜索中没有看到这个帖子,但现在遇到了。它是相似的,所以我在这里链接是为了完整性。 [How to detect if two Golang net.IPNet objects intersect?]

【问题讨论】:

  • 什么不起作用?你的函数没有做任何事情,除了打印一些输出到标准输出。
  • 无论如何,你应该使用IPNet.Contains方法。
  • play.golang.org/p/KP9mI4xRLZg IPv6 留作练习。
  • @彼得。非常感谢——这行得通,但我也需要花一些时间把它拆开,弄清楚它是如何工作的。我是 Go 新手,我希望能指出正确的方向,你把它写出来了——谢谢!一旦我完成它,我会将您的评论标记为答案 - 在第二天。
  • 考虑子网的定义:具有特定公共前缀的地址集。因此,要确定 A 是否包含 B,您必须检查 A 是否是 B 的前缀。

标签: go


【解决方案1】:

对于任何xy IPv4,以及从0-32 的任何整数mn,网络x/m 包含在y/n 中当且仅当m >= n 和@987654328 @ 在 y/n 中(你可以自己计算证明)。因此,以下将起作用:

func contains(subnet, route string) (bool, error) {
    sIP, sNW, err := net.ParseCIDR(subnet)
    if err != nil {
        return false, err
    }

    _, rNW, err := net.ParseCIDR(route)
    if err != nil {
        return false, err
    }

    sNWMaskSize, _ := sNW.Mask.Size()
    rNWMaskSize, _ := rNW.Mask.Size()

    return rNW.Contains(sIP) && sNWMaskSize >= rNWMaskSize, nil
}

【讨论】:

  • 我没有忘记你的回答只是忙。我很快就会仔细阅读。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多