Implementación y configuración de Azure Firewall en una red híbrida con Azure PowerShell

Cuando conecta la red local a una red virtual de Azure para crear una red híbrida, la capacidad de controlar el acceso a los recursos de la red de Azure es parte importante de un plan de seguridad global.

Puede usar Azure Firewall para controlar el acceso de red en una red híbrida con reglas que definen el tráfico de red que se permite o que se rechaza.

En este artículo se crearán tres redes virtuales:

  • VNet-Hub: el firewall está en esta red virtual.
  • VNet-Spoke: la red virtual de radio representa la carga de trabajo ubicada en Azure.
  • VNet-Onprem: la red virtual local representa una red local. En una implementación real, puede conectarse a ella mediante una conexión de red privada virtual (VPN) o una conexión de Azure ExpressRoute. Para simplificar, este artículo usa una conexión de puerta de enlace de VPN y una red virtual ubicada en Azure para representar una red local.

Diagrama que muestra un firewall en una red híbrida.

Si quiere usar Azure Portal en su lugar para completar los procedimientos de este artículo, consulte Implementación y configuración de Azure Firewall en una red híbrida mediante Azure Portal.

Nota:

Se recomienda usar el módulo Azure Az de PowerShell para interactuar con Azure. Consulte Instalación de Azure PowerShell para empezar. Para más información sobre cómo migrar al módulo Az de PowerShell, consulte Migración de Azure PowerShell de AzureRM a Az.

Requisitos previos

En este artículo es necesario ejecutar PowerShell en local. Debe tener instalados el módulo de Azure PowerShell. Ejecute Get-Module -ListAvailable Az para encontrar la versión. Si necesita actualizarla, consulte Instalación del módulo de Azure PowerShell. Después de verificar la versión de PowerShell, ejecute Login-AzAccount para crear una conexión con Azure.

Hay tres requisitos clave para que este escenario funcione correctamente:

  • Una ruta definida por el usuario (UDR) en la subred de radio que apunte a la dirección IP de Azure Firewall como puerta de enlace predeterminada. La propagación de las rutas de puerta de enlace de red virtual se debe deshabilitar en esta tabla de rutas.

  • Una ruta definida por el usuario en la subred de la puerta de enlace del centro debe apuntar a la dirección IP del firewall como próximo salto para las redes de radio.

    No se requiere ninguna UDR en la subred de Azure Firewall, ya que aprende rutas del Protocolo de puerta de enlace de borde (BGP).

  • Asegúrese de establecer AllowGatewayTransit cuando esté emparejando VNet-Hub a VNet-Spoke. Establezca UseRemoteGateways cuando esté emparejando VNet-Spoke a VNet-Hub.

La sección Crear las rutas más adelante en este artículo muestra cómo crear estas rutas.

Nota:

Azure Firewall debe tener conectividad directa a Internet. Si la subred de AzureFirewallSubnet aprende una ruta predeterminada a la red local mediante BGP, debe configurar Azure Firewall en el modo de tunelización forzada. Si se trata de una instancia de Azure Firewall existente que no se puede volver a configurar en modo de tunelización forzada, se recomienda agregar una UDR 0.0.0.0/0 en la subred de AzureFirewallSubnet con el valor de NextHopType establecido como Internet para mantener la conectividad directa a Internet.

Para más información, consulte Tunelización forzada de Azure Firewall.

El tráfico entre redes virtuales emparejadas directamente se enruta directamente, aunque una ruta definida por el usuario apunte a Azure Firewall como puerta de enlace predeterminada. Para enviar tráfico de subred a subred al firewall en este escenario, una UDR debe contener el prefijo de red de la subred de destino de forma explícita en ambas subredes.

Para revisar la documentación de referencia de Azure PowerShell relacionada, consulte New-AzFirewall.

Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

Declaración de las variables

En el ejemplo siguiente se declaran las variables con los valores para este artículo. En algunos casos, puede que tenga que reemplazar algunos valores por los suyos propios para trabajar en su suscripción. Si es necesario, modifique las variables y después cópielas y péguelas en la consola de PowerShell.

$RG1 = "FW-Hybrid-Test"
$Location1 = "East US"

