Codelab de rutas basadas en políticas (PBR)

1. Introducción

Rutas basadas en políticas

Las rutas basadas en políticas te permiten elegir un próximo salto basándote en más información que la dirección IP de destino de un paquete. También puedes hacer coincidir el tráfico por protocolo y dirección IP de origen. El tráfico coincidente se redirecciona a un balanceador de cargas de red interno. Esto puede ayudarte a insertar dispositivos como firewalls en la ruta del tráfico de red.

Cuando creas una ruta basada en políticas, seleccionas para qué recursos la ruta puede procesar su tráfico. La ruta puede aplicarse a lo siguiente:

  • Toda la red: todas las instancias de máquina virtual (VM), las puertas de enlace de VPN y las interconexiones
  • Usa etiquetas de red: selecciona instancias de VM en la VPC
  • Región de interconexión: Todo el tráfico que ingresa a la red de VPC por medio de los adjuntos de VLAN para la región

El próximo salto de una ruta basada en políticas debe ser un balanceador de cargas de red interno válido que se encuentra en la misma red de VPC que la ruta basada en políticas.

Los balanceadores de cargas de red internos usan hashing simétrico de forma predeterminada, por lo que el tráfico puede llegar al mismo dispositivo en las rutas de salida y de retorno sin configurar la NAT de origen.

Las rutas basadas en políticas tienen una prioridad más alta que otros tipos de ruta, excepto las rutas de retorno especiales.

Si dos rutas basadas en políticas tienen la misma prioridad, Google Cloud usa un algoritmo interno determinista para seleccionar una sola ruta basada en políticas, ignorando otras rutas con la misma prioridad. Las rutas basadas en políticas no usan la coincidencia con el prefijo más largo y solo seleccionan la ruta de mayor prioridad.

Puedes crear una sola regla para el tráfico unidireccional o varias reglas para manejar el tráfico bidireccional.

Para usar rutas basadas en políticas con Cloud Interconnect, la ruta debe aplicarse a todas las conexiones de Cloud Interconnect en toda una región. Las rutas basadas en políticas no se pueden aplicar solo a una conexión individual de Cloud Interconnect.

Las instancias de VM que reciben tráfico de una ruta basada en políticas deben tener habilitado el reenvío de IP.

Consideraciones sobre el PBR

Se necesita una configuración especial para usar rutas basadas en políticas de las siguientes maneras.

Por ejemplo, mediante PBR con GKE, PSC o con PGA/PSA.

Obtenga más información sobre PBR con GKE aquí y la sección general sobre limitaciones de PBR aquí.

Qué aprenderás

  • Cómo configurar rutas basadas en políticas

Requisitos

  • Conocimiento sobre la implementación de instancias y la configuración de componentes de redes
  • Conocimiento de la configuración del firewall de VPC

2. Entorno de pruebas

En este codelab, se aprovechará una sola VPC. En este entorno, habrá dos recursos de procesamiento, clienta y clientb, que enviarán paquetes a otro recurso de servidor. Usando PBR y filtros, forzaremos el tráfico de clienta a través de otro recurso de procesamiento para la aplicación de firewall, mientras que el tráfico de clientb va directamente al servidor. En el siguiente diagrama, se ilustra la ruta.

bff32b01ada8e9ad.png

En el diagrama anterior, técnicamente debería haber un ILB (balanceador de cargas interno de red) para las rutas de PBR. Se omitió para simplificar el diagrama.

3. Antes de comenzar

El codelab requiere un solo proyecto.

Desde cloudshell:

export project_id=`gcloud config list --format="value(core.project)"`
export region=us-central1
export zone=us-central1-a
export prefix=codelab-pbr

4. Habilita las APIs

Si aún no lo hiciste, habilita las APIs para que usen los productos.

Desde cloudshell:

gcloud services enable compute.googleapis.com
gcloud services enable networkconnectivity.googleapis.com

5. Crear red y subred de VPC

Red de VPC

Crea la VPC codelab-pbr-vpc:

Desde cloudshell:

gcloud compute networks create $prefix-vpc --subnet-mode=custom 

