Compartir por


Configuración del acceso remoto a nodos de proceso en un grupo de Azure Batch

Si se configura, puede permitir que un usuario de nodo con conectividad de red se conecte externamente a un nodo de proceso de un grupo de Batch. Por ejemplo, un usuario puede conectarse mediante Escritorio remoto (RDP) en el puerto 3389 a un nodo de proceso en un grupo de Windows. Asimismo, de forma predeterminada, un usuario puede conectarse mediante Shell seguro (SSH) en el puerto 22 a un nodo de proceso en un grupo de Linux.

Nota:

A partir de la versión 2024-07-01 de la API (y de todos los grupos creados después del 30 de noviembre de 2025 independientemente de la versión de la API), Batch ya no asigna automáticamente los puertos comunes de acceso remoto para SSH y RDP. Si quiere permitir el acceso remoto a sus nodos de proceso de Batch con grupos creados con la versión de API 2024-07-01 o posterior (y después del 30 de noviembre de 2025), deberá configurar manualmente el punto de conexión del grupo para habilitar dicho acceso.

En su entorno, es posible que tenga que habilitar, restringir o deshabilitar la configuración de acceso externo u otros puertos que necesite en el Batch pool. Puede modificar esta configuración mediante las API de Batch para establecer la propiedad NetworkConfiguration .

Configuración del punto de conexión del grupo de Batch

La configuración de punto de conexión consta de uno o varios grupos de traducción de direcciones de red (NAT) de puertos front-end. No confunda un grupo NAT con el grupo de Batch de nodos de proceso. Configuras cada grupo NAT para invalidar la configuración de conexión predeterminada en los nodos de cómputo del grupo.

Cada configuración de grupo NAT incluye una o varias reglas de grupo de seguridad de red (NSG). Cada regla NSG permite o deniega cierto tráfico de red al punto de conexión. Puede elegir permitir o denegar todo el tráfico, el tráfico identificado por una etiqueta de servicio (por ejemplo, "Internet") o el tráfico procedente de subredes o direcciones IP específicas.

Consideraciones

  • La configuración de punto de conexión del grupo forma parte de la configuración de red del grupo. La configuración de red puede incluir, opcionalmente, una configuración para unir el grupo a una red virtual de Azure. Si configura el grupo en una red virtual, puede crear reglas NSG que usen la configuración de dirección de la red virtual.
  • Puede configurar varias reglas NSG al configurar un grupo NAT. Las reglas se comprueban por orden de prioridad. Una vez que se aplica una regla, no se comprueba si las demás coinciden.

Ejemplo: autorización del tráfico RDP procedente de una dirección IP específica

El siguiente fragmento de código de C# muestra cómo configurar el punto de conexión RDP en nodos de proceso de un grupo de Windows para permitir el acceso RDP solo desde la dirección IP 198.168.100.7. La segunda regla de NSG deniega el tráfico que no coincide con la dirección IP.

using System;
using Azure.Core;
using Azure.Identity;
using Azure.ResourceManager.Batch;
using Azure.ResourceManager.Batch.Models;