# Variables for the firewall hub virtual network

$VNetnameHub = "VNet-Hub"
$SNnameHub = "AzureFirewallSubnet"
$VNetHubPrefix = "10.5.0.0/16"
$SNHubPrefix = "10.5.0.0/24"
$SNGWHubPrefix = "10.5.1.0/24"
$GWHubName = "GW-hub"
$GWHubpipName = "VNet-Hub-GW-pip"
$GWIPconfNameHub = "GW-ipconf-hub"
$ConnectionNameHub = "hub-to-Onprem"

# Variables for the spoke virtual network

$VnetNameSpoke = "VNet-Spoke"
$SNnameSpoke = "SN-Workload"
$VNetSpokePrefix = "10.6.0.0/16"
$SNSpokePrefix = "10.6.0.0/24"
$SNSpokeGWPrefix = "10.6.1.0/24"

# Variables for the on-premises virtual network

$VNetnameOnprem = "Vnet-Onprem"
$SNNameOnprem = "SN-Corp"
$VNetOnpremPrefix = "192.168.0.0/16"
$SNOnpremPrefix = "192.168.1.0/24"
$SNGWOnpremPrefix = "192.168.2.0/24"
$GWOnpremName = "GW-Onprem"
$GWIPconfNameOnprem = "GW-ipconf-Onprem"
$ConnectionNameOnprem = "Onprem-to-hub"
$GWOnprempipName = "VNet-Onprem-GW-pip"

$SNnameGW = "GatewaySubnet"

Crear la red virtual del centro de firewall

En primer lugar, cree el grupo de recursos en el que se incluirán los recursos de este artículo:

  New-AzResourceGroup -Name $RG1 -Location $Location1

Defina las subredes que se incluirán en la red virtual:

$FWsub = New-AzVirtualNetworkSubnetConfig -Name $SNnameHub -AddressPrefix $SNHubPrefix
$GWsub = New-AzVirtualNetworkSubnetConfig -Name $SNnameGW -AddressPrefix $SNGWHubPrefix

Crear la red virtual del centro de firewall:

$VNetHub = New-AzVirtualNetwork -Name $VNetnameHub -ResourceGroupName $RG1 `
-Location $Location1 -AddressPrefix $VNetHubPrefix -Subnet $FWsub,$GWsub

Solicite que se asigne una dirección IP pública a la puerta de enlace de VPN que creará para la red virtual. Observe que el valor de AllocationMethod es Dynamic. No puede especificar la dirección IP que desea usar. Se asigna dinámicamente a la puerta de enlace de VPN.

$gwpip1 = New-AzPublicIpAddress -Name $GWHubpipName -ResourceGroupName $RG1 `
-Location $Location1 -AllocationMethod Dynamic

Crear la red virtual de tipo hub-and-spoke

Defina las subredes que se incluirán en la red virtual de tipo hub-and-spoke:

$Spokesub = New-AzVirtualNetworkSubnetConfig -Name $SNnameSpoke -AddressPrefix $SNSpokePrefix
$GWsubSpoke = New-AzVirtualNetworkSubnetConfig -Name $SNnameGW -AddressPrefix $SNSpokeGWPrefix

Cree la red virtual de tipo hub-and-spoke:

$VNetSpoke = New-AzVirtualNetwork -Name $VnetNameSpoke -ResourceGroupName $RG1 `
-Location $Location1 -AddressPrefix $VNetSpokePrefix -Subnet $Spokesub,$GWsubSpoke

Crear la red virtual local

Defina las subredes que se incluirán en la red virtual:

$Onpremsub = New-AzVirtualNetworkSubnetConfig -Name $SNNameOnprem -AddressPrefix $SNOnpremPrefix
$GWOnpremsub = New-AzVirtualNetworkSubnetConfig -Name $SNnameGW -AddressPrefix $SNGWOnpremPrefix

Crear la red virtual local:

$VNetOnprem = New-AzVirtualNetwork -Name $VNetnameOnprem -ResourceGroupName $RG1 `
-Location $Location1 -AddressPrefix $VNetOnpremPrefix -Subnet $Onpremsub,$GWOnpremsub

