Konfigurieren des Remotezugriffs auf Serverknoten in einem Azure Batch-Pool

Bei entsprechender Konfiguration können Sie einem Knotenbenutzer mit Netzwerkverbindung erlauben, eine externe Verbindung mit einem Serverknoten in einem Batch-Pool herzustellen. Beispielsweise kann ein Benutzer per Remote Desktop (RDP) auf Port 3389 eine Verbindung zu einem Computeknoten in einem Windows-Pool herstellen. Auf ähnliche Weise kann ein Benutzer standardmäßig per Secure Shell (SSH) auf Port 22 eine Verbindung zu einem Computeknoten in einem Linux-Pool herstellen.

Hinweis

Ab der API-Version 2024-07-01 (und aller Pools, die nach dem 30. November 2025 erstellt werden, unabhängig von der API-Version), ordnet Batch nicht mehr automatisch allgemeine Remotezugriffsports für SSH und RDP zu. Wenn Sie den Remotezugriff auf Ihre Batch-Computeknoten mit Pools zulassen möchten, die mit der API-Version 2024-07-01 oder höher (und nach dem 30 November 2025) erstellt wurden, müssen Sie den Pool-Endpunkt manuell konfigurieren, um diesen Zugriff zu aktivieren.

In Ihrer Umgebung müssen Sie möglicherweise Einstellungen für den externen Zugriff oder andere Ports, die Sie im Batch-Pool benötigen, aktivieren, einschränken oder deaktivieren. Sie können diese Einstellungen ändern, indem Sie die Batch-APIs verwenden, um die NetworkConfiguration-Eigenschaft festzulegen.

Konfiguration von Batch-Pool-Endpunkten

Die Endpunktkonfiguration besteht aus einem oder mehreren Pools für die Netzwerkadressübersetzung (NAT) von Front-End-Ports. Verwechseln Sie NAT-Pools nicht mit dem Batch-Pool von Serverknoten. Sie richten jeden NAT-Pool so ein, dass er die Standardverbindungseinstellungen auf den Rechnerknoten des Pools überschreibt.

Jede NAT-Pool-Konfiguration enthält eine oder mehrere Regeln für die Netzwerksicherheitsgruppe (NSG). Jede NSG-Regel erlaubt oder verweigert bestimmten Netzwerkdatenverkehr zum Endpunkt. Sie können den kompletten Datenverkehr, durch ein Diensttag (wie „Internet“) identifizierten Datenverkehr oder Datenverkehr von bestimmten IP-Adressen oder Subnetzen zulassen oder verweigern.

Überlegungen

  • Die Konfiguration des Poolendpunkts ist Teil der Netzwerkkonfiguration des Pools. Die Netzwerkkonfiguration kann optional Einstellungen zum Verknüpfen des Pools mit einem virtuellen Azure-Netzwerk enthalten. Wenn Sie den Pool in einem virtuellen Netzwerk einrichten, können Sie NSG-Regeln erstellen, die Adresseinstellungen im virtuellen Netzwerk verwenden.
  • Sie können mehrere NSG-Regeln konfigurieren, wenn Sie einen NAT-Pool konfigurieren. Die Regeln werden gemäß ihrer Priorität geprüft. Wenn eine Regel angewendet wird, werden keine weiteren Regeln mehr auf Übereinstimmung geprüft.

Beispiel: Zulassen von RDP-Datenverkehr von einer bestimmten IP-Adresse

Im folgenden C#-Codeschnipsel sehen Sie, wie Sie den RDP-Endpunkt auf Serverknoten in einem Windows-Pool konfigurieren müssen, um den RDP-Zugriff nur von der IP-Adresse 198.168.100.7 zu gestatten. Die zweite NSG-Regel verweigert Datenverkehr, der nicht mit der IP-Adresse übereinstimmt.