Subred

Crea las subredes respectivas en la región seleccionada:

Desde cloudshell:

gcloud compute networks subnets create $prefix-vpc-subnet \
   --range=10.10.10.0/24 --network=$prefix-vpc --region=${region}

6. Crea reglas de firewall

Para permitir que IAP se conecte a tus instancias de VM, crea una regla de firewall que haga lo siguiente:

  • Se aplica a todas las instancias de VM a las que deseas que se pueda acceder mediante IAP.
  • Permite el tráfico de entrada del rango de IP 35.235.240.0/20. Este rango contiene todas las direcciones IP que IAP usa para el reenvío de TCP.

Desde cloudshell:

gcloud compute firewall-rules create $prefix-allow-iap-proxy \
--direction=INGRESS \
--priority=1000 \
--network=$prefix-vpc \
--action=ALLOW \
--rules=tcp:22 \
--source-ranges=35.235.240.0/20

Para permitir el puerto HTTP estándar (TCP 80) y el protocolo ICMP en el servidor, haz lo siguiente:

  • Se aplica a los recursos con la etiqueta de red “server”
  • Permite la entrada desde todas las fuentes

Desde cloudshell:

gcloud compute firewall-rules create $prefix-allow-http-icmp \
--direction=INGRESS \
--priority=1000 \
--network=$prefix-vpc \
--action=ALLOW \
--rules=tcp:80,icmp \
--source-ranges=0.0.0.0/0 \
--target-tags=server

Para permitir que el FW reciba paquetes, permite una entrada en todos los protocolos y puertos.

  • Se aplica a los recursos con la etiqueta de red "fw"
  • Permite la entrada de fuentes 10.10.10.0/24

Desde cloudshell:

gcloud compute firewall-rules create $prefix-fw-allow-ingress \
--direction=INGRESS \
--priority=1000 \
--network=$prefix-vpc \
--action=ALLOW \
--rules=all \
--source-ranges=10.10.10.0/24 \
--target-tags=fw

Permitir que los sondeos de las verificaciones de estado

  • Se aplica a los recursos con la etiqueta de red "fw"
  • Permite la entrada desde rangos de verificación de estado

Desde cloudshell:

gcloud compute firewall-rules create $prefix-allow-hc-ingress \
--direction=INGRESS \
--priority=1000 \
--network=$prefix-vpc \
--action=ALLOW \
--rules=tcp:80 \
--source-ranges=130.211.0.0/22,35.191.0.0/16 \
--target-tags=fw

7. Crea Cloud Router y Cloud NAT

El objetivo de esta sección es que las máquinas virtuales privadas puedan descargar los paquetes de software correspondientes de Internet.

Crear Cloud Router

Desde cloudshell:

gcloud compute routers create ${prefix}-cr \
--region=${region} \
--network=${prefix}-vpc

Crear puerta de enlace de Cloud NAT

Desde cloudshell:

gcloud compute routers nats create ${prefix}-nat-gw-${region} \
--router=${prefix}-cr \
--router-region=${region} \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges

8. Crear instancias de procesamiento

Crea las instancias de procesamiento ClientA, ClientB, FW y Server:

Desde cloudshell:

gcloud compute instances create clienta \
   --subnet=$prefix-vpc-subnet \
   --no-address \
   --private-network-ip=10.10.10.10 \
   --zone $zone \
   --tags client \
   --metadata startup-script='#! /bin/bash
apt-get update'

Desde cloudshell:

gcloud compute instances create clientb \
   --subnet=$prefix-vpc-subnet \
   --no-address \
   --private-network-ip=10.10.10.11 \
   --zone $zone \
   --tags client \
   --metadata startup-script='#! /bin/bash
apt-get update'

Desde cloudshell:

gcloud compute instances create server \
   --subnet=$prefix-vpc-subnet \
   --no-address \
   --private-network-ip=10.10.10.200 \
   --zone $zone \
   --tags server \
   --metadata startup-script='#! /bin/bash
sudo su
apt-get update
apt-get -y install tcpdump
apt-get -y install nginx
cat > /var/www/html/index.html << EOF
<html><body><p>Server</p></body></html>
EOF'