Solicite que se asigne una dirección IP pública a la puerta de enlace que creará para la red virtual. Observe que el valor de AllocationMethod es Dynamic. No puede especificar la dirección IP que desea usar. Se asigna dinámicamente a la puerta de enlace.

$gwOnprempip = New-AzPublicIpAddress -Name $GWOnprempipName -ResourceGroupName $RG1 `
-Location $Location1 -AllocationMethod Dynamic

Configuración e implementación del firewall

Ahora, implemente el firewall en la red virtual del centro de conectividad:

# Get a public IP for the firewall
$FWpip = New-AzPublicIpAddress -Name "fw-pip" -ResourceGroupName $RG1 `
  -Location $Location1 -AllocationMethod Static -Sku Standard
# Create the firewall
$Azfw = New-AzFirewall -Name AzFW01 -ResourceGroupName $RG1 -Location $Location1 -VirtualNetworkName $VNetnameHub -PublicIpName fw-pip

#Save the firewall private IP address for future use

$AzfwPrivateIP = $Azfw.IpConfigurations.privateipaddress
$AzfwPrivateIP

Configurar reglas de red:

$Rule1 = New-AzFirewallNetworkRule -Name "AllowWeb" -Protocol TCP -SourceAddress $SNOnpremPrefix `
   -DestinationAddress $VNetSpokePrefix -DestinationPort 80

$Rule2 = New-AzFirewallNetworkRule -Name "AllowRDP" -Protocol TCP -SourceAddress $SNOnpremPrefix `
   -DestinationAddress $VNetSpokePrefix -DestinationPort 3389

$Rule3 = New-AzFirewallNetworkRule -Name "AllowPing" -Protocol ICMP -SourceAddress $SNOnpremPrefix `
   -DestinationAddress $VNetSpokePrefix -DestinationPort

$NetRuleCollection = New-AzFirewallNetworkRuleCollection -Name RCNet01 -Priority 100 `
   -Rule $Rule1,$Rule2 -ActionType "Allow"
$Azfw.NetworkRuleCollections = $NetRuleCollection
Set-AzFirewall -AzureFirewall $Azfw

Creación y conexión de las puertas de enlace de VPN

Las redes virtuales de centro y local están conectadas mediante puertas de enlace VPN.

Creación de una puerta de enlace VPN para la red virtual de centro

Cree la configuración de la puerta de enlace de VPN para la red virtual del centro de conectividad. La configuración de la puerta de enlace de VPN define la subred y la dirección IP pública.

$vnet1 = Get-AzVirtualNetwork -Name $VNetnameHub -ResourceGroupName $RG1
$subnet1 = Get-AzVirtualNetworkSubnetConfig -Name "GatewaySubnet" -VirtualNetwork $vnet1
$gwipconf1 = New-AzVirtualNetworkGatewayIpConfig -Name $GWIPconfNameHub `
-Subnet $subnet1 -PublicIpAddress $gwpip1

Ahora, cree la puerta de enlace de VPN para la red virtual del centro de conectividad. Las configuraciones de red a red requieren un valor de VpnType de RouteBased. La creación de una puerta de enlace de VPN suele tardar 45 minutos o más, en función de la SKU que seleccione.

New-AzVirtualNetworkGateway -Name $GWHubName -ResourceGroupName $RG1 `
-Location $Location1 -IpConfigurations $gwipconf1 -GatewayType Vpn `
-VpnType RouteBased -GatewaySku basic

Creación de una puerta de enlace VPN para la red virtual local

Cree la configuración de la puerta de enlace de VPN para la red virtual local. La configuración de la puerta de enlace de VPN define la subred y la dirección IP pública.

$vnet2 = Get-AzVirtualNetwork -Name $VNetnameOnprem -ResourceGroupName $RG1
$subnet2 = Get-AzVirtualNetworkSubnetConfig -Name "GatewaySubnet" -VirtualNetwork $vnet2
$gwipconf2 = New-AzVirtualNetworkGatewayIpConfig -Name $GWIPconfNameOnprem `
-Subnet $subnet2 -PublicIpAddress $gwOnprempip

