La lliçó anterior va acabar amb una constatació incòmoda: tot el que ha desplegat Contoso Airlines fins ara —les VM del motor heretat, el conjunt d'escalat de l'API, les aplicacions d'App Service i el compte d'emmagatzematge de targetes— es comunica per internet. Funciona, però cap arquitectura seriosa no es queda així. I arreglar-ho després és molt més car que fer-ho bé des del principi, perquè l'espai d'adreces d'una xarxa virtual condiciona tot el que s'hi connecti durant anys.

Per això tota arquitectura seriosa comença per la xarxa. Canviar la mida d'una VM costa dos minuts; canviar el rang d'adreces d'una xarxa virtual amb cent recursos a dins i una VPN contra dues oficines és un projecte amb tall de servei.

En aquesta lliçó dissenyaràs i desplegaràs la xarxa completa de Contoso: l'espai d'adreces de vnet-contoso-pro amb l'aritmètica CIDR explicada des de zero, les seves quatre subxarxes, els grups de seguretat de xarxa que obren només l'imprescindible, la resolució DNS privada, l'aparellament entre xarxes amb el patró hub-and-spoke, la diferència decisiva entre punts de connexió de servei i Azure Private Link, com es connecta App Service a la xarxa i per què ningú no hauria d'exposar SSH a internet tenint Azure Bastion.

Avís de cost: les xarxes virtuals, les subxarxes i els NSG no costen res. Sí que costen els punts de connexió privats (per hora i per dades processades), les IP públiques estàtiques i, sobretot, Azure Bastion, que es factura per hora des del moment en què existeix. Al final tens la neteja.

Contingut

  1. Per què la xarxa va primer
  2. Xarxes virtuals i espai d'adreces
  3. Aritmètica CIDR sense dolor
  4. Disseny de subxarxes de vnet-contoso-pro
  5. Adreces reservades per Azure a cada subxarxa
  6. Grups de seguretat de xarxa (NSG)
  7. Etiquetes de servei i grups de seguretat d'aplicació
  8. IP públiques i privades, estàtiques i dinàmiques
  9. DNS a Azure i zones DNS privades
  10. Aparellament de xarxes virtuals i hub-and-spoke
  11. Punts de connexió de servei davant d'Azure Private Link
  12. Integració d'App Service amb la xarxa virtual
  13. Azure Bastion davant d'exposar SSH i RDP
  14. Verificació amb Network Watcher
  15. Topologia completa i neteja
  16. Errors Comuns i Consells
  17. Exercicis
  18. Conclusió

  1. Per què la xarxa va primer

Una xarxa virtual (VNet) és la teva xarxa privada dins d'Azure: un espai d'adreces IP aïllat i controlat per tu, on col·loques recursos que es veuen entre ells i pel qual decideixes què entra i què surt.

El que la xarxa determina, i per això va primer:

Decisió de xarxa Què condiciona
Espai d'adreces Amb quines xarxes locals et podràs connectar sense encavalcaments, per sempre
Mida de les subxarxes Quants recursos hi caben; ampliar una subxarxa amb recursos a dins és problemàtic
Segmentació Què pot parlar amb què quan algú entri on no ha d'entrar
Connectivitat privada Si les teves dades viatgen per internet o no surten mai de la xarxa de Microsoft
Regió Una VNet viu en una regió; es connecta a d'altres per aparellament

I un avís sobre el que no pots fer: dues xarxes amb espais d'adreces encavalcats no es poden aparellar ni unir per VPN. Si tries 10.0.0.0/16 perquè és l'exemple de tots els tutorials, i la teva oficina de Barcelona fa servir 10.0.0.0/16, has creat un problema que només s'arregla renumerant una de les dues.

  1. Xarxes virtuals i espai d'adreces

Una VNet té un o diversos espais d'adreces en notació CIDR, presos dels rangs privats de l'RFC 1918:

Rang privat Adreces Ús habitual
10.0.0.0/8 16,7 milions Xarxes corporatives grans; el més utilitzat a Azure
172.16.0.0/12 1 milió Xarxes mitjanes
192.168.0.0/16 65.536 Xarxes domèstiques i petites oficines

Pla d'adreçament de Contoso Airlines, decidit per la Marta Ríos amb la vista posada en la VPN amb les oficines (lliçó 02-06):

Xarxa Espai Ús
vnet-contoso-hub-pro 10.10.0.0/16 Concentrador: porta d'enllaç VPN, Bastion, serveis compartits
vnet-contoso-pro 10.20.0.0/16 Radi de producció: web, aplicació, dades, gestió
vnet-contoso-dev 10.30.0.0/16 Radi de desenvolupament
Oficina de Barcelona 10.100.0.0/16 Xarxa local existent
Oficina de Palma 10.101.0.0/16 Xarxa local existent

Observa la disciplina: blocs /16 separats i res encavalcat, amb forat reservat entre ells per créixer. Això no costa res ara i evita una migració dolorosa d'aquí a tres anys.

GRUP_XARXA="rg-contoso-red-pro"   # el grup de xarxa de llarga durada del modul 1
REGIO="westeurope"
ETIQUETES=(entorno=produccion proyecto=contoso-reservas centro-coste=CC-1042
           [email protected] criticidad=alta)

az network vnet create \
  --resource-group "${GRUP_XARXA}" \
  --name vnet-contoso-pro \
  --location "${REGIO}" \
  --address-prefixes 10.20.0.0/16 \
  --tags "${ETIQUETES[@]}" \
  --output table

Recorda per què la xarxa viu a rg-contoso-red-pro i no al costat de les aplicacions: el criteri d'agrupació de la lliçó 01-05 era cicle de vida + entorn, i la xarxa sobreviu a moltes generacions d'aplicacions.

  1. Aritmètica CIDR sense dolor

Si CIDR ja et resulta natural, salta a l'apartat següent. Si no, aquest és el mínim imprescindible i n'hi ha prou d'entendre tres idees.

Idea 1: el número després de la barra són els bits fixos. Una adreça IPv4 té 32 bits. A 10.20.1.0/24, els 24 primers bits són la xarxa (fixos) i els 8 restants identifiquen l'equip (variables).

Idea 2: com més bits fixos, més petita és la xarxa. Una /24 és més petita que una /16. El compte és directe: 2^(32 - prefix) adreces.

