Настройка IPSec-шлюзов для подключения внешних узлов к кластеру
Сервис Yandex Managed Service for Kubernetes позволяет подключать в качестве узлов кластера Kubernetes серверы, расположенные вне Yandex Cloud. Для подключения необходимо организовать сетевую связность между удаленной сетью, в которой расположен внешний сервер, и облачной сетью, в которой находится кластер Managed Service for Kubernetes. Это можно сделать с помощью VPN.
Ниже рассматривается пример организации сетевой связности с помощью протокола IPSec. В роли внешнего сервера выступает виртуальная машина, расположенная в другой облачной сети Yandex Cloud.
Перед началом работы
-
Создайте основную облачную сеть с тремя подсетями в разных зонах доступности.
-
В основной сети создайте кластер Managed Service for Kubernetes с высокодоступным типом мастера.
Для создания внешней группы узлов кластер Managed Service for Kubernetes должен работать в туннельном режиме. Он включается только при создании кластера.
-
Установите kubectl
и настройте его на работу с созданным кластером. -
В основной сети создайте виртуальную машину Compute Cloud с публичным IP-адресом и назовите ее
VM-1
. На этой ВМ будет настроен основной IPSec-шлюз. -
Создайте дополнительную облачную сеть с одной подсетью.
-
В дополнительной сети создайте виртуальную машину Compute Cloud с публичным IP-адресом и назовите ее
VM-2
. На этой ВМ будет настроен дополнительный IPSec-шлюз.
Настройка групп безопасности
-
В основной сети создайте группу безопасности и назначьте ее
VM-1
. Добавьте в группу правила:Исходящий трафикВходящий трафикОписание Диапазон портов Протокол Назначение CIDR блоки any
0-65535
Любой
CIDR
0.0.0.0/0
Описание Диапазон портов Протокол Источник CIDR блоки icmp
0-65535
ICMP
CIDR
0.0.0.0/0
ssh
22
TCP
CIDR
0.0.0.0/0
ipsec-udp-500
500
UDP
CIDR
<публичный_адрес_VM-2>/32
ipsec-udp-4500
4500
UDP
CIDR
<публичный_адрес_VM-2>/32
VM-2-subnet
0-65535
Любой
CIDR
<CIDR_подсети_VM-2>
-
В дополнительной сети создайте группу безопасности и назначьте ее
VM-2
. Добавьте в группу правила:Исходящий трафикВходящий трафикОписание Диапазон портов Протокол Назначение CIDR блоки any
0-65535
Любой
CIDR
0.0.0.0/0
Описание Диапазон портов Протокол Источник CIDR блоки icmp
0-65535
ICMP
CIDR
0.0.0.0/0
ssh
22
TCP
CIDR
0.0.0.0/0
ipsec-udp-500
500
UDP
CIDR
<публичный_адрес_VM-1>/32
ipsec-udp-4500
4500
UDP
CIDR
<публичный_адрес_VM-1>/32
k8s-VM-1-subnets
0-65535
Любой
CIDR
<CIDR_основной_подсети1>
,<CIDR_основной_подсети2>
,<CIDR_основной_подсети3>
cluster&services
0-65535
Любой
CIDR
<CIDR_кластера>
,<CIDR_сервисов>
-
В группу безопасности кластера и групп узлов Managed Service for Kubernetes добавьте правило:
Входящий трафикОписание Диапазон портов Протокол Источник CIDR блоки VM-2-subnet
0-65535
Любой
CIDR
<CIDR_подсети_VM-2>
Настройка маршрутизации
-
Настройте маршрутизацию для основного IPSec-шлюза:
-
В основной сети создайте таблицу маршрутизации и добавьте в нее статический маршрут:
- Префикс назначения — укажите CIDR подсети, где расположена
VM-2
. - IP-адрес — укажите внутренний IP-адрес
VM-1
.
- Префикс назначения — укажите CIDR подсети, где расположена
-
Привяжите таблицу маршрутизации ко всем подсетям основной сети.
-
-
Настройте маршрутизацию для дополнительного IPSec-шлюза:
-
В дополнительной сети создайте таблицу маршрутизации.
-
Добавьте для таблицы маршрутизации статический маршрут:
- Префикс назначения — укажите CIDR подсети, где расположена
VM-1
. - IP-адрес — укажите внутренний IP-адрес
VM-2
.
Повторите этот шаг для каждой подсети основной сети.
- Префикс назначения — укажите CIDR подсети, где расположена
-
Привяжите таблицу маршрутизации к подсети, в которой расположена
VM-2
.
-
Настройка IPSec-шлюзов
-
Настройте основной IPSec-шлюз:
-
Подключитесь к
VM-1
по SSH. -
Установите strongSwan:
sudo apt update && sudo apt install strongswan
-
Откройте файл конфигурации
ipsec.conf
:sudo nano /etc/ipsec.conf
-
Замените содержимое файла следующим текстом:
# basic configuration config setup charondebug="all" uniqueids=yes conn VM-1 type=tunnel auto=route keyexchange=ikev2 ike=aes256-sha2_256-modp2048! esp=aes256-sha2_256! authby=secret left=<внутренний_адрес_VM-1> leftsubnet=<CIDR_основной_подсети1>,<CIDR_основной_подсети2>,<CIDR_основной_подсети3> leftsourceip=<внутренний_адрес_VM-1> leftid=<публичный_адрес_VM-1> right=<публичный_адрес_VM-2> rightsubnet=<CIDR_подсети_VM-2> aggressive=no keyingtries=%forever ikelifetime=86400s
Подробнее о параметрах см. в документации strongSwan
. -
Откройте файл
ipsec.secrets
, который используется для аутентификации:sudo nano /etc/ipsec.secrets
-
Замените содержимое файла следующим текстом:
<публичный_адрес_VM-1> <публичный_адрес_VM-2> : PSK "<пароль>"
Подробнее о формате файла
ipsec.secrets
см. в документации strongSwan .
-
-
Настройте дополнительный IPSec-шлюз:
-
Подключитесь к
VM-2
по SSH. -
Установите strongSwan
:sudo apt update && sudo apt install strongswan
-
Откройте файл конфигурации
ipsec.conf
:sudo nano /etc/ipsec.conf
-
Замените содержимое файла следующим текстом:
# basic configuration config setup charondebug="all" conn VM-2 type=tunnel auto=route keyexchange=ikev2 ike=aes256-sha2_256-modp2048! esp=aes256-sha2_256! authby=secret left=<внутренний_адрес_VM-2> leftid=<публичный_адрес_VM-2> leftsubnet=<CIDR_подсети_VM-2> right=<публичный_адрес_VM-1> rightsubnet=<CIDR_основной_подсети1>,<CIDR_основной_подсети2>,<CIDR_основной_подсети3> rightsourceip=<внутренний_адрес_VM-1> aggressive=no keyingtries=%forever ikelifetime=86400s lifetime=43200s lifebytes=576000000 dpddelay=30s
Подробнее о параметрах см. в документации strongSwan
. -
Откройте файл
ipsec.secrets
, необходимый для аутентификации:sudo nano /etc/ipsec.secrets
-
Замените содержимое файла следующим текстом:
<публичный_адрес_VM-2> <публичный_адрес_VM-1> : PSK "<пароль>"
Пароли должны быть одинаковыми на обеих ВМ.
Подробнее о формате файла
ipsec.secrets
см. в документации strongSwan .
-
-
Перезапустите strongSwan на обеих ВМ:
sudo ipsec restart
-
Проверьте статус соединения на обеих ВМ:
sudo ipsec statusall
ESTABLISHED
в выводе команды означает, что соединение установлено:... Security Associations (1 up, 0 connecting): VM-1[1]: ESTABLISHED 5 seconds ago, 10.128.*.**[46.21.***.***]...84.201.***.***[84.201.***.***] ...
Если соединение не установилось, попробуйте запустить его вручную. На
VM-1
выполните команду:sudo ipsec up VM-1
Эту команду достаточно выполнить только на одной из ВМ.
-
Настройте MTU на обеих ВМ:
ETH_NIC=eth0 sudo iptables -t mangle -A FORWARD -i ${ETH_NIC} -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360 sudo iptables -t mangle -A FORWARD -o ${ETH_NIC} -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360 echo "net.ipv4.ip_no_pmtu_disc = 1" | sudo tee -a /etc/sysctl.conf sudo sysctl -p /etc/sysctl.conf
Важно
Если оставить значение MTU по умолчанию, возможны потери сетевого трафика.
-
Подключите
VM-2
к кластеру Managed Service for Kubernetes в качестве внешнего узла.
Решение проблем
docker-ce
и containerd
на внешнем узле
Ошибка при работе с пакетами Чтобы диагностировать и исправить ошибку:
-
Посмотрите список служб, которые работают некорректно:
sudo systemctl --failed
Результат:
UNIT LOAD ACTIVE SUB DESCRIPTION docker.socket loaded failed failed Docker Socket for the API LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. 1 loaded units listed.
-
Проверьте состояние
docker.socket
:sudo systemctl status docker.socket
Результат:
docker.socket - Docker Socket for the API Loaded: loaded (/lib/systemd/system/docker.socket; disabled; vendor preset: enabled) Active: failed (Result: exit-code) since Tue 2024-02-10 09:53:37 UTC; 6s ago Triggers: ● docker.service Listen: /run/docker.sock (Stream) CPU: 1ms Feb 10 09:53:37 ext-node systemd[1]: Starting Docker Socket for the API... Feb 10 09:53:37 ext-node systemd[7052]: docker.socket: Failed to resolve group docker: No such process Feb 10 09:53:37 ext-node systemd[1]: docker.socket: Control process exited, code=exited, status=216/GROUP Feb 10 09:53:37 ext-node systemd[1]: docker.socket: Failed with result 'exit-code'. Feb 10 09:53:37 ext-node systemd[1]: Failed to listen on Docker Socket for the API.
-
Посмотрите ошибки в системных логах:
sudo journalctl -xe
Результат:
... Feb 10 09:56:40 ext-node maintainer[19298]: E: Sub-process /usr/bin/dpkg returned an error code (1) ...
-
Переустановите пакеты и исправьте ошибки:
sudo apt install -f
-
Когда установщик спросит, что делать с файлом
config.toml
, введитеN
, чтобы оставить текущую версию файла.