如何确定GCP负载平衡器使用的IP范围

时间:2018-08-28 13:56:22

标签: nginx google-cloud-platform google-compute-engine

如何确定GCP负载平衡器使用的IP范围

我正在Google Cloud Platform(GCP)上运行多个VM实例。它们位于HTTP(S)负载平衡器的后面。

为了限制基于原始IP地址的访问,我在每个VM实例上配置了Nginx,如下所示:

server {
  listen 80;
  listen [::]:80;
  server_name www.example.com;

  real_ip_header X-Forwarded-For;
  real_ip_recursive on;
  set_real_ip_from 130.211.0.0/22; # GCP load balancers
  set_real_ip_from 35.191.0.0/16;  # GCP load balancers

  ...
}

我在“ HTTP(S)负载平衡概念”文档页面的Firewall rules部分中找到了IP范围130.211.0.0/2235.191.0.0/16

但是,在实际操作中,我注意到访问可能来自另一个IP范围35.190.0.0/17

因此,我查阅了section的Google Compute Engine常见问题解答,并了解到我可以获得GCP的所有所有公共IP范围的列表。

此列表很长,似乎包含了负载均衡器未使用的IP范围。

我有两个问题:

  1. 如何确定GCP负载均衡器使用的IP范围?
  2. 当IP范围更改时,如何更新Nginx配置?

2 个答案:

答案 0 :(得分:2)

时间不长,我将它们全部放在一个单独的文件中,并将其包含在您的Nginx配置中。

然后只需将bash脚本作为cron作业运行以创建一个新的配置文件,将其与当前配置文件进行比较,并在必要时重新启动Nginx。

这样的事情应该让您入门:

for i in $(host -t txt _cloud-netblocks.googleusercontent.com | egrep -o "_cloud-netblocks[0-9]+\.googleusercontent.com"); do
host -t txt "$i" | egrep -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\/[0-9]+" | sed -e 's/^/set_real_ip_from /' -e 's/$/;/' >> newhostsfile;
done;
diff -N newhostsfile hostsfile > /dev/null && rm newhostsfile || mv newhostsfile hostsfile | nginx -s reload;

答案 1 :(得分:1)

在测试Google Kubernetes Engine上的部署时遇到了完全相同的问题。我发现,如果您为负载均衡器分配了静态IP地址,则这是流量将从其转发的其他IP地址。静态IP地址始终超出Google负载平衡器列出的范围,因为静态IP地址可以保留用于负载平衡以外的目的。就我而言,我将Google列出的范围以及我的静态IP列入了白名单,并且一切正常。流量不会从任何其他IP地址转发。

将整个Google IP地址范围列入白名单可能会打开一个安全漏洞,使他人能够在您的网站上欺骗其IP。如果有人使用分配了您列入白名单的Google IP之一的Google Compute Engine实例,他们将能够通过更改转发的标头来欺骗其IP。