Подтвердить что ты не робот

Как вы определяете равенство между двумя адресами IPv6?

У меня есть приложение, которое позволяет администраторам указывать допустимые IP-адреса, из которых могут быть сделаны запросы веб-сервисов. Я просто принимаю настроенные IP-адреса и сравниваю их с входящим запросом. Сравнение двух адресов IPv4 тривиально, и я думал, что сравнение двух адресов IPv6 также будет.

Однако мое сетевое незнание начало проявляться, когда я заметил, что адреса IPv6 немного сложнее. Одна из проблем, которую я заметил, заключается в том, что если я посмотрю на IP-адрес на машине (просматривал, какая консоль VMWare показывала IP-адрес) по сравнению с IP-адресом из веб-запроса (HttpContext.Current.Request.UserHostAddress в .NET), я заметил, что один из они закончились в% 10, а другой в% 11:

  • ipconfig показывает: fe80: 8179: 5576: c6d0: 8b16% 11
  • UserHostAddress показывает: fe80:: 8179: 5576: c6d0: 8b16% 10

Единственное отличие - это% 10 и% 11 - что дает?

Я также видел, что адреса IPv6 заканчиваются на "/", а затем 2 цифры. Должен ли я просто игнорировать эти последние 3 цифры (если они существуют) при сравнении? Если да, то каковы действительные альтернативные окончания, которые мне нужно искать?

----------- ИЗМЕНИТЬ -------------

Вот мое решение на основе предоставленного ответа...

Я просто храню "очищенный" IP-адрес и сравниваю его с "очищенным" IP-адресом. Использование .NET здесь - это то, как я очищаю IP-адрес. Не лучшее с точки зрения производительности, но оно действительно работает. Я бы предпочел просто сравнить GetAddressBytes(), но я использую Dictionary, и я решил отказаться от дополнительного шага создания моего собственного ByteComparer.

IPAddress incomingIp = null;
bool ipAddressParsePassed = IPAddress.TryParse(userHostAddress, out incomingIp);
if (ipAddressParsePassed)
{
    IPAddress scrubbedIp = new IPAddress(incomingIp.GetAddressBytes());
    string scrubbedIpStr = scrubbedIp.ToString()
}
4b9b3361

Ответ 1

Статьи в Википедии:

Поскольку все локальные локальные ссылки в хост имеет общий префикс, обычный процедуры маршрутизации не могут использоваться для выберите исходящий интерфейс, когда отправка пакетов в локальную ссылку место назначения. Специальный идентификатор, известный как индекс зоны, необходим для обеспечить дополнительную маршрутизацию Информация; в случае локальных ссылок адреса, индексы зон соответствуют идентификаторы интерфейса.

Когда адрес написан текстовым способом, индекс зоны добавляется к адрес, разделенный знаком процента "%". Фактический синтаксис индексов зон зависит от операционной системы [...]

Таким образом, эти суффиксы являются индикаторами зоны, которые связывают адрес с физическим интерфейсом. Это также объясняет, почему, например, достаточно различать проводные и беспроводные интерфейсы.

Чтобы ответить на вопрос, я не думаю, что суффиксы должны быть включены в любое сравнение. Адреса IPv6 по определению 128 бит, а суффиксы - это строго локальная информация, которая не имеет смысла вне вашей собственной машины и ее текущей операционной системы.

Сравнение 128 бит должно быть достаточно.

Ответ 2

Единственное отличие - это% 10 и% 11 - что дает?

Это IPv6 идентификаторы зоны, локальные адреса ссылок, то есть префикс fe80, гарантируются только по локальной ссылке. Это означает, что адреса можно найти на разных машинах, к которым нужно обратиться через интерфейс 10, а другой через интерфейс 11.

Посмотрите на определение sockaddr_in6,

struct sockaddr_in6 {
  short sin6_family;
  u_short sin6_port;
  u_long sin6_flowinfo;
  struct in6_addr sin6_addr;
  u_long sin6_scope_id;
};

Вам нужно будет сравнить поля семейства, адреса и поля области видимости для полного соответствия.

Ответ 3

Адреса с номером/и номером в конце используют нотацию Nonless Routing Inter-Domain Routing (CIDR). Они могут обозначать фактический адрес или сеть. Если есть нуль или:: перед /, то это сеть.

Обозначение CIDR

Ответ 4

IPv6 - это всего лишь 128-битный или 32-разрядный IPv4; вы должны просто выполнить байтовое сравнение по байтам.