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.
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.
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.
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