Prefix Adreces totals Utilitzables a Azure (−5) Equivalent
/16 65.536 65.531 Una xarxa virtual completa
/20 4.096 4.091 Un bloc gran de subxarxes
/24 256 251 Una subxarxa típica
/26 64 59 Subxarxa petita (mínim per a Bastion)
/27 32 27 Mínim per a GatewaySubnet
/29 8 3 La subxarxa més petita permesa a Azure

Idea 3: per trossejar, s'avança de bloc en bloc. Una /24 cobreix 256 adreces, així que dins de 10.20.0.0/16 les subxarxes /24 van saltant d'una en una al tercer octet:

10.20.0.0/16  →  de 10.20.0.0 a 10.20.255.255 (65.536 adreces)
  ├── 10.20.1.0/24   →  10.20.1.0   a  10.20.1.255
  ├── 10.20.2.0/24   →  10.20.2.0   a  10.20.2.255
  ├── 10.20.3.0/24   →  10.20.3.0   a  10.20.3.255
  └── 10.20.4.0/24   →  10.20.4.0   a  10.20.4.255

I si una subxarxa necessita menys, es trosseja amb prefixos més grans. Dins de 10.20.250.0/24:

10.20.250.0/26   →  10.20.250.0   a  10.20.250.63   (64 adreces)
10.20.250.64/26  →  10.20.250.64  a  10.20.250.127
10.20.250.128/26 →  10.20.250.128 a  10.20.250.191
10.20.250.192/26 →  10.20.250.192 a  10.20.250.255

Regla mental que resol el 90 % dels casos del dia a dia: /24 és "un bloc de 256 amb el mateix tercer octet". Planifica amb /24 llevat que sàpigues que necessites una altra cosa, i deixa forats entre subxarxes per créixer.

  1. Disseny de subxarxes de vnet-contoso-pro

Una subxarxa és una porció de l'espai d'adreces de la xarxa virtual on es col·loquen realment els recursos. Se segmenta per funció, perquè la segmentació és el que permet aplicar regles diferents a cada capa.

Subxarxa Rang Què conté Qui li parla
snet-web 10.20.1.0/24 Front-end públic, Application Gateway Internet (només 443)
snet-app 10.20.2.0/24 API de Disponibilitat, integració d'App Service Només snet-web
snet-datos 10.20.3.0/24 Punts de connexió privats de SQL i Storage Només snet-app
snet-gestion 10.20.4.0/24 VM del motor heretat, servidors d'administració Només snet-gestion i Bastion
AzureBastionSubnet 10.20.250.0/26 Azure Bastion (nom obligatori) Servei gestionat
GatewaySubnet 10.20.255.0/27 Porta d'enllaç VPN (nom obligatori, lliçó 02-06) Servei gestionat
GRUP_XARXA="rg-contoso-red-pro"
VNET="vnet-contoso-pro"

# Subxarxes funcionals.
for PARELL in "snet-web:10.20.1.0/24" "snet-app:10.20.2.0/24" \
              "snet-datos:10.20.3.0/24" "snet-gestion:10.20.4.0/24"; do
  NOM="${PARELL%%:*}"
  RANG="${PARELL##*:}"
  az network vnet subnet create \
    --resource-group "${GRUP_XARXA}" \
    --vnet-name "${VNET}" \
    --name "${NOM}" \
    --address-prefixes "${RANG}" \
    --output none
  echo "Subxarxa ${NOM} creada amb ${RANG}"
done

# Subxarxes de serveis gestionats: el nom es obligatori i literal.
az network vnet subnet create -g "${GRUP_XARXA}" --vnet-name "${VNET}" \
  --name AzureBastionSubnet --address-prefixes 10.20.250.0/26 --output none

az network vnet subnet create -g "${GRUP_XARXA}" --vnet-name "${VNET}" \
  --name GatewaySubnet --address-prefixes 10.20.255.0/27 --output none

# Comprovacio.
az network vnet subnet list -g "${GRUP_XARXA}" --vnet-name "${VNET}" \
  --query "[].{Subxarxa:name, Rang:addressPrefix}" --output table

Noms reservats que cal respectar al peu de la lletra, perquè Azure els busca literalment:

Nom obligatori Servei Mida mínima recomanada
GatewaySubnet Porta d'enllaç de VPN o ExpressRoute /27 (millor /26)
AzureBastionSubnet Azure Bastion /26
AzureFirewallSubnet Azure Firewall /26

I una restricció amb conseqüències: una subxarxa es pot ampliar, però no si hi ha recursos que ho impedeixin, i no es pot reduir amb recursos a dins. Dimensiona amb marge.

  1. Adreces reservades per Azure a cada subxarxa

En una subxarxa /24 no disposes de 256 adreces ni de 254, sinó de 251. Azure en reserva cinc a cada subxarxa:

Adreça (a 10.20.1.0/24) Reservada per a
10.20.1.0 Identificador de xarxa (estàndard)
10.20.1.1 Porta d'enllaç predeterminada d'Azure
10.20.1.2 Assignada a Azure DNS (mapatge del servidor virtual)
10.20.1.3 Reservada per a ús futur d'Azure
10.20.1.255 Difusió (broadcast, estàndard)

Per tant, la primera adreça assignable de snet-web és 10.20.1.4. Això importa quan dimensiones al límit: una subxarxa /29 té 8 adreces i només 3 utilitzables. Si has planificat «vuit servidors en una /29», no hi caben.

  1. Grups de seguretat de xarxa (NSG)

Un grup de seguretat de xarxa és una llista de regles de filtratge amb estat que s'aplica a una subxarxa o a una NIC. Amb estat vol dir que si permets una connexió d'entrada, la resposta de sortida es permet automàticament; no cal escriure la regla inversa.

Cada regla té:

Camp Què és
Prioritat De 100 a 4096. S'avalua de menor a major i la primera coincidència guanya
Origen / Destinació IP, CIDR, etiqueta de servei o grup de seguretat d'aplicació
Ports D'origen (gairebé sempre *) i de destinació
Protocol Tcp, Udp, Icmp o *
Direcció Entrada (Inbound) o Sortida (Outbound)
Acció Allow o Deny

Regles per defecte

Tot NSG porta regles invisibles que no es poden esborrar, només sobreescriure amb prioritats més baixes:

