为了解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:22
和icmp
与--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.3
和10.0.0.2
分别是内部和NAT网关实例的私有IP地址。
据我了解,NAT网关正在将echo reply
发送到内部实例。但是,内部实例没有收到ICMP数据包。
有人能用NAT网关的外部IP地址解释内部实例的行为吗?