Post

Terraform: Configurando a saída de internet de VMs com Azure NAT Gateway

Terraform: Configurando a saída de internet de VMs com Azure NAT Gateway

Olá pessoal! Blz?

Nesse artigo quero trazer a vocês a implementação do Azure NAT Gateway através do Terraform, usaremos em cenários onde precisamos de uma conexão com a internet e não queremos adicionar um IP público a máquina virtual ou colocá-la atrás de um Load Balancer (balanceador de carga), isso porque recentemente a Microsoft anunciou que irá retirar a saída padrão de internet nas máquinas virtuais no Microsoft Azure, a data prevista para a retirada será 30 de setembro de 2025 e você pode ler aqui esse anúncio, portanto, as máquinas virtuais criadas a partir dessa data não terão conectividade com a Internet e, se você precisar disso, precisará configurá-lo explicitamente.

O acesso explícito pode ser permitido através de firewalls de terceiros, por exemplo, Palo Alto, CheckPoint, Fortinet, etc, mas o Azure também fornece vários serviços que podem ajudar a controlar a conectividade de saída nativamente através dos seguintes serviços:

  • Máquinas virtuais com endereços IP públicos associados a elas.
  • Criado dentro de uma sub-rede associada a um gateway NAT.
  • No pool de backend de um balanceador de carga padrão com regras de saída definidas.
  • No pool de backend de um balanceador de carga público básico.

Segue uma imagem da documentação da Microsoft para ilustrar melhor:

outbound-internet-azure

Como mencionado acima, podemos ter o acesso a internet através de um Firewall ou um NVA (Network Virtual Appliance), isso é comum em ambientes corporativos onde temos uma estrutura de rede no formato HUB-SPOKE posicionando o Firewall/NVA na rede HUB e todo o tráfego de internet dos recursos que estão posicionados na rede spoke é direcionado para a rede hub através de uma route table. Com isso o controle de acesso a internet é administrado por esse recurso de maneira centralizada.

Arquitetura proposta

Nesse artigo teremos algo mais simples, iremos configurar as máquinas virtuais para se conectarem a internet (outbound traffic) através de um Azure NAT Gateway e criar toda a infraestrutura através do Terraform, a arquitetura final será a seguinte:

outbound-internet-azure

O que é o Azure NAT Gateway?

O Azure NAT Gateway é um serviço de conversão de endereços de rede (NAT) e é uma ótima solução para as máquinas virtuais que exigem apenas conectividade de saída.

Você pode usar o Azure NAT Gateway para permitir que todas as instâncias em uma subnet privada se conectem à Internet, mantendo-se totalmente privadas. Conexões de entrada vindas da Internet não são permitidas e somente os pacotes que chegam como pacotes de resposta a uma conexão de saída podem passar por um NAT Gateway.

Para a conectividade com a internet você deve associar ao Azure NAT Gateway um IP público ou um conjunto de IPs públicos (Prefix Public IP).

Terraform para infraestrutura de Redes

No script Terraform abaixo iremos criar a infraestrutura de rede necessária para o nosso propósito:

  • Rede virtual e subnets
  • NAT Gateway
  • IP público para associar ao NAT Gateway
  • Associar os recursos (IP púbico com o NAT Gateway e o NAT Gateway cm a subnet)

Não iremos usar variáveis no Terraform para o script abaixo ficar mais curto.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
resource "azurerm_resource_group" "rg" {
  name = "rg-lab-nat-gateway"
  location = "eastus2"
}

resource "azurerm_virtual_network" "vnet" {
  name                =  "vnet-lab-nat-gateway"
  address_space       = ["192.168.0.0/16"]
  resource_group_name = azurerm_resource_group.rg.name
  location = azurerm_resource_group.rg.location 
}

locals {
  subnets = {
    "snet-vms" = {
      address_prefix = ["192.168.0.0/24"]
    },
    "snet-app" = {
      address_prefix = ["192.168.1.0/24"]
    },
    "snet-pve" = {
      address_prefix = ["192.168.2.0/24"]
    }
  }
}

resource "azurerm_subnet" "subnet" {
  for_each             = local.subnets
  name                 = each.key
  address_prefixes     = each.value.address_prefix

  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.vnet.name
}

resource "azurerm_public_ip" "public_ip" {
  name                = "pip-nat-gateway-vms"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  allocation_method   = "Static"
  sku                 = "Standard"
}

resource "azurerm_nat_gateway" "nat_gateway" {
  name                = "nat-gateway-vms"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

resource "azurerm_nat_gateway_public_ip_association" "nat_public_ip" {
  nat_gateway_id       = azurerm_nat_gateway.nat_gateway.id
  public_ip_address_id = azurerm_public_ip.public_ip.id
}

resource "azurerm_subnet_nat_gateway_association" "subnet_nat_gateway" {
  subnet_id      = azurerm_subnet.subnet["snet-vms"].id
  nat_gateway_id = azurerm_nat_gateway.nat_gateway.id
}

Recursos criados

Com a execução do script temos os recursos criados e associados, na imagem abaixo temos as subnets que estão associadas com o Azure NAT Gateway, para esse exemplo associamos somente a subnet snet-vms, mas para associar outras subnets é só selecionar o “checkbox” da subnet que deseja associar.

outbound-internet-azure


Você pode consultar qual foi o IP público associado ao Azure NAT Gateway, será esse IP que as máquinas virtuais irão usar para acessar a internet.

outbound-internet-azure


Com uma máquina virtual criada na subnet (snet-vms) que associamos o Azure NAT Gateway testamos qual IP público está sendo usado para saída de internet e podemos ver que realmente foi o IP público que associamos ao NAT Gateway:

outbound-internet-azure

Concluindo!

O uso do Azure NAT Gateway é um bom recurso para ambientes menores e que querem manter uma saída para a internet, mas é um recurso “caro”, mas às vezes e dependendo do ambiente é melhor o uso do NAT Gateway por nao ter um trabalho de administração, onde você manter um firewall precisa de muito acompanhamento e administração.

Bom pessoal, eu tenho usado isso em alguns ambientes e acredito que possa ser bem útil a vocês!

Artigos relacionados

O que é o Azure NAT Gateway

Acesso de saída padrão no Azure

Compartilhe o artigo com seus amigos clicando nos icones abaixo!!!

Este post está licenciado sob CC BY 4.0 e pelo autor.