Вопрос или проблема
Я запускаю сервер, доступный извне, внутри виртуальной машины (ВМ). Мой локальный маршрутизатор настроен на использование DynDNS для сопоставления моего IP-адреса с доменом, который я владею, и для переадресации пакетов на порты 80 и 443 на мой ПК с Windows. Виртуальная машина VirtualBox настроена с сетью NAT и следующими правилами переадресации портов:
До недавнего времени всё работало прекрасно с IPv4. К сожалению, я недавно сменил провайдера DSL, и они используют туннель DS Lite, что означает, что у меня нет публичного IPv4-адреса, только IPv6. Поэтому я перенастроил правила DynDNS, чтобы сопоставить мой домен с моим динамическим IPv6-адресом. Похоже, что пакеты доходят до моего ПК*, но не перенаправляются на ВМ.
Почему? Нужно ли мне где-то настроить IPv6 и/или использовать другой тип сети в выпадающем списке «Присоединено к: »? Могу ли я как-то перенаправить пакеты IPv6 на IPv4-адрес внутри ВМ?
* На самом деле, когда я запускаю сервер на хосте, я тоже не могу получить к нему доступ через мой внешний IPv6-адрес. Я перенаправляюсь на страницу моего маршрутизатора. Так что, возможно, мне также нужно как-то исправить конфигурацию маршрутизатора. Я думаю, это связано с “IPv6 Prefix”, и это концепция, с которой я не знаком. Также, похоже, у моего ПК в настройках переадресации портов есть выделенный адрес IPv6, что, кажется, подразумевает, что мне назначено несколько внешних IPv6-адресов. Похоже, мне нужно больше об этом прочитать.
Хотя теоретически возможно, чтобы реализация NAT в VirtualBox перенаправляла IPv6-соединения на хост IPv4, такая протокольная трансляция, как правило, вызывает множество осложнений, таких как «какой IPv4-адрес источника должен видеть целевой хост?» (так как оригинальный v6-адрес, конечно, не помещается в заголовок IPv4). Поэтому на практике единственными вариантами остаются v4-to-v4 и v6-to-v6.
По умолчанию сеть NAT в VirtualBox не поддерживает IPv6. Вам нужно открыть “Инструменты → Сеть” в главном окне VirtualBox и создать там пользовательскую сеть NAT, включив IPv6 и настроив некоторый префикс адреса; тогда вы увидите, что на вкладке “Переадресация портов” теперь есть как ‘IPv4’, так и ‘IPv6’ под-вкладки.
Затем в настройках ВМ переключите сетевой интерфейс с “NAT” на “NAT Network” и выберите только что созданную сеть.
(В отличие от режима NAT по умолчанию, эти пользовательские сети NAT могут быть совместно использованы несколькими виртуальными машинами, поэтому переадресация портов настраивается через настройки сети, а не через настройки ВМ.)
Вариант B: Вместо режима NAT используйте “Режим мост”, который позволяет ВМ находиться напрямую в вашей основной локальной сети (LAN). Виртуальная машина тогда будет иметь свой собственный IPv6-адрес (и свой собственный IPv4-адрес в локальной сети), так же как и ваш хост Windows, так что вам вообще не нужно будет настраивать переадресацию портов.
Вариант C: Существуют HTTP-обратные прокси и TCP-прокси, которые можно запустить на хосте Windows, проксируя соединения на ВМ (либо через “переадресацию портов” NAT VBox, либо через “только для хоста”). Прокси могут переводить между IPv4 и IPv6, так как они не пытаются сохранить оригинальный IP-адрес; они просто создают новое соединение с IP хоста. (Оригинальный IP клиента будет предоставлен через X-Forwarded-For или аналогичные методы.)
Вариант D: В Windows есть встроенный сервис TCP-прокси, который аналогично поддерживает пересылку между IPv4 и IPv6. Вы можете найти его в netsh
под interface portproxy
(попробуйте команду add
). Он не поддерживает X-Forwarded-For или что-то подобное.
Префиксы (расширение из комментариев)
-
“Префиксы” – это одно и то же как в IPv4, так и в IPv6; они просто указывают на сеть (диапазон адресов) определённого размера. Например, внутренний префикс вашей домашней локальной сети, скорее всего, 192.168.1.0/24, где “/24” – это длина префикса в битах (более компактный способ записи сетевой маски 255.255.255.0).
Этот термин нечасто используется в контексте домашних IPv4-соединений, поскольку в лучшем случае они получают только один адрес, который не стоит называть “префиксом”, когда единственное, для чего он является префиксом, это он сам (хотя вы всё равно можете назвать это префиксом /32).
С IPv6, в свою очередь, пул адресов достаточно велик, чтобы ваш провайдер мог с легкостью позволить себе назначить вам несколько внешних адресов. Но вместо того чтобы сдавать их в аренду индивидуально каждому устройству, провайдер назначает вам целую подсеть сразу и позволяет вашему собственному маршрутизатору заботиться о остальном — “IPv6-префикс” это просто диапазон IPv6-адресов, используемый для вашей сети.
(Как и в IPv4, длина префикса такая как /64 всё ещё является просто способом записи сетевой маски, но это гораздо более компактно, чем “ffff:ffff:ffff:ffff:0:0:0:0”.)
-
Ваш маршрутизатор арендует префикс вашей локальной сети с помощью DHCPv6-PD (“Prefix Delegation”) примерно так же, как он арендует IPv4-адрес с помощью традиционного DHCP. Это позволяет маршрутизатору напрямую распределять публичные IPv6-адреса устройствам локальной сети, что означает, что ему больше не нужно выполнять NAT — ни исходящий, ни входящий, таким образом, правила “переадресации портов” также не применяются к IPv6-соединениям; клиенты просто напрямую достигают адресов вашей локальной сети. (Тем не менее, у маршрутизатора всё равно есть межсетевой экран, чтобы защищать локальную сеть.)
(Индивидуальные подсети IPv6 почти всегда используют префикс /64; это то, что ваш домашний маршрутизатор получает по умолчанию для вашей локальной сети, но ваш провайдер, как правило, способен назначить вам более широкую сеть (короткий префикс), такую как /60 или /56, которая затем делится на приличное количество подсетей /64. Когда вы используете “Генератор уникальных локальных префиксов“, вы также должны разделить /48 на подсети размером /64.)
-
Как только префикс получен, маршрутизатор объявляет его в локальной сети с помощью ICMPv6 Router Advertisement; каждое устройство затем независимо решает, какие суффиксы добавить к нему и генерирует свои собственные адреса таким образом. Маршрутизатор не отслеживает ‘арендованные’ IPv6-адреса.
В зависимости от ОС суффикс адреса может быть либо полностью статичным (например, основанным на MAC), либо частично статичным (меняется только при изменении префикса). Также на ПК часто включены “Расширения конфиденциальности IPv6”, которые генерируют дополнительные временные IPv6-адреса наряду с постоянным; существует отдельная тема по отключению этого.
(Описанный выше протокол называется “SLAAC”. Хотя IPv6 также имеет DHCPv6 как более традиционный вариант назначения адресов, он довольно редок.)
-
Поскольку каждое устройство теперь имеет уникальный внешний адрес, клиенты DynDNS должны запускаться на этом конкретном устройстве — и да, это означает, что вам нужен отдельный субдомен для каждого сервера, который у вас есть. Тем не менее, ваш провайдер должен позволить вам иметь статический IPv6-префикс, избегая необходимости в DynDNS, поскольку он вполне может себе это позволить… если только они не решили взимать налог “Потому что мы можем”. (Или, если вы не в Германии, где, похоже, вам нужно явно согласиться на наличие статического префикса из-за законов?)
Ответ или решение
Чтобы сконфигурировать NAT-сеть VirtualBox с поддержкой IPv6, следуйте следующим шагам:
1. Создание пользовательской NAT-сети с поддержкой IPv6
- Откройте VirtualBox и перейдите в меню "Инструменты" (Tools) → "Сеть" (Network).
- Нажмите "Добавить" (Add), чтобы создать новую NAT-сеть. Убедитесь, что вы включили поддержку IPv6, установив соответствующий флажок.
- Укажите префикс IPv6, который будет использоваться для вашей NAT-сети (например,
2001:db8:0:1::/64
). - Сохраните изменения.
2. Настройка виртуальной машины
- Выберите вашу виртуальную машину и перейдите в её настройки.
- В разделе "Сеть" (Network) установите режим сетевого адаптера на "NAT Network" и выберите созданную вами ранее NAT-сеть.
- Убедитесь, что сетевой интерфейс в вашей виртуальной машине настроен на получение IPv6-адреса через DHCP или SLAAC (Stateless Address Autoconfiguration).
3. Настройка IPv6 на хосте и виртуальной машине
- Убедитесь, что на вашем хосте (Windows PC) правильно настроен IPv6 и что он подключен к вашему маршрутизатору.
- В виртуальной машине проверьте, что IPv6-адрес был назначен автоматически. Для этого выполните команду:
ip -6 addr show
4. Настройка перенаправления портов для IPv6
- После создания пользовательской NAT-сети вернитесь в настройки сети этой NAT-сети.
- Перейдите на вкладку "Перенаправление портов" (Port Forwarding). Здесь вы увидите вкладки для конфигурации IPv4 и IPv6.
- Добавьте новое правило для перенаправления IPv6. Укажите внешний IPv6-адрес и порт, которые должны перенаправляться на внутренний IPv6-адрес и порт вашей виртуальной машины.
5. Настройки маршрутизатора
Если вы не можете получить доступ к своему серверу через внешний IPv6-адрес, возможно, проблема в настройках маршрутизатора:
- Убедитесь, что ваш маршрутизатор правильно обрабатывает запросы IPv6 и не выполняет NAT для IPv6.
- Проверьте настройки DHCPv6 и Prefix Delegation на маршрутизаторе. Убедитесь, что он предоставляет префиксы для вашего локального сетевого сегмента.
- Проверьте, нет ли правил брандмауэра, блокирующих входящие IPv6-запросы.
6. Опции
Если вы не ожидаете серьезных сложностей, то можете рассмотреть возможность использования режима "Мост" (Bridged) вместо NAT. Это позволит вашей виртуальной машине получить адрес в вашем локальном сегменте сети, что значительно упростит доступ к ней извне без необходимости перенаправления портов.
Заключение
Следуя этим шагам, вы сможете настроить VirtualBox NAT-сеть с поддержкой IPv6 и создать доступ к вашему серверу внутри виртуальной машины. Убедитесь, что как хост, так и виртуальная машина корректно настроены для работы с IPv6, и правильно перенаправьте порты, если это необходимо. Если у вас возникнут дополнительные проблемы, рассмотрите возможность обращения к документации вашего маршрутизатора или к провайдеру интернет-услуг для получения дополнительной информации о поддержке IPv6.