Prioritat Nom Efecte
65000 AllowVnetInBound Permet tot el trànsit dins de la xarxa virtual
65001 AllowAzureLoadBalancerInBound Permet les sondes del balancejador
65500 DenyAllInBound Denega tot allò altre que entri
65000 AllowVnetOutBound Permet la sortida dins de la xarxa virtual
65001 AllowInternetOutBound Permet la sortida a internet
65500 DenyAllOutBound Denega la resta de la sortida

Dues conseqüències que cal interioritzar:

  1. Per defecte, tot el trànsit dins de la VNet està permès, encara que siguin subxarxes diferents. La segmentació no és automàtica: cal escriure-la.
  2. Per defecte, tot pot sortir a internet. Si ho vols impedir, cal denegar-ho explícitament.

Segmentar les capes de Contoso

GRUP_XARXA="rg-contoso-red-pro"
REGIO="westeurope"

# --- NSG de la capa web ---
az network nsg create -g "${GRUP_XARXA}" -n nsg-snet-web -l "${REGIO}" --output none

# Permetre HTTPS des d'internet.
az network nsg rule create -g "${GRUP_XARXA}" --nsg-name nsg-snet-web \
  --name permitir-https-internet --priority 100 \
  --direction Inbound --access Allow --protocol Tcp \
  --source-address-prefixes Internet --source-port-ranges '*' \
  --destination-address-prefixes '*' --destination-port-ranges 443 \
  --description "Transit public de Contoso Reserves" --output none

# Denegar HTTP en clar: l'aplicacio redirigeix, pero la xarxa no ho accepta.
az network nsg rule create -g "${GRUP_XARXA}" --nsg-name nsg-snet-web \
  --name denegar-http-plano --priority 110 \
  --direction Inbound --access Deny --protocol Tcp \
  --source-address-prefixes Internet --destination-port-ranges 80 \
  --output none

az network vnet subnet update -g "${GRUP_XARXA}" --vnet-name vnet-contoso-pro \
  --name snet-web --network-security-group nsg-snet-web --output none

# --- NSG de la capa d'aplicacio: nomes accepta transit des de la web ---
az network nsg create -g "${GRUP_XARXA}" -n nsg-snet-app -l "${REGIO}" --output none

az network nsg rule create -g "${GRUP_XARXA}" --nsg-name nsg-snet-app \
  --name permitir-api-desde-web --priority 100 \
  --direction Inbound --access Allow --protocol Tcp \
  --source-address-prefixes 10.20.1.0/24 --destination-port-ranges 8080 \
  --description "API de Disponibilitat nomes des de snet-web" --output none

# Denegar explicitament la resta del transit intern (anul·la AllowVnetInBound).
az network nsg rule create -g "${GRUP_XARXA}" --nsg-name nsg-snet-app \
  --name denegar-resto-vnet --priority 4000 \
  --direction Inbound --access Deny --protocol '*' \
  --source-address-prefixes VirtualNetwork --destination-port-ranges '*' \
  --output none

az network vnet subnet update -g "${GRUP_XARXA}" --vnet-name vnet-contoso-pro \
  --name snet-app --network-security-group nsg-snet-app --output none

La regla denegar-resto-vnet amb prioritat 4000 és la peça clau de la segmentació: s'avalua abans que la regla per defecte 65000 que permetia tot el trànsit intern, però després que la regla 100 que autoritza la capa web. El resultat és exactament el que buscàvem: snet-app només escolta snet-web.

Comprovació de les regles efectives, incloses les invisibles:

az network nsg rule list -g "${GRUP_XARXA}" --nsg-name nsg-snet-app \
  --include-default \
  --query "sort_by([].{Prioritat:priority, Nom:name, Dir:direction, Accio:access, Origen:sourceAddressPrefix, Port:destinationPortRange}, &Prioritat)" \
  --output table

  1. Etiquetes de servei i grups de seguretat d'aplicació

Escriure rangs d'IP a mà envelleix malament: les IP dels serveis d'Azure canvien i les de les teves màquines també. Azure ofereix dues abstraccions per no dependre'n.

Etiquetes de servei

Una etiqueta de servei representa un conjunt de prefixos d'IP que Microsoft manté actualitzat per tu.

Etiqueta Què representa
Internet Tot el que és fora de la teva xarxa
VirtualNetwork La teva xarxa virtual, xarxes aparellades i xarxes locals connectades
AzureLoadBalancer El balancejador d'Azure (necessari per a les sondes d'estat)
Storage / Storage.WestEurope Azure Storage, global o d'una regió
Sql / Sql.WestEurope Azure SQL Database
AzureCloud Tots els serveis públics d'Azure
AzureMonitor Els punts de connexió de supervisió (mòdul 7)
# Permetre sortida NOMES cap a Azure SQL de West Europe, sense coneixer cap IP.
az network nsg rule create -g "${GRUP_XARXA}" --nsg-name nsg-snet-app \
  --name permitir-salida-sql --priority 200 \
  --direction Outbound --access Allow --protocol Tcp \
  --source-address-prefixes VirtualNetwork \
  --destination-address-prefixes Sql.WestEurope \
  --destination-port-ranges 1433 --output none

Grups de seguretat d'aplicació (ASG)

Un ASG és una etiqueta lògica que agrupa NIC. En lloc d'escriure regles per rang d'IP, escrius regles entre grups: «el que sigui a asg-web pot parlar amb el que sigui a asg-api». Quan afegeixes una màquina al grup, hereta les regles sense tocar el NSG.

# 1. Crear els grups.
az network asg create -g "${GRUP_XARXA}" -n asg-web -l "${REGIO}" --output none
az network asg create -g "${GRUP_XARXA}" -n asg-api -l "${REGIO}" --output none

# 2. Regla entre grups, sense ni una sola IP escrita.
az network nsg rule create -g "${GRUP_XARXA}" --nsg-name nsg-snet-app \
  --name permitir-web-a-api --priority 90 \
  --direction Inbound --access Allow --protocol Tcp \
  --source-asgs asg-web --destination-asgs asg-api \
  --destination-port-ranges 8080 --output none

# 3. Associar una NIC al seu grup.
az network nic ip-config update \
  -g rg-contoso-reservas-pro --nic-name nic-api-01 --name ipconfig1 \
  --application-security-groups asg-api --output none

És la manera de mantenir regles llegibles quan la xarxa creix: es llegeixen com a frases del negoci, no com a llistes d'octets.

  1. IP públiques i privades, estàtiques i dinàmiques