Ahora, cree la puerta de enlace de VPN para la red virtual local. Las configuraciones de red a red requieren un valor de VpnType de RouteBased. La creación de una puerta de enlace de VPN suele tardar 45 minutos o más, en función de la SKU que seleccione.

New-AzVirtualNetworkGateway -Name $GWOnpremName -ResourceGroupName $RG1 `
-Location $Location1 -IpConfigurations $gwipconf2 -GatewayType Vpn `
-VpnType RouteBased -GatewaySku basic

Creación de las conexiones

Cree las conexiones de VPN entre las puertas de enlace del centro de conectividad y locales.

Obtención de las puertas de enlace de VPN

$vnetHubgw = Get-AzVirtualNetworkGateway -Name $GWHubName -ResourceGroupName $RG1
$vnetOnpremgw = Get-AzVirtualNetworkGateway -Name $GWOnpremName -ResourceGroupName $RG1

Creación de las conexiones

En este paso va a crear la conexión entre la red virtual de centro y la red virtual local. Los ejemplos muestran una clave compartida, pero puede usar sus propios valores para la clave compartida. Lo importante es que la clave compartida coincida en ambas conexiones. Se tardará unos momentos en terminar de crear la conexión.

New-AzVirtualNetworkGatewayConnection -Name $ConnectionNameHub -ResourceGroupName $RG1 `
-VirtualNetworkGateway1 $vnetHubgw -VirtualNetworkGateway2 $vnetOnpremgw -Location $Location1 `
-ConnectionType Vnet2Vnet -SharedKey 'AzureA1b2C3'

Cree la conexión de red virtual desde el entorno local al centro de conectividad. Este paso es similar al anterior, salvo que se crea la conexión desde VNet-Onprem a VNet-Hub. Asegúrese de que coincidan las claves compartidas. Después de unos minutos, se establece la conexión.

New-AzVirtualNetworkGatewayConnection -Name $ConnectionNameOnprem -ResourceGroupName $RG1 `
-VirtualNetworkGateway1 $vnetOnpremgw -VirtualNetworkGateway2 $vnetHubgw -Location $Location1 `
-ConnectionType Vnet2Vnet -SharedKey 'AzureA1b2C3'

Comprobación de la conexión

Puede comprobar una conexión correcta mediante el cmdlet Get-AzVirtualNetworkGatewayConnection, con o sin -Debug.

Use el siguiente ejemplo de cmdlet, pero configure los valores para que coincidan con los suyos propios. Si se le solicita, seleccione A para ejecutar All. En el ejemplo, -Name es el nombre de la conexión que desea probar.

Get-AzVirtualNetworkGatewayConnection -Name $ConnectionNameHub -ResourceGroupName $RG1

Cuando el cmdlet termine, consulte los valores. En el ejemplo siguiente se muestra un estado de conexión de Connected, junto con bytes de entrada y salida:

"connectionStatus": "Connected",
"ingressBytesTransferred": 33509044,
"egressBytesTransferred": 4142431

Emparejar las redes virtuales de tipo hub-and-spoke

Ahora, empareje las redes virtuales de tipo hub-and-spoke:

# Peer hub to spoke
Add-AzVirtualNetworkPeering -Name HubtoSpoke -VirtualNetwork $VNetHub -RemoteVirtualNetworkId $VNetSpoke.Id -AllowGatewayTransit

# Peer spoke to hub
Add-AzVirtualNetworkPeering -Name SpoketoHub -VirtualNetwork $VNetSpoke -RemoteVirtualNetworkId $VNetHub.Id -AllowForwardedTraffic -UseRemoteGateways

Creación de las rutas

Use los siguientes comandos para crear estas rutas:

  • Una ruta desde la subred de puerta de enlace de concentrador a la subred de radio mediante la dirección IP del firewall.
  • Una ruta predeterminada desde la subred de radio mediante la dirección IP del firewall.
