Функция для поиска, если одна сеть содержится в другой сети - PullRequest
0 голосов
/ 29 сентября 2019

Мне нужен эффективный способ в Go взять одну сеть CIDR и проверить, полностью ли она содержится в других сетях.

Пример:

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

Я хочу проверить, находится ли «подсеть» в «маршруте», и вернуть true, потому что это так.Вернуть false для значений, которые не находятся внутри «маршрута» или частично находятся за его пределами.

У меня есть решение для тестирования, если один хост находится в сети, используя разбор IP / CIDR и 'x.Contains ()' в пакете net.Я попытался адаптировать это для сетей, и это не удалось.

Это не работает: .

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

Редактировать: По-видимому, есть некоторая путаница по этому поводу.Фрагмент кода чуть выше этого параграфа, который не работает для меня, чтобы проверить, находится ли одна сеть внутри другой.Руководство по переполнению SO попросило меня быть более точным в отношении того, что я пробовал, поэтому я изложил это здесь.Это мой первый пост SO.

У меня есть некоторые идеи, которые являются более объемными, чем я хотел бы сделать это с этим в начале:

Рассчитать первый IP (сетевой IP) и последний ip (широковещательный IP) «подсети», используя «net.ParseCIDR ()» и известные размеры подсети в качестве констант, а затем проверьте, находятся ли как сетевой, так и широковещательный IP «подсети» в «маршруте» с помощью «x»..Contains () '.

Редактировать: я не видел эту ветку в моих начальных поисках, но наткнулся на нее сейчас.Это похоже, так что я здесь для полноты.[ Как определить, пересекаются ли два объекта Golang net.IPNet? ]

1 Ответ

1 голос
/ 30 сентября 2019

Для любых x и y IPv4s и любых целых чисел m и n от 0 до 32, сеть x/m содержится в y/n тогда и только тогда, когда m >= n и x находится в 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...