Tipus Assignació Comportament Quan fer-la servir
Privada dinàmica Azure la tria de la subxarxa Es conserva mentre la VM existeixi; pot canviar en desassignar i reassignar Predeterminada per a VM normals
Privada estàtica La tries tu Fixa sempre Controladors de domini, servidors DNS, appliances
Pública dinàmica Azure l'assigna en arrencar Canvia en desassignar la VM Només proves
Pública estàtica Reservada per a tu Fixa; es factura encara que la VM estigui apagada Balancejadors, portes d'enllaç, qualsevol cosa en un registre DNS
# IP privada estatica per a la VM del motor heretat.
az network nic ip-config update \
  --resource-group rg-contoso-reservas-pro \
  --nic-name nic-motor-disponibilidad-01 \
  --name ipconfig1 \
  --private-ip-address 10.20.4.10 \
  --output none

Sobre les SKU d'IP pública: Standard és l'actual (estàtica sempre, tancada per defecte —necessita un NSG que permeti el trànsit explícitament— i compatible amb zones). La SKU Basic està retirada. Fes servir sempre Standard.

Un matís de sortida a internet que confon molta gent: una VM sense IP pública pot continuar sortint a internet mitjançant l'accés sortint predeterminat d'Azure, amb una IP que no controles i que Microsoft està retirant per a les xarxes noves. Per a una sortida predictible i auditable es fa servir un NAT Gateway, que dona a tota la subxarxa una IP de sortida fixa i evita l'esgotament de ports SNAT.

  1. DNS a Azure i zones DNS privades