#Create a route table
$routeTableHubSpoke = New-AzRouteTable `
  -Name 'UDR-Hub-Spoke' `
  -ResourceGroupName $RG1 `
  -location $Location1

#Create a route
Get-AzRouteTable `
  -ResourceGroupName $RG1 `
  -Name UDR-Hub-Spoke `
  | Add-AzRouteConfig `
  -Name "ToSpoke" `
  -AddressPrefix $VNetSpokePrefix `
  -NextHopType "VirtualAppliance" `
  -NextHopIpAddress $AzfwPrivateIP `
 | Set-AzRouteTable

#Associate the route table to the subnet

Set-AzVirtualNetworkSubnetConfig `
  -VirtualNetwork $VNetHub `
  -Name $SNnameGW `
  -AddressPrefix $SNGWHubPrefix `
  -RouteTable $routeTableHubSpoke | `
Set-AzVirtualNetwork

#Now, create the default route

#Create a table, with BGP route propagation disabled. The property is now called "Virtual network gateway route propagation," but the API still refers to the parameter as "DisableBgpRoutePropagation."
$routeTableSpokeDG = New-AzRouteTable `
  -Name 'UDR-DG' `
  -ResourceGroupName $RG1 `
  -location $Location1 `
  -DisableBgpRoutePropagation

#Create a route
Get-AzRouteTable `
  -ResourceGroupName $RG1 `
  -Name UDR-DG `
  | Add-AzRouteConfig `
  -Name "ToFirewall" `
  -AddressPrefix 0.0.0.0/0 `
  -NextHopType "VirtualAppliance" `
  -NextHopIpAddress $AzfwPrivateIP `
 | Set-AzRouteTable

#Associate the route table to the subnet

Set-AzVirtualNetworkSubnetConfig `
  -VirtualNetwork $VNetSpoke `
  -Name $SNnameSpoke `
  -AddressPrefix $SNSpokePrefix `
  -RouteTable $routeTableSpokeDG | `
Set-AzVirtualNetwork

Creación de máquinas virtuales

Cree la carga de trabajo de radio y las máquinas virtuales locales, y colóquelas en las subredes adecuadas.

Creación de la máquina virtual de cargas de trabajo

Cree una máquina virtual en la red virtual de radio que ejecuta Internet Information Services (IIS), no tiene ninguna dirección IP pública y permite pings. Cuando se le solicite, escriba un nombre de usuario y una contraseña para la máquina virtual.

# Create an inbound network security group rule for ports 3389 and 80
$nsgRuleRDP = New-AzNetworkSecurityRuleConfig -Name Allow-RDP  -Protocol Tcp `
  -Direction Inbound -Priority 200 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix $SNSpokePrefix -DestinationPortRange 3389 -Access Allow
$nsgRuleWeb = New-AzNetworkSecurityRuleConfig -Name Allow-web  -Protocol Tcp `
  -Direction Inbound -Priority 202 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix $SNSpokePrefix -DestinationPortRange 80 -Access Allow

# Create a network security group
$nsg = New-AzNetworkSecurityGroup -ResourceGroupName $RG1 -Location $Location1 -Name NSG-Spoke02 -SecurityRules $nsgRuleRDP,$nsgRuleWeb

#Create the NIC
$NIC = New-AzNetworkInterface -Name spoke-01 -ResourceGroupName $RG1 -Location $Location1 -SubnetId $VnetSpoke.Subnets[0].Id -NetworkSecurityGroupId $nsg.Id

#Define the virtual machine
$VirtualMachine = New-AzVMConfig -VMName VM-Spoke-01 -VMSize "Standard_DS2"
$VirtualMachine = Set-AzVMOperatingSystem -VM $VirtualMachine -Windows -ComputerName Spoke-01 -ProvisionVMAgent -EnableAutoUpdate
$VirtualMachine = Add-AzVMNetworkInterface -VM $VirtualMachine -Id $NIC.Id
$VirtualMachine = Set-AzVMSourceImage -VM $VirtualMachine -PublisherName 'MicrosoftWindowsServer' -Offer 'WindowsServer' -Skus '2016-Datacenter' -Version latest

#Create the virtual machine
New-AzVM -ResourceGroupName $RG1 -Location $Location1 -VM $VirtualMachine -Verbose

#Install IIS on the VM
Set-AzVMExtension `
    -ResourceGroupName $RG1 `
    -ExtensionName IIS `
    -VMName VM-Spoke-01 `
    -Publisher Microsoft.Compute `
    -ExtensionType CustomScriptExtension `
    -TypeHandlerVersion 1.4 `
    -SettingString '{"commandToExecute":"powershell Add-WindowsFeature Web-Server"}' `
    -Location $Location1

#Create a host firewall rule to allow pings in
Set-AzVMExtension `
    -ResourceGroupName $RG1 `
    -ExtensionName IIS `
    -VMName VM-Spoke-01 `
    -Publisher Microsoft.Compute `
    -ExtensionType CustomScriptExtension `
    -TypeHandlerVersion 1.4 `
    -SettingString '{"commandToExecute":"powershell New-NetFirewallRule –DisplayName "Allow ICMPv4-In" –Protocol ICMPv4"}' `
    -Location $Location1

Creación de la máquina virtual local

Cree una máquina virtual sencilla que pueda usar para conectarse a través del acceso remoto a la dirección IP pública. Desde allí, puede conectarse al servidor local a través del firewall. Cuando se le solicite, escriba un nombre de usuario y una contraseña para la máquina virtual.

New-AzVm `
    -ResourceGroupName $RG1 `
    -Name "VM-Onprem" `
    -Location $Location1 `
    -VirtualNetworkName $VNetnameOnprem `
    -SubnetName $SNNameOnprem `
    -OpenPorts 3389 `
    -Size "Standard_DS2"