Desde cloudshell:

gcloud compute instances create fw \
   --subnet=$prefix-vpc-subnet \
   --can-ip-forward \
   --no-address \
   --private-network-ip=10.10.10.75 \
   --zone $zone \
   --tags fw \
   --metadata startup-script='#! /bin/bash
apt-get update
sudo apt-get -y install tcpdump
sudo apt-get -y install nginx
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -I FORWARD -d 10.10.10.200 -j REJECT'

9. Prueba la conectividad sin PBR

Establece una conexión SSH a las VMs de procesamiento de cliente que creamos recientemente y verifica la conectividad de ambos clientes al servidor.

Desde cloudshell1 accede a clienta:

gcloud compute ssh clienta --zone=$zone --tunnel-through-iap

Ejecute los siguientes comandos:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Las solicitudes de ping y curl deberían realizarse de forma correcta.

Resultado:

root@clienta:~$ ping 10.10.10.200 -c 5
PING 10.10.10.200 (10.10.10.200) 56(84) bytes of data.
64 bytes from 10.10.10.200: icmp_seq=1 ttl=64 time=1.346 ms
64 bytes from 10.10.10.200: icmp_seq=2 ttl=64 time=0.249 ms
64 bytes from 10.10.10.200: icmp_seq=3 ttl=64 time=0.305 ms
64 bytes from 10.10.10.200: icmp_seq=4 ttl=64 time=0.329 ms
64 bytes from 10.10.10.200: icmp_seq=5 ttl=64 time=0.240 ms
root@clienta:~$ curl 10.10.10.200/index.html
<html><body><p>Server</p></body></html>

Haz clic en el signo + para abrir una pestaña adicional de Cloud Shell.

3722d8574c3812b1.png

Desde cloudshell2 configura variables para usar:

export project_id=`gcloud config list --format="value(core.project)"`
export region=us-central1
export zone=us-central1-a
export prefix=codelab-pbr

De SSH de cloudshell2 a clientb:

gcloud compute ssh clientb --zone=$zone --tunnel-through-iap

Ejecute los siguientes comandos:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Las solicitudes de ping y curl deberían realizarse de forma correcta.

Resultado:

root@clientb:~$ ping 10.10.10.200 -c 5
PING 10.10.10.200 (10.10.10.200) 56(84) bytes of data.
64 bytes from 10.10.10.200: icmp_seq=1 ttl=64 time=1.346 ms
64 bytes from 10.10.10.200: icmp_seq=2 ttl=64 time=0.249 ms
64 bytes from 10.10.10.200: icmp_seq=3 ttl=64 time=0.305 ms
64 bytes from 10.10.10.200: icmp_seq=4 ttl=64 time=0.329 ms
64 bytes from 10.10.10.200: icmp_seq=5 ttl=64 time=0.240 ms
root@clientb:~$ curl 10.10.10.200/index.html
<html><body><p>Server</p></body></html>

Ahora, sal de la terminal de la VM y regresa a cloudshell.

10. Crear un grupo de instancias

Crea un grupo de instancias no administrado para la VM fw.

Desde cloudshell:

gcloud compute instance-groups unmanaged create pbr-uig --zone=$zone

Agrega la instancia fw al grupo de instancias no administrado.

Desde cloudshell:

gcloud compute instance-groups unmanaged add-instances pbr-uig --instances=fw --zone=$zone

11. Crear una verificación de estado

Crea una verificación de estado para el servicio de backend. Realizaremos una verificación de estado simple del puerto TCP 80.

Desde cloudshell:

gcloud compute health-checks create tcp $prefix-hc-tcp-80 --region=$region --port 80

12. Crear un servicio de backend

Crea un servicio de backend para adjuntar a la regla de reenvío.

Desde cloudshell:

gcloud compute backend-services create be-pbr --load-balancing-scheme=internal --protocol=tcp --region=$region --health-checks=$prefix-hc-tcp-80 --health-checks-region=$region

Ahora agrega el grupo de instancias al servicio de backend.

Desde cloudshell:

