Делаем свой собственный IKEv2 VPN сервер на базе Ubuntu 20.04

Введение

Виртуальная частная сеть, или VPN, позволяет надежно шифровать трафик, когда он проходит через ненадежные сети, например, в кафе, на конференции или в аэропорту. А еще получить доступ к чему-то, что вам не дают увитеть.

Internet Key Exchange v2 или IKEv2 — это протокол, позволяющий осуществлять прямое туннелирование IPSec между сервером и клиентом. В реализациях IKEv2 VPN IPSec обеспечивает шифрование сетевого трафика. IKEv2 изначально поддерживается на некоторых платформах без дополнительных приложений.

Предпосылки

Для выполнения этого урока вам понадобятся:

  • Один сервер Ubuntu 20.04
  • Немного терпения

Шаг 1 — Установка StrongSwan

Во-первых, мы установим StrongSwan, демон IPSec с открытым исходным кодом, который мы настроим в качестве нашего VPN-сервера. Мы также установим компонент инфраструктуры открытых ключей (PKI), чтобы мы могли создать центр сертификации (CA) для предоставления учетных данных для нашей инфраструктуры.

Начните с обновления локального кеша пакетов:

sudo apt update 

Затем установите программное обеспечение, набрав:

sudo apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins libstrongswan-extra-plugins

Дополнительный libcharon-extauth-plugins пакет используется для обеспечения того, чтобы различные клиенты могли аутентифицироваться на вашем сервере, используя общее имя пользователя и парольную фразу. Пакет libstrongswan-extra-plugins включен, так что Strongswan поддерживает наборы шифров на эллиптических кривых, которые используют Curve25519 набор криптографии.

Тут важно вставить отдельную ремарку: в ubuntu 20.04 по умолчанию не устанавливается плагин md4, который очень важен для Windows клиентов. Без него ничего работать не будет. Этот модуль еще есть в 18.04, но в 20.04 его уже нет. Просто скопируйте /usr/lib/ipsec/plugins/libstrongswan-md4.so или соберите его из исходников (в линуксе всегда так - ха-ха). Я собрал и получилось вот что. Можете скачать и взять себе.

Теперь, когда все установлено, давайте перейдем к созданию наших сертификатов.

Шаг 2 — Создание центра сертификации

Серверу IKEv2 требуется сертификат, чтобы идентифицировать себя для клиентов. Чтобы помочь создать требуемый сертификат, в strongswan-pki пакет входит утилита, вызываемая pkiдля создания центра сертификации и сертификатов сервера.

Для начала давайте создадим несколько каталогов для хранения всех ресурсов, над которыми мы будем работать. Структура каталогов соответствует некоторым каталогам в /etc/ipsec.d, куда мы в конечном итоге переместим все созданные нами элементы:

mkdir -p ~/pki/{cacerts,certs,private} 

Затем заблокируйте разрешения, чтобы другие пользователи не могли видеть наши личные файлы:

chmod 700 ~/pki 

Теперь, когда у нас есть структура каталогов для хранения всего, мы можем сгенерировать корневой ключ. Это будет 4096-битный ключ RSA, который будет использоваться для подписи нашего корневого центра сертификации.

Выполните эти команды, чтобы сгенерировать ключ:

pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem 

После этого мы можем перейти к созданию нашего корневого центра сертификации, используя только что сгенерированный ключ для подписи корневого сертификата:

pki --self --ca --lifetime 3650 --in ~/pki/private/ca-key.pem --type rsa --dn "CN=VPN root CA" --outform pem > ~/pki/cacerts/ca-cert.pem 

Флаг --lifetime 3650 используется для гарантии того, что корневой сертификат центра сертификации будет действителен в течение 10 лет. Корневой сертификат для центра обычно не меняется, поскольку его придется перераспределять на каждый сервер и клиент, которые полагаются на него, поэтому 10 лет — это безопасное значение срока действия по умолчанию.

Вы можете изменить значение отличительного имени (DN) на другое, если хотите. Общее имя (поле CN) здесь является просто индикатором, поэтому оно не должно соответствовать чему-либо в вашей инфраструктуре.

Теперь, когда у нас есть корневой центр сертификации, мы можем создать сертификат, который будет использовать VPN-сервер.

Шаг 3 — Генерация сертификата для VPN-сервера

Теперь мы создадим сертификат и ключ для VPN-сервера. Этот сертификат позволит клиенту проверить подлинность сервера, используя только что созданный нами сертификат ЦС.

Сначала создайте закрытый ключ для VPN-сервера с помощью следующей команды:

pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem 

Теперь создайте и подпишите сертификат VPN-сервера с помощью ключа центра сертификации, который вы создали на предыдущем шаге. Выполните следующую команду, но измените поля «Общее имя» (CN) и «Альтернативное имя субъекта» (SAN) на DNS-имя или IP-адрес вашего VPN-сервера:

pki --pub --in ~/pki/private/server-key.pem --type rsa \ 
 | pki --issue --lifetime 1825 \ 
 --cacert ~/pki/cacerts/ca-cert.pem \ 
 --cakey ~/pki/private/ca-key.pem \ 
 --dn "CN=server_domain_or_IP" --san server_domain_or_IP \ 
 --flag serverAuth --flag ikeIntermediate --outform pem \ 
 > ~/pki/certs/server-cert.pem 

Параметр --flag serverAuth используется для указания того, что сертификат будет явно использоваться для проверки подлинности сервера до того, как будет установлен зашифрованный туннель. Этот --flag ikeIntermediate параметр используется для поддержки старых клиентов macOS.

