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.

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.

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.

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