IP 别名如何在 Google 云计算实例上工作?
How IP-Aliases does work on Google Cloud Computing Instance?
当通过 gloud 命令或界面设置 IP 别名时,它开箱即用。但是在机器本身中,我没有看到任何配置、ip 地址条目、没有防火墙规则、没有允许机器可 ping 通的路由 - 但它是可 ping 通的(本地和远程)! (例如 10.31.150.70
,当您设置 10.31.150.64/26
-子网时,您的主 IP 是 10.31.150.1
)
另一方面,机器的主 IP 是 /32 网络掩码。例如:
10.31.150.1/32
,网关:10.31.0.1/16
。那么,当网关超出范围时,机器如何到达网关10.31.0.1
?
通过 ip addr del
删除主 IP 时,别名不再可 ping 通。
配置别名 IP 范围后,GCP 会自动为主要网络接口的子网安装 VPC 网络路由和别名 IP 范围。别名 IP 范围可在 GCP 虚拟网络中路由,无需额外路由。这就是为什么 VM 本身没有配置但仍然可以 ping 通的原因。您不必为每个 IP 别名添加路由,也不必考虑路由配额。
有关 Google 云平台 (GCP) 上别名 IP 的更多信息,请参见 this help center article。
请注意,Compute Engine 网络 only support IPv4 unicast traffic 并且它将在 VM 上将网络掩码显示为 /32。但是,它仍然能够到达它所属的子网的网关。例如,10.31.0.0/16 包括范围从 10.31.0.1 到 10.31.255.254 的主机,而主机 10.31.150.1 在该范围内。
为了进一步阐明为什么 VM 实例分配有 /32 掩码,重要的是要注意 /32 是一个人为构造。该实例与创建和管理“真实”子网的软件定义网络对话。因此,它实际上是单个地址和子网网关之间的 link。只要 link 层存在,通信就会建立并且一切正常。
除此之外,网络掩码在网络层强制执行。这有助于避免产生不必要的广播流量(无论如何底层网络都不会分发)。
请注意,删除主 IP 会破坏元数据服务器的可达性,因此 IP 别名将无法访问。
Google 运行您的实例上有一个网络守护进程。它 运行 作为 google-network-daemon
服务。此代码是开源的,可以在 repo 上查看。这个 repo 有一个名为 google_compute_engine
的 Python 模块,它管理 IP 别名等。您可以浏览他们的代码以了解 Google 如何实现这一点(他们根据平台使用 ip route
或 ifconfig
)
要查看 Google 在 Debian 机器上添加的别名路由(他们在下面使用 ip route
作为别名)运行 以下命令。
ip route ls table local type local dev eth0 scope host proto 66
如果你知道你的 Linux 命令,你可以在停止守护进程后删除适当的路由,然后将别名 IP 地址分配给你的主接口作为第二个 IP 地址来查看 ifconfig
方法也在行动中。
当通过 gloud 命令或界面设置 IP 别名时,它开箱即用。但是在机器本身中,我没有看到任何配置、ip 地址条目、没有防火墙规则、没有允许机器可 ping 通的路由 - 但它是可 ping 通的(本地和远程)! (例如 10.31.150.70
,当您设置 10.31.150.64/26
-子网时,您的主 IP 是 10.31.150.1
)
另一方面,机器的主 IP 是 /32 网络掩码。例如:
10.31.150.1/32
,网关:10.31.0.1/16
。那么,当网关超出范围时,机器如何到达网关10.31.0.1
?
通过 ip addr del
删除主 IP 时,别名不再可 ping 通。
配置别名 IP 范围后,GCP 会自动为主要网络接口的子网安装 VPC 网络路由和别名 IP 范围。别名 IP 范围可在 GCP 虚拟网络中路由,无需额外路由。这就是为什么 VM 本身没有配置但仍然可以 ping 通的原因。您不必为每个 IP 别名添加路由,也不必考虑路由配额。
有关 Google 云平台 (GCP) 上别名 IP 的更多信息,请参见 this help center article。
请注意,Compute Engine 网络 only support IPv4 unicast traffic 并且它将在 VM 上将网络掩码显示为 /32。但是,它仍然能够到达它所属的子网的网关。例如,10.31.0.0/16 包括范围从 10.31.0.1 到 10.31.255.254 的主机,而主机 10.31.150.1 在该范围内。
为了进一步阐明为什么 VM 实例分配有 /32 掩码,重要的是要注意 /32 是一个人为构造。该实例与创建和管理“真实”子网的软件定义网络对话。因此,它实际上是单个地址和子网网关之间的 link。只要 link 层存在,通信就会建立并且一切正常。
除此之外,网络掩码在网络层强制执行。这有助于避免产生不必要的广播流量(无论如何底层网络都不会分发)。
请注意,删除主 IP 会破坏元数据服务器的可达性,因此 IP 别名将无法访问。
Google 运行您的实例上有一个网络守护进程。它 运行 作为 google-network-daemon
服务。此代码是开源的,可以在 repo 上查看。这个 repo 有一个名为 google_compute_engine
的 Python 模块,它管理 IP 别名等。您可以浏览他们的代码以了解 Google 如何实现这一点(他们根据平台使用 ip route
或 ifconfig
)
要查看 Google 在 Debian 机器上添加的别名路由(他们在下面使用 ip route
作为别名)运行 以下命令。
ip route ls table local type local dev eth0 scope host proto 66
如果你知道你的 Linux 命令,你可以在停止守护进程后删除适当的路由,然后将别名 IP 地址分配给你的主接口作为第二个 IP 地址来查看 ifconfig
方法也在行动中。