是否可以绑定到 Google Compute VM 实例上的公共 IP 地址?

是否可以绑定到 Google Compute VM 实例上的公共 IP 地址?

我在 Google Compute 实例上运行服务器应用程序,该实例需要使用公共 IP 地址,因为它不支持/不兼容 NAT(如果您想知道,它是 MRCP)。我试图了解这样的事情是否可能。

我已经为我的虚拟机分配了一个公共 IP 地址,但我只能接收内部地址 (10.xyz) 上的流量。

答案1

如果您想接收来自互联网的流量,您需要允许来自您允许的 IP 地址范围的流量。[https://cloud.google.com/vpc/docs/firewalls]默认情况下,隐含的防火墙规则允许所有 VPC 内部流量进入您的 VM 实例。

而分配给虚拟机实例的外部 IP 地址未配置或绑定到虚拟机实例内的任何网络接口。因此,您无法通过运行命令“ip address”来检索外部 ip 地址。GCP 平台中有一个 ip 地址映射表,用于将外部 ip 地址映射到虚拟机实例,因此通过检查映射表,到外部 ip 地址的流量将转发到虚拟机实例。如果您的软件需要获取外部 ip,则需要手动配置它。

答案2

我认为如果您可以在启动服务器应用程序之前在配置文件中设置 Listen/BindIP 或 Interface,那就有可能了。(例如 IP/interface=xxxx port=xxxx)

可能有更好的方法,我遇到过类似的问题,这种方法对 TCP/UDP 很有效。我还没有测试过 MRCP/SIP

为了测试是否可行,你可以:

1.创建一个新的虚拟机进行测试:(不确定您正在运行什么操作系统,因此这些命令可能不准确)

2.然后创建一个虚拟网络接口,例如:

ifconfig eth0:1 公共 IP 地址 up

3.然后使用命令检查:ifconfig 应该看起来像这样:

eth0:1:标志=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 并且只能设置一个绑定/侦听 IP/接口。您可以尝试将绑定/侦听 IP 设置为:0.0.0.0,这样可以侦听/绑定所有接口。否则,这可能不起作用,对于我的目的而言,当我仅绑定到公共 IP 并为 UDP 添加预路由规则时,UDP 仅部分起作用,但我没有使用 MRCP 或 SIP。

如果您只能绑定到一個 IP /接頭,可能其他人知道如何正确地重新路由 UDP。

答案3

我最终使用了转发规则:

$ 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.zz1www.xxx.yyy.zz2是2个公共静态IP地址(一个用于TCP,另一个用于UDP)。

Linux 非常友好地允许我绑定这些 IP,而无需将这些地址添加到我的网络接口。

这正是我所寻找的。

注意:实例必须使用--can-ip-forward

相关内容