Теперь, когда мы сгенерировали все файлы TLS/SSL, которые нужны StrongSwan, мы можем переместить файлы на место в /etc/ipsec.d каталоге, набрав:

sudo cp -r ~/pki/* /etc/ipsec.d/ 

На этом шаге мы создали пару сертификатов, которая будет использоваться для защиты связи между клиентом и сервером. Мы также подписали сертификаты ключом ЦС, поэтому клиент сможет проверить подлинность VPN-сервера с помощью сертификата ЦС. Когда все эти сертификаты готовы, мы перейдем к настройке программного обеспечения.

Шаг 4 — Настройка StrongSwan

StrongSwan имеет файл конфигурации по умолчанию с некоторыми примерами, но большую часть конфигурации нам придется выполнить самостоятельно. Давайте создадим резервную копию файла для справки, прежде чем начинать с нуля:

sudo mv /etc/ipsec.conf{,.original} 

Создайте и откройте новый пустой файл конфигурации с помощью предпочитаемого вами текстового редактора. Здесь мы будем использовать nano:

sudo nano /etc/ipsec.conf 

Во-первых, мы скажем StrongSwan регистрировать статусы демона для отладки и разрешать дублирование соединений. Добавьте эти строки в файл /etc/ipsec.conf:

config setup
    charondebug="ike 1, knl 1, cfg 0"
    uniqueids=no

Затем мы создадим раздел конфигурации для нашей VPN. Мы также скажем StrongSwan создать VPN-туннели IKEv2 и автоматически загрузить этот раздел конфигурации при запуске. Добавьте в файл следующие строки:

. . .
conn ikev2-vpn
    auto=add
    compress=no
    type=tunnel
    keyexchange=ikev2
    fragmentation=yes
    forceencaps=yes

Мы также настроим обнаружение мертвых узлов, чтобы очищать любые «зависшие» соединения в случае неожиданного отключения клиента. Добавьте эти строки:

. . .
conn ikev2-vpn
    . . .
    dpdaction=clear
    dpddelay=300s
    rekey=no

Далее мы настроим параметры IPSec «левой» стороны сервера. Каждый из следующих параметров гарантирует, что сервер настроен на прием соединений от клиентов и правильную идентификацию. Вы добавите каждый из этих параметров в /etc/ipsec.conf файл после того, как ознакомитесь с тем, что они из себя представляют и почему они используются:

  • left=%any Это %any значение гарантирует, что сервер будет использовать сетевой интерфейс, через который он получает входящие соединения для последующей связи с клиентами. Например, если вы подключаетесь к клиенту через частную сеть, сервер будет использовать частный IP-адрес, по которому он получает трафик для остальной части соединения.
  • leftid=@server_domain_or_IP Этот параметр управляет именем, которое сервер представляет клиентам. В сочетании со следующей опцией leftcert этот leftid параметр гарантирует, что настроенное имя сервера и отличительное имя (DN), содержащееся в общедоступном сертификате, совпадают.
  • leftcert=server-cert.pem Этот параметр представляет собой путь к общедоступному сертификату для сервера, который вы настроили на шаге 3. Без него сервер не сможет аутентифицировать себя с клиентами или завершить согласование настройки IKEv2.
  • leftsendcert=always Это always значение гарантирует, что любой клиент, который подключается к серверу, всегда будет получать копию общедоступного сертификата сервера как часть первоначальной настройки подключения.
  • leftsubnet=0.0.0.0/0 Последняя «левая» опция, которую вы добавите, сообщает клиентам о доступных подсетях за сервером. В этом случае 0.0.0.0/0 используется для представления всего набора адресов IPv4, а это означает, что сервер по умолчанию будет указывать клиентам отправлять весь свой трафик через VPN.

Теперь, когда вы знакомы с каждым из соответствующих «левых» параметров, добавьте их все в файл следующим образом:

. . .
conn ikev2-vpn
    . . .
    left=%any
    leftid=@server_domain_or_IP
    leftcert=server-cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0

Далее мы можем настроить параметры IPSec «правой» стороны клиента. Каждый из следующих параметров сообщает серверу, как принимать подключения от клиентов, как клиенты должны аутентифицироваться на сервере, а также диапазоны частных IP-адресов и DNS-серверы, которые будут использовать клиенты. Добавьте каждый из этих параметров в /etc/ipsec.conf файл, как только вы ознакомитесь с тем, что они собой представляют и почему они используются:

  • right=%any Параметр %any для right стороны подключения указывает серверу принимать входящие подключения от любого удаленного клиента.
  • rightid=%any Этот параметр гарантирует, что сервер не будет отклонять подключения от клиентов, предоставляющих удостоверение, до того, как будет установлен зашифрованный туннель.
  • rightauth=eap-mschapv2 Этот параметр настраивает метод аутентификации, который клиенты будут использовать для аутентификации на сервере. eap-mschapv2 здесь используется для широкой совместимости для поддержки таких клиентов, как устройства Windows, macOS и Android.
  • rightsourceip=10.10.10.0/24 Этот параметр указывает серверу назначать частные IP-адреса клиентам из указанного 10.10.10.0/24 пула IP-адресов.
  • rightdns=8.8.8.8,8.8.4.4 Эти IP-адреса являются общедоступными преобразователями DNS Google. Их можно изменить, чтобы использовать другие общедоступные преобразователи, преобразователи VPN-сервера или любые другие преобразователи, доступные клиентам.
  • rightsendcert=never Этот параметр указывает серверу, что клиентам не нужно отправлять сертификат для аутентификации.

Теперь, когда вы знакомы с необходимыми параметрами «правильной» стороны для VPN, добавьте следующие строки в /etc/ipsec.conf:

. . .
conn ikev2-vpn
    . . .
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=10.10.10.0/24
    rightdns=8.8.8.8,8.8.4.4
    rightsendcert=never

Теперь мы скажем StrongSwan запрашивать у клиента учетные данные пользователя при подключении:

. . .
conn ikev2-vpn
    . . .
    eap_identity=%identity

Наконец, добавьте следующие строки для поддержки клиентов Linux, Windows, macOS, iOS и Android. Эти строки определяют различные алгоритмы обмена ключами, хеширования, аутентификации и шифрования (обычно называемые наборами шифров ), которые StrongSwan позволит использовать различным клиентам:

. . .
conn ikev2-vpn
    . . .
    ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
    esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!

Каждый поддерживаемый набор шифров отделяется от других запятой. Например chacha20poly1305-sha512-curve25519-prfsha512 есть один, а aes256gcm16-sha384-prfsha384-ecp384есть другой. Наборы шифров, перечисленные здесь, выбраны для обеспечения максимальной совместимости с клиентами Windows, macOS, iOS, Android и Linux.

Полный файл конфигурации должен выглядеть так:

config setup
    charondebug="ike 1, knl 1, cfg 0"
    uniqueids=no

conn ikev2-vpn
    auto=add
    compress=no
    type=tunnel
    keyexchange=ikev2
    fragmentation=yes
    forceencaps=yes
    dpdaction=clear
    dpddelay=300s
    rekey=no
    left=%any
    leftid=@server_domain_or_IP
    leftcert=server-cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=10.10.10.0/24
    rightdns=8.8.8.8,8.8.4.4
    rightsendcert=never
    eap_identity=%identity
    ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
    esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!

Сохраните и закройте файл, как только убедитесь, что вы правильно добавили каждую строку.

Теперь, когда мы настроили параметры VPN, давайте перейдем к созданию учетной записи, чтобы наши пользователи могли подключаться к серверу.

Шаг 5 — Настройка аутентификации VPN

Наш VPN-сервер теперь настроен на прием клиентских подключений, но у нас еще нет настроенных учетных данных. Нам нужно настроить пару вещей в специальном файле конфигурации с именем ipsec.secrets:

  • Нам нужно указать StrongSwan, где найти закрытый ключ для нашего сертификата сервера, чтобы сервер мог аутентифицировать клиентов.
  • Нам также необходимо настроить список пользователей, которым будет разрешено подключаться к VPN.

Откроем файл секретов для редактирования:

sudo nano /etc/ipsec.secrets 

Во-первых, мы сообщим StrongSwan, где найти наш закрытый ключ и как его разобрать. /etc/ipsec.secrets

: RSA "server-key.pem"

Убедитесь, что строка начинается с : символа и после него стоит пробел, чтобы вся строка читалась как : RSA "server-key.pem".

Затем мы определим учетные данные пользователя. Вы можете составить любую комбинацию имени пользователя или пароля, которая вам нравится:

your_username : EAP "your_password"

Сохраните и закройте файл. Теперь, когда мы закончили работу с параметрами VPN, перезапустим службу VPN, чтобы наша конфигурация применилась:

sudo systemctl restart strongswan-starter 

Теперь, когда VPN-сервер полностью настроен как с параметрами сервера, так и с учетными данными пользователя, пришло время перейти к настройке самой важной части: брандмауэра.

Шаг 6 — Настройка брандмауэра и IP-переадресации ядра

Когда конфигурация StrongSwan завершена, нам нужно настроить брандмауэр, чтобы разрешить прохождение и пересылку VPN-трафика.

Если вы следовали обязательному руководству по начальной настройке сервера, у вас должен быть включен брандмауэр UFW. Если вы еще не настроили UFW, вам следует начать с добавления правила, разрешающего SSH-соединения через брандмауэр, чтобы ваш текущий сеанс не закрывался при включении UFW:

sudo ufw allow OpenSSH 

Затем включите брандмауэр, набрав:

sudo ufw enable 

Затем добавьте правило, разрешающее трафик UDP на стандартные порты IPSec, 500 и 4500:

sudo ufw allow 500,4500/udp 

Далее мы откроем один из файлов конфигурации UFW, чтобы добавить несколько низкоуровневых политик для маршрутизации и пересылки пакетов IPSec. Однако прежде чем мы сможем это сделать, нам нужно найти, какой сетевой интерфейс на нашем сервере используется для доступа в Интернет. Найдите этот интерфейс, запросив устройство, связанное с маршрутом по умолчанию:

ip route show default 

Ваш общедоступный интерфейс должен следовать за словом «dev». Например, этот результат показывает интерфейс с именем eth0, который выделен в следующем примере:

default via your_server_ip dev eth0 proto static

Если у вас есть общедоступный сетевой интерфейс, откройте /etc/ufw/before.rules файл в текстовом редакторе. Правила в этом файле добавляются в брандмауэр перед остальными обычными правилами ввода и вывода. Они используются для настройки преобразования сетевых адресов (NAT), чтобы сервер мог правильно маршрутизировать соединения с клиентами и Интернетом.

sudo nano /etc/ufw/before.rules 

В верхней части файла (перед *filter строкой) добавьте следующий блок конфигурации. Измените каждый экземпляр eth0 в приведенной выше конфигурации, чтобы он соответствовал имени интерфейса, которое вы нашли с помощью ip route. Строки *nat создают правила, чтобы брандмауэр мог правильно маршрутизировать и управлять трафиком между VPN-клиентами и Интернетом. Строка *mangle регулирует максимальный размер сегмента пакета, чтобы предотвратить возможные проблемы с некоторыми VPN-клиентами:

*nat
-A POSTROUTING -s 10.10.10.0/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
-A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
COMMIT

*mangle
-A FORWARD --match policy --pol ipsec --dir in -s 10.10.10.0/24 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360
COMMIT

*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
. . .

Далее после *filter строк определения цепочки и добавьте еще один блок конфигурации:

. . .
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]

-A ufw-before-forward --match policy --pol ipsec --dir in --proto esp -s 10.10.10.0/24 -j ACCEPT
-A ufw-before-forward --match policy --pol ipsec --dir out --proto esp -d 10.10.10.0/24 -j ACCEPT

Эти строки указывают брандмауэру пересылать трафик ESP (Encapsulating Security Payload), чтобы VPN-клиенты могли подключаться. ESP обеспечивает дополнительную безопасность наших пакетов VPN, поскольку они проходят через ненадежные сети.

Перед перезапуском брандмауэра мы изменим некоторые параметры сетевого ядра, чтобы разрешить маршрутизацию с одного интерфейса на другой. Файл, управляющий этими настройками, называется /etc/ufw/sysctl.conf. Нам нужно настроить несколько вещей в файле.

Сначала необходимо включить пересылку пакетов IPv4, чтобы трафик мог перемещаться между VPN и общедоступными сетевыми интерфейсами на сервере. Далее мы отключим обнаружение Path MTU, чтобы предотвратить проблемы с фрагментацией пакетов. Наконец, мы не будем принимать перенаправления ICMP и отправлять перенаправления ICMP, чтобы предотвратить атаки посредника.

Откройте файл конфигурации параметров ядра UFW с помощью nanoлюбого текстового редактора:

sudo nano /etc/ufw/sysctl.conf 

Теперь добавьте следующий net/ipv4/ip_forward=1 параметр в конец файла, чтобы разрешить пересылку пакетов между интерфейсами:

. . .
net/ipv4/ip_forward=1
. . .
net/ipv4/conf/all/accept_redirects=0
net/ipv4/conf/all/send_redirects=0
. . .
net/ipv4/ip_no_pmtu_disc=1

Сохраните файл, когда закончите. Теперь мы можем включить все наши изменения, отключив и снова включив брандмауэр, поскольку UFW применяет эти настройки при каждом перезапуске:

sudo ufw disable 
sudo ufw enable 

Вам будет предложено подтвердить процесс. Введите Y, чтобы снова включить UFW с новыми настройками.

Шаг 7 — Тестирование VPN-подключения в Windows

Теперь, когда у вас все настроено, пришло время попробовать. Во-первых, вам нужно скопировать созданный сертификат ЦС и установить его на свои клиентские устройства, которые будут подключаться к VPN. Самый простой способ сделать это — войти на свой сервер и вывести содержимое файла сертификата:

cat /etc/ipsec.d/cacerts/ca-cert.pem 

Чтобы импортировать сертификат корневого ЦС с помощью PowerShell, сначала откройте командную строку PowerShell с правами администратора.

Import-Certificate -CertStoreLocation cert:\LocalMachine\Root\ -FilePath ~\Documents\ca-cert.pem 

Теперь, чтобы настроить VPN с помощью PowerShell, выполните следующую команду. Замените DNS-имя или IP-адрес вашего сервера в -ServerAddress строке. Различные флаги гарантируют, что Windows правильно настроена с соответствующими параметрами безопасности, которые соответствуют параметрам, установленным в файлах /etc/ipsec.conf.

Add-VpnConnection -Name "VPN Connection" ` 
 -ServerAddress "server_domain_or_IP" ` 
 -TunnelType "IKEv2" ` 
 -AuthenticationMethod "EAP" ` 
 -EncryptionLevel "Maximum" ` 
 -RememberCredential

Set-VpnConnectionIPsecConfiguration -Name "VPN Connection" ` 
 -AuthenticationTransformConstants GCMAES256 ` 
 -CipherTransformConstants GCMAES256 ` 
 -DHGroup ECP384 ` 
 -IntegrityCheckMethod SHA384 ` 
 -PfsGroup ECP384 ` 
 -EncryptionMethod GCMAES256 

Подключение к VPN

После импорта сертификата и настройки VPN любым из этих способов ваше новое VPN-подключение будет отображаться в списке сетей. Выберите VPN и нажмите «Подключиться» . Вам будет предложено ввести имя пользователя и пароль. Введите их, нажмите OK , и вы будете подключены.

Переход на swanctl

Обновление от 2025-12-17: т.к. вариант установки strongSwan через ipsec является устаревшим, я решил написать как перейти от него к swanctl - читать тут.

Комментарии

  • crowsford#

    Добрый день. Почти не надеюсь на ваш ответ, но всё же напишу. Сделал всё по этой инструкции. Поборол несколько проблем при создании. Всё получилось, компьютер подключается к VPN всё отлично. Но : подсле подключения к VPN доступа в интернет нет ) Сайты не открываются и пиктограмма "Доступ в интернет" показывает значек "отсутствие сети". Может вы что-то сможете подсказать?

    • Виталий Лещенкоавтор#

      Мне кажется что вы пропустили момент настройки пересылки ip пакетов (ip_forward).

      • crowsford#

        Я нашел свою ошибку через 15-ть минут, но забыл об этом написать, простите. Всё было просто : общедоступный интерфейс - я забыл поменять на свой. Спасибо за ответ и за статью. Может быть вы знаете продукцию Микротик и планируете выпустить статью похожую на эту, но с его использованием для создания инфраструктцры?

        • Виталий Лещенкоавтор#

          К сожалению или к счастью, с микротиками дел не имел. Ничего сказать не могу.

  • tandw#

    Добрый день. Какие существуют команды для проверки vpn сервера? Например посмотреть активные vpn Сессии? Можно ли прикрутить web интерфейс?

    • Виталий Лещенкоавтор#

      И вам добрый день. Это же Linux, тут нет готовых решений. Надо гуглить.

  • Samik#

    Установил, виндовс машины подключаються без проблем, но вот на mac не могут подключиться ((

    • Виталий Лещенкоавтор#

      Предположу что всё дело в шифровании. Посмотрите логи StrongSwan. На определенном этапе идет согласование поддерживаемых способов шифрования. В логах будет написан список того, что поддерживает клиент и что поддерживает сервер.

      Вам необходимо найти такие, которые поддерживаются всеми вашими платформами. В /etc/ipsec.conf надо править строки:

          ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
          esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
      ```		
      
  • co367#

    Здравствуйте, подскажите пожалуйста в чем дело:

    При попытке создать сертификат впн-сервера командой: pki --pub --in ~/pki/private/server-key.pem --type rsa \ | pki --issue --lifetime 1825 \ --cacert ~/pki/cacerts/ca-cert.pem \ --cakey ~/pki/private/ca-key.pem \ --dn "CN=xx.xxx.xx.xx" --san xx.xxx.xx.xx \ --flag serverAuth --flag ikeIntermediate --outform pem \ > ~/pki/certs/server-cert.pem

    Ubuntu выдает ошибку: Error: --cacert is required

    хотя в папке ~/pki/cacerts/ca-cert.pem корневой сертфикат присутствует (ca-cert.pem).

  • co367#

    предыдущее побороть вроде бы удалось, но вот лог андроида при подключении:

    Nov 2 17:08:19 00[DMN] +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    Nov 2 17:08:19 00[DMN] Starting IKE service (strongSwan 5.9.11, Android 13 - TP1A.220624.014.G985FXXSIHWHI/2023-09-01, SM-G985F - samsung/y2sser/samsung, Linux 4.19.87-27102101, aarch64, org.strongswan.android)

    Nov 2 17:08:19 00[LIB] providers loaded by OpenSSL: legacy default

    Nov 2 17:08:19 00[LIB] loaded plugins: androidbridge charon android-log socket-default openssl nonce pkcs1 pem x509 xcbc kdf revocation eap-identity eap-mschapv2 eap-md5 eap-gtc eap-tls

    Nov 2 17:08:19 00[JOB] spawning 16 worker threads

    Nov 2 17:08:19 06[IKE] initiating IKE_SA android[1] to 85.234.107.34

    Nov 2 17:08:19 06[ENC] generating IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) ]

    Nov 2 17:08:19 06[NET] sending packet: from 192.168.0.241[49041] to XX.XXX.XXX.XX[500] (948 bytes)

    Nov 2 17:08:21 09[IKE] retransmit 1 of request with message ID 0

    Nov 2 17:08:21 09[NET] sending packet: from 192.168.0.241[49041] to XX.XXX.XXX.XX[500] (948 bytes)

    Nov 2 17:08:24 10[IKE] retransmit 2 of request with message ID 0

    Nov 2 17:08:24 10[NET] sending packet: from 192.168.0.241[49041] to XX.XXX.XXX.XX[500] (948 bytes)

    Nov 2 17:08:29 11[IKE] retransmit 3 of request with message ID 0

    Nov 2 17:08:29 11[NET] sending packet: from 192.168.0.241[49041] to XX.XXX.XXX.XX[500] (948 bytes)

    Nov 2 17:08:34 12[IKE] giving up after 3 retransmits

    Nov 2 17:08:34 12[IKE] establishing IKE_SA failed, peer not responding

    Nov 2 17:08:34 14[IKE] unable to terminate IKE_SA: ID 1 not found

    Nov 2 17:08:40 00[DMN] +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    windows пишет что ошибка в брандмауэре или nat. В чем может быть проблема?

    • Виталий Лещенкоавтор#

      Есть вероятность что вы забыли установить libstrongswan-md4.so

  • aaa#

    Добрый день! Подскажите, пожалуйста, что можно сделать при данной ошибке. Ввожу "sudo systemctl restart strongswan-starter", ошибка System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down

  • igor_d#

    Сделал все как Вы описали. В итоге Windows 11 подключается, iPhone iOS16.6 подключается, iPhone 17.1 ни в какую не подключается =( еще отличие второго айфона - ой из гонконга. Перечитал множество статей, кто-то пишет что надо в какую-то папку два сертификата положить (пробовал). Кто-то говорит что надо чтобы сертификат был не более чем на 800 дней (не пробовал)..... Есть ли идеи?

    • igor_d#

      обратил внимание на разницу ответов при подключении: при нормальном подключении вот так: Feb 29 23:54:55 ipsec[4821]: 11[NET] received packet: from 1.1.1.1[2241] to 2.2.2.2[500] (604 bytes) Feb 29 23:54:55 ipsec[4821]: 11[ENC] parsed IKE_SA_INIT request 0 [ SA KE No N(REDIR_SUP) N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) ] Feb 29 23:54:55 ipsec[4821]: 11[IKE] 1.1.1.1 is initiating an IKE_SA Feb 29 23:54:55 ipsec[4821]: 11[IKE] remote host is behind NAT Feb 29 23:54:55 ipsec[4821]: 11[IKE] DH group MODP_2048 unacceptable, requesting MODP_1024

      а при не нормальном вот так: Feb 29 23:54:55 ipsec[4821]: 13[NET] received packet: from 1.1.1.1[13372] to 2.2.2.2[500] (370 bytes) Feb 29 23:54:55 ipsec[4821]: 13[ENC] parsed IKE_SA_INIT request 0 [ SA KE No N(REDIR_SUP) N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) ] Feb 29 23:54:55 ipsec[4821]: 13[IKE] 1.1.1.1 is initiating an IKE_SA Feb 29 23:54:55 ipsec[4821]: 13[IKE] remote host is behind NAT Feb 29 23:54:55 ipsec[4821]: 13[IKE] received proposals unacceptable

      • Виталий Лещенкоавтор#

        Вас скорее всего надо копать в сторону значения параметров ike и esp в файле ipsec.conf

        • Виталий Лещенкоавтор#

          Вам* - опечатка вышла

    • Виталий Лещенкоавтор#

      В процессе создания VPN сервера, вы делали корневой сертификат. Вот его надо установить на всех устройствах, которые будут подключаться. Делается это везде по разному, в зависимости от ОС. Как это делается в iOS я не знаю.

      • igor_d#

        сертификат установлен на все устройства одинаковый

  • Nikola#

    Спасибо за интересную статью. Можете подсказать есть ли какая-нибудь возможность поменять стандартные порты IPSec, 500 и 4500 на другие? Некоторые провайдеры начали блокировать эти порты, интересует этот вопрос.

    • Виталий Лещенкоавтор#

      нет. Порты только эти.

  • Дмитрий#

    у кого проблемы с подключением на ios 17, в частности на 17.4 проблема была, помогла установка таких алгоритмов в ike и esp

        ike=aes256gcm16-sha256-ecp256,aes256gcm16-sha256-modp2048,aes256-sha256-ecp256,aes256-sha256-modp2048!
        esp=aes256gcm16-sha256,aes256-sha256!
    
    • Антон#

      Не помогло с IOS 17.5.1 - может еще каке-то нюансы делались?

  • БлагоЯр#

    Подключается нормально, но интеренета нет. И по логам в syslog вроде всё норм.

    • Виталий Лещенкоавтор#

      Значит надо смотреть iptables

      • БлагоЯр#

        Это на oracle free tier, все порты открыты. iptables руками не трогал, там только то, что oracle накидал и wireguard

        # Generated by iptables-save v1.8.9 (nf_tables) on Thu Aug 15 12:50:48 2024
        *filter
        :INPUT ACCEPT [17050211:14837933700]
        :FORWARD ACCEPT [0:0]
        :OUTPUT ACCEPT [16578248:14421859389]
        -A INPUT -p udp -m udp --dport 51820 -j ACCEPT
        -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
        -A FORWARD -s 10.7.0.0/24 -j ACCEPT
        -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
        -A FORWARD -s 10.7.0.0/24 -j ACCEPT
        COMMIT
        # Completed on Thu Aug 15 12:50:48 2024
        # Generated by iptables-save v1.8.9 (nf_tables) on Thu Aug 15 12:50:48 2024
        *nat
        :PREROUTING ACCEPT [547153:30674295]
        :INPUT ACCEPT [546601:30599663]
        :OUTPUT ACCEPT [996148:63974349]
        :POSTROUTING ACCEPT [996148:63974349]
        -A POSTROUTING -s 10.7.0.0/24 ! -d 10.7.0.0/24 -j SNAT --to-source 10.0.0.74
        COMMIT
        # Completed on Thu Aug 15 12:50:48 2024
        
  • Pavel#

    Добрый день, Виталий!

    Благодарю за данный материал! Второй день пытаюсь настроить, ничего не получается (нет соединения с VPN). А главное, что сложно разобраться, где находится лог strongswan'а - вы не подскажите, где его можно посмотреть? Я не технический специалист, но подозреваю, что для локализации проблемы нужен в первую очередь лог, а найти его никак не получается.

    Заранее благодарю!

    • Виталий Лещенкоавтор#

      journalctl -u strongswan-starter

  • Stepan#

    Ктонибудь с андроида смог подключиться? какие параметры указывать в настройках ВПН, кроме очевидных)? Особенно интересует параметр "Идентификатор IPSec" С ПК все норм.

    • Виталий Лещенкоавтор#

      На андроид устройстве я ставил strongSwan. Подключается без проблем. Надо только сертификат установить в том же strongSwan'е. Родной клиент я не знаю как подружить.

  • admsasha#

    Подскажите, где я мог ошибиться?

    авг 19 13:40:44 vpn charon[25339]: 08[ENC] parsed IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) ]
    авг 19 13:40:44 vpn charon[25339]: 08[IKE] x.x.x.x is initiating an IKE_SA
    авг 19 13:40:44 vpn charon[25339]: 08[IKE] x.x.x.x is initiating an IKE_SA
    авг 19 13:40:44 vpn charon[25339]: 08[IKE] remote host is behind NAT
    авг 19 13:40:44 vpn charon[25339]: 08[IKE] DH group ECP_256 unacceptable, requesting CURVE_25519
    авг 19 13:40:44 vpn charon[25339]: 08[ENC] generating IKE_SA_INIT response 0 [ N(INVAL_KE) ]
    авг 19 13:40:44 vpn charon[25339]: 08[NET] sending packet: from y.y.y.y[500] to x.x.x.x[47497] (38 bytes)
    авг 19 13:40:44 vpn charon[25339]: 09[NET] received packet: from x.x.x.x[47497] to y.y.y.y[500] (1096 bytes)
    авг 19 13:40:44 vpn charon[25339]: 09[ENC] parsed IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) ]
    авг 19 13:40:44 vpn charon[25339]: 09[IKE] x.x.x.x is initiating an IKE_SA
    авг 19 13:40:44 vpn charon[25339]: 09[IKE] x.x.x.x is initiating an IKE_SA
    авг 19 13:40:44 vpn charon[25339]: 09[IKE] remote host is behind NAT
    авг 19 13:40:44 vpn charon[25339]: 09[ENC] generating IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(CHDLESS_SUP) N(MULT_AUTH) ]
    авг 19 13:40:44 vpn charon[25339]: 09[NET] sending packet: from y.y.y.y[500] to x.x.x.x[47497] (236 bytes)
    авг 19 13:40:44 vpn charon[25339]: 10[NET] received packet: from x.x.x.x[42626] to y.y.y.y[4500] (466 bytes)
    авг 19 13:40:44 vpn charon[25339]: 10[ENC] parsed IKE_AUTH request 1 [ IDi N(INIT_CONTACT) CERTREQ CPRQ(ADDR ADDR6 DNS NBNS DNS6) N(ESP_TFC_PAD_N) SA TSi TSr N(MOBIKE_SUP) N(NO_ADD_ADDR) N(MULT_AUTH) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ]
    авг 19 13:40:44 vpn charon[25339]: 10[IKE] received cert request for "CN=VPN root CA"
    авг 19 13:40:44 vpn charon[25339]: 10[IKE] initiating EAP_IDENTITY method (id 0x00)
    авг 19 13:40:44 vpn charon[25339]: 10[IKE] peer supports MOBIKE
    авг 19 13:40:44 vpn charon[25339]: 10[IKE] received ESP_TFC_PADDING_NOT_SUPPORTED, not using ESPv3 TFC padding
    авг 19 13:40:44 vpn charon[25339]: 10[IKE] authentication of 'vpn.mydomain.ru' (myself) with RSA_EMSA_PKCS1_SHA2_384 successful
    авг 19 13:40:44 vpn charon[25339]: 10[IKE] sending end entity cert "CN=vpn.mydomain.ru"
    авг 19 13:40:44 vpn charon[25339]: 10[ENC] generating IKE_AUTH response 1 [ IDr CERT AUTH EAP/REQ/ID ]
    авг 19 13:40:44 vpn charon[25339]: 10[ENC] splitting IKE message (1969 bytes) into 2 fragments
    авг 19 13:40:44 vpn charon[25339]: 10[ENC] generating IKE_AUTH response 1 [ EF(1/2) ]
    авг 19 13:40:44 vpn charon[25339]: 10[ENC] generating IKE_AUTH response 1 [ EF(2/2) ]
    авг 19 13:40:44 vpn charon[25339]: 10[NET] sending packet: from y.y.y.y[4500] to x.x.x.x[42626] (1248 bytes)
    авг 19 13:40:44 vpn charon[25339]: 10[NET] sending packet: from y.y.y.y[4500] to x.x.x.x[42626] (786 bytes)
    авг 19 13:40:44 vpn charon[25339]: 12[NET] received packet: from x.x.x.x[42626] to y.y.y.y[4500] (74 bytes)
    авг 19 13:40:44 vpn charon[25339]: 12[ENC] parsed IKE_AUTH request 2 [ EAP/RES/ID ]
    авг 19 13:40:44 vpn charon[25339]: 12[IKE] received EAP identity 'admsasha'
    авг 19 13:40:44 vpn charon[25339]: 12[IKE] initiating EAP_MSCHAPV2 method (id 0xC1)
    авг 19 13:40:44 vpn charon[25339]: 12[ENC] generating IKE_AUTH response 2 [ EAP/REQ/MSCHAPV2 ]
    авг 19 13:40:44 vpn charon[25339]: 12[NET] sending packet: from y.y.y.y[4500] to x.x.x.x[42626] (97 bytes)
    авг 19 13:40:44 vpn charon[25339]: 13[NET] received packet: from x.x.x.x[42626] to y.y.y.y[4500] (128 bytes)
    авг 19 13:40:44 vpn charon[25339]: 13[ENC] parsed IKE_AUTH request 3 [ EAP/RES/MSCHAPV2 ]
    авг 19 13:40:44 vpn charon[25339]: 13[IKE] EAP-MS-CHAPv2 verification failed, retry (1)
    авг 19 13:40:46 vpn charon[25339]: 13[ENC] generating IKE_AUTH response 3 [ EAP/REQ/MSCHAPV2 ]
    авг 19 13:40:46 vpn charon[25339]: 13[NET] sending packet: from y.y.y.y[4500] to x.x.x.x[42626] (114 bytes)
    авг 19 13:40:46 vpn charon[25339]: 14[NET] received packet: from x.x.x.x[42626] to y.y.y.y[4500] (65 bytes)
    авг 19 13:40:46 vpn charon[25339]: 14[ENC] parsed INFORMATIONAL request 4 [ N(AUTH_FAILED) ]
    авг 19 13:40:46 vpn charon[25339]: 14[ENC] generating INFORMATIONAL response 4 [ ]
    авг 19 13:40:46 vpn charon[25339]: 14[NET] sending packet: from y.y.y.y[4500] to x.x.x.x[42626] (57 bytes)
    

    /etc/ipsec.secrets

    : RSA "server-key.pem"
    
    admsasha : EAP "123456"
    user1 : EAP "test"
    

    /etc/ipsec.conf

    config setup
        charondebug="ike 1, knl 1, cfg 0"
        uniqueids=no
    
    conn ikev2-vpn
        auto=add
        compress=no
        type=tunnel
        keyexchange=ikev2
        fragmentation=yes
        forceencaps=yes
        dpdaction=clear
        dpddelay=300s
        rekey=no
        left=%any
        leftid=@vpn.mydomain.ru
        leftcert=server-cert.pem
        leftsendcert=always
        leftsubnet=0.0.0.0/0
        right=%any
        rightid=%any
        rightauth=eap-mschapv2
        rightsourceip=10.10.10.0/24
        rightdns=8.8.8.8,8.8.4.4
        rightsendcert=never
        eap_identity=%identity
        ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp102
    4,aes128-sha1-modp1024,3des-sha1-modp1024!
        esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
    
  • admsasha#

    На android нормально всё подключилось. А вот в linux нет.

    Добавьте как в KDE создать подключение. У меня вот так показывает:

    $ ipsec status
    Security Associations (1 up, 0 connecting):ikev2-vpn[8]: ESTABLISHED 16 seconds ago, y.y.y.y[vpn.mydomain.ru]...x.x.x.x[admsasha]
    
  • admsasha#

    консольный клиент strongswan вот что пишет:

    авг 20 11:25:37 host-89 charon[1003779]: 06[IKE] authentication of 'vpn.mydomain.ru' with EAP successful
    авг 20 11:25:37 host-89 charon[1003779]: 06[IKE] installing DNS server 8.8.8.8 via resolvconf
    авг 20 11:25:37 host-89 charon[1003779]: 06[IKE] installing DNS server 8.8.4.4 via resolvconf
    авг 20 11:25:37 host-89 charon[1003779]: 06[IKE] installing new virtual IP 10.10.10.1
    авг 20 11:25:37 host-89 charon[1003779]: 06[IKE] peer supports MOBIKE
    авг 20 11:25:37 host-89 charon[1003779]: 06[IKE] IKE_SA ipsec-ikev2-vpn-client[1] established between 192.168.1.124[admsasha]...x.x.x.x[vpn.mydomain.ru]
    авг 20 11:25:37 host-89 charon[1003779]: 06[IKE] IKE_SA ipsec-ikev2-vpn-client[1] established between 192.168.1.124[admsasha]...x.x.x.x[vpn.mydomain.ru]
    авг 20 11:25:37 host-89 charon[1003779]: 06[IKE] scheduling rekeying in 9934s
    авг 20 11:25:37 host-89 charon[1003779]: 06[IKE] maximum IKE_SA lifetime 10474s
    авг 20 11:25:37 host-89 charon[1003779]: 06[CFG] selected proposal: ESP:AES_GCM_16_256/NO_EXT_SEQ
    авг 20 11:25:37 host-89 charon[1003779]: 06[KNL] unable to add SAD entry with SPI c9986138: Function not implemented (38)
    авг 20 11:25:37 host-89 charon[1003779]: 06[KNL] unable to add SAD entry with SPI cac9490c: Function not implemented (38)
    авг 20 11:25:37 host-89 charon[1003779]: 06[IKE] unable to install inbound and outbound IPsec SA (SAD) in kernel
    авг 20 11:25:37 host-89 charon[1003779]: 06[IKE] failed to establish CHILD_SA, keeping IKE_SA
    авг 20 11:25:37 host-89 charon[1003779]: 06[IKE] sending DELETE for ESP CHILD_SA with SPI c9986138
    авг 20 11:25:37 host-89 charon[1003779]: 06[ENC] generating INFORMATIONAL request 6 [ D ]
    авг 20 11:25:37 host-89 charon[1003779]: 06[NET] sending packet: from 192.168.1.124[4500] to x.x.x.x[4500] (69 bytes)
    авг 20 11:25:38 host-89 charon[1003779]: 12[NET] received packet: from x.x.x.x[4500] to 192.168.1.124[4500] (69 bytes)
    авг 20 11:25:38 host-89 charon[1003779]: 12[ENC] parsed INFORMATIONAL response 6 [ D ]
    авг 20 11:25:38 host-89 charon[1003779]: 12[KNL] deleting policy 0.0.0.0/0 === 10.10.10.1/32 in failed, not found
    авг 20 11:25:38 host-89 charon[1003779]: 12[KNL] deleting policy 0.0.0.0/0 === 10.10.10.1/32 fwd failed, not found
    авг 20 11:25:38 host-89 charon[1003779]: 12[KNL] unable to delete SAD entry with SPI c9986138: No such process (3)
    авг 20 11:25:38 host-89 charon[1003779]: 12[KNL] unable to delete SAD entry with SPI cac9490c: No such process (3)
    
  • Роман#

    Если у кого-то возникли проблемы с подключением, то можете использовать в конфиге (/etc/ipsec.conf):

    ike=aes256-sha256-modp2048,aes128-sha256-modp1024,3des-sha1-modp1024!

    esp=aes256-sha256,aes128-sha1,3des-sha1!

    Это решило мою проблему.

Оставить комментарий могут только зарегистрированные пользователи.

Войдите на сайт или зарегистрируйтесь, чтобы оставить комментарий.