Dins d'una VNet, Azure ofereix resolució DNS automàtica: les màquines de la mateixa xarxa es resolen pel seu nom d'amfitrió sense que configuris res, a través del servidor virtual 168.63.129.16 (una adreça que apareix a tots els diagnòstics d'Azure i convé reconèixer).

Aquesta resolució automàtica té límits: no funciona entre xarxes aparellades ni resol noms de serveis privats. Per a això hi ha les zones DNS privades.

# 1. Zona privada propia de Contoso.
az network private-dns zone create \
  --resource-group rg-contoso-red-pro \
  --name interno.contosoairlines.example \
  --output none

# 2. Vincular la zona a la xarxa virtual, amb registre automatic de les VM.
az network private-dns link vnet create \
  --resource-group rg-contoso-red-pro \
  --zone-name interno.contosoairlines.example \
  --name enlace-vnet-contoso-pro \
  --virtual-network vnet-contoso-pro \
  --registration-enabled true \
  --output none

# 3. Registre manual per al motor heretat.
az network private-dns record-set a add-record \
  --resource-group rg-contoso-red-pro \
  --zone-name interno.contosoairlines.example \
  --record-set-name motor \
  --ipv4-address 10.20.4.10 \
  --output none

Ara qualsevol recurs de la xarxa resol motor.interno.contosoairlines.example a 10.20.4.10. Amb --registration-enabled true, a més, les VM es registren soles en crear-se.

Les zones privades són imprescindibles per a Private Link: són el mecanisme pel qual sql-contoso-reservas-pro.database.windows.net deixa de resoldre's a una IP pública i passa a resoldre's a una IP de la teva subxarxa. Ho veiem ara.

El DNS públic (registrar contosoairlines.example i publicar-ne els registres al món) és Azure DNS, i es tracta a la lliçó 02-06.

  1. Aparellament de xarxes virtuals i hub-and-spoke

L'aparellament (peering) connecta dues xarxes virtuals perquè es vegin com si fossin una de sola: trànsit privat per la xarxa troncal de Microsoft, latència baixa, sense portes d'enllaç ni internet pel mig.

Característiques que cal conèixer:

  • Funciona dins d'una regió i entre regions (aparellament global).
  • No és transitiu: si A s'aparella amb B i B amb C, A no veu C. Aquest és el punt que més sorprèn i el que dona forma a la topologia hub-and-spoke.
  • Els espais d'adreces no es poden encavalcar.
  • Es factura per dades transferides en tots dos sentits.
  • Cal crear-lo en els dos sentits: dues ordres, una per xarxa.
GRUP_XARXA="rg-contoso-red-pro"

# Del concentrador al radi de produccio.
az network vnet peering create \
  --resource-group "${GRUP_XARXA}" \
  --name peer-hub-a-pro \
  --vnet-name vnet-contoso-hub-pro \
  --remote-vnet vnet-contoso-pro \
  --allow-vnet-access \
  --allow-gateway-transit \
  --output none

# Del radi al concentrador (obligatori: l'aparellament es bidireccional per definicio).
az network vnet peering create \
  --resource-group "${GRUP_XARXA}" \
  --name peer-pro-a-hub \
  --vnet-name vnet-contoso-pro \
  --remote-vnet vnet-contoso-hub-pro \
  --allow-vnet-access \
  --use-remote-gateways \
  --output none

Les dues opcions importants: --allow-gateway-transit al concentrador vol dir «pots fer servir la meva porta d'enllaç VPN», i --use-remote-gateways al radi vol dir «la faré servir». Gràcies a aquesta parella, una sola porta d'enllaç VPN al concentrador dona connectivitat a tots els radis, en lloc de pagar-ne una per xarxa. És l'argument econòmic principal del patró.

El patró hub-and-spoke

graph TD
    OFI["Oficines Barcelona i Palma<br/>10.100.0.0/16 i 10.101.0.0/16"] -->|VPN lloc a lloc| GW["Porta d'enllac VPN<br/>(llico 02-06)"]
    GW --> HUB["vnet-contoso-hub-pro<br/>10.10.0.0/16<br/>Bastion, serveis compartits"]
    HUB -->|peering| PRO["vnet-contoso-pro<br/>10.20.0.0/16<br/>produccio"]
    HUB -->|peering| DEV["vnet-contoso-dev<br/>10.30.0.0/16<br/>desenvolupament"]
    PRO -.->|"sense peering directe:<br/>produccio i desenvolupament<br/>NO es veuen"| DEV

Com que l'aparellament no és transitiu, producció i desenvolupament no es veuen entre ells encara que tots dos vegin el concentrador. Això no és una limitació: és exactament la propietat d'aïllament que volem, i surt de franc.

  1. Punts de connexió de servei davant d'Azure Private Link

Aquí hi ha la decisió més important de la lliçó, i la que resol el problema amb què obríem: la base de dades i el compte d'emmagatzematge de Contoso són accessibles des d'internet.

Aspecte Punt de connexió de servei Punt de connexió privat (Private Link)
Què fa Estén la identitat de la teva subxarxa cap al servei, que continua tenint la seva IP pública Crea una NIC amb IP privada de la teva subxarxa per a aquest servei
Adreça de destinació La IP pública del servei (encara que el trànsit no surti a internet) Una IP privada de snet-datos
El servei continua exposat a internet? Sí, només restringit pel tallafoc del servei No, pots tancar l'accés públic del tot
Accés des de la xarxa local per VPN No funciona Sí
Abast Tota la subxarxa cap a tot el servei Un recurs concret (aquest compte, aquesta base de dades)
DNS No canvia Requereix zona DNS privada per resoldre al privat
Cost Gratis Per hora i per dades processades

La diferència pràctica que decideix: amb un punt de connexió de servei, algú amb la clau del compte d'emmagatzematge pot continuar accedint-hi des de qualsevol lloc autoritzat pel tallafoc; i les oficines connectades per VPN no el poden fer servir. Amb un punt de connexió privat, el recurs té una IP dins de la teva xarxa, es pot tancar del tot al món i les oficines hi arriben per la VPN.

Contoso tria punts de connexió privats per a la base de dades sql-contoso-reservas-pro i per al compte sttarjetascontosopro. El cost afegit és petit comparat amb exposar les dades dels passatgers.

GRUP_XARXA="rg-contoso-red-pro"
VNET="vnet-contoso-pro"

# 1. Desactivar les politiques de xarxa a la subxarxa de dades (requisit de Private Link).
az network vnet subnet update -g "${GRUP_XARXA}" --vnet-name "${VNET}" \
  --name snet-datos --disable-private-endpoint-network-policies true --output none

# 2. Punt de connexio privat cap al compte d'emmagatzematge de targetes.
ID_COMPTE=$(az storage account show -g rg-contoso-reservas-pro \
  -n sttarjetascontosopro --query id -o tsv)

az network private-endpoint create \
  --resource-group "${GRUP_XARXA}" \
  --name pe-storage-tarjetas \
  --vnet-name "${VNET}" --subnet snet-datos \
  --private-connection-resource-id "${ID_COMPTE}" \
  --group-id blob \
  --connection-name conexion-blob-tarjetas \
  --output none

# 3. Zona DNS privada del servei: sense aixo, el nom continua resolent a la IP publica.
az network private-dns zone create -g "${GRUP_XARXA}" \
  --name "privatelink.blob.core.windows.net" --output none

az network private-dns link vnet create -g "${GRUP_XARXA}" \
  --zone-name "privatelink.blob.core.windows.net" \
  --name enlace-blob-vnet-pro --virtual-network "${VNET}" \
  --registration-enabled false --output none

# 4. Registrar automaticament el punt de connexio a la zona.
az network private-endpoint dns-zone-group create \
  --resource-group "${GRUP_XARXA}" \
  --endpoint-name pe-storage-tarjetas \
  --name grupo-zonas-blob \
  --private-dns-zone "privatelink.blob.core.windows.net" \
  --zone-name blob --output none

# 5. Tancar l'acces public del compte: ara nomes s'hi arriba per la xarxa.
az storage account update -g rg-contoso-reservas-pro -n sttarjetascontosopro \
  --public-network-access Disabled --output none

El pas 3 és el que més gent oblida i el que provoca la fallada clàssica: crees el punt de connexió privat, tanques l'accés públic i l'aplicació deixa de funcionar, perquè continua resolent el nom a la IP pública que ja està tancada. Sense la zona DNS privada vinculada, Private Link no serveix de res.

Comprovació des d'una VM de la xarxa:

nslookup sttarjetascontosopro.blob.core.windows.net
# Esperat: un CNAME a sttarjetascontosopro.privatelink.blob.core.windows.net
# i una adreca 10.20.3.x (privada), no una IP publica.

Les zones privades dels serveis que Contoso farà servir: privatelink.blob.core.windows.net (Storage), privatelink.database.windows.net (SQL, mòdul 3), privatelink.vaultcore.azure.net (Key Vault, 04-03) i privatelink.azurewebsites.net (App Service).

  1. Integració d'App Service amb la xarxa virtual

Amb App Service cal distingir dues direccions, i confondre-les és font d'hores perdudes.

Necessitat Mecanisme Què fa
Sortida: que l'aplicació arribi a recursos privats Integració amb xarxa virtual Encamina el trànsit de sortida per una subxarxa delegada
Entrada: que només es pugui arribar a l'aplicació des de la xarxa Punt de connexió privat o restriccions d'accés Treu l'aplicació d'internet
# 1. Subxarxa dedicada i delegada a App Service (la delegacio es obligatoria
#    i la subxarxa no es pot compartir amb altres recursos).
az network vnet subnet create \
  -g rg-contoso-red-pro --vnet-name vnet-contoso-pro \
  --name snet-integracion-app --address-prefixes 10.20.5.0/24 \
  --delegations Microsoft.Web/serverFarms --output none

# 2. Integracio de sortida de la web de reserves.
az webapp vnet-integration add \
  -g rg-contoso-reservas-pro -n app-contoso-reservas-pro \
  --vnet vnet-contoso-pro --subnet snet-integracion-app --output none

# 3. Entrada restringida per a l'API interna: nomes des de snet-web.
az webapp config access-restriction add \
  -g rg-contoso-reservas-pro -n app-contoso-api-disponibilidad-pro \
  --rule-name permitir-solo-web --priority 100 \
  --action Allow --vnet-name vnet-contoso-pro --subnet snet-web --output none

Detalls pràctics: la integració de sortida requereix nivell Basic o superior, la subxarxa delegada és d'ús exclusiu d'aquell pla, i per defecte només s'encamina cap a adreces privades (per forçar tot el trànsit de sortida per la xarxa s'activa WEBSITE_VNET_ROUTE_ALL=1, que és el que Contoso fa en producció perquè la sortida sigui auditable).

  1. Azure Bastion davant d'exposar SSH i RDP

A la lliçó 02-01 vam obrir el port 22 a internet amb --nsg-rule SSH i vam avisar que era temporal. Ha arribat el moment de fer-ho bé.

