【问题标题】:Can't connect to port 80 on Google Cloud Compute instance despite firewall rule尽管有防火墙规则,但无法连接到 Google Cloud Compute 实例上的端口 80
【发布时间】:2017-06-19 00:18:18
【问题描述】:

总之,虽然我设置了一个允许 tcp:80 的防火墙规则,但我的 GCE 实例(位于“默认”网络上)不接受到端口 80 的连接。我的似乎只有端口 22 是开放的实例。我可以 ping 它,但无法在 64 跳以下对其进行跟踪。

接下来是我得出这些结论的调查。

gcloud beta compute firewall-rules list

NAME                    NETWORK  DIRECTION  PRIORITY  ALLOW                         DENY
default-allow-http      default  INGRESS    1000      tcp:80
default-allow-https     default  INGRESS    1000      tcp:443
default-allow-icmp      default  INGRESS    65534     icmp
default-allow-internal  default  INGRESS    65534     tcp:0-65535,udp:0-65535,icmp
default-allow-rdp       default  INGRESS    65534     tcp:3389
default-allow-ssh       default  INGRESS    65534     tcp:22
temp                    default  INGRESS    1000      tcp:8888


gcloud compute instances list
NAME   ZONE        MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
ssrf3  us-west1-c  f1-micro      true         10.138.0.4   35.197.33.182  RUNNING


gcloud compute instances describe ssrf3
...
name: ssrf3
networkInterfaces:
- accessConfigs:
  - kind: compute#accessConfig
    name: external-nat
    natIP: 35.197.33.182
    type: ONE_TO_ONE_NAT
  kind: compute#networkInterface
  name: nic0
  network: https://www.googleapis.com/compute/v1/projects/hack-170416/global/networks/default
  networkIP: 10.138.0.4
  subnetwork: https://www.googleapis.com/compute/v1/projects/hack-170416/regions/us-west1/subnetworks/default
...
tags:
  fingerprint: 6smc4R4d39I=
  items:
  - http-server
  - https-server

我 ssh 进入 35.197.33.182(这是 ssrf3 实例)并运行:

sudo nc -l -vv -p 80

在我的本地机器上,我运行:

nc 35.197.33.182 80 -vv
hey

但什么也没发生。 所以我尝试ping主机。看起来很健康:

ping 35.197.33.182 
PING 35.197.33.182 (35.197.33.182): 56 data bytes
64 bytes from 35.197.33.182: icmp_seq=0 ttl=57 time=69.172 ms
64 bytes from 35.197.33.182: icmp_seq=1 ttl=57 time=21.509 ms

Traceroute 在 64 跳后退出,没有到达 35.197.33.182 目的地。

所以我用 nmap 检查了哪些端口是打开的:

nmap 35.197.33.182

Starting Nmap 7.12 ( https://nmap.org ) at 2017-06-18 16:39 PDT
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 3.06 seconds



nmap 35.197.33.182 -Pn

Starting Nmap 7.12 ( https://nmap.org ) at 2017-06-18 16:39 PDT
Nmap scan report for 182.33.197.35.bc.googleusercontent.com (35.197.33.182)
Host is up (0.022s latency).
Not shown: 999 filtered ports
PORT   STATE SERVICE
22/tcp open  ssh

Nmap done: 1 IP address (1 host up) scanned in 6.84 seconds

…即使我在 35.197.33.182 上运行 nc -l -p 80

【问题讨论】:

  • 请说明您为相关虚拟机使用的源映像。
  • 那是什么原因呢?除了添加 http-server 标签之外,还需要手动配置 VM 防火墙吗?如果这样做,那么是否也应该允许端口 22 呢?

标签: google-compute-engine


【解决方案1】:

确保虚拟机级别的防火墙没有干预。例如,与所有其他默认镜像相比,Container-Optimized OS 有点特别:

默认情况下,Container-Optimized OS 主机防火墙只允许传出连接,并且只接受通过 SSH 服务的传入连接。要在 Container-Optimized OS 实例上接受传入连接,您必须打开您的服务正在侦听的端口。

https://cloud.google.com/container-optimized-os/docs/how-to/firewall

【讨论】:

  • 我浪费了 5 个小时来查看我非常简单的防火墙规则,然后我在谷歌上搜索了一段时间并找到了这个。谢谢
【解决方案2】:

选中“允许 HTTP 流量”和“允许 HTTPS 流量”这两个复选框就可以了。这创建了两个防火墙规则,打开了端口 80 和 443。 出于某种原因,为这些端口手动添加规则不起作用,但它可以在选中这些框时起作用。

【讨论】:

    【解决方案3】:

    经过大量的尝试和错误,以下对我有用 ubuntu-1404-trusty-v20190514 , 一个 nodejs 应用监听 8080 端口。接受 80 和 8080 端口,然后将 80 重定向到 8080。

    sudo iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
    sudo iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
    sudo iptables -t nat -A OUTPUT -o lo -p tcp --dport 80 -j REDIRECT --to-port 8080
    sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
    

    【讨论】:

      【解决方案4】:

      快速浏览一下,您的设置似乎是正确的。

      • 您已允许默认网络中的所有实例使用 INGRESS tcp:80
      • 您的 VM 位于默认网络上。

      不幸的是,由于使用了 SDN、虚拟网络和一大堆中间网络基础设施,当您在云提供商上运行 VM 时,Traceroute 不会给出很好的指示。

      我注意到的一件事是您的实例有 2 个标签 http-serverhttps-server。这些可能会被其他一些防火墙规则使用,这些规则可能会以某种方式阻止到您的 VM 的 tcp:80 端口的流量。

      您的设置中还有其他变量,如果需要进一步调试,我很乐意进行调试。

      Tag based firewall rules

      您可以尝试基于标签的防火墙规则,该规则仅将防火墙规则应用于具有指定目标标签的实例。

      网络使用网络标签来识别哪些实例是 受某些防火墙规则和网络路由的约束。例如,如果 您有多个为大型网站提供服务的 VM 实例,标记 这些实例具有共享的单词或术语,然后使用该标签 应用允许 HTTP 访问这些实例的防火墙规则。标签 也反映在元数据服务器中,因此您可以将它们用于 在您的实例上运行的应用程序。创建防火墙时 规则,您可以提供sourceRangessourceTags,但不能同时提供。

      # Add a new tag based firewall rule to allow ingress tcp:80
      gcloud compute firewall-rules create rule-allow-tcp-80 --source-ranges 0.0.0.0/0 --target-tags allow-tcp-80 --allow tcp:80
      
      # Add the allow-tcp-80 target tag to the VM ssrf3
      gcloud compute instances add-tags ssrf3 --tags allow-tcp-80
      

      更改可能需要几秒钟到几分钟才能生效。

      注意:由于您要向 Internet 开放 VM 的外部 IP 端口,因此请注意根据在这些端口上运行的应用程序的需要相应地限制访问。

      【讨论】:

        【解决方案5】:

        如果您是 Windows 服务器实例,您可以尝试关闭 Windows Defender 并检查它是否阻止传入连接。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-03
          • 2016-12-22
          • 1970-01-01
          • 2019-09-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多