Вопрос или проблема
У меня есть четыре хоста Ubuntu: два “внутренних” (B/C) и два “внешних” (A/D):
A --> B --> (ИНТЕРНЕТ) <-- C <-- D
Я уже успешно установил соединение IPSec между B и C. Однако я хочу добиться создания вложенного IPSec-туннеля между A и D так, чтобы туннель был установлен и поддерживался через туннель B/C.
У меня есть начальное понимание параметров swanctl.conf
, поэтому я не совсем уверен, как это правильно реализовать.
В конечном итоге трафик инициатора от A к получателю D должен направляться через туннель B/C, однако, по-видимому, это маршрутизирование в конечном итоге устанавливается конфигурацией Strongswan.
Мои базовые конфигурации инициатора и получателя (B и C):
# Инициатор B
connections {
inner_tunnel {
remote_addrs = <публичный IP сервера C>
version = 2
proposals = aes256-sha512-x25519
ppk_required = yes
ppk_id = a2v-SoId7WN5Q19wptdaRWJp11EjPr1yYGWh8xlY62Q=
children {
inner_tunnel {
local_ts = 192.168.108.103/24
remote_ts = 10.54.0.25/24
esp_proposals = aes256gcm12-x25519
}
}
local {
auth = psk
}
remote {
auth = psk
}
}
}
# Получатель C
connections {
inner_tunnel {
remote_addrs = %any
pools = default_pool
version = 2
proposals = aes256-sha512-x25519
ppk_required = yes
children {
inner_tunnel {
remote_ts = 192.168.108.103/24
local_ts = 10.54.0.25/24
esp_proposals = aes256gcm12-x25519
}
}
local {
auth = psk
id = inner_hub
}
remote {
auth = psk
}
}
}
pools {
default_pool {
addrs = 10.1.30.0/24
}
}
Ответ или решение
Для установления вложенного VPN туннеля при помощи StrongSwan между хостами A и D через уже существующий туннель между хостами B и C, необходимо правильно настроить конфигурации на всех четырех серверах. Следующий процесс поможет вам пошагово выполнить данную задачу.
1. Понимание архитектуры
У вас есть две пары хостов:
- Внешние: A и D
- Внутренние: B и C
Сначала вы уже установили IPSec соединение между B и C, а теперь требуется настроить дополнительное соединение между A и D, чтобы данные из A могли проходить через B и C.
2. Конфигурация StrongSwan для A и D
Конфигурация на хосте A
На хосте A вам нужно определить соединение на основе существующего туннеля между B и C.
# Настройка соединения на хосте A
connections {
outer_tunnel {
remote_addrs = <имя_или_IP_адрес_хоста_D> # Замените на IP адрес D
version = 2
proposals = aes256-sha512-x25519
ppk_required = yes
ppk_id = a2v-SoId7WN5Q19wptdaRWJp11EjPr1yYGWh8xlY62Q=
children {
outer_tunnel {
local_ts = 10.1.30.10/32 # Локальный IP A
remote_ts = 10.1.30.20/32 # Локальный IP D
esp_proposals = aes256gcm12-x25519
}
}
local {
auth = psk
}
remote {
auth = psk
}
}
}
Конфигурация на хосте D
Теперь вам нужно выполнить аналогичные настройки на хосте D, чтобы он мог принимать соединение с хоста A.
# Настройка соединения на хосте D
connections {
outer_tunnel {
remote_addrs = %any
version = 2
proposals = aes256-sha512-x25519
ppk_required = yes
children {
outer_tunnel {
remote_ts = 10.1.30.10/32 # Локальный IP A
local_ts = 10.1.30.20/32 # Локальный IP D
esp_proposals = aes256gcm12-x25519
}
}
local {
auth = psk
id = outer_hub
}
remote {
auth = psk
}
}
}
3. Настройка маршрутов
Убедитесь, что маршруты корректно настроены, чтобы трафик от A к D проходил через B и C:
-
На хосте A:
ip route add 10.1.30.0/24 via <IP_адрес_B>
-
На хосте B:
Убедитесь, что хост B настроен на маршрутизацию трафика из A в C и обратно. -
На хосте C:
Аналогично, настройте C для маршрутизации трафика от B к D. -
На хосте D:
Также удостоверьтесь, что D знает, как отправлять ответные пакеты на IP-адрес A через C.
4. Проверка соединения
После завершения всех настроек перезапустите StrongSwan на каждом из хостов и выполните проверку состояния соединений:
swanctl --list-conns
Убедитесь, что все соединения активны, и просмотрите журналы на предмет возможных ошибок:
sudo journalctl -u strongswan
Заключение
Создание вложенного VPN туннеля с помощью StrongSwan требует внимательного подхода к конфигурации и маршрутам. Помните о необходимой безопасности (использование PSK и проверка ключей) и обязательно проводите тесты после каждой настройки. С успешным выполнением всех шагов вы сможете установить надежное соединение между хостами A и D через туннель B/C.