ArmClient armClient = new ArmClient(new DefaultAzureCredential());

        ResourceIdentifier batchAccountResourceId =
            BatchAccountResource.CreateResourceIdentifier("subscriptionId", "resourceGroupName", "accountName");
        BatchAccountResource batchAccount = armClient.GetBatchAccountResource(batchAccountResourceId);

        BatchAccountPoolCollection poolCollection = batchAccount.GetBatchAccountPools();

        BatchAccountPoolData poolData = new BatchAccountPoolData()
        {
            VmSize = "Standard_D2_v2",
            DeploymentConfiguration = new BatchDeploymentConfiguration()
            {
                VmConfiguration = new BatchVmConfiguration(
                    imageReference: new BatchImageReference()
                    {
                        Publisher = "canonical",
                        Offer = "0001-com-ubuntu-server-jammy",
                        Sku = "22_04-lts",
                        Version = "latest"
                    },
                    nodeAgentSkuId: "batch.node.ubuntu 22.04")
            },
            ScaleSettings = new BatchAccountPoolScaleSettings()
            {
                FixedScale = new BatchAccountFixedScaleSettings() { TargetDedicatedNodes = 2 }
            },
            NetworkConfiguration = new BatchNetworkConfiguration()
            {
                EndpointInboundNatPools =
                {
                    new BatchInboundNatPool(
                        name: "RDP",
                        protocol: BatchInboundEndpointProtocol.Tcp,
                        backendPort: 3389,
                        frontendPortRangeStart: 7500,
                        frontendPortRangeEnd: 8000)
                    {
                        NetworkSecurityGroupRules =
                        {
                            new BatchNetworkSecurityGroupRule(
                                priority: 179,
                                access: BatchNetworkSecurityGroupRuleAccess.Allow,
                                sourceAddressPrefix: "198.168.100.7"),
                            new BatchNetworkSecurityGroupRule(
                                priority: 180,
                                access: BatchNetworkSecurityGroupRuleAccess.Deny,
                                sourceAddressPrefix: "*")
                        }
                    }
                }
            }
        };

        ArmOperation<BatchAccountPoolResource> pool = await poolCollection.CreateOrUpdateAsync(
            WaitUntil.Completed, "myPool", poolData);

Beispiel: Zulassen von SSH-Datenverkehr aus einem bestimmten Subnetz

Im folgenden Python-Ausschnitt sehen Sie, wie Sie den SSH-Endpunkt auf Computeknoten in einem Linux-Pool konfigurieren müssen, um den Zugriff nur vom Subnetz 192.168.1.0/24 zu gestatten. Die zweite NSG-Regel verweigert Datenverkehr, der nicht mit dem Subnetz übereinstimmt.

from azure.batch import models

class AzureBatch(object):
    def set_ports_pool(self, **kwargs):
        pool.network_configuration = models.NetworkConfiguration(
            endpoint_configuration=models.BatchPoolEndpointConfiguration(
                inbound_nat_pools=[models.BatchInboundNatPool(
                    name='SSH',
                    protocol=models.InboundEndpointProtocol.TCP,
                    backend_port=22,
                    frontend_port_range_start=4000,
                    frontend_port_range_end=4100,
                    network_security_group_rules=[
                        models.NetworkSecurityGroupRule(
                            priority=170,
                            access=models.NetworkSecurityGroupRuleAccess.ALLOW,
                            source_address_prefix='192.168.1.0/24'
                        ),
                        models.NetworkSecurityGroupRule(
                            priority=175,
                            access=models.NetworkSecurityGroupRuleAccess.DENY,
                            source_address_prefix='*'
                        )
                    ]
                )
                ]
            )
        )
    ),
    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.")

Beispiel: Blockieren des gesamten RDP-Verkehrs

Im folgenden C#-Codeausschnitt sehen Sie, wie Sie den RDP-Endpunkt auf Computeknoten in einem Windows-Pool konfigurieren müssen, um sämtlichen Netzwerkdatenverkehr zu verweigern. Der Endpunkt verwendet einen Pool an Front-End-Ports im Bereich 60000–60099.

Hinweis

