Служба IPsec запускается, а туннели не поднимаются
Туннель IPsec требует двух согласований подряд, и отказ на любом шаге выглядит одинаково снаружи: служба работает, туннеля нет. Разбор строится по журналу согласования, а не по состоянию службы.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Служебные порты закрыты
Согласование идёт по двум портам, а сам трафик — отдельным протоколом. Брандмауэр по умолчанию не пропускает ни то, ни другое.
-
Параметры шифрования не совпадают
Стороны не находят общего набора. В журнале это видно как отказ на первой фазе согласования.
-
Нет доступа к файлам ключей
Служба работает от своего пользователя, а закрытые ключи часто лежат с правами только для root.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Журнал согласования: на каком шаге отказ.
sudo journalctl -u strongswan -u ipsec -n 40 --no-pager 2>/dev/nullУстановленные соединения и их состояние.
sudo swanctl --list-sas 2>/dev/nullСлушает ли служба служебные порты.
sudo ss -ulnp | grep -E ":500|:4500"Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Согласование идёт по двум портам, а сам трафик — отдельным протоколом. Брандмауэр по умолчанию не пропускает ни то, ни другое.
- Как проверить
-
Посмотрите правила и попытки согласования.
sudo ss -ulnp | grep -E ":500|:4500" sudo journalctl -u strongswan -u ipsec -n 30 --no-pager 2>/dev/null | grep -iE "IKE|retransmit"
- Как исправить
- Разрешите порты согласования и протокол шифрованного трафика. При прохождении через преобразование адресов нужен второй порт согласования.
- Почему происходит
- Стороны не находят общего набора. В журнале это видно как отказ на первой фазе согласования.
- Как проверить
-
Посмотрите предложенные и принятые наборы.
sudo journalctl -u strongswan -n 40 --no-pager 2>/dev/null | grep -iE "no proposal|selected proposal"
- Как исправить
- Приведите наборы шифрования в соответствие с другой стороной. Списки должны пересекаться хотя бы в одном варианте.
- Почему происходит
- Служба работает от своего пользователя, а закрытые ключи часто лежат с правами только для root.
- Как проверить
-
Посмотрите права на ключи и пользователя службы.
sudo ls -l /etc/ipsec.d/private/ 2>/dev/null systemctl show strongswan -p User -p LoadCredential 2>/dev/null
- Как исправить
-
Передайте ключи пользователю службы или подайте их через механизм учётных данных systemd: он выдаёт файлы только процессам этой службы.
[Service] LoadCredential=vpn.key:/etc/ipsec.d/private/vpn.key
Пример вывода
Согласование не проходит: ответов нет. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
charon[5800]: initiating IKE_SA site-to-site[1] to 198.51.100.20
charon[5800]: retransmit 1 of request with message ID 0
charon[5800]: retransmit 5 of request with message ID 0
charon[5800]: establishing IKE_SA failed, peer not responding
Связанные ошибки
- WireGuard: туннель поднят, но обмена нет Интерфейс есть, рукопожатие не проходит: неверные ключи, недоступный порт, несовпадение разрешённых адресов.
- status=243/CREDENTIALS в systemd Код 243/CREDENTIALS: не удалось подготовить учётные данные службы из LoadCredential=, SetCredential= или ImportCredential=.
- Connection timed out в журнале службы Соединение не устанавливается по таймауту: пакеты отбрасываются, узел недоступен, перегружен сервер на другой стороне.
- Node-служба не может занять порт 80 Приложение на Node падает при привязке к привилегированному порту: как дать возможность вместо запуска от root.
- bind: Permission denied при привязке к порту Отказ при привязке к порту: обычно порт ниже 1024 у службы от непривилегированного пользователя. Как дать возможность CAP_NET_BIND_SERVICE.
- openvpn: Cannot open TUN/TAP dev /dev/net/tun Служба не может открыть устройство туннеля: нет модуля, нет устройства в контейнере или мешает изоляция unit-файла.
- Туннель поднимается, но перестаёт работать через несколько минут Соединение через преобразование адресов рвётся при простое: без периодических пакетов запись в таблице узла исчезает.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
Где встречается чаще всего
Источники
- Документация strongSwan
-
systemd.exec(5)
LoadCredential= и выдача секретов процессам службы. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено блокировкой портов согласования между двумя узлами.