Aspecte SSH/RDP amb IP pública Azure Bastion
Ports exposats a internet 22 o 3389, atacats en minuts Cap
IP pública a cada VM Necessària (i facturada) No en cal cap
Accés Client SSH o RDP Navegador (HTTPS) o client natiu per túnel
Auditoria La del sistema operatiu Sessions registrades a la plataforma
Cost Baix Per hora, des que existeix
# Bastion necessita AzureBastionSubnet (/26) i una IP publica Standard.
az network public-ip create -g rg-contoso-red-pro -n ip-bastion-contoso-pro \
  --sku Standard --allocation-method Static --output none

az network bastion create \
  --resource-group rg-contoso-red-pro \
  --name bastion-contoso-pro \
  --vnet-name vnet-contoso-pro \
  --public-ip-address ip-bastion-contoso-pro \
  --location westeurope \
  --sku Standard \
  --output none

# Connexio SSH sense IP publica a la VM ni port 22 obert.
az network bastion ssh \
  --name bastion-contoso-pro \
  --resource-group rg-contoso-red-pro \
  --target-resource-id "$(az vm show -g rg-contoso-reservas-pro -n vm-motor-disponibilidad-01 --query id -o tsv)" \
  --auth-type ssh-key --username azureuser --ssh-key ~/.ssh/contoso_motor

Avís de cost important: Bastion es factura per hora mentre existeixi, més el trànsit de sortida. En un laboratori, crea'l, fes-lo servir i esborra'l el mateix dia. En producció, el seu cost es compara favorablement amb el de gestionar IP públiques i sobreviure a un incident per SSH exposat.

Alternativa més barata per a administració puntual: az ssh vm amb Microsoft Entra ID i l'extensió corresponent, o un simple túnel a través d'una VPN de punt a lloc, que és justament el que la Marta Ríos farà servir des de casa (lliçó 02-06).

  1. Verificació amb Network Watcher

Quan alguna cosa no connecta, endevinar és car. Network Watcher et diu exactament quina regla està bloquejant què.

# 1. Comprovacio de flux IP: aquesta connexio concreta es permet o es denega?
az network watcher test-ip-flow \
  --resource-group rg-contoso-reservas-pro \
  --vm vm-motor-disponibilidad-01 \
  --direction Inbound --protocol TCP \
  --local 10.20.4.10:22 --remote 10.20.1.5:60000 \
  --output json
# La resposta inclou "access": "Allow"/"Deny" i la regla exacta responsable.

# 2. Regles de seguretat efectives sobre una NIC (suma de NSG de subxarxa i de NIC).
az network nic list-effective-nsg \
  --resource-group rg-contoso-reservas-pro \
  --name nic-motor-disponibilidad-01 \
  --output json

# 3. Solucio de problemes de connexio d'extrem a extrem.
az network watcher test-connectivity \
  --resource-group rg-contoso-reservas-pro \
  --source-resource vm-motor-disponibilidad-01 \
  --dest-address sttarjetascontosopro.privatelink.blob.core.windows.net \
  --dest-port 443 \
  --output table

test-ip-flow és l'eina que cal fer servir abans de tocar cap regla: et diu el nom de la regla que decideix, amb la qual cosa deixes de canviar coses a l'atzar. I els registres de flux de NSG, que envien a Log Analytics tot el que es permet i es denega, són la base de l'anàlisi que veuràs a la lliçó 07-02.

  1. Topologia completa i neteja

graph TB
    NET["Internet"] -->|443| WEB
    subgraph VNET["vnet-contoso-pro  ·  10.20.0.0/16"]
        WEB["snet-web · 10.20.1.0/24<br/>nsg-snet-web: nomes 443 d'entrada"]
        APP["snet-app · 10.20.2.0/24<br/>nsg-snet-app: nomes des de snet-web"]
        DAT["snet-datos · 10.20.3.0/24<br/>punts de connexio privats"]
        GES["snet-gestion · 10.20.4.0/24<br/>motor heretat, sense IP publica"]
        INT["snet-integracion-app · 10.20.5.0/24<br/>delegada a App Service"]
        BAS["AzureBastionSubnet · 10.20.250.0/26"]
        GWS["GatewaySubnet · 10.20.255.0/27<br/>(llico 02-06)"]
    end
    WEB --> APP
    APP --> DAT
    INT --> DAT
    DAT -.->|Private Link| SQL["sql-contoso-reservas-pro"]
    DAT -.->|Private Link| ST["sttarjetascontosopro"]
    BAS --> GES
    HUB["vnet-contoso-hub-pro · 10.10.0.0/16"] <-->|peering| VNET

Neteja del que factura:

# 1. Bastion: el mes car d'aquesta llico. Esborra'l tan bon punt acabis.
az network bastion delete -g rg-contoso-red-pro -n bastion-contoso-pro
az network public-ip delete -g rg-contoso-red-pro -n ip-bastion-contoso-pro

# 2. Punts de connexio privats (es facturen per hora).
az network private-endpoint delete -g rg-contoso-red-pro -n pe-storage-tarjetas

# 3. Les VNet, subxarxes i NSG no costen res: poden quedar-s'hi.
#    Si tot i aixi vols esborrar-ho tot en un laboratori:
# az group delete --name rg-contoso-red-pro --yes --no-wait

Comprovació de despesa residual: az network public-ip list --query "[?ipConfiguration==null]" -o table i az network private-endpoint list -o table.

