двойной стек ipv6 / ipv4 на локальном хосте - PullRequest
4 голосов
/ 17 февраля 2010

У меня есть сервер ipv4, который принимает соединения только через локальный хост (используя INADDR_LOOPBACK). Я хотел бы преобразовать этот сервер в ipv6 / ipv4 с двумя стеками. Однако при использовании in6addr_loopback допускаются только подключения к ::1.

Я обнаружил, что могу принимать соединения ipv4 и ipv6 одновременно, используя in6addr_any, но так как это разрешает соединения из любого места, это не полезно для моего конкретного случая.

Возможно ли привязать к локальному хосту ipv6 (::1) и локальному хосту ipv4 (127.0.0.1) одновременно?

Ответы [ 2 ]

4 голосов
/ 17 февраля 2010

AFAIK, это невозможно.

Что вам нужно сделать, это создать два сокета, один из которых связан с INADDR_LOOPBACK, а другой - с in6addr_loopback. Затем вы можете одновременно ожидать их обоих, используя выбранный мультиплексор (опрос, выбор, epoll и т. Д. 0).

Обновление

Просто придумали некоторые обходные пути, которые вы можете рассмотреть. В обоих этих обходах вы связываетесь с in6addr_any.

  1. Когда соединение установлено, проверьте удаленный адрес и, если это не 127.0.0.1 или :: 1, закройте его. Хотя поведение соединения по IP-адресу не является идеальным (соединения устанавливаются / немедленно закрываются, а не отклоняются), приятно то, что это можно сделать исключительно в вашем приложении.
  2. Отрегулируйте настройки стека IP-адресов вашей ОС, чтобы запретить подключения к вашему порту от не-петлевых IP-адресов. Это определенно выполнимо в Linux с iptables . Хотя поведение более идеальное, оно требует настройки, внешней для вашего приложения.
0 голосов
/ 17 февраля 2010

Только потому, что ваш сервер является двойным стеком, действительно ли ваше приложение только для localhost должно быть? Вы можете просто выбрать один и пойти с ним?

...