Blog

Alle IP-Adressen eines CIDR-Blocks mit Terraform abrufen

Laurens Knoll

Laurens Knoll

Aktualisiert Oktober 17, 2025
3 Minuten

CIDR-Blöcke geben IP-Bereiche an. Was aber, wenn Ihr Dienst eine Liste von IPs benötigt? In diesem Blog stelle ich Ihnen das Terraform-Modul CIDR expand vor, mit dem Sie alle IP-Adressen für einen CIDR-Block erhalten.

Terraform CIDR-Erweiterungsmodul

Das CIDR-Erweiterungsmodul nutzt die Funktion cidrhost, um IP-Adressen zu erzeugen. Die Funktion nimmt einen CIDR-Block und eine Hostnummer entgegen und gibt die zugehörige IP-Adresse zurück. Da wir alle IP-Adressen benötigen, rufen wir die Funktion cidrhost für jede Hostnummer auf.

Sie interessieren sich nur für die Start- und End-IP? Lesen Sie in diesem Blog-Beitrag, wie Sie cidrhost dafür verwenden können.

locals {
  cidr         = "192.168.0.0/24"
  ip_addresses = [ for host_number in [0, 1, 2, ..] : cidrhost(local.cidr, host_number) ]
}

Mit der Möglichkeit, IP-Adressen zu generieren, aktualisieren wir den Code, um die durch das CIDR-Präfix festgelegte Anzahl von Adressen zu generieren. Das CIDR-Präfix liegt zwischen (alle Adressen) und (eine einzelne Adresse) für IPv4. Da die Anzahl der Adressen eine Potenz von 2 ist (1, 2, 4, ...), verwenden wir die Funktion pow.

Beachten Sie, dass das Präfix die Anzahl der CIDR-Blöcke angibt, z.B. /32 hat 2 ^ 32 Blöcke. Verwenden Sie 2 ^ (32 - prefix), um die Anzahl der Adressen pro Block zu ermitteln.

locals {
  cidr         = "192.168.0.0/24"
  cidr_prefix  = "24"

  host_numbers = range(pow(2, 32 - local.cidr_prefix))
  ip_addresses = [ for host_number in local.host_numbers : cidrhost(local.cidr, host_number) ]
}

Die letzte Herausforderung besteht darin, die eingegebene CIDR zu analysieren. Zum Glück können wir die Terraform-Validierungen und die Funktion cidrhost nutzen, um dies zu bewältigen.

variable "cidr" {
  description = "The IP address range in CIDR notation. Required format: '0.0.0.0/0'"
  type        = string

  validation {
    condition     = try(cidrhost(var.cidr, 0), null) != null
    error_message = "The IP address range is invalid. Must be of format '0.0.0.0/0'."
  }
}

locals {
  cidr_prefix  = split("/", var.cidr)[1]

  host_numbers = range(pow(2, 32 - local.cidr_prefix))
  ip_addresses = [ for host_number in local.host_numbers : cidrhost(var.cidr, host_number) ]
}

Terraform CIDR Expand Modul Verwendung

Das Modul ist über GitHub verfügbar. Verwenden Sie es in Ihrer Terraform-Konfiguration mit dem folgenden Schnipsel.

module "cidr_expand" {
  source = "git::https:/github.com/binxio/terraform-cidr-expand.git?ref=1.0.0"

  cidr = "192.168.0.0/28"
}

output "cidr_expand_ip_addresses" {
  description = "IP addresses in CIDR-block."
  value       = module.cidr_expand.ip_addresses
}

Google Cloud DNS Beispiel

Dieses Beispiel konfiguriert DNS-Einträge für den privaten Google-API-Zugang unter Verwendung der eingeschränkten virtuellen IP (restricted.googleapis.com). Da die DNS A-Eintragsdaten feste IP-Adressen erfordern, wird CIDR-expand verwendet.

module "cidr_restricted_googleapis" {
  source = "git::https:/github.com/binxio/terraform-cidr-expand.git?ref=1.0.0"

  cidr = "199.36.153.4/30"
}

# NOTE: This example is limited to 'googleapis.com'. Make sure to include other
#       google service domains as well, https://cloud.google.com/vpc/docs/configure-private-google-access#config
resource "google_dns_record_set" "googleapis_com_base" {
  project      = var.project_id
  managed_zone = google_dns_managed_zone.googleapis_com.name
  name         = "restricted.googleapis.com."
  type         = "A"
  ttl          = 300
  rrdatas      = module.cidr_restricted_googleapis.ip_addresses
}

resource "google_dns_record_set" "googleapis_com_redirect" {
  project      = var.project_id
  managed_zone = google_dns_managed_zone.googleapis_com.name
  name         = "*.googleapis.com."
  type         = "CNAME"
  ttl          = 300
  rrdatas      = ["restricted.googleapis.com."]
}

resource "google_dns_managed_zone" "googleapis_com" {
  project  = var.project_id
  name     = "googleapis-com"
  dns_name = "googleapis.com"

  visibility = "private"

  private_visibility_config {
    networks {
      network_url = var.network_id
    }
  }
}

Diskussion

Angesichts der Einfachheit der Implementierung frage ich mich, warum es dafür keine integrierte Funktion gibt. Dies verbessert die Leistung und die Benutzerfreundlichkeit erheblich. Die tatsächlichen Anwendungsfälle sind jedoch begrenzt. Dennoch habe ich dieses Modul entwickelt, um eine einheitliche IP-Abstraktion zu haben: die CIDR-Notation. Diese Abstraktion macht es einfach, meine Terraform-Module zu entwerfen und IP-Beschränkungen weiterzugeben.

Fazit

Das Modul CIDR expand ergänzt die Funktion cidrhost, indem es alle IP-Adressen auflistet.

Verfasst von

Laurens Knoll

As a cloud consultant I enjoy improving what your company does best. I enable your business using cloud technology and enable your engineers by applying software engineering practices to your infrastructure domain.

Contact

Let’s discuss how we can support your journey.