Выберите адреса прослушивания для сервера IPv6 (двойной стек)

Некоторым это покажется странным вопросом. но я искал и не нашел ответа.

Когда я хочу сервер с двумя стеками, мне нужно слушать INADDR_ANY для IPv4 и до in6addr_any для IPv6.

Если у меня более одной сетевой карты, мне нужно выбрать, хочу ли я слушать всех или указать, какую карту слушать.

Для этого точного предложения я использую getaddrinfo метод с настраиваемым именем_хоста. Если host_name не настроил, то звоню getaddrinfo с NULL и получите два «ЛЮБЫХ» адреса. Если я настроил его с IP (v6 или v4), я получу только один адрес, что тоже хорошо.

Но когда я использую мой hostname как настроенное имя_хоста, на машине с Windows я получаю от getaddrinfo 3 адреса: один адрес IPv4 и два адреса IPv6. Первый виден ipconfig как «Link-local IPv6 Address», второй — «IPv6 Address» в разделе «Туннельный адаптер 6TO4 Adapter:».
Адреса упорядочены так:

  1. IPv6 Link Local
  2. IPv6-адрес
  3. IPv4

Итак, если я слушаю все адреса, двойной стек фактически является тройным стеком. Если я беру первый адрес IPv6 (как это было принято на сервере IPv4 с настроенным именем_хоста), я слушаю только «Link-local IPv6 Address», который менее доступен, чем «IPv6 Address», и многие клиенты могут т подключиться к нему, в то время как они могут подключиться к IPv4-адресу.

Сейчас я пытаюсь усложнить это дальше. Я подключил свой мобильный телефон к USB и активировал USB Tethering. когда я разрешаю адреса getaddrinfo Я получаю 5 адресов:
по этому заказу:

  1. USB IPv6 Link Local
  2. Ethernet IPv6 Link Local
  3. IPv6-адрес
  4. USB IPv4
  5. Ethernet IPv4

Итак, мои вопросы:

  1. Если бы это был только IPv4, я бы сказал, что я беру только первый IPv4. и не заботится об остальном. но при использовании IPv6, похоже, что последний IPv6 является наиболее подходящим. есть ли соглашение для этого?

  2. Если у меня есть многосетевой компьютер, мне нужно выбрать первую сеть и прослушивать как IPv4, так и IPv6, но здесь результаты смешаны. опять же, есть ли соглашение?

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

Спасибо за любую помощь или комментарий.
Но, пожалуйста, не советуйте слушать только «ЛЮБОЙ», так как я не могу.

3

Решение

Локальные адреса связи действительны только в пределах сегмента сети и часто только для вашей машины к машине на другом конце линии связи. Например, ваш локальный USB-адрес будет работать только для связи между телефоном и компьютером, но не более того; ваш локальный IPv6-адрес канала будет использоваться со всех машин на одном концентраторе / коммутаторе, но не за маршрутизатором (что-то похожее на частный адрес IPv4). Если это не ваш ожидаемый вариант использования, я предлагаю вам просто игнорировать локальные адреса ссылок.

Автоматически назначенные локальные адреса создаются с очень специфическим шаблоном и маской, поэтому вы можете определять их программно. Локальные IPv6-адреса каналов находятся в диапазоне fe80 :: / 64 (это означает, что первые байты адреса fe80:0000:0000:0000 и 8 оставшихся байтов могут быть любыми), а локальные IPv4-адреса в диапазоне от 169.254.1.0 до 169.254.255.255.

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

1

Другие решения

Старый пост, я знаю, как ты наконец решил это? Мне действительно интересно знать.

Для этого я бы порекомендовал вариант, которого вы избегаете, привязать к ЛЮБОМУ, подстановочный знак "::" , bind(.., "::", ..) и использовать правила брандмауэра или фильтра пакетов, чтобы исключить нежелательные подключения.

0

По вопросам рекламы [email protected]