---
title: "Пример создания инфраструктуры с облачным файрволом через Terraform"
sidebar_label: "Пример создания инфраструктуры с файрволом"
description: "Как создать облачный файрвол, облачный сервер в подсети, закрытой файрволом, и облачный сервер в не закрытой файрволом подсети"
sidebar_position: 2
---

import Formbricks from '@theme/MDXComponents/Formbricks'
import ConfigureProviders from '@site/terraform/_partials/common/configure-providers.mdx'
import ConfigureProvidersConfig from '@site/terraform/_partials/common/configure-providers-config.mdx'
import CreateEgressPolicy from '@site/terraform/_partials/cloud-firewalls/create-egress-policy.mdx'
import CreateIngressPolicy from '@site/terraform/_partials/cloud-firewalls/create-ingress-policy.mdx'
import CreateResourcesAlert from '@site/terraform/_partials/common/create-resources-alert.mdx'

# Пример создания инфраструктуры с облачным файрволом через Terraform

Это пример создания инфраструктуры, которая состоит:

* из приватной подсети `192.168.199.0/24`, в которой находится облачный файрвол, назначенный на порт облачного роутера `192.168.199.1`;
* приватной подсети `10.20.30.0/24`, не закрытой файрволом;
* разрешающего правила на файрволе для исходящего трафика из подсети `192.168.199.0/24` в `10.20.30.0/24`;
* облачного сервера в подсети `192.168.199.0/24`;
* облачного сервера в подсети `10.20.30.0/24`.

<br />

<CreateResourcesAlert />

<br />

