Оглавление:
- Введение
- Топология и основные элементы решения
- Параметры IPsec протокола
- Особенности реализации шлюза безопасности YC-SGW
- Описание развёртывания решения с помощью Terraform модуля
- Создание конфигурационного файла для Remote-SGW
- Выполнение Terraform развёртывания
- Спецификация модуля
Информационные сервисы имеют свой жизненный цикл. Они постоянно эволюционируют и изменяются. Для роста им необходимы ресурсы. В традиционных корпоративных ЦОД процесс развёртывания новых ИТ-ресурсов занимает много времени. Облака позволяют расширять границы ЦОД быстро и практически безгранично.
При размещении части ресурсов в облаке им необходимо обеспечить защищённое сетевое взаимодействие с уже работающими в корпоративном ЦОД ресурсами. Для решения этой задачи применяется технология создания защищенных соединений между корпоративным ЦОД и облачной инфраструктурой.
Инфраструктура ЦОД и облачная инфраструктура объединяются в одно информационное пространства с помощью технологий для построения виртуальных сетей (VPN), такими как IPsec, WireGuard, и т.д.
В данном документе описано решение шлюза безопасности (Security Gateway) для организации защищённого соединения на базе протокола IPsec
между корпоративным ЦОД и облачной инфраструктурой в Yandex Cloud
через сеть Интернет.
Выбор протокола IPsec обусловлен его широкой поддержкой в различных сетевых устройствах (как физических так и виртуальных) от множества производителей.
В качестве шлюза безопасности для данного решения был выбран продукт с открытым исходным кодом strongSwan.
Пример обычной топологии IPsec site to site VPN
- защищённого IPsec соединения между корпоративным ЦОД и облачной инфраструктурой в Yandex Cloud показан на схеме ниже:
В облачной инфраструктуре Yandex Cloud есть подсети subnet-1, subnet-2 и subnet-3 в которых расположена одна часть информационных ресурсов.
В ЦОД Remote site
есть подсети subnet-5 subnet-6 в которых расположена другая часть информационных ресурсов.
Шлюзы безопасности YC-SGW и Remote-SGW объединяют вышеперечисленные сегменты сети с помощью IPsec Tunnel
, который строиться через сеть Интернет. Шлюзы безопасности выполняют функции по передаче трафика и его шифрованию при передаче в соседний сегмент сети через IPsec туннель.
Ниже описаны наболее важные объекты, показанные на схеме:
-
YC-SGW
- шлюз безопасности в Yandex Cloud - это ключевой элемент этого решения. Шлюз безопасности развёртывается в формате ВМ на базе продукта с открытым исходным кодом strongSwan. Работа IPsec туннеля обеспечивается согласованной работой шлюза безопасности YC-SGW и удаленного шлюза безопасности Remote-SGW в ЦОД. Шлюз безопасности YC-SGW развёртывается в выделенной подсетиsubnet-4
в Yandex Cloud. Использование отдельной подсети для развёртывания YC-SGW позволяет избежать зацикливаний трафика при маршрутизации в определенных сценариях использования. -
Remote-SGW
- шлюз безопасности в ЦОД. В данном примере шлюз безопасности реализован на базе аппаратного или программного маршрутизатора компании Cisco с операционной системойCisco IOS-XE
. -
Network-1
- облачная сеть в облачном каталоге Yandex Cloud. -
subnet1
,subnet2
иsubnet3
- подсети в облачной сети. Каждая подсеть создана в своей зоне доступности. В подсетях развёрнуты облачные ресурсы (cloud resources), которым нужно взаимодействовать с ресурсами в ЦОД (on-prem resources). -
subnet-5
иsubnet-6
- подключены к Remote-SGW через логические интерфейсы (sub-interfaces Gig1.11 и Gig1.12) одного физического транкогового порта "Gig1". Информация о конфигурации сетевых интерфейсов шлюза безопасности показана на схеме в таблице Remote-SGW interfaces. -
sgw-rt
- таблица маршрутизации в облачной сети Network-1. Обеспечивает маршрутизацию трафика в направлении подсетей subnet-5 и subnet-6 через шлюз безопасности YC-SGW. Для включения таблицы маршрутизации в работу её обязательно нужно привязать к подсетям (subnet-1, subnet-2 и subnet-3). -
YC-SGW route table
- это общая таблица маршрутизации внутри Linux ВМ YC-SGW. В эту таблицу добавляются маршруты для подсетей subnet-5 и subnet-6. Трафик к этим подсетям будет передаваться через IPsec туннель. -
Remote-SGW route table
- таблица маршрутизации шлюза безопасности Remote-SGW. В эту таблицу добавляются маршруты к подсетям в Yandex Cloud: subnet-1, subnet-2 и subnet-3. Трафик к этим подсетям будет передаваться через IPsec туннель.
Для работы IPsec соединения требуется настройка согласованного набора параметров (IPsec Policy
) на шлюзах безопасности с обоих сторон соединения. В данном решении используются следующие параметры:
-
policy_name
- имя IPsec политики / профиля. -
ike_proposal
- Internet Key Exchange Version 2 (IKEv2). Шифр (cipher), который будет использоваться для шифрования канала управления IPsec соединением. -
esp_proposal
- Encapsulating Security Payload. Шифр (cipher), который будет использоваться для шифрования передаваемых данных. -
psk
- Pre-Shared Key. Ключ (пароль), который будет использоваться для установления IPsec соединения.
Для значений параметров "ike_proposal" и "esp_proposal" используется нотация strongSwan.
В данном примере используются следующие значения параметров IPsec Policy:
policy_name: yc-ipsec
ike_proposal: aes128gcm16-prfsha256-ecp256
esp_proposal: aes128gcm16
psk: Sup#erPa85s
Ознакомится с основными принципами работы протокола IPsec можно в документе IPsec Protocol.
Шлюз безопасности YC-SGW реализован в виде образа ВМ в состав которого входят следующие компоненты:
- Ubuntu Linux 22.04
- Docker Daemon, Docker Client
- Docker контейнер strongSwan. Контейнер доступен для загрузки по следующей ссылке:
cr.yandex/crpjfmfou6gflobbfvfv/strongswan:5.9.9
Работа с сетью внутри шлюза безопасности YC-SGW имеет ряд особенностей:
-
ВМ имеет только один сетевой интерфейс - eth0, который подключается к виртуальной сети Yandex Cloud. IP-адрес на этом сетевом интерфейс является шлюзом (next-hop) для маршрутов к подсетям subnet-5 и subnet-6 из подсетей subnet-1, subnet-2 и subnet-3. Через этот же сетевой интерфейс трафик направляется в Интернет через подсистему 1:1 NAT виртуальной сети Yandex Cloud.
-
в ВМ разрешается маршрутизация пакетов на уровне ядра (
IP Forwarding
). -
в ВМ отключается протокол IPv6.
-
при запуске контейнера
strongSwan
в него пробрасывается сеть хоста (ВМ). -
для удобства эксплуатации шлюза безопасности, контейнер
strongSwan
настраивается на работу в режиме Route-based VPN. Для этого в ВМ создаётся XFRM интерфейс. В результате в YC-SGW появляется дополнительный виртуальный сетевой интерфейсipsec0
, через который можно направлять трафик в IPsec туннель с помощью стандартной команды Linux "ip route". При этом, никаких изменений параметров IPsec внутри контейнера не требуется.
В процесее выполнения данного Terraform развёртывания в Yandex Cloud будут созданы следующие объекты:
-
новая отдельная подсеть в существующей сети для развёртывания в ней шлюза безопасности YC-SGW (subnet-4).
-
одна общая для всех защищаемых подсетей таблица маршрутизации (sgw-rt). В этой таблице будут маршруты до всех перечисленных удалённых подсетей. Таблица маршрутизации будет применяться ко всем перечисленным подсетям в Yandex Cloud. При необходимости, в сети будет создан NAT-шлюз и соответствующая запись в таблице маршрутизации с маршрутом по умолчанию, указывающая на этот шлюз для передачи трафика в Интернет.
-
ВМ YC-SGW будет создана из предварительно подготовленного образа в Yandex Cloud.
-
при создании ВМ YC-SGW ей будет выделен публичный статический IP-адрес и создана группа безопасности (Security Group).
-
после выполнения развёртывания решения YC-SGW для шлюза безопасности в ЦОД будет создан конфигурационный файл для его согласованной настройки с шлюзом безопасности YC-SGW. Имя конфигурационного файла будет соответствовать имени шлюза безопасности, заданному во входных параметрах (см. ниже).
Пример описания развёртывания показан в файле main.tf.
Перед вызовом модуля ему на вход нужно передать набор входных объектов:
-
объект
yc_sgw
- описывает атрибуты для развёртывания шлюза безопасности в Yandex Cloud:name
- имя, которое будет использоваться при создании различных объектов относящихся к YC-SGW.folder_name
- имя облачного каталога в котором будет создаваться ВМ YC-SGW.image_folder_id
- идентификатор облачного каталога в котором находится подготовленный образ для развёртывания YC-SGW.image_name
- имя файла подготовленного образа для развёртывания YC-SGW.zone
- идентификатор зоны доступности в которой будет создаваться YC-SGW.subnet
- IPv4 префикс подсети, которая будет создана для подключения туда YC-SGW.inside_ip
- IP-адрес в подсетиsubnet
, который будет использоваться на сетевом интерфейсе eth0 YC-SGW.admin_name
- имя пользователя-администратора, который будет подключаться к YC-SGW по протоколу SSH.admin_key_path
- локальный путь к файлу с публичным ключём для аутентификации пользователя-администратора. Этот ключ будет загружен на ВМ YC-SGW при её создании.
-
объект
IPsec Policy
- описывает атрибуты для конфигурации IPsec: policy_name, ike_proposal, esp_proposal, psk. Подробнее об этих параметров можно почитать здесь. -
объект
yc_subnets
- описывает сетевые сущности в Yandex Cloud. У него есть следующие атрибуты:net_name
- имя сети (network) в которой будет создаваться ВМ YC-SGW. Предполагается, что все защищаемые с помощью YC-SGW подсети также размещаються в этой же сети.rt_name
- имя таблицы маршрутизации, которая будет использоваться для направления трафика из защищаемых подсетей через шлюз безопасности и далее в IPsec туннель.prefix_list
- список IPv4 префиксов защищаемых подсетей, из которых трафик будет передаваться через шлюз безопасности.rt_internet_access
- специальный флаг с помощью которого в таблицу маршрутизации "rt_name" может быть добавлен маршрут по-умолчанию для выхода в Интернет через NAT-Gateway. По умолчанию имеет значение false.force_subnets_update
- специальный флаг с помощью которого можно применить созданную таблицу маршрутизации к созданным ранее подсетям в рамках данного Terraform развёртывания. По умолчанию имеет значение false, что означает, что изменений в конфигурациях подсетей не производится - в специальном значении Terraform outputyc_rt_cmd
сохраняется командная строка для выполнения этих изменений в запланированное время.
-
объект
remote_subnets
- список IPv4 префиксов подсетей за удалённым шлюзом безопасности. -
объект
remote_sgw
- описывает атрибуты существующего удалённого шлюза безопасности:name
- имя удалённого шлюза безопасности. Используется при генерировании файла конфигурации.type
- тип удалённого шлюза безопасности. Прямо сейчас поддерживаются следующие типы шлюзов:cisco-iosxe
,cisco-asa
,mikrotik-chr
,unknown
.outside_ip
- публичный IP-адрес (outside) со стороны удалённого шлюза безопасности.
cd examples
source env-yc.sh
terraform init
terraform apply
Name | Version |
---|---|
local | ~> 2.4.0 |
null | ~> 3.2.1 |
yandex | ~> 0.89.0 |
Name | Version |
---|---|
local | ~> 2.4.0 |
yandex | ~> 0.89.0 |
null | ~> 3.2.1 |
No modules.
Name | Type |
---|---|
local_file.remote_ipsec_config | resource |
null_resource.yc_subnets_update | resource |
yandex_compute_instance.sgw | resource |
yandex_vpc_address.sgw_public_ip | resource |
yandex_vpc_gateway.egress_gw | resource |
yandex_vpc_route_table.sgw_rt | resource |
yandex_vpc_security_group.sgw_sg | resource |
yandex_vpc_subnet.sgw_subnet | resource |
yandex_compute_image.sgw_image | data source |
yandex_resourcemanager_folder.sgw_folder | data source |
yandex_vpc_network.yc_net | data source |
yandex_vpc_subnet.yc_sub_all | data source |
Name | Description | Type | Default | Required |
---|---|---|---|---|
cloud_id | YC cloud-id. Taken from environment variable. | any |
n/a | yes |
folder_id | YC folder-id. Taken from environment variable. | any |
n/a | yes |
ipsec_policy | IPsec parameters for both sides | object( |
{ |
no |
yc_sgw | YC IPsec SGW | object( |
{ |
no |
yc_subnets | YC IP subnet prefixes | object( |
{ |
no |
remote_sgw | Remote IPsec Security Gateway (SGW) | object( |
{ |
no |
remote_subnets | Yandex Cloud Subnet prefixes list | list(string) |
null |
no |
labels | A set of key/value label pairs to assign. | map(string) |
null |
no |
Name | Description |
---|---|
subnets_pairs | Subnet pairs for Remote SGW which is not supported Route-based policies, such as Mikrotik CHR. |
yc_rt_cmd | Provide yc CLI command string for change traffic flow via route-table manually. |