Вопрос или проблема
Я использую Windows 10 сборки 1809 и у меня установлен Hyper-V. У меня есть машина с Linux, работающая за NAT, с работающей интернет-связью на IP 10.0.5.5. Я в основном следовал инструкциям по ссылке ниже
https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/user-guide/setup-nat-network
Когда я создал сопоставление портов, я назвал
Add-NetNatStaticMapping -ExternalIPAddress 0.0.0.0/24 -ExternalPort 8500 -Protocol TCP -InternalIPAddress 10.0.5.5 -InternalPort 8500 -NatName YetAnotherNAT
Если я пытаюсь зайти на http://10.0.5.5:8500, это работает (страница загружается). Если я пытаюсь зайти на http://127.0.0.1:8500, это не работает (ничего не загружается). Даже если я пытаюсь использовать любой из своих внешних IP, это не работает.
Это в основном похоже на то, что переадресация портов не работает.
Есть идеи?
Get-VmSwitch возвращает следующее
PS C:\> Get-VMSwitch
Name SwitchType NetAdapterInterfaceDescription
---- ---------- ------------------------------
nat Internal
Wifi External Intel(R) Dual Band Wireless-AC 7265
DockerNAT Internal
Default Switch Internal Teamed-Interface
MyNATSwitch Internal
YetAnotherSwitch Internal
Get-NetNat возвращает следующее
PS C:\> get-netnat
Name : YetAnotherNAT
ExternalIPInterfaceAddressPrefix :
InternalIPInterfaceAddressPrefix : 10.0.5.0/24
IcmpQueryTimeout : 30
TcpEstablishedConnectionTimeout : 1800
TcpTransientConnectionTimeout : 120
TcpFilteringBehavior : AddressDependentFiltering
UdpFilteringBehavior : AddressDependentFiltering
UdpIdleSessionTimeout : 120
UdpInboundRefresh : False
Store : Local
Active : True
Вы, вероятно, сталкиваетесь с этим:
Доступ к внутренним конечным точкам напрямую с хоста
Внутренние конечные точки, назначенные ВМ или контейнерам, не могут быть доступны
с использованием внешних IP / портов, указанных в статических сопоставлениях портов NAT,
напрямую с хоста NAT. С хоста NAT эти внутренние
конечные точки должны адресоваться непосредственно по их внутреннему IP и портам.
Например, предположим, что конечная точка контейнера имеет IP 172.16.1.100 и работающий
веб-сервер, который прослушивает на порту 80. Кроме того, предположим, что
сопоставление порта было создано через Docker для переадресации трафика с
IP-адреса хоста (10.10.50.20), получаемого на TCP-порту 8080, к
конечной точке контейнера. В этом случае пользователь на хосте контейнера не может
получить доступ к веб-серверу напрямую, используя внешние сопоставленные порты. т.е.
Пользователь, работающий на хосте контейнера, не может получить доступ к веб-серверу контейнера косвенно на http://10.10.50.20:8080. Вместо этого пользователь должен
получить доступ к веб-серверу контейнера напрямую по адресу http://172.16.1.100:80.Единственное исключение к этому ограничению заключается в том, что к внутренней конечной точке можно
получить доступ с использованием внешнего IP/порта из другого конечной точки ВМ/контейнера,
работающего на том же хосте NAT: это называется “hair-pinning”.
Например, пользователь, работающий на контейнере A, может получить доступ к веб-серверу, работающему
в контейнере B, используя внутренний IP и порт по адресу
http://10.10.50.20:8080
Ответ или решение
С учетом описанной вами ситуации с использованием Hyper-V на Windows 10, я подробно объясню, почему ваш port forwarding с помощью команды Add-NetNatStaticMapping
не работает, и предложу возможные решения проблемы.
Проблема: Доступ к внутреннему IP через внешний IP
Вы уже установили, что ваш Linux VM имеет внутренний IP-адрес 10.0.5.5 и отвечает на запросы по этому адресу на порту 8500. Однако, когда вы пытаетесь получить доступ к этому же серверу через 127.0.0.1:8500 или внешний IP, просто не возникает никаких ответов. Причина этого кроется в ограничениях настройки NAT в Windows, с которыми вы столкнулись.
Ограничения NAT в Windows
Как указано в документации, Windows NAT не позволяет хосту (в вашем случае, машине с Windows 10) подключаться к внутренним конечным точкам непосредственно через внешний IP-адрес NAT. Это означает, что вам необходимо использовать внутренний IP-адрес и порт для доступа к вашему Linux серверу.
При этом, запуск локального сервера на хосте Windows и попытка доступа к нему через внешний IP-адрес не будет работать, т.к. не предусмотрено использование NAT для механизма обратного проксирования с самого хоста.
Возможные решения
-
Использование внутреннего IP-адреса: Для доступа к вашему серверу используйте внутренний IP-адрес. В вашем случае это будет:
http://10.0.5.5:8500
-
Проверка настроек межсетевого экрана: Убедитесь, что на вашей Linux машине нет блокировки входящих соединений на порт 8500. Возможно, потребуется проверить настройки межсетевых экранов (например,
iptables
) на вашем сервере. -
Hair-pinning (если необходимо): Обратите внимание, что возможность hair-pinning может зависеть от конкретной реализации и конфигурации NAT на вашей платформе. Если у вас есть другой VM, вы можете попробовать доступ с него. С другой стороны, hair-pinning не будет работать с вашим хостом.
-
Настройка прокси-сервера (если необходимо): Если вам действительно нужно получать доступ к вашему веб-серверу с хоста используя внешний IP-адрес, вы можете рассмотреть использование одного из следующих решений:
- Настройка обратного прокси на Windows (например, с использованием IIS или Nginx).
- Использование VPN или SSH-туннелей.
Заключение
Подводя итог, проблема с отсутствием доступа через 127.0.0.1:8500
или ваш внешний IP-адрес в NAT среде на Hyper-V заключается в специфике работы NAT в Windows. Возможно, единственным правильным решением в вашей ситуации будет доступ по внутреннему IP-адресу вашего Linux сервера. Если вам сложно реализовать это, я рекомендую ознакомиться с дополнительными материалами по настройке NAT в Windows и возможности использования других инструментов для достижения вашей цели.