Errors Comuns i Consells

  • Fer servir 10.0.0.0/16 perquè és l'exemple del tutorial. És el rang que fa servir mitja internet corporativa; el dia que muntis la VPN amb l'oficina, s'encavalcarà. Planifica l'adreçament abans de crear res.
  • Dimensionar les subxarxes al límit. Azure reserva 5 adreces per subxarxa i ampliar amb recursos a dins és problemàtic. Deixa marge.
  • Oblidar els noms obligatoris. GatewaySubnet i AzureBastionSubnet s'escriuen exactament així; amb qualsevol altre nom, el servei no es desplega.
  • Suposar que les subxarxes estan aïllades per defecte. La regla AllowVnetInBound permet tot el trànsit intern. La segmentació cal escriure-la.
  • Confondre l'ordre de prioritats. S'avalua de menor a major i la primera coincidència guanya. Una regla Deny amb prioritat 100 anul·la un Allow amb prioritat 200.
  • Escriure rangs d'IP on hi cap una etiqueta de servei. Les IP dels serveis d'Azure canvien; les etiquetes s'actualitzen soles.
  • Esperar que l'aparellament sigui transitiu. No ho és. En hub-and-spoke, els radis no es veuen entre ells (i normalment això és el que vols).
  • Crear l'aparellament en un sol sentit. Queda en estat Initiated i no funciona fins que existeix l'enllaç invers.
  • Crear un punt de connexió privat sense la seva zona DNS privada. El nom continua resolent a la IP pública i, en tancar l'accés públic, l'aplicació deixa de funcionar. És l'errada número u de Private Link.
  • Deixar Azure Bastion encès en un laboratori. Es factura per hora encara que no el facis servir.
  • Depurar connectivitat a força de provar regles. az network watcher test-ip-flow et dona la regla culpable en una ordre.
  • Consell: documenta el pla d'adreçament en un fitxer del repositori juntament amb els scripts. La xarxa és la part de l'arquitectura que més gent necessita consultar i menys gent recorda.
  • Consell: aplica els NSG a subxarxes, no a NIC individuals, llevat d'excepcions justificades. Les regles per NIC s'obliden i creen forats invisibles.

Exercicis

Exercici 1: planificar l'adreçament

Contoso obre una tercera oficina a Sevilla i vol a més una xarxa virtual per a proves de càrrega, aïllada de producció.

  1. Assigna espais d'adreces a l'oficina de Sevilla i a la nova xarxa vnet-contoso-pruebas, coherents amb el pla existent i sense encavalcaments.
  2. Divideix vnet-contoso-pruebas en tres subxarxes /24 amb noms coherents amb la nomenclatura del curs.
  3. Quantes adreces utilitzables té cada subxarxa /24? I una /27?
  4. Explica per què no pots fer servir 10.20.0.0/16 per a la xarxa de proves.

Exercici 2: segmentar amb NSG

Escriu les regles de NSG (amb prioritats) que compleixin exactament aquesta política per a vnet-contoso-pro:

  1. snet-web accepta 443 des d'internet i res més.
  2. snet-app accepta 8080 només des de snet-web; cap altre trànsit intern.
  3. snet-datos accepta 1433 només des de snet-app.
  4. snet-gestion no accepta res des d'internet; només administració des de Bastion.
  5. snet-app pot sortir cap a Azure SQL de West Europe, però no cap a la resta d'internet.

Exercici 3: fer privada la base de dades

Descriu, amb les ordres corresponents, els passos perquè sql-contoso-reservas-pro deixi de ser accessible des d'internet i només s'hi arribi des de snet-app:

  1. Preparar la subxarxa.
  2. Crear el punt de connexió privat.
  3. Configurar la resolució DNS.
  4. Tancar l'accés públic.
  5. Verificar que la resolució retorna una IP privada.

Explica a més què passaria si et saltessis el pas 3.

Solucions

Solució 1:

  1. Adreçament coherent amb el pla existent:
Xarxa Espai Motiu
Oficina de Sevilla 10.102.0.0/16 Segueix la sèrie d'oficines (Barcelona 10.100, Palma 10.101)
vnet-contoso-pruebas 10.40.0.0/16 Segueix la sèrie de xarxes d'Azure (hub 10.10, pro 10.20, dev 10.30)
  1. Subxarxes:
az network vnet create -g rg-contoso-red-pro -n vnet-contoso-pruebas \
  --address-prefixes 10.40.0.0/16 --location westeurope --output none

az network vnet subnet create -g rg-contoso-red-pro --vnet-name vnet-contoso-pruebas \
  -n snet-web --address-prefixes 10.40.1.0/24 --output none
az network vnet subnet create -g rg-contoso-red-pro --vnet-name vnet-contoso-pruebas \
  -n snet-app --address-prefixes 10.40.2.0/24 --output none
az network vnet subnet create -g rg-contoso-red-pro --vnet-name vnet-contoso-pruebas \
  -n snet-datos --address-prefixes 10.40.3.0/24 --output none
  1. Una /24 té 256 adreces, menys les 5 que reserva Azure: 251 utilitzables. Una /27 en té 32, menys 5: 27 utilitzables.

  2. Perquè 10.20.0.0/16 ja és l'espai de vnet-contoso-pro. Dues xarxes amb rangs encavalcats no es poden aparellar ni connectar per VPN, i l'encaminament seria ambigu. Encara que avui no les aparellessis, reutilitzar el rang tanca aquesta porta per sempre.

Solució 2:

G="rg-contoso-red-pro"

# 1. snet-web: 443 des d'internet, res mes (la denegacio la dona la regla per defecte 65500).
az network nsg rule create -g $G --nsg-name nsg-snet-web -n permitir-https \
  --priority 100 --direction Inbound --access Allow --protocol Tcp \
  --source-address-prefixes Internet --destination-port-ranges 443 --output none

# 2. snet-app: 8080 nomes des de snet-web; la resta del transit intern, denegat.
az network nsg rule create -g $G --nsg-name nsg-snet-app -n permitir-web \
  --priority 100 --direction Inbound --access Allow --protocol Tcp \
  --source-address-prefixes 10.20.1.0/24 --destination-port-ranges 8080 --output none
az network nsg rule create -g $G --nsg-name nsg-snet-app -n denegar-resto-vnet \
  --priority 4000 --direction Inbound --access Deny --protocol '*' \
  --source-address-prefixes VirtualNetwork --destination-port-ranges '*' --output none

# 3. snet-datos: 1433 nomes des de snet-app.
az network nsg rule create -g $G --nsg-name nsg-snet-datos -n permitir-app-sql \
  --priority 100 --direction Inbound --access Allow --protocol Tcp \
  --source-address-prefixes 10.20.2.0/24 --destination-port-ranges 1433 --output none
az network nsg rule create -g $G --nsg-name nsg-snet-datos -n denegar-resto-vnet \
  --priority 4000 --direction Inbound --access Deny --protocol '*' \
  --source-address-prefixes VirtualNetwork --destination-port-ranges '*' --output none

# 4. snet-gestion: res d'internet; SSH i RDP nomes des de la subxarxa de Bastion.
az network nsg rule create -g $G --nsg-name nsg-snet-gestion -n permitir-bastion \
  --priority 100 --direction Inbound --access Allow --protocol Tcp \
  --source-address-prefixes 10.20.250.0/26 --destination-port-ranges 22 3389 --output none
