двойной стек ipv6/ipv4 на локальном хосте

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

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

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


person paleozogt    schedule 17.02.2010    source источник
comment
Это должно перейти к ошибке сервера   -  person Vivin Paliath    schedule 17.02.2010
comment
Насколько я понимаю, ServerFault — это сайт типа IT/SysAdmin. Это вопрос программирования (API сокетов).   -  person paleozogt    schedule 17.02.2010


Ответы (2)


АФАИК, это невозможно.

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

Обновить

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

  1. Когда соединение установлено, проверьте удаленный адрес и, если он не 127.0.0.1 или ::1, закройте его. Хотя поведение подключения по IP-адресу не идеально (соединения устанавливаются/немедленно закрываются, а не отклоняются), приятно то, что это можно сделать исключительно в вашем приложении.
  2. Настройте параметры стека IP-адресов вашей ОС, чтобы запретить подключения к вашему порту с IP-адресов без обратной связи. Это определенно выполнимо в Linux с помощью iptables. Хотя поведение является более идеальным, оно требует конфигурации, внешней по отношению к вашему приложению.
person R Samuel Klatchko    schedule 17.02.2010
comment
Я так и думал, но хотел убедиться. Спасибо. - person paleozogt; 17.02.2010
comment
некоторые могут подключаться с 127.1.0.1, и это все равно будет локальным трафиком. - person akostadinov; 21.07.2015

Просто потому, что ваш сервер имеет двойной стек, действительно ли ваше приложение только для локального хоста должно быть таким? Можете ли вы просто выбрать один и пойти с ним?

person Yuliy    schedule 17.02.2010