Семантика :: и 0.0.0.0 в ОС с двумя стеками

10

Еще в дни только IPv4 соединение LISTEN, отображаемое netstatкак прослушивающее 0.0.0.0, реагировало на соединения на любом интерфейсе IPv4 в системе.

Насколько я понимаю, новая идиома IPv6 ::прослушивает все доступные интерфейсы IPv6 и IPv4. Правильно ли это для всех операционных систем (Unix, Windows, Mac)? Есть ли идиома для прослушивания только на интерфейсах IPv6?

Алекс Дж
источник

Ответы:

17

К сожалению, это зависит от используемой операционной системы.

В Microsoft Windows привязка сокета к привязкам ::только к портам IPv6. Таким образом , чтобы прослушивать все адреса на IPv4 , так и IPv6, необходимо связывать с 0.0.0.0, а также ::. Следующая выдержка из коробки Vista:

C:\>netstat -an | find "445"
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING
  TCP    [::]:445               [::]:0                 LISTENING

В качестве примера я привел порт 445, используемый для трафика SMB, когда NetBIOS не используется. Как вы можете видеть, это является обязательным для обоих, 0.0.0.0и ::для того, чтобы клиенты IPv4 и IPv6 работали соответственно.

В Linux ::он включает в себя адреса, совместимые с IPv4, как вы правильно догадались, поэтому привязка к ним 0.0.0.0также не требуется . Я написал простую программу на Python, которая привязывается только к AF_INET6сокету ::. Несмотря на то, что я также не привязывался к AF_INETсокету (IPv4), он все еще принимает подключения от клиентов IPv4. Если, скажем, 10.1.1.3подключается к нему, он будет отображаться как подключение с ::ffff:10.1.1.3.

За исключением того, что это становится волосатым. Вышеуказанное не относится к Linux, если для /proc/sys/net/ipv6/bindv6onlyнего установлено значение 1, и в этом случае поведение точно такое же, как в Windows - привязка к ::будет прослушивать только запросы IPv6. Если вы также хотите прослушивать запросы IPv4, вам нужно будет создать AF_INETсокет и прослушивать его 0.0.0.0. К счастью, по умолчанию bindv6onlyявляется 0, таким образом , есть очень небольшой шанс , вы всегда будете иметь дело с этим ( за исключением , если вы используете Debian, который на самом деле по умолчанию используется bindv6only = 1).

Все это удобно знать, проверяя, поддерживает ли служба IPv6, а также включена ли поддержка IPv4. Вот мой SSH сервер:

$ netstat -64ln | grep 22
tcp6    0    0 :::22    :::*    LISTEN

Как видите, SSH прослушивает только ::порт 22. Однако он не только прослушивает клиенты IPv6 - он отлично работает от клиентов IPv4 благодаря привязке, совместимой с IPv4. Чтобы доказать это, если вы посмотрите на это:

$ cat /proc/sys/net/ipv6/bindv6only 
0

bindv6onlyотключено (по умолчанию). Если бы это было установлено 1, то я должен был бы поощрять SSH также слушать 0.0.0.0(или вместо).

Извиняюсь за отсутствие информации о стороне Mac OS X. Я использовал это в прошлом, но я предпочитаю эстетику GNOME, поэтому я не использовал это в течение очень долгого времени. Тем не менее, я бы предположил, что поведение такое же, как и в Linux.

Надеюсь это поможет.

Джереми Виссер
источник
4

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

Редактировать: Ах, немного дальше, он говорит:

Некоторые распространенные стеки IPv6 не поддерживают функцию сопоставления адресов IPv4, поскольку стеки IPv6 и IPv4 являются отдельными реализациями (Microsoft Windows до Vista / Longhorn: например, XP / 2003) или из-за проблем безопасности (OpenBSD). В этих операционных системах необходимо открыть отдельный сокет для каждого поддерживаемого протокола IP. В некоторых системах (например, Linux, NetBSD, FreeBSD) эта функция контролируется опцией сокета IPV6_V6ONLY, как указано в RFC 3493.
Дэвид Пашли
источник
-1

Возможно, вы могли бы сделать это с помощью своего идентификатора сети, AAAA: BBBB: CCCC: DDDD :: или чего бы то ни было для вас. Это гарантировало бы, что только интерфейсы IPv6 подхватят это. Думаю. Я не мастер IPv6.

Мэтт Симмонс
источник