az network nsg rule create -g $G --nsg-name nsg-snet-gestion -n denegar-internet \
  --priority 200 --direction Inbound --access Deny --protocol '*' \
  --source-address-prefixes Internet --destination-port-ranges '*' --output none

# 5. Sortida de snet-app: nomes Azure SQL de la regio; la resta d'internet, denegat.
az network nsg rule create -g $G --nsg-name nsg-snet-app -n permitir-salida-sql \
  --priority 200 --direction Outbound --access Allow --protocol Tcp \
  --destination-address-prefixes Sql.WestEurope --destination-port-ranges 1433 --output none
az network nsg rule create -g $G --nsg-name nsg-snet-app -n denegar-salida-internet \
  --priority 4000 --direction Outbound --access Deny --protocol '*' \
  --destination-address-prefixes Internet --destination-port-ranges '*' --output none

Detall del punt 5: la regla de sortida a SQL ha de tenir prioritat menor (200) que la denegació general (4000), o el trànsit legítim quedaria bloquejat.

Solució 3:

G="rg-contoso-red-pro"; V="vnet-contoso-pro"

# 1. Preparar la subxarxa que allotjara el punt de connexio.
az network vnet subnet update -g $G --vnet-name $V -n snet-datos \
  --disable-private-endpoint-network-policies true --output none

# 2. Punt de connexio privat cap al servidor SQL (group-id sqlServer).
ID_SQL=$(az sql server show -g rg-contoso-reservas-pro -n sql-contoso-reservas-pro --query id -o tsv)
az network private-endpoint create -g $G -n pe-sql-reservas \
  --vnet-name $V --subnet snet-datos \
  --private-connection-resource-id "${ID_SQL}" --group-id sqlServer \
  --connection-name conexion-sql-reservas --output none

# 3. Zona DNS privada del servei, vinculada a la xarxa i enllacada al punt de connexio.
az network private-dns zone create -g $G -n "privatelink.database.windows.net" --output none
az network private-dns link vnet create -g $G \
  --zone-name "privatelink.database.windows.net" -n enlace-sql-vnet-pro \
  --virtual-network $V --registration-enabled false --output none
az network private-endpoint dns-zone-group create -g $G \
  --endpoint-name pe-sql-reservas -n grupo-zonas-sql \
  --private-dns-zone "privatelink.database.windows.net" --zone-name sql --output none

# 4. Tancar l'acces public del servidor.
az sql server update -g rg-contoso-reservas-pro -n sql-contoso-reservas-pro \
  --enable-public-network false --output none

# 5. Verificar des d'una VM de la xarxa.
nslookup sql-contoso-reservas-pro.database.windows.net
# Esperat: CNAME a ...privatelink.database.windows.net i una IP 10.20.3.x

Si et saltes el pas 3, el punt de connexió privat existeix i té la seva IP, però el nom sql-contoso-reservas-pro.database.windows.net continua resolent a la IP pública. Tan bon punt executis el pas 4, l'aplicació intentarà connectar-se a aquesta IP pública ja tancada i fallarà amb un error de connexió esgotada, sense cap pista que apunti al DNS. És l'avaria més freqüent i més desconcertant de Private Link.

Conclusió

Ja tens la tercera pota de la plataforma. Saps per què la xarxa va primer i quines decisions queden congelades durant anys. Manegues els espais d'adreces privats, l'aritmètica CIDR suficient per trossejar una /16 en subxarxes sense encavalcaments, i coneixes les cinc adreces que Azure reserva a cada subxarxa. Has dissenyat i desplegat vnet-contoso-pro amb snet-web, snet-app, snet-datos, snet-gestion i les subxarxes de nom obligatori AzureBastionSubnet i GatewaySubnet. Escrius regles de NSG entenent les prioritats i les regles per defecte —inclosa la més perillosa, AllowVnetInBound, que fa que la segmentació no sigui automàtica—, i fas servir etiquetes de servei i grups de seguretat d'aplicació perquè les regles no depenguin de llistes d'IP. Distingeixes IP públiques i privades, estàtiques i dinàmiques, amb el seu efecte a la factura. Saps com funciona la resolució DNS d'Azure i per a què serveixen les zones DNS privades. Entens l'aparellament i la seva manca de transitivitat, que és just el que dona forma al patró hub-and-spoke i permet pagar una sola porta d'enllaç VPN. I has pres la decisió que més protegeix les dades dels passatgers: punts de connexió privats amb la seva zona DNS per a la base de dades i el compte d'emmagatzematge, en lloc de punts de connexió de servei. A més, has connectat App Service a la xarxa, has substituït l'SSH exposat per Azure Bastion i saps diagnosticar amb Network Watcher en comptes d'endevinar.

Queda una peça per tancar el mòdul, i és la que connecta Azure amb el món real de Contoso Airlines. Les oficines de Barcelona i Palma continuen fora d'aquesta xarxa: el seu personal no arriba als recursos privats que acabes de blindar, el sistema de facturació heretat continua vivint en local, i la Marta Ríos no pot administrar res des de casa sense exposar alguna cosa. Alhora, un client que compra un bitllet des de Sud-amèrica pateix la latència de creuar l'Atlàntic a cada petició fins a West Europe.

A l'última lliçó del mòdul, Connectivitat híbrida i lliurament global, resolem tots dos extrems: VPN de punt a lloc per a la Marta i de lloc a lloc per a les oficines, amb les seves portes d'enllaç i el seu desplegament per CLI; ExpressRoute i quan justifica el seu preu; Azure Virtual WAN com a evolució del hub-and-spoke híbrid; i el lliurament global del lloc amb Azure Front Door, Azure CDN i Traffic Manager, inclòs el cost de la sortida de dades que sorprèn tothom la primera vegada que llegeix una factura.

Curs d'Azure

Mòdul 1: Introducció a Azure

Mòdul 2: Serveis principals d'Azure

Mòdul 3: Bases de dades d'Azure

Mòdul 4: Seguretat a Azure

Mòdul 5: Azure DevOps

Mòdul 6: Serveis avançats d'Azure

Mòdul 7: Monitoratge i gestió

Mòdul 8: Gestió i optimització de costos

Mòdul 9: Estudis de cas i millors pràctiques

© Copyright 2026. Tots els drets reservats