namespace AzureBatch
{
    public void SetPortsPool()
    {
        // get your azure access token, for more details of how Azure SDK get your access token, please refer to https://learn.microsoft.com/en-us/dotnet/azure/sdk/authentication?tabs=command-line
        TokenCredential cred = new DefaultAzureCredential();

        // authenticate your client
        ArmClient client = new ArmClient(cred);

        // this example assumes you already have this BatchAccountResource created on azure
        // for more information of creating BatchAccountResource, please refer to the document of BatchAccountResource
        string subscriptionId = "12345678-1234-1234-1234-123456789012";
        string resourceGroupName = "default-azurebatch-japaneast";
        string accountName = "sampleacct";
        ResourceIdentifier batchAccountResourceId = BatchAccountResource.CreateResourceIdentifier(subscriptionId, resourceGroupName, accountName);
        BatchAccountResource batchAccount = client.GetBatchAccountResource(batchAccountResourceId);

        // get the collection of this BatchAccountPoolResource
        BatchAccountPoolCollection collection = batchAccount.GetBatchAccountPools();

        // invoke the operation
        string poolName = "testpool";
        BatchAccountPoolData pool = new BatchAccountPoolData
        {
            VmSize = "STANDARD_D4",
            DeploymentVmConfiguration = new BatchVmConfiguration(new BatchImageReference
            {
                Publisher = "MicrosoftWindowsServer",
                Offer = "WindowsServer",
                Sku = "2016-Datacenter-SmallDisk",
                Version = "latest",
            }, "batch.node.windows amd64"),
            NetworkConfiguration = new BatchNetworkConfiguration
            {
                EndpointConfiguration = new PoolEndpointConfiguration(new BatchInboundNatPool[]
                {
                    new BatchInboundNatPool("RDP", BatchInboundEndpointProtocol.Tcp, 3389, 7500, 8000)
                    {
                        NetworkSecurityGroupRules =
                            {
                                new BatchNetworkSecurityGroupRule(179, BatchNetworkSecurityGroupRuleAccess.Allow, "198.168.100.7"),
                                new BatchNetworkSecurityGroupRule(180, BatchNetworkSecurityGroupRuleAccess.Deny, "*")
                            }
                    }
                }
            )
        };

        ArmOperation<BatchAccountPoolResource> lro = await collection.CreateOrUpdateAsync(WaitUntil.Completed, poolName, data);
        BatchAccountPoolResource result = lro.Value;

        // the variable result is a resource, you could call other operations on this instance as well
        // but just for demo, we get its data from this resource instance
        BatchAccountPoolData resourceData = result.Data;
    }
}

Ejemplo: autorización del tráfico SSH procedente de una subred específica

El siguiente fragmento de código Python muestra cómo configurar el punto de conexión SSH en nodos de proceso en un grupo de Linux para solo permitir el acceso de la subred 192.168.1.0/24. La segunda regla de NSG deniega el tráfico que no coincide con la subred.

from azure.identity import DefaultAzureCredential
from azure.mgmt.batch import BatchManagementClient
from azure.mgmt.batch import models as batchmodels

# Authenticate using DefaultAzureCredential
credential = DefaultAzureCredential()
subscription_id = "12345678-1234-1234-1234-123456789012"
client = BatchManagementClient(credential, subscription_id)

resource_group_name = "default-azurebatch-japaneast"
account_name = "sampleacct"
pool_name = "testpool"

pool_parameters = batchmodels.Pool(
    vm_size="STANDARD_D4",
    deployment_configuration=batchmodels.DeploymentConfiguration(
        virtual_machine_configuration=batchmodels.VirtualMachineConfiguration(
            image_reference=batchmodels.ImageReference(
                publisher="Canonical",
                offer="0001-com-ubuntu-server-jammy",
                sku="22_04-lts",
                version="latest"
            ),
            node_agent_sku_id="batch.node.ubuntu 22.04"
        )
    ),
    network_configuration=batchmodels.NetworkConfiguration(
        endpoint_configuration=batchmodels.PoolEndpointConfiguration(
            inbound_nat_pools=[batchmodels.InboundNatPool(
                name='SSH',
                protocol=batchmodels.InboundEndpointProtocol.TCP,
                backend_port=22,
                frontend_port_range_start=4000,
                frontend_port_range_end=4100,
                network_security_group_rules=[
                    batchmodels.NetworkSecurityGroupRule(
                        priority=170,
                        access=batchmodels.NetworkSecurityGroupRuleAccess.ALLOW,
                        source_address_prefix='192.168.1.0/24'
                    ),
                    batchmodels.NetworkSecurityGroupRule(
                        priority=175,
                        access=batchmodels.NetworkSecurityGroupRuleAccess.DENY,
                        source_address_prefix='*'
                    )
                ]
            )]
        )
    )
)

result = client.pool.create(
    resource_group_name=resource_group_name,
    account_name=account_name,
    pool_name=pool_name,
    parameters=pool_parameters
)

print(f"Pool '{result.name}' created successfully.")

Ejemplo: Denegar todo el tráfico RDP

El siguiente fragmento de código C# muestra cómo configurar el punto de conexión RDP en nodos de proceso de un grupo de Windows para denegar todo el tráfico de red. El punto de conexión utiliza un grupo de puertos front-end en el rango 60000 - 60099.

Nota:

A partir de la versión de Batch API 2024-07-01, el puerto 3389 normalmente asociado a RDP ya no se asigna de forma predeterminada. La creación de una regla de denegación explícita ya no es necesaria si no se necesita acceso desde Internet para grupos de Batch creados con esta versión de API o posterior. Es posible que tenga que especificar reglas de denegación explícitas para restringir el acceso desde otros orígenes.

using System;
using Azure.Core;
using Azure.Identity;
using Azure.ResourceManager.Batch;
using Azure.ResourceManager.Batch.Models;

namespace AzureBatch
{
    public void SetPortsPool()
    {
        // get your azure access token, for more details of how Azure SDK get your access token, please refer to https://learn.microsoft.com/en-us/dotnet/azure/sdk/authentication?tabs=command-line
        TokenCredential cred = new DefaultAzureCredential();

        // authenticate your client
        ArmClient client = new ArmClient(cred);

        // this example assumes you already have this BatchAccountResource created on azure
        // for more information of creating BatchAccountResource, please refer to the document of BatchAccountResource
        string subscriptionId = "12345678-1234-1234-1234-123456789012";
        string resourceGroupName = "default-azurebatch-japaneast";
        string accountName = "sampleacct";
        ResourceIdentifier batchAccountResourceId = BatchAccountResource.CreateResourceIdentifier(subscriptionId, resourceGroupName, accountName);
        BatchAccountResource batchAccount = client.GetBatchAccountResource(batchAccountResourceId);

        // get the collection of this BatchAccountPoolResource
        BatchAccountPoolCollection collection = batchAccount.GetBatchAccountPools();

        // invoke the operation
        string poolName = "testpool";
        BatchAccountPoolData pool = new BatchAccountPoolData
        {
            VmSize = "STANDARD_D4",
            DeploymentVmConfiguration = new BatchVmConfiguration(new BatchImageReference
            {
                Publisher = "MicrosoftWindowsServer",
                Offer = "WindowsServer",
                Sku = "2016-Datacenter-SmallDisk",
                Version = "latest",
            }, "batch.node.windows amd64"),
            NetworkConfiguration = new BatchNetworkConfiguration
            {
                EndpointConfiguration = new PoolEndpointConfiguration(new BatchInboundNatPool[]
                {
                    new BatchInboundNatPool("RDP", BatchInboundEndpointProtocol.Tcp, 3389, 60000, 60099)
                    {
                        NetworkSecurityGroupRules =
                        {
                            new BatchNetworkSecurityGroupRule(162, BatchNetworkSecurityGroupRuleAccess.Deny, "*")
                        }
                    }
                })
            }
        };

        ArmOperation<BatchAccountPoolResource> lro = await collection.CreateOrUpdateAsync(WaitUntil.Completed, poolName, pool);
        BatchAccountPoolResource result = lro.Value;

        // the variable result is a resource, you could call other operations on this instance as well
        // but just for demo, we get its data from this resource instance
        BatchAccountPoolData resourceData = result.Data;
    }
}

Ejemplo: denegación de todo el tráfico SSH procedente de Internet

El siguiente fragmento de código Python muestra cómo configurar el punto de conexión SSH en nodos de proceso en un grupo de Linux para denegar todo el tráfico de Internet. El punto de conexión utiliza un grupo de puertos front-end en el intervalo 4000 - 4100.

Nota:

A partir de la versión de Batch API 2024-07-01, el puerto 22 normalmente asociado a SSH ya no se asigna de forma predeterminada. La creación de una regla de denegación explícita ya no es necesaria si no se necesita acceso desde Internet para grupos de Batch creados con esta versión de API o posterior. Es posible que tenga que especificar reglas de denegación explícitas para restringir el acceso desde otros orígenes.

from azure.identity import DefaultAzureCredential
from azure.mgmt.batch import BatchManagementClient
from azure.mgmt.batch import models as batchmodels

# Authenticate using DefaultAzureCredential
credential = DefaultAzureCredential()
subscription_id = "12345678-1234-1234-1234-123456789012"
client = BatchManagementClient(credential, subscription_id)

resource_group_name = "default-azurebatch-japaneast"
account_name = "sampleacct"
pool_name = "testpool"

pool_parameters = batchmodels.Pool(
    vm_size="STANDARD_D4",
    deployment_configuration=batchmodels.DeploymentConfiguration(
        virtual_machine_configuration=batchmodels.VirtualMachineConfiguration(
            image_reference=batchmodels.ImageReference(
                publisher="Canonical",
                offer="0001-com-ubuntu-server-jammy",
                sku="22_04-lts",
                version="latest"
            ),
            node_agent_sku_id="batch.node.ubuntu 22.04"
        )
    ),
    network_configuration=batchmodels.NetworkConfiguration(
        endpoint_configuration=batchmodels.PoolEndpointConfiguration(
            inbound_nat_pools=[batchmodels.InboundNatPool(
                name='SSH',
                protocol=batchmodels.InboundEndpointProtocol.TCP,
                backend_port=22,
                frontend_port_range_start=4000,
                frontend_port_range_end=4100,
                network_security_group_rules=[
                    batchmodels.NetworkSecurityGroupRule(
                        priority=170,
                        access=batchmodels.NetworkSecurityGroupRuleAccess.DENY,
                        source_address_prefix='Internet'
                    )
                ]
            )]
        )
    )
)

result = client.pool.create(
    resource_group_name=resource_group_name,
    account_name=account_name,
    pool_name=pool_name,
    parameters=pool_parameters
)

print(f"Pool '{result.name}' created successfully.")

Pasos siguientes