为什么NA​​T网关后面的计算实例在ping到NAT网关的外部IP地址时显示ICMP丢包?

时间:2017-03-04 11:35:39

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

为了解Google Cloud Compute NAT网关,我遵循了Configure a NAT gateway文档。由于我打算检查NAT网关后面的计算实例内部的连接,我做了以下内容:

  • 使用子网创建了一个自定义网络,范围为10.0.0.0/23

    $ gcloud compute networks create custom-network1 \
        --mode custom
    $ gcloud compute networks subnets create subnet-us-central-192 \
        --network custom-network1 \
        --region us-central1 \
        --range 10.0.0.0/23
    
  • 创建防火墙规则以允许ssh连接tcp:22icmp--source-ranges 0.0.0.0/0

    $ gcloud compute firewall-rules create gce-network-allow-ssh \
        --allow tcp:22 --network gce-network
    $ gcloud compute firewall-rules create gce-network-allow-internal \
        --allow tcp:1-65535,udp:1-65535,icmp --network gce-network
    
  • 在启用了IP转发的新网络上创建了一个虚拟机作为NAT网关。

    $ gcloud compute instances create nat-gateway --network gce-network \
        --can-ip-forward --zone us-central1-a \
        --image-family debian-8 --image-project debian-cloud --tags nat
    
  • 在同一网络上的NAT网关后面创建另一个虚拟机,标记为no-ip,并且没有连接外部IP。

    $ gcloud compute instances create example-instance --network gce-network \
        --no-address --zone us-central1-a \
        --image-family debian-8 --image-project debian-cloud --tags no-ip
    
  • 创建了通过网关实例发送流量的路由。

    $ gcloud compute routes create no-ip-internet-route --network gce-network \
        --destination-range 0.0.0.0/0 --next-hop-instance nat-gateway \
        --next-hop-instance-zone us-central1-a --tags no-ip --priority 800
    
  • 在NAT网关内部,启用了ipv4转发并允许对内部实例进行互联网访问

    $ sudo sysctl -w net.ipv4.ip_forward=1
    $ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    

配置NAT网关后,我尝试了以下方案:

  • 从内部实例向ping(NAT网关私有IP地址)发送10.0.0.2请求,以检查NAT网关与内部实例之间的连接。它运作良好。
  • 从内部实例向ping发送google.com请求,以检查互联网连接。它也工作得很好。
  • 从内部实例向ping(NAT网关外部IP地址)发送104.xx.xx.xx请求,以检查NAT网关与内部实例之间的连接。 没用。

    数据包流的转储如下所示:

    • ping请求从内部实例发起到NAT网关实例的外部IP地址。

      $ ping -c 1 104.xx.xx.xx
      PING 104.xx.xx.xx (104.xx.xx.xx) 56(84) bytes of data.
      
      --- 104.xx.xx.xx ping statistics ---
      1 packets transmitted, 0 received, 100% packet loss, time 0ms
      
    • 数据包转储在NAT网关实例内部流动,如下所示:

      09:07:34.062054 IP 10.0.0.3 > 104.xx.xx.xx: ICMP echo request, id 2341, seq 1, length 64
      09:07:34.062080 IP 10.0.0.2 > 104.xx.xx.xx: ICMP echo request, id 2341, seq 1, length 64
      09:07:34.062459 IP 104.xx.xx.xx > 10.0.0.2: ICMP echo request, id 2341, seq 1, length 64
      09:07:34.062479 IP 10.0.0.2 > 104.xx.xx.xx: ICMP echo reply, id 2341, seq 1, length 64
      09:07:34.062574 IP 104.xx.xx.xx > 10.0.0.2: ICMP echo reply, id 2341, seq 1, length 64
      09:07:34.062579 IP 104.xx.xx.xx > 10.0.0.3: ICMP echo reply, id 2341, seq 1, length 64
      
    • 数据包转储在内部实例内部流动如下:

      09:07:34.038915 IP 10.0.0.3 > 104.xx.xx.xx: ICMP echo request, id 2341, seq 1, length 64
      
  

注意:10.0.0.310.0.0.2分别是内部和NAT网关实例的私有IP地址。

据我了解,NAT网关正在将echo reply发送到内部实例。但是,内部实例没有收到ICMP数据包。

有人能用NAT网关的外部IP地址解释内部实例的行为吗?

0 个答案:

没有答案