Входящий пул NAT, как обнаружить внешний порт?

Предыстория: если я правильно понимаю, InboundNATPools используются для сопоставления диапазона внешних портов, каждый из которых соответствует определенной виртуальной машине на VMSS за LB. например {LB_IP:p1,LB_IP:p2, ...} => {VM1:p0,VM2:p0, ...}

Вопрос. Как виртуальная машина (например, приложение) может обнаружить назначенный ей внешний порт? например в примере выше правый порт от {p1,p2,..}

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

Дополнительные сведения: я использую Service Fabric, а протокол для порта — TCP.

Идентичный вопрос без ответа: Получить порт NAT подсистемы балансировки нагрузки Azure для виртуальной машины Azure на C# не получил корректного ответа, я надеюсь вновь решить эту проблему.


person Omzaks    schedule 11.06.2018    source источник


Ответы (1)


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

curl -H Metadata:true "http://169.254.169.254/metadata/instance?api-version=2017-12-01"

который даст вам имя узла в формате nodename_0

добавление числа после _ к начальному порту балансировщика нагрузки должно дать вам порт

Это очень хакерски, и я действительно надеюсь, что есть лучшее решение!

Лично я предпочитал предоставлять VPN-доступ, чтобы к этим портам можно было получить доступ непосредственно из внутренней виртуальной сети.

person Michael B    schedule 11.06.2018
comment
имя также можно получить в сервисе с помощью Environment.GetEnvironmentVariable(Fabric_NodeName), но я бы предпочел менее хакерское решение - спасибо! - person Omzaks; 12.06.2018