1. Опционально: [настройте провайдеры](#configure-providers).
2. [Создайте приватные сети и подсети](#create-networks).
3. [Создайте облачный роутер, подключенный к интернету](#create-router).
4. [Создайте облачный файрвол](#create-cloud-firewall).
5. [Создайте облачный сервер в приватной подсети, закрытой файрволом](#create-protected-server).
6. [Создать облачный сервер в приватной подсети, не закрытой файрволом](#create-unprotected-server).

## Конфигурационные файлы \{#config}

<details>
  <summary>Пример файла для настройки провайдеров</summary>

  <ConfigureProvidersConfig />
</details>

<details>
  <summary>Пример файла для создания инфраструктуры с облачным файрволом</summary>

  ```hcl
  resource "openstack_networking_network_v2" "protected_network_1" {
    name           = "protected-network"
    admin_state_up = "true"
  }

  resource "openstack_networking_subnet_v2" "protected_subnet_1" {
    name       = "protected-subnet"
    network_id = openstack_networking_network_v2.protected_network_1.id
    cidr       = "192.168.199.0/24"
  }

  resource "openstack_networking_network_v2" "unprotected_network_1" {
    name           = "unprotected-network"
    admin_state_up = "true"
  }

  resource "openstack_networking_subnet_v2" "unprotected_subnet_1" {
    name       = "unprotected-subnet"
    network_id = openstack_networking_network_v2.unprotected_network_1.id
    cidr       = "10.20.30.0/24"
  }

  data "openstack_networking_network_v2" "external_network_1" {
    external = true
  }

  resource "openstack_networking_router_v2" "router_1" {
    name                = "router"
    admin_state_up      = true
    external_network_id = data.openstack_networking_network_v2.external_network_1.id
  }

  resource "openstack_networking_router_interface_v2" "protected_router_interface_1" {
    router_id = openstack_networking_router_v2.router_1.id
    subnet_id = openstack_networking_subnet_v2.protected_subnet_1.id
  }

  resource "openstack_networking_router_interface_v2" "unprotected_router_interface_1" {
    router_id = openstack_networking_router_v2.router_1.id
    subnet_id = openstack_networking_subnet_v2.unprotected_subnet_1.id
  }

  resource "openstack_fw_rule_v2" "rule_1" {
    name     = "allow-protected-network-traffic-rule"
    action   = "allow"
    protocol = "icmp"
  }

  resource "openstack_fw_rule_v2" "rule_2" {
    name                   = "allow-protected-network-traffic-rule"
    action                 = "allow"
    protocol               = "tcp"
    source_ip_address      = "192.168.199.0/24"
    destination_ip_address = "10.20.30.0/24"
  }

  resource "openstack_fw_policy_v2" "firewall_policy_1" {
    name        = "ingress-firewall-policy"
    audited     = true
    rules       = [
      openstack_fw_rule_v2.rule_1.id,
    ]
  }

  resource "openstack_fw_policy_v2" "firewall_policy_2" {
    name        = "egress-firewall-policy"
    audited     = true
    rules       = [
      openstack_fw_rule_v2.rule_2.id,
    ]
  }

  resource "openstack_fw_group_v2" "group_1" {
    name                       = "group"
    admin_state_up             = true
    ingress_firewall_policy_id = openstack_fw_policy_v2.firewall_policy_1.id
    egress_firewall_policy_id  = openstack_fw_policy_v2.firewall_policy_2.id
    ports                      = [
      openstack_networking_router_interface_v2.protected_router_interface_1.port_id,
    ]
  }

  resource "selectel_vpc_keypair_v2" "keypair_protected_1" {
    name       = "keypair-protected"
    public_key = file("~/.ssh/id_rsa.pub")
    user_id    = selectel_iam_serviceuser_v1.serviceuser_1.id
  }

  resource "openstack_networking_port_v2" "port_protected_1" {
    name       = "port-protected"
    network_id = openstack_networking_network_v2.protected_network_1.id

    fixed_ip {
      subnet_id = openstack_networking_subnet_v2.protected_subnet_1.id
    }
  }

  data "openstack_images_image_v2" "image_protected_1" {
    name        = "Ubuntu 20.04 LTS 64-bit"
    most_recent = true
    visibility  = "public"
  }

  resource "openstack_blockstorage_volume_v3" "volume_protected_1" {
    name                 = "boot-volume-for-protected-server"
    size                 = "5"
    image_id             = data.openstack_images_image_v2.image_protected_1.id
    volume_type          = "fast.ru-9a"
    availability_zone    = "ru-9a"
    enable_online_resize = true

    lifecycle {
      ignore_changes = [image_id]
    }

  }

  resource "openstack_compute_instance_v2" "protected_server_1" {
    name              = "protected-server"
    flavor_id         = "1015"
    key_pair          = selectel_vpc_keypair_v2.keypair_protected_1.name
    availability_zone = "ru-9a"

    network {
      port = openstack_networking_port_v2.port_protected_1.id
    }

    lifecycle {
      ignore_changes = [image_id]
    }

    block_device {
      uuid             = openstack_blockstorage_volume_v3.volume_protected_1.id
      source_type      = "volume"
      destination_type = "volume"
      boot_index       = 0
    }

    vendor_options {
      ignore_resize_confirmation = true
    }
  }

  resource "selectel_vpc_keypair_v2" "keypair_unprotected_1" {
    name       = "keypair-unprotected"
    public_key = file("~/.ssh/id_rsa.pub")
    user_id    = selectel_iam_serviceuser_v1.serviceuser_1.id
  }

  resource "openstack_networking_port_v2" "port_unprotected_1" {
    name       = "port-unprotected"
    network_id = openstack_networking_network_v2.unprotected_network_1.id

    fixed_ip {
      subnet_id = openstack_networking_subnet_v2.unprotected_subnet_1.id
    }
  }

  data "openstack_images_image_v2" "image_unprotected_1" {
    name        = "Ubuntu 20.04 LTS 64-bit"
    most_recent = true
    visibility  = "public"
  }

  resource "openstack_blockstorage_volume_v3" "volume_unprotected_1" {
    name                 = "boot-volume-for-unprotected-server"
    size                 = "5"
    image_id             = data.openstack_images_image_v2.image_unprotected_1.id
    volume_type          = "fast.ru-9a"
    availability_zone    = "ru-9a"
    enable_online_resize = true

    lifecycle {
      ignore_changes = [image_id]
    }

  }

  resource "openstack_compute_instance_v2" "unprotected_server_1" {
    name              = "unprotected-server"
    flavor_id         = "1015"
    key_pair          = selectel_vpc_keypair_v2.keypair_unprotected_1.name
    availability_zone = "ru-9a"

    network {
      port = openstack_networking_port_v2.port_unprotected_1.id
    }

    lifecycle {
      ignore_changes = [image_id]
    }

    block_device {
      uuid             = openstack_blockstorage_volume_v3.volume_unprotected_1.id
      source_type      = "volume"
      destination_type = "volume"
      boot_index       = 0
    }

    vendor_options {
      ignore_resize_confirmation = true
    }
  }
  ```
</details>

## 1. Опционально: настроить провайдеры \{#configure-providers}

Если вы [настроили провайдеры](/terraform/configure-terraform-environment/#configure-providers) Selectel и OpenStack, пропустите этот шаг.

<ConfigureProviders />

## 2. Создать приватные сети и подсети \{#create-networks}

1. [Создайте сеть и подсеть, которые будут закрыты файрволом](#create-protected-network).
2. [Создайте сеть и подсеть, которые не будут закрыты файрволом](#create-unprotected-network).

### 1. Создать сеть и подсеть, которые будут закрыты файрволом \{#create-protected-network}

```hcl
resource "openstack_networking_network_v2" "protected_network_1" {
  name           = "protected-network"
  admin_state_up = "true"
}

resource "openstack_networking_subnet_v2" "protected_subnet_1" {
  name       = "protected-subnet"
  network_id = openstack_networking_network_v2.protected_network_1.id
  cidr       = "192.168.199.0/24"
}
```

Здесь `cidr` — CIDR приватной подсети, которая будет закрыта файрволом, например `192.168.199.0/24`.

Посмотрите подробное описание ресурсов:

* [openstack\_networking\_network\_v2](/terraform/openstack-provider-reference/networking-neutron/resources/openstack_networking_network_v2/);
* [openstack\_networking\_subnet\_v2](/terraform/openstack-provider-reference/networking-neutron/resources/openstack_networking_subnet_v2/).

### 2. Создать сеть и подсеть, которые не будут закрыты файрволом \{#create-unprotected-network}

```hcl
resource "openstack_networking_network_v2" "unprotected_network_1" {
  name           = "unprotected-network"
  admin_state_up = "true"
}

resource "openstack_networking_subnet_v2" "unprotected_subnet_1" {
  name       = "unprotected-subnet"
  network_id = openstack_networking_network_v2.unprotected_network_1.id
  cidr       = "10.20.30.0/24"
}
```

Здесь `cidr` — CIDR приватной подсети, которая будет не закрыта файрволом, например `10.20.30.0/24`.

Посмотрите подробное описание ресурсов:

* [openstack\_networking\_network\_v2](/terraform/openstack-provider-reference/networking-neutron/resources/openstack_networking_network_v2/);
* [openstack\_networking\_subnet\_v2](/terraform/openstack-provider-reference/networking-neutron/resources/openstack_networking_subnet_v2/).

## 3. Создать облачный роутер, подключенный к интернету \{#create-router}

Облачный роутер, подключенный к интернету, выполняет функцию 1:1 NAT для доступа из приватной сети в интернет через публичный IP-адрес роутера.

```hcl
data "openstack_networking_network_v2" "external_network_1" {
  external = true
}

resource "openstack_networking_router_v2" "router_1" {
  name                = "router"
  admin_state_up      = true
  external_network_id = data.openstack_networking_network_v2.external_network_1.id
}

resource "openstack_networking_router_interface_v2" "protected_router_interface_1" {
  router_id = openstack_networking_router_v2.router_1.id
  subnet_id = openstack_networking_subnet_v2.protected_subnet_1.id
}

resource "openstack_networking_router_interface_v2" "unprotected_router_interface_1" {
  router_id = openstack_networking_router_v2.router_1.id
  subnet_id = openstack_networking_subnet_v2.unprotected_subnet_1.id
}
```

Посмотрите подробное описание ресурсов:

* [openstack\_networking\_network\_v2](/terraform/openstack-provider-reference/networking-neutron/resources/openstack_networking_network_v2/);
* [openstack\_networking\_router\_v2](/terraform/openstack-provider-reference/networking-neutron/resources/openstack_networking_router_v2/);
* [openstack\_networking\_router\_interface\_v2](/terraform/openstack-provider-reference/networking-neutron/resources/openstack_networking_router_interface_v2/).

## 4. Создать облачный файрвол \{#create-cloud-firewall}

1. [Создайте правила](#create-rules).
2. [Создайте политику для входящего трафика](#create-ingress-policy).
3. [Создайте политику для исходящего трафика](#create-egress-policy).
4. [Создайте облачный файрвол](#create-firewall).

### 1. Создать правила \{#create-rules}

У облачного файрвола есть базовое свойство: весь входящий и исходящий трафик, который не разрешен, — запрещен.

Пока вы не добавите разрешающие правила, будут запрещены:

* трафик, входящий в приватную подсеть, которая подключена к роутеру;
* трафик, исходящий из этой подсети.

```hcl
resource "openstack_fw_rule_v2" "rule_1" {
  name     = "allow-protected-network-traffic-rule"
  action   = "allow"
  protocol = "icmp"
}

resource "openstack_fw_rule_v2" "rule_2" {
  name                   = "allow-protected-network-traffic-rule"
  action                 = "allow"
  protocol               = "tcp"
  source_ip_address      = "192.168.199.0/24"
  destination_ip_address = "10.20.30.0/24"
}
```

Посмотрите подробное описание ресурса [openstack\_fw\_rule\_v2](/terraform/openstack-provider-reference/fwaas-neutron/resources/openstack_fw_rule_v2/).

### 2. Создать политику для входящего трафика \{#create-ingress-policy}

<CreateIngressPolicy />

### 3. Создать политику для исходящего трафика \{#create-egress-policy}

<CreateEgressPolicy />

### 4. Создать облачный файрвол \{#create-firewall}

```hcl
resource "openstack_fw_group_v2" "group_1" {
  name                       = "group"
  admin_state_up             = true
  ingress_firewall_policy_id = openstack_fw_policy_v2.firewall_policy_1.id
  egress_firewall_policy_id  = openstack_fw_policy_v2.firewall_policy_2.id
  ports                      = [
    openstack_networking_router_interface_v2.protected_router_interface_1.port_id,
  ]
}
```

Посмотрите подробное описание ресурса [openstack\_fw\_group\_v2](/terraform/openstack-provider-reference/fwaas-neutron/resources/openstack_fw_group_v2/).

## 5. Создать облачный сервер в приватной подсети, закрытой файрволом \{#create-protected-server}

1. [Создайте пару SSH-ключей](#create-ssh-keypair-for-protected).
2. [Создайте порт для облачного сервера](#create-port-for-protected).
3. [Получите образ](#get-image-for-protected).
4. [Создайте загрузочный сетевой диск](#create-boot-volume-for-protected).
5. [Создайте облачный сервер](#create-server-for-protected).

### 1. Создать пару SSH-ключей \{#create-ssh-keypair-for-protected}

```hcl
resource "selectel_vpc_keypair_v2" "keypair_protected_1" {
  name       = "keypair-protected"
  public_key = file("~/.ssh/id_rsa.pub")
  user_id    = selectel_iam_serviceuser_v1.serviceuser_1.id
}
```

Здесь `public_key` — путь до публичного SSH-ключа. Если SSH-ключи не созданы, [сгенерируйте их](/cloud-servers/manage/create-and-place-ssh-key/#create-ssh-keys).

Посмотрите подробное описание ресурса [selectel\_vpc\_keypair\_v2](/terraform/selectel-provider-reference/resources/vpc_keypair_v2/).

### 2. Создать порт для облачного сервера \{#create-port-for-protected}

```hcl
resource "openstack_networking_port_v2" "port_protected_1" {
  name       = "port-protected"
  network_id = openstack_networking_network_v2.protected_network_1.id

  fixed_ip {
    subnet_id = openstack_networking_subnet_v2.protected_subnet_1.id
  }
}
```

Посмотрите подробное описание ресурса [openstack\_networking\_port\_v2](/terraform/openstack-provider-reference/networking-neutron/resources/openstack_networking_port_v2/).

### 3. Получить образ \{#get-image-for-protected}

```hcl
data "openstack_images_image_v2" "image_protected_1" {
  name        = "Ubuntu 20.04 LTS 64-bit"
  most_recent = true
  visibility  = "public"
}
```

Посмотрите подробное описание источника данных [openstack\_images\_image\_v2](/terraform/openstack-provider-reference/images-glance/data-sources/openstack_images_image_v2/).

### 4. Создать загрузочный сетевой диск \{#create-boot-volume-for-protected}

```hcl
resource "openstack_blockstorage_volume_v3" "volume_protected_1" {
  name                 = "boot-volume-for-protected-server"
  size                 = "5"
  image_id             = data.openstack_images_image_v2.image_protected_1.id
  volume_type          = "fast.ru-9a"
  availability_zone    = "ru-9a"
  enable_online_resize = true

  lifecycle {
    ignore_changes = [image_id]
  }

}
```

Здесь:

* `size` — размер диска в ГБ. Учитывайте [лимиты сетевых дисков](/cloud-servers/volumes/about-network-volumes/#network-volume-limits) на максимальный размер;
* `volume_type` — ID или имя [типа сетевого диска](/cloud-servers/volumes/about-network-volumes/#network-volume-types). Например, `fast.ru-9a` — имя для создания сетевого диска с типом SSD Быстрый в [сегменте пула](/infrastructure/availability-matrix/#network-volumes) ru-9a. Список типов можно посмотреть в таблице [Список типов сетевого диска во всех сегментах пула](/cloud-servers/volumes/about-network-volumes/#network-volume-types-full-list).

Посмотрите подробное описание ресурса [openstack\_blockstorage\_volume\_v3](/terraform/openstack-provider-reference/block-storage-cinder/resources/openstack_blockstorage_volume_v3/).

### 5. Создать облачный сервер \{#create-server-for-protected}

```hcl
resource "openstack_compute_instance_v2" "protected_server_1" {
  name              = "protected-server"
  flavor_id         = "1015"
  key_pair          = selectel_vpc_keypair_v2.keypair_protected_1.name
  availability_zone = "ru-9a"

  network {
    port = openstack_networking_port_v2.port_protected_1.id
  }

  lifecycle {
    ignore_changes = [image_id]
  }

  block_device {
    uuid             = openstack_blockstorage_volume_v3.volume_protected_1.id
    source_type      = "volume"
    destination_type = "volume"
    boot_index       = 0
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}
```

Здесь:

* `availability_zone` — [сегмент пула](/infrastructure/locations/#pool), в котором будет создан облачный сервер, например `ru-9a`. Список доступных сегментов пула можно посмотреть в инструкции [Матрицы доступности](/infrastructure/availability-matrix/);
* `flavor_id` — ID флейвора. Флейворы соответствуют [конфигурациям облачного сервера](/cloud-servers/create/configurations/) и определяют количество vCPU, RAM и размер локального диска (опционально) сервера. Можно использовать флейворы фиксированных конфигураций. Например, `1015` — ID для создания сервера с фиксированной конфигурацией линейки Standard с 4 vCPU, 16 ГБ RAM в пуле ru-9. Список флейворов можно посмотреть в таблице [Список флейворов фиксированной конфигурации во всех пулах](/cloud-servers/create/configurations/#server-flavors-full-list).

Посмотрите подробное описание ресурса [openstack\_compute\_instance\_v2](/terraform/openstack-provider-reference/compute-nova/resources/openstack_compute_instance_v2/).

## 6. Создать облачный сервер в приватной подсети, не закрытой файрволом \{#create-unprotected-server}

1. [Cоздайте пару SSH-ключей](#create-ssh-keypair-for-unprotected).
2. [Создайте порт для облачного сервера](#create-port-for-unprotected).
3. [Получите образ](#get-image-for-unprotected).
4. [Создайте загрузочный сетевой диск](#create-boot-volume-for-unprotected).
5. [Создайте облачный сервер](#create-server-for-unprotected).

### 1. Cоздать пару SSH-ключей \{#create-ssh-keypair-for-unprotected}

```hcl
resource "selectel_vpc_keypair_v2" "keypair_unprotected_1" {
  name       = "keypair-unprotected"
  public_key = file("~/.ssh/id_rsa.pub")
  user_id    = selectel_iam_serviceuser_v1.serviceuser_1.id
}
```

Здесь `public_key` — путь до публичного SSH-ключа. Если SSH-ключи не созданы, [сгенерируйте их](/cloud-servers/manage/create-and-place-ssh-key/#create-ssh-keys).

Посмотрите подробное описание ресурса [selectel\_vpc\_keypair\_v2](/terraform/selectel-provider-reference/resources/vpc_keypair_v2/).

### 2. Создать порт для облачного сервера \{#create-port-for-unprotected}

```hcl
resource "openstack_networking_port_v2" "port_unprotected_1" {
  name       = "port-unprotected"
  network_id = openstack_networking_network_v2.unprotected_network_1.id

  fixed_ip {
    subnet_id = openstack_networking_subnet_v2.unprotected_subnet_1.id
  }
}
```

Посмотрите подробное описание ресурса [openstack\_networking\_port\_v2](/terraform/openstack-provider-reference/networking-neutron/resources/openstack_networking_port_v2/).

### 3. Получить образ \{#get-image-for-unprotected}

```hcl
data "openstack_images_image_v2" "image_unprotected_1" {
  name        = "Ubuntu 20.04 LTS 64-bit"
  most_recent = true
  visibility  = "public"
}
```

Посмотрите подробное описание источника данных [openstack\_images\_image\_v2](/terraform/openstack-provider-reference/images-glance/data-sources/openstack_images_image_v2/).

### 4. Создать загрузочный сетевой диск \{#create-boot-volume-for-unprotected}

```hcl
resource "openstack_blockstorage_volume_v3" "volume_unprotected_1" {
  name                 = "boot-volume-for-unprotected-server"
  size                 = "5"
  image_id             = data.openstack_images_image_v2.image_unprotected_1.id
  volume_type          = "fast.ru-9a"
  availability_zone    = "ru-9a"
  enable_online_resize = true

  lifecycle {
    ignore_changes = [image_id]
  }

}
```

Здесь:

* `size` — размер диска в ГБ. Учитывайте [лимиты сетевых дисков](/cloud-servers/volumes/about-network-volumes/#network-volume-limits) на максимальный размер;
* `volume_type` — ID или имя [типа сетевого диска](/cloud-servers/volumes/about-network-volumes/#network-volume-types). Например, `fast.ru-9a` — имя для создания сетевого диска с типом SSD Быстрый в [сегменте пула](/infrastructure/availability-matrix/#network-volumes) ru-9a. Список типов можно посмотреть в таблице [Список типов сетевого диска во всех сегментах пула](/cloud-servers/volumes/about-network-volumes/#network-volume-types-full-list).

Посмотрите подробное описание ресурса [openstack\_blockstorage\_volume\_v3](/terraform/openstack-provider-reference/block-storage-cinder/resources/openstack_blockstorage_volume_v3/).

### 5. Создать облачный сервер \{#create-server-for-unprotected}

```hcl
resource "openstack_compute_instance_v2" "unprotected_server_1" {
  name              = "unprotected-server"
  flavor_id         = "1015"
  key_pair          = selectel_vpc_keypair_v2.keypair_unprotected_1.name
  availability_zone = "ru-9a"

  network {
    port = openstack_networking_port_v2.port_unprotected_1.id
  }

  lifecycle {
    ignore_changes = [image_id]
  }

  block_device {
    uuid             = openstack_blockstorage_volume_v3.volume_unprotected_1.id
    source_type      = "volume"
    destination_type = "volume"
    boot_index       = 0
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}
```

Здесь:

* `availability_zone` — [сегмент пула](/infrastructure/locations/#pool), в котором будет создан облачный сервер, например `ru-9a`. Список доступных сегментов пула можно посмотреть в инструкции [Матрицы доступности](/infrastructure/availability-matrix/);
* `flavor_id` — ID флейвора. Флейворы соответствуют [конфигурациям облачного сервера](/cloud-servers/create/configurations/) и определяют количество vCPU, RAM и размер локального диска (опционально) сервера. Можно использовать флейворы фиксированных конфигураций. Например, `1015` — ID для создания сервера с фиксированной конфигурацией линейки Standard с 4 vCPU, 16 ГБ RAM в пуле ru-9. Список флейворов можно посмотреть в таблице [Список флейворов фиксированной конфигурации во всех пулах](/cloud-servers/create/configurations/#server-flavors-full-list).

Посмотрите подробное описание ресурса [openstack\_compute\_instance\_v2](/terraform/openstack-provider-reference/compute-nova/resources/openstack_compute_instance_v2/).

<Formbricks />
