En primer lugar, deseo usar únicamente los comandos de gcloud para lograr mi objetivo, NO la interfaz de GCE, ¡así que no proporcione respuestas usando la GUI!
Creé una imagen desde un disco adjunto a una instancia de VM. Para hacerlo, tuve que eliminar la instancia, según la documentación de Google para crear imágenes. Después de eso, recreé mi instancia usando la imagen.
¡Casi todo parece haber funcionado perfectamente desde ese proceso, excepto que el tráfico http y https ahora está deshabilitado en la instancia! Ya no puedo navegar al sitio web alojado en la máquina virtual. Tampoco puedo obtener una respuesta haciendo ping al dominio.
Cuando miro en la interfaz gráfica de usuario de GCE (solo miro, ¡sin modificar nada!), puedo ver que las casillas de verificación "Permitir tráfico http" y "Permitir tráfico https" no están marcadas para la instancia. Parece que debe estar relacionado con mi problema.
Verifiqué las reglas del firewall en el servidor (ipTables) y en la red de Google asociada con la VM. No hay nada de malo en ninguno de los dos (y la VM definitivamente está asociada con esa red). Si escucho en el puerto 80 usando tcpdump en el servidor y busco mi dominio, puedo ver que las solicitudes llegan al servidor, por lo que no están bloqueadas por un firewall entrante. También reinicié Apache explícitamente, solo asegúrese de que ese no fuera el problema.
Entonces, ¿hay algo que deba hacer para desbloquear los puertos 80 y 443 de forma saliente? ¿Es esto posible una cosa de SELinux? Dado que la imagen debería representar exactamente lo que había en el disco, no debería ser así. Parece que esto debe estar del lado de GCE...
¿Qué hacen realmente esas casillas de verificación para la instancia si no editan iptables en el servidor o las reglas de firewall en la red de Google? ¿Cuál es el comando de gcloud para configurar esos interruptores o, idealmente, especificarlo con un comando de creación de instancias?
Resuelto. No entiendo completamente lo que sucede detrás de escena, pero la solución a esto requiere el uso de "etiquetas" que asocian las reglas de firewall en la red con la instancia de VM. Por lo que puedo ver en este punto, esto solo es pertinente para http y https. Otros puertos que están abiertos en la red y la VM parecen funcionar sin esta pieza adicional.
Si ve las reglas de su firewall, probablemente verá que las reglas de los puertos 80 y 443 tienen las etiquetas "http-server" y "https-server" respectivamente. Si no es así, deberá agregar esas (u otras etiquetas de su elección). Resulta que la instancia también necesita que se le agreguen esas etiquetas.
Para agregar las etiquetas a una instancia de VM existente, use este comando de gcloud:
gcloud compute instances add-tags [YOUR_INSTANCE_NAME] --tags http-server,https-serverPara agregar las etiquetas en el momento de la creación de la instancia, incluya esa bandera en su declaración:
gcloud compute instances create [YOUR_INSTANCE_NAME] --tags http-server,https-serverSi observa la interfaz gráfica de usuario de GCE, verá que las casillas de verificación "Permitir tráfico http" y "Permitir tráfico https" están marcadas después de hacer eso. Luego, las solicitudes y las respuestas fluyen a través de los puertos 80 y 443 como se esperaba.
Una de las cosas súper útiles que ofrece Google Cloud Console es un enlace en la parte inferior de la creación para la mayoría de los recursos para la API REST y la línea de comando para crear el mismo recurso. Me estoy desafiando a mí mismo para poder hacer todo lo que puedo hacer en la consola desde la línea de comandos del SDK, así que lo uso a menudo cuando tengo una pregunta como la suya.
Teniendo la misma pregunta que arriba, en la consola creé una VM y seleccioné "Permitir tráfico HTTP". Mirando la línea de comando para esto, verá dos comandos. El primero es el comando de creación con la etiqueta como se indicó anteriormente (servidor http):
gcloud beta compute --project=XXXX instances create cgapperi-vm1 \ --zone=XXXXX --machine-type=f1-micro --subnet=default \ --tags=http-server --image=debian-10-buster-v20200413 \ --image-project=debian-cloud --boot-disk-size=10GB \ --boot-disk-type=pd-standard --boot-disk-device-name=cgapperi-vm1 \ --no-shielded-secure-boot --shielded-vtpm --shielded-integrity-monitoring \ --reservation-affinity=anyEl segundo en realidad crea la regla de firewall ( default-allow-http ) para usted, y establece el destino de las solicitudes a la etiqueta del servidor http ( --target-tags=http-server ) en el puerto TCP 80 ( --rules=tcp :80 ) de solicitudes entrantes ( --direction=INGRESS ) de todas las fuentes ( --source-ranges=0.0.0.0/0 ):
gcloud compute --project=XXXX firewall-rules create default-allow-http \ --direction=INGRESS --priority=1000 --network=default --action=ALLOW \ --rules=tcp:80 --source-ranges=0.0.0.0/0 --target-tags=http-serverEspero que esto sea útil para cualquier otra persona.
NOTA: Reduje la salida de la gcloud compute instance create a bits relevantes para reducir el desorden.
Según los detalles en este enlace: https://cloud.google.com/vpc/docs/special-configurations
"Al seleccionar estas casillas de verificación, la red de VPC crea automáticamente una regla de http predeterminada o https predeterminada que se aplica a todas las instancias con las etiquetas de servidor http o servidor https. Su nueva instancia también se etiqueta con la etiqueta adecuada según su casilla de verificación selección."
Entonces, marcar estas casillas etiqueta su servidor y crea la regla de firewall necesaria para usted que se aplicará a todos los servidores con esa etiqueta. Desde la perspectiva de gcloud, supongo que deberá asegurarse de que la etiqueta se cree y aplique, y que la regla también se cree para que haga lo que la opción de la consola hace por usted.