Назад | Перейти на главную страницу

Можно ли выполнить привязку к общедоступному IP-адресу на экземпляре виртуальной машины Google Compute?

Я запускаю серверное приложение на экземпляре Google Compute, которое требует использования общедоступного IP-адреса, потому что оно не поддерживает NAT / не совместимо (это MRCP, если вам интересно). Я пытаюсь понять, возможно ли такое.

У меня уже есть общедоступный IP-адрес, назначенный моей виртуальной машине, но я могу получать трафик только на внутренние адреса (10.x.y.z).

Я думаю, что это возможно, если вы можете установить Listen / BindIP или интерфейс в файле конфигурации перед запуском серверного приложения. (например, IP / interface = xxxx port = xxxx)

Может быть способ получше, у меня была аналогичная проблема, и у меня это сработало с TCP / UDP. Я не тестировал MRCP / SIP

Чтобы проверить, возможно ли это, вы должны:

1.Создайте новую виртуальную машину для тестирования: (Не уверен, на какой ОС вы работаете, поэтому эти команды могут быть неточными)

2. Затем создайте виртуальный сетевой интерфейс, например:

ifconfig eth0: 1 publicipaddress вверх

3. Затем проверьте это командой: ifconfig Должно выглядеть примерно так:

eth0: 1: flags = 4163 mtu 1460 inet xxxxxxx сетевая маска xxxxxxxxxx широковещательная передача xxxxxxxxx

  1. Затем запустите свое приложение с помощью listen / bind на: publicipaddress или интерфейсе eth0: 1.

  2. Отредактируйте брандмауэр, чтобы разрешить все для тестирования

  3. Запустите службу брандмауэра, затем выполните:
  4. Выполните эту команду ниже:

iptables -t nat -A PREROUTING -p tcp --dport portyourapplicationislisteningon -j DNAT --to-destination yourpublicipaddress

Рукопожатие получено по TCP, который направляется на созданный вами виртуальный интерфейс, и он отправит клиенту правильный общедоступный IP-адрес.

Если вы настроили использование UDP после рукопожатия, вам нужно запустить ОДИН экземпляр вашего серверного приложения с файлом конфигурации, настроенным для прослушивания нескольких IP-адресов, например: (internalIP и ExternalIP) или (eth0 & eth0: 1), таким образом UDP будет работать правильно когда заходит во внутренние адреса (10.xyz)

Если вы используете UDP и можете установить только ОДИН Bind / Listen IP / Interface. Вы можете попробовать bind / listenIP как: 0.0.0.0, который может прослушивать / связывать на всех интерфейсах. В противном случае это может не сработать, для моей цели UDP работал только частично, когда я привязал только к общедоступному IP-адресу и добавил правило предварительного маршрута для UDP, но я не использовал MRCP или SIP.

Может быть, кто-то еще знает, как правильно перенаправить UDP, если вы можете привязаться только к одному ip / интерфейсу.

Если вы хотите получать трафик из Интернета, вам необходимо разрешить трафик из разрешенного вами диапазона IP-адресов. [https://cloud.google.com/vpc/docs/firewalls] По умолчанию подразумеваемые правила брандмауэра разрешают весь внутренний трафик VPC к вашему экземпляру виртуальной машины.

А внешний IP-адрес, назначенный экземпляру виртуальной машины, не настроен или не привязан ни к одному из сетевых интерфейсов внутри экземпляра виртуальной машины. Таким образом, вы не можете получить внешний IP-адрес, выполнив команду «IP-адрес». В платформе GCP существует таблица сопоставления IP-адресов, которая используется для сопоставления внешнего IP-адреса с экземпляром виртуальной машины, поэтому при проверке таблицы сопоставления трафик на внешний IP-адрес будет перенаправлен на экземпляр виртуальной машины. Если вашему программному обеспечению необходимо получить внешний IP-адрес, вам необходимо настроить его вручную.

В итоге я использовал правила переадресации:

$ gcloud compute forwarding-rules list
NAME      REGION                   IP_ADDRESS        IP_PROTOCOL  TARGET
pf-rule1  northamerica-northeast1  www.xxx.yyy.zz1   TCP          northamerica-northeast1-a/targetInstances/target-instance-1
pf-rule2  northamerica-northeast1  www.xxx.yyy.zz2   UDP          northamerica-northeast1-a/targetInstances/target-instance-2

где www.xxx.yyy.zz1 и www.xxx.yyy.zz2 - это 2 общедоступных статических IP-адреса (один для TCP, а другой для UDP).

Linux достаточно любезен, чтобы позволить мне привязать к этим IP-адресам без необходимости добавлять эти адреса в мой сетевой интерфейс.

Это именно то, что я искал.

Примечание: экземпляр должен быть создан с помощью --can-ip-forward