Ab der Batch-API-Version 2024-07-01 ist Port 3389, der normalerweise RDP zugeordnet ist, nicht mehr standardmäßig zugeordnet. Das Erstellen einer expliziten Verweigerungsregel ist nicht mehr erforderlich, wenn kein Zugriff über das Internet für Batch-Pools erforderlich ist, die mit dieser API-Version oder einer höheren Version erstellt wurden. Möglicherweise müssen Sie dennoch explizite Verweigerungsregeln angeben, um den Zugriff von anderen Quellen einzuschränken.

ArmClient armClient = new ArmClient(new DefaultAzureCredential());

        ResourceIdentifier batchAccountResourceId =
            BatchAccountResource.CreateResourceIdentifier("subscriptionId", "resourceGroupName", "accountName");
        BatchAccountResource batchAccount = armClient.GetBatchAccountResource(batchAccountResourceId);

        BatchAccountPoolCollection poolCollection = batchAccount.GetBatchAccountPools();

        BatchAccountPoolData poolData = new BatchAccountPoolData()
        {
            VmSize = "Standard_D2_v2",
            DeploymentConfiguration = new BatchDeploymentConfiguration()
            {
                VmConfiguration = new BatchVmConfiguration(
                    imageReference: new BatchImageReference()
                    {
                        Publisher = "canonical",
                        Offer = "0001-com-ubuntu-server-jammy",
                        Sku = "22_04-lts",
                        Version = "latest"
                    },
                    nodeAgentSkuId: "batch.node.ubuntu 22.04")
            },
            ScaleSettings = new BatchAccountPoolScaleSettings()
            {
                FixedScale = new BatchAccountFixedScaleSettings() { TargetDedicatedNodes = 2 }
            },
            NetworkConfiguration = new BatchNetworkConfiguration()
            {
                EndpointInboundNatPools =
                {
                    new BatchInboundNatPool(
                        name: "RDP",
                        protocol: BatchInboundEndpointProtocol.Tcp,
                        backendPort: 3389,
                        frontendPortRangeStart: 60000,
                        frontendPortRangeEnd: 60099)
                    {
                        NetworkSecurityGroupRules =
                        {
                            new BatchNetworkSecurityGroupRule(
                                priority: 162,
                                access: BatchNetworkSecurityGroupRuleAccess.Deny,
                                sourceAddressPrefix: "*")
                        }
                    }
                }
            }
        };

        ArmOperation<BatchAccountPoolResource> pool = await poolCollection.CreateOrUpdateAsync(
            WaitUntil.Completed, "myPool", poolData);

Beispiel: Verweigern des gesamten SSH-Datenverkehrs aus dem Internet

Im folgenden Python-Ausschnitt sehen Sie, wie Sie den SSH-Endpunkt auf Computeknoten in einem Linux-Pool konfigurieren müssen, um sämtlichen Internetdatenverkehr zu verweigern. Der Endpunkt verwendet einen Pool an Front-End-Ports im Bereich 4000–4100.

Hinweis

Ab der Batch-API-Version 2024-07-01 wird Port 22, der typischerweise SSH zugeordnet ist, nicht mehr standardmäßig gemappt. Das Erstellen einer expliziten Verweigerungsregel ist nicht mehr erforderlich, wenn kein Zugriff über das Internet für Batch-Pools erforderlich ist, die mit dieser API-Version oder einer höheren Version erstellt wurden. Möglicherweise müssen Sie dennoch explizite Verweigerungsregeln angeben, um den Zugriff von anderen Quellen einzuschränken.

from azure.batch import models

class AzureBatch(object):
    def set_ports_pool(self, **kwargs):
        pool.network_configuration = models.NetworkConfiguration(
            endpoint_configuration=models.BatchPoolEndpointConfiguration(
                inbound_nat_pools=[models.BatchInboundNatPool(
                    name='SSH',
                    protocol=models.InboundEndpointProtocol.TCP,
                    backend_port=22,
                    frontend_port_range_start=4000,
                    frontend_port_range_end=4100,
                    network_security_group_rules=[
                        models.NetworkSecurityGroupRule(
                            priority=170,
                            access=models.NetworkSecurityGroupRuleAccess.DENY,
                            source_address_prefix='Internet'
                        )
                    ]
                )
                ]
            )
        )
    ),
    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.")

Nächste Schritte