gcloud compute backend-services add-backend be-pbr --region=$region --instance-group=pbr-uig --instance-group-zone=$zone

13. Crear una regla de reenvío

Desde cloudshell:

gcloud compute forwarding-rules create fr-pbr --region=$region --load-balancing-scheme=internal --network=$prefix-vpc --subnet=$prefix-vpc-subnet --ip-protocol=TCP --ports=ALL --backend-service=be-pbr --backend-service-region=$region --address=10.10.10.25 --network-tier=PREMIUM

14. Crear regla de PBR

Esta regla de PBR se aplica a los clientes. Enrutará todo el tráfico IPv4 a la regla de reenvío 10.10.10.25 si la IP de origen es 10.10.10.10/32 (dirección de cliente) y la IP de destino es 10.10.10.0/24.

Esto significa que clienta coincidirá con PBR y no con clientb.

Desde cloudshell:

gcloud network-connectivity policy-based-routes create pbr-client \
   --network=projects/$project_id/global/networks/$prefix-vpc \
   --next-hop-ilb-ip=10.10.10.25 \
   --source-range=10.10.10.10/32 \
   --destination-range=10.10.10.0/24 \
   --protocol-version=IPv4 \
   --priority=1000 \
   --tags=client

Esta regla de PBR se aplica al servidor. Enrutará todo el tráfico IPv4 a la regla de reenvío 10.10.10.25 si la IP de origen es 10.10.10.200/32 y la IP de destino es 10.10.10.10/32.

Desde cloudshell:

gcloud network-connectivity policy-based-routes create pbr-server \
   --network=projects/$project_id/global/networks/$prefix-vpc \
   --next-hop-ilb-ip=10.10.10.25 \
   --source-range=10.10.10.200/32 \
   --destination-range=10.10.10.10/32 \
   --protocol-version=IPv4 \
   --priority=2000 \
   --tags=server

15. Prueba la conectividad con PBR

Ahora verificaremos la funcionalidad de PBR. La "fw" se configura con iptables para rechazar solicitudes destinadas al servidor. Si PBR es funcional, las solicitudes que funcionaban anteriormente en clienta ahora fallarán, mientras que clientb aún tiene éxito.

Establece una conexión SSH a la VM de Compute de cliente y ejecuta las mismas pruebas.

Desde cloudshell1:

gcloud compute ssh clienta --zone=$zone --tunnel-through-iap

Ejecute los siguientes comandos:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Resultado:

root@clienta:~$ ping 10.10.10.200 -c 5
PING 10.10.10.200 (10.10.10.200) 56(84) bytes of data.
From 10.10.10.75 icmp_seq=1 Destination Port Unreachable
From 10.10.10.75 icmp_seq=2 Destination Port Unreachable
From 10.10.10.75 icmp_seq=3 Destination Port Unreachable
From 10.10.10.75 icmp_seq=4 Destination Port Unreachable
From 10.10.10.75 icmp_seq=5 Destination Port Unreachable
root@clienta:~$ curl 10.10.10.200/index.html
curl: (7) Failed to connect to 10.10.10.200 port 80: Connection refused

Dado que las solicitudes fallaron, podemos confirmar que PBR está enrutando activamente el tráfico de clientes a la instancia nueva que se configuró para bloquear este tráfico.

Establece una conexión SSH a clientb y ejecuta la misma prueba de conectividad.

Desde cloudshell2:

gcloud compute ssh clientb --zone=$zone --tunnel-through-iap

Ejecute los siguientes comandos:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Resultado:

root@clientb:~$ ping 10.10.10.200 -c 5
PING 10.10.10.200 (10.10.10.200) 56(84) bytes of data.
64 bytes from 10.10.10.200: icmp_seq=1 ttl=63 time=0.361 ms
64 bytes from 10.10.10.200: icmp_seq=2 ttl=63 time=0.475 ms
64 bytes from 10.10.10.200: icmp_seq=3 ttl=63 time=0.379 ms
root@clientb:~$ curl 10.10.10.200
<html><body><p>Server</p></body></html>

