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 basado en más que la dirección IP de destino de un paquete. También puedes hacer coincidir el tráfico por protocolo y la 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 de tráfico de red.

Cuando creas una ruta basada en políticas, puedes seleccionar qué recursos pueden tener su tráfico procesado por la ruta. 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 a través de los adjuntos de VLAN para la región

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

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

Las rutas basadas en políticas tienen mayor prioridad que otros tipos de ruta, excepto las rutas de acceso de retorno especiales.

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

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 una región completa. 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 con el PBR

La configuración especial es necesaria para usar rutas basadas en políticas de las siguientes maneras.

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

Puedes encontrar más detalles sobre el PBR con GKE aquí y la sección de limitaciones generales del 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. Con el PBR y los filtros, forzaremos el tráfico de clienta a través de otro recurso de procesamiento para la aplicación de reglas del firewall, mientras que el tráfico de clientb irá 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. Esto se omitió para simplificar el diagrama.

3. Antes de comenzar

El codelab requiere un solo proyecto.

En Cloud Shell, haz lo siguiente:

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 usar los productos.

En Cloud Shell, haz lo siguiente:

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

5. Crea una red y una subred de VPC

Red de VPC

Crea la VPC codelab-pbr-vpc:

En Cloud Shell, haz lo siguiente:

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

Subred

Crea las subredes correspondientes en la región seleccionada:

En Cloud Shell, haz lo siguiente:

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 cumpla con lo siguiente:

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

En Cloud Shell, haz lo siguiente:

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 "servidor".
  • Permite el ingreso desde todas las fuentes

En Cloud Shell, haz lo siguiente:

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 el tráfico de entrada desde fuentes 10.10.10.0/24

En Cloud Shell, haz lo siguiente:

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

Para permitir los sondeos de verificación de estado

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

En Cloud Shell, haz lo siguiente:

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 un Cloud Router y Cloud NAT

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

Crea un Cloud Router

En Cloud Shell, haz lo siguiente:

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

Crea una puerta de enlace de Cloud NAT

En Cloud Shell, haz lo siguiente:

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. Crea instancias de procesamiento

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

En Cloud Shell, haz lo siguiente:

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'

En Cloud Shell, haz lo siguiente:

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'

En Cloud Shell, haz lo siguiente:

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'

En Cloud Shell, haz lo siguiente:

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 de conectividad sin PBR

Establece una conexión SSH a las VMs de procesamiento del 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

Ejecuta los siguientes comandos:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Los pings y las solicitudes de curl deberían realizarse correctamente.

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

En cloudshell2, configura las variables para su uso:

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

Desde cloudshell2, establece una conexión SSH con clientb:

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

Ejecuta los siguientes comandos:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Los pings y las solicitudes de curl deberían realizarse correctamente.

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 vuelve a Cloud Shell.

10. Crear un grupo de instancias

Crea un grupo de instancias no administrado para tu VM de FW.

En Cloud Shell, haz lo siguiente:

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

Agrega la instancia fw al grupo de instancias no administrado.

En Cloud Shell, haz lo siguiente:

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.

En Cloud Shell, haz lo siguiente:

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 adjuntarlo a la regla de reenvío.

En Cloud Shell, haz lo siguiente:

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.

En Cloud Shell, haz lo siguiente:

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

En Cloud Shell, haz lo siguiente:

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. Crea una 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 clienta) y la IP de destino es 10.10.10.0/24.

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

En Cloud Shell, haz lo siguiente:

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.

En Cloud Shell, haz lo siguiente:

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 el PBR

Ahora verificaremos la funcionalidad del PBR. La instancia "fw" está configurada con iptables para rechazar las solicitudes destinadas al servidor. Si el PBR funciona, las solicitudes que antes funcionaban en clienta ahora fallarán, mientras que clientb seguirá teniendo éxito.

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

En cloudshell1, haz lo siguiente:

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

Ejecuta 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 el PBR está enrutando activamente el tráfico de clienta a la instancia de FW que se configuró para bloquear este tráfico.

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

Desde cloudshell2, haz lo siguiente:

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

Ejecuta 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 completan correctamente. Esto se debe a que las solicitudes no coinciden con una regla de PBR para la IP de origen.

16. [Opcional] Validación con capturas en el firewall

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

Aún deberías tener una conexión SSH en cloudshell1 y cloudshell2 a 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

Desde 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

Salida 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 el tcpdump de clientb (10.10.10.11), ya que la PBR no es aplicable.

Sal de Cloud Shell para limpiar los recursos.

17. Pasos para la limpieza

En 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, la 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