Nota:

Azure proporciona una dirección IP de acceso de salida predeterminada para las máquinas virtuales que no tienen asignada una dirección IP pública o están en el grupo back-end de un equilibrador de carga de Azure básico interno. El mecanismo de dirección IP de acceso de salida predeterminado proporciona una dirección IP de salida que no se puede configurar.

La dirección IP de acceso de salida predeterminada está deshabilitada cuando se produce uno de los siguientes eventos:

  • Se asigna una dirección IP pública a la máquina virtual.
  • La máquina virtual se coloca en el grupo back-end de un equilibrador de carga estándar, con o sin reglas de salida.
  • Se asigna un recurso de Azure NAT Gateway a la subred de la máquina virtual.

Las máquinas virtuales creadas mediante conjuntos de escalado de máquinas virtuales en modo de orquestación flexible no tienen acceso de salida predeterminado.

Para más información sobre las conexiones de salida en Azure, vea Acceso de salida predeterminado en Azure y Uso de traducción de direcciones de red (SNAT) de origen para conexiones de salida.

Probar el firewall

  1. Obtenga y anote la dirección IP privada de la máquina virtual de vm-spoke-01:

    $NIC.IpConfigurations.privateipaddress
    
  2. En Azure Portal, conéctese a la máquina virtual VM-Onprem.

  3. Abra un símbolo del sistema de Windows PowerShell en VM-Onprem y haga ping a la dirección IP privada de VM-spoke-01. Obtendrá una respuesta.

  4. Abra un explorador web en VM-Onprem y vaya a http://<VM-spoke-01 private IP>. La página predeterminada de IIS debería abrirse.

  5. Desde VM-Onprem, abra una conexión de acceso remoto a VM-spoke-01 en la dirección IP privada. Se realizará la conexión y podrá iniciar sesión con el nombre de usuario y la contraseña elegidos.

Ahora que ha comprobado que las reglas de firewall funcionan, puede hacer lo siguiente:

  • Haga ping al servidor en la red virtual de radio.
  • Vaya al servidor web en la red virtual de radio.
  • Conéctese al servidor de la red virtual de radio mediante RDP.

A continuación, ejecute el siguiente script para cambiar la acción de la colección de reglas de red de firewall a Deny:

$rcNet = $azfw.GetNetworkRuleCollectionByName("RCNet01")
$rcNet.action.type = "Deny"

Set-AzFirewall -AzureFirewall $azfw

Cierre las conexiones de acceso remoto existentes. Vuelva a ejecutar las pruebas para probar las reglas modificadas. Esta vez, todas producirán un error.

Limpieza de recursos

Puede mantener los recursos del firewall para el siguiente tutorial. Si ya no los necesita, elimine el grupo de recursos FW-Hybrid-Test para eliminar todos los recursos relacionados con el firewall.

Pasos siguientes

Supervisión de los registros de Azure Firewall