Como puedes ver, las solicitudes de clientb al servidor se realizan correctamente. Esto se debe a que las solicitudes no coinciden con una regla de PBR para la IP de origen.

16. [Opcional] Valida con capturas en el firewall

En esta sección opcional, tienes la oportunidad de validar el PBR mediante capturas de paquetes en la VM de firewall.

Aún deberías tener una conexión SSH en cloudshell1 y cloudshell2 para clienta y clientb.

Haz clic en el signo + para abrir una pestaña adicional de Cloud Shell.

5eb3a9956f7e41a2.png

En cloudshell3, configura las variables:

export project_id=`gcloud config list --format="value(core.project)"`
export region=us-central1
export zone=us-central1-a
export prefix=codelab-pbr

Establece una conexión SSH a fw:

gcloud compute ssh fw --zone=$zone --tunnel-through-iap

Ejecuta el siguiente comando en fw (cloudshell3):

sudo tcpdump -i any icmp -nn

En clienta (cloudshell1), ejecuta la prueba de ping:

ping 10.10.10.200 -c 5

Desde clientb (cloudshell2) ejecuta la prueba de ping:

ping 10.10.10.200 -c 5

Resultado en fw (cloudshell 3):

root@fw:~$ sudo tcpdump -i any icmp -nn
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
17:07:42.215297 ens4  In  IP 10.10.10.10 > 10.10.10.200: ICMP echo request, id 25362, seq 1, length 64
17:07:42.215338 ens4  Out IP 10.10.10.75 > 10.10.10.10: ICMP 10.10.10.200 protocol 1 port 51064 unreachable, length 92
17:07:43.216122 ens4  In  IP 10.10.10.10 > 10.10.10.200: ICMP echo request, id 25362, seq 2, length 64
17:07:43.216158 ens4  Out IP 10.10.10.75 > 10.10.10.10: ICMP 10.10.10.200 protocol 1 port 30835 unreachable, length 92
17:07:44.219064 ens4  In  IP 10.10.10.10 > 10.10.10.200: ICMP echo request, id 25362, seq 3, length 64
17:07:44.219101 ens4  Out IP 10.10.10.75 > 10.10.10.10: ICMP 10.10.10.200 protocol 1 port 2407 unreachable, length 92

No verás ningún paquete en tcpdump del cliente (10.10.10.11), ya que PBR no es aplicable.

Regresa a cloudshell para limpiar recursos.

17. Pasos de limpieza

Desde Cloud Shell, quita la regla de PBR, la regla de reenvío, el servicio de backend, la verificación de estado, el grupo de instancias, las instancias de procesamiento, NAT, Cloud Router y las reglas de firewall.

gcloud -q network-connectivity policy-based-routes delete pbr-client

gcloud -q network-connectivity policy-based-routes delete pbr-server

gcloud -q compute forwarding-rules delete fr-pbr --region=$region

gcloud -q compute backend-services delete be-pbr --region=$region

gcloud -q compute health-checks delete $prefix-hc-tcp-80 --region=$region

gcloud -q compute instance-groups unmanaged delete pbr-uig --zone=$zone

gcloud -q compute instances delete clienta --zone=$zone
gcloud -q compute instances delete clientb --zone=$zone
gcloud -q compute instances delete server --zone=$zone
gcloud -q compute instances delete fw --zone=$zone


gcloud -q compute routers nats delete ${prefix}-nat-gw-${region} \
--router=$prefix-cr --router-region=$region

gcloud -q compute routers delete $prefix-cr --region=$region

gcloud -q compute firewall-rules delete $prefix-allow-iap-proxy
gcloud -q compute firewall-rules delete $prefix-allow-http-icmp
gcloud -q compute firewall-rules delete $prefix-fw-allow-ingress
gcloud -q compute firewall-rules delete $prefix-allow-hc-ingress

Quita la subred y las VPC:

gcloud -q compute networks subnets delete $prefix-vpc-subnet \
    --region $region

gcloud -q compute networks delete $prefix-vpc

18. ¡Felicitaciones!

Felicitaciones por completar el codelab.

Temas abordados

  • Rutas basadas en políticas