Какова была мотивация для добавления флага IPv6_v6only?

StackOverflow https://stackoverflow.com/questions/2693709

  •  01-10-2019
  •  | 
  •  

Вопрос

В сети IPv6 флагом IPv6_V6Only используется для обеспечения того, чтобы сокет будет использовать только IPv6, и в частности, что сопоставление IPv4-to-IPv6 не будет использоваться для этого сокета. На многих ОС IPv6_V6only не устанавливается по умолчанию, но на некоторых ОС (например, Windows 7) он устанавливается по умолчанию.

Мой вопрос: какова была мотивация для представления этого флага? Есть ли что-то о сопоставлении IPv4-to-IPv6, которое вызывает проблемы, и, таким образом, людям нужен способ отключить его? Мне показано, что если кто-то не хотел использовать отображение IPv4-To-IPv6, они могут просто не указать IPv4-сопоставленный адрес IPv6. Что я здесь не хватает?

Это было полезно?

Решение

Я не знаю, почему это будет по умолчанию; Но это такие флаги, которые я всегда ставил явную, независимо от того, что такое по умолчанию.

О том, почему это существует в первую очередь, я думаю, что позволяет поддерживать существующие серверы только IPv4, и просто запустите новые на одном порту, но только для подключения IPv6. Или, может быть, новый сервер может просто прокси клиентам к старуху, что делает функциональность IPv6 простой и безболезненной, чтобы добавить в старые услуги.

Другие советы

Не все IPv6 способные платформы поддерживают розетки Dualstack, поэтому вопрос становится тем, как приложения, необходимые для максимимизации совместимости IPv6, либо знают, что DualStack поддерживается или связывается в разделе, когда его нет? Единственный универсальный ответ - IPv6_v6only.

Приложение, игнорирующее IPV6_V6ONLY или записанное до того, как существовала DualStack, способные для IP-стеков IP, могут найти привязку сепарат V4, не удается в среде DualStack, что и IPv6 DualStack Socket связывается с IPv4, предотвращающей связывание сокета IPv4. Приложение также может не ожидать IPv4 по IPv6 из-за протокола или на уровне приложений, касающихся проблем или контроля доступа IP.

Эти или аналогичные ситуации, скорее всего, будут предложены MS et al до умолчании 1 даже Tho RFC3493, объявляют 0, чтобы быть по умолчанию. 1 теоретически максимизирует обратную совместимость. В частности, Windows XP / 2003 не поддерживает разъемы DualStack.

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

Причина, по которой наиболее часто упоминается, в том случае, если сервер имеет некоторую форму ACL (список контроля доступа). Например, представьте себе сервер с правилами, как:

Allow 192.0.2.4
Deny all

Он работает на IPv4. Теперь кто-то работает на машине с IPv6 и, в зависимости от некоторых параметров, запросы IPv4 принимаются на сокете IPv6, отображаются как :: 192.0.2.4, а затем больше не совпадают с первым ACL. Внезапно доступ будет отклонен.

Быть явным в вашем приложении (с использованием ipv6_v6only) решит проблему, что у по умолчанию используется операционная система.

Для Linux, при написании сервиса, который слушает на сокетах IPv4, так и на IPv6 на такой же Порт обслуживания, например, порт 2001, вы должны позвонить SetsockOpt (S, Sol_ipv6, IPv6_v6only, One, Sizeof (One)); На сокете IPv6. Если вы этого не сделаете, операция BING () для сокета IPv4 не удается с «адресом уже в использовании».

Существуют правдоподобные способы, которыми (плохо называемые) «IPv4-сопоставленные» адреса могут использоваться для обхода плохо настроенных систем или плохих стеков, или даже в хорошо настроенной системе, возможно, просто требуют обременительной масштабировки. Разработчик может пожелать использовать этот флаг, чтобы сделать их приложение более безопасным, не используя эту часть API.

Видеть: http://ipv6samurais.com/ipv6samurais/OpenBSD-AUDIT/DRAFT-CMEDZ-V6OPS-V4MOPT-AP-AHARMFLE-01.TXT.

Представьте себе протокол, который включает в себя разговор сетевой адрес, например канал данных для FTP. При использовании IPv6 вы собираетесь отправить адрес IPv6, если получатель будет включен в IPv4 Maped Address, он не будет иметь никакого способа подключения к этому адресу.

Существует один очень распространенный пример, где двойственность поведения является проблемой. Стандарт getaddrinfo() позвонить с AI_PASSIVE Флаг предлагает возможность пройти odname. Параметр и возвращает список адресов для прослушивания. Специальное значение в форме нулевой строки принимается для odname. и подразумевает слушать на адресах подстановки.

На некоторых системах 0.0.0.0 а также :: возвращаются в этом порядке. Когда гнездо двойной стеки включен по умолчанию, и вы не устанавливаете сокет IPV6_V6ONLY, сервер подключается к 0.0.0.0 и затем не может подключиться к двойной стеке :: И поэтому (1) работает только на IPv4 и (2) ошибка отчетов.

Я бы рассмотрел заказ неправильно, поскольку IPv6 ожидается предпочтительным. Но даже когда вы впервые попытаетесь с двойным стеком :: а затем только IPv4-только 0.0.0.0, Сервер все еще сообщает об ошибке для второго вызова.

Я лично считаю всю идею розетки двойной стеки ошибкой. В моем проекте я бы предпочел всегда явно установить IPV6_V6ONLY чтобы избежать этого. Некоторые люди, по-видимому, видели это как хорошей идеей, но в этом случае я, вероятно, явно незаметно IPV6_V6ONLY и перевести NULL прямо к 0.0.0.0 обход getaddrinfo() механизм.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top