Виртуальная частная сеть (VPN) позволяет выполнять защищенное шифрование трафика, передаваемого через незащищенные сети, например, в кафе, на конференции или в аэропорту.
Протокол IKEv2 или Internet Key Exchange v2 позволяет создавать прямые туннели IPSec между сервером и клиентом. IPSec обеспечивает шифрование сетевого трафика в виртуальных частных сетях IKEv2. IKEv2 изначально поддерживается на ряде платформ OS X 10.11+, iOS 9.1+, Windows 10) без дополнительных приложений и легко решает проблемы с подключением клиентов.
В этом обучающем модуле мы выполним настройку сервера IKEv2 VPN с помощью StrongSwan на сервере Ubuntu 18.04 и подключимся к нему с клиентов Windows, macOS, Ubuntu, iOS и Android.
Для данного обучающего руководства вам потребуется следующее:
sudo
без привилегий root.Вначале мы установим StrongSwan, демона IPSec с открытым исходным кодом, а затем настроим его как наш сервер VPN. Также мы установим компонент инфраструктуры открытых ключей, чтобы создать центр сертификации, который будет предоставлять учетные данные для нашей инфраструктуры.
Обновите кэш локальных пакетов и установите программное обеспечение с помощью следующей команды:
- sudo apt update
- sudo apt install strongswan strongswan-pki
После завершения установки перейдем к созданию сертификатов.
Для идентификации на клиентских системах серверу IKEv2 требуется сертификат. Пакет strongswan-pki
включает утилиту, которая может сгенерировать центр сертификации и сертификаты сервера. Для начала создадим несколько каталогов для хранения всех активо, с которыми мы будем работать. Структура каталогов соответствует некоторым каталогам в /etc/ipsec.d
, куда мы постепенно переместим все создаваемые элементы. Мы заблокируем разрешения, чтобы другие пользователи не могли видеть наши частные файлы:
- mkdir -p ~/pki/{cacerts,certs,private}
- chmod 700 ~/pki
Располагая структурой каталогов для хранения всех элементов, мы можем сгенерировать ключ root. Это будет 4096-битный ключ RSA, который будет использоваться для подписи корневого центра сертификации.
Запустите следующие команды, чтобы сгенерировать ключ:
- ipsec pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem
Получив ключ, мы можем перейти к созданию корневого центра сертификации, используя ключ для подписания сертификата root:
- ipsec 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
Вы можете изменить значение distinguished name (DN) на любое другое имя по своему желанию. Используемое здесь имя common приведено просто для примера, имя не должно соответствовать какому-либо элементу вашей инфраструктуры.
Настроив и запустив корневой центр сертификации, мы можем создать сертификат, который будет использоваться сервером VPN.
Теперь мы создадим сертификат и ключ для сервера VPN. Этот сертификат позволит клиентам проверять подлинность сервера, используя только что сгенерированный нами сертификат CA.
Вначале создайте закрытый ключ сервера VPN с помощью следующей команды:
- ipsec pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem
Затем создайте и подпишите сертификат сервера VPN, используя ключ центра сертификации, созданный на предыдущем шаге. Запустите следующую команду, но измените поля Common Name (CN) и Subject Alternate Name (SAN) на имя DNS или IP-адрес вашего сервера VPN:
- ipsec pki --pub --in ~/pki/private/server-key.pem --type rsa \
- | ipsec 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
Теперь мы сгенерировали все файлы TLS/SSL, необходимые StrongSwan, и можем переместить их в каталог /etc/ipsec.d
следующим образом:
- sudo cp -r ~/pki/* /etc/ipsec.d/
На этом шаге мы создали пару сертификатов, которые можно будет использовать для защиты связи между клиентом и сервером. Также мы подписали сертификаты ключом CA, и теперь клиент сможет проверять подлинность сервера VPN, используя сертификат CA. Подготовив все сертификаты, мы можем перейти к настройке программного обеспечения.
StrongSwan имеет файл конфигурации по умолчанию с несколькими образцами, но большинство настроек нужно будет выполнить самостоятельно. Прежде чем начинать, создадим резервную копию файла для справки:
- sudo mv /etc/ipsec.conf{,.original}
Создайте и откройте новый пустой файл конфигурации, введя следующую команду:
- sudo nano /etc/ipsec.conf
Вначале мы укажем StrongSwan регистрировать состояния демонов для целей отладки и разрешить дублирующиеся соединения. Добавьте в файл следующие строки:
config setup
charondebug="ike 1, knl 1, cfg 0"
uniqueids=no
Затем мы создадим раздел конфигурации для сервера VPN. Также мы укажем StrongSwan создать туннели IKEv2 VPN и автоматически загружать этот раздел конфигурации при запуске. Добавьте в файл следующие строки:
. . .
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 нашего сервера (слева). Добавьте в файл следующее:
. . .
conn ikev2-vpn
. . .
left=%any
leftid=@server_domain_or_IP
leftcert=server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
Примечание. При настройке идентификатора сервера (leftid
) символ @
нужно указывать только в случае, если ваш сервер VPN будет идентифицироваться по доменному имени:
leftid=@vpn.example.com
Если сервер будет идентифицироваться по IP-адресу, просто укажите IP-адрес:
leftid=203.0.113.7
Теперь мы можем настроить параметры IPSec на стороне клиента (справа) как диапазоны частных IP-адресов и серверы DNS, которые нужно будет использовать:
. . .
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
Файл конфигурации должен выглядеть следующим образом:
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
Когда вы убедитесь, что конфигурация соответствует показанной, сохраните и закройте файл.
Теперь мы настроили параметры VPN и можем перейти к созданию учетной записи, чтобы наши пользователи могли подключаться к серверу.
Теперь наш сервер VPN настроен на принятие подключений клиентов, но мы еще не настроили учетные данные. Нам нужно задать пару настроек в специальном файле конфигурации с именем ipsec.secrets
:
Откроем для редактирования файл secrets
- sudo nano /etc/ipsec.secrets
Вначале мы укажем StrongSwan, где можно найти закрытый ключ:
: RSA "server-key.pem"
Затем мы зададим учетные данные пользователя. Вы можете создать любую комбинацию имени пользователя и пароля:
your_username : EAP "your_password"
Сохраните и закройте файл. Мы завершили настройку параметров VPN и теперь можем перезапустить службу VPN, чтобы применить новую конфигурацию:
- sudo systemctl restart strongswan
Мы полностью настроили параметры сервера и учетные данные пользователя на сервере VPN и теперь можем перейти к самой важной части: настройке брандмауэра.
После настройки конфигурации StrongSwan нам нужно настроить брандмауэр, чтобы он разрешал трафик VPN и перенаправлял его.
Если вы выполнили указания предварительных обучающих модулей, у вас должен быть включен базовый брандмауэр UFW. Если вы еще не настроили UFW, вы можете базовую конфигурацию и включить ее с помощью следующей команды:
- sudo ufw allow OpenSSH
- sudo ufw enable
Теперь добавьте правило, которое будет разрешать трафик UDP на стандартных портах IPSec, 500 и 4500:
- sudo ufw allow 500,4500/udp
Затем мы откроем один из файлов конфигурации UFW, чтобы добавить несколько политик нижнего уровня для маршрутизации и перенаправления пакетов IPSec. Перед этим нам нужно будет определить, какой сетевой интерфейс нашего сервера будет использоваться для доступа к интернету. Для этого мы можем отправить запрос интерфейса, связанного с маршрутом по умолчанию:
- ip route | grep default
Ваш публичный интерфейс должен содержать слово «dev». Например, в этом результате показан интерфейс с именем eth0
, который выделен ниже:
Outputdefault via 203.0.113.7 dev eth0 proto static
Определив интерфейс публичной сети, откройте файл правил /etc/ufw/before.rules
в своем текстовом редакторе:
- sudo nano /etc/ufw/before.rules
Добавьте в верхнюю часть файла (перед строкой *filter
) следующий блок конфигурации:
*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]
. . .
Измените каждый экземпляр eth0
в конфигурации выше для соответствия имени интерфейса, которое вы определили с помощью ip route
. Строки *nat
создают правила, благодаря которым брандмауэр может обеспечивать маршрутизацию и управление трафиком между клиентами VPN и интернетом. Строка *mangle
позволяет настроить максимальный размер сегмента пакета, чтобы предотвратить возможные проблемы с некоторыми клиентами VPN.
После строки *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 (защищенная инкапсуляция полезной нагрузки), чтобы дать клиентам VPN возможность подключения. ESP обеспечивает дополнительную защиту пакетов VPN, когда они проходят через ненадежные сети.
Завершив редактирование, сохраните и закройте файл.
Прежде чем перезапустить брандмауэр, нам нужно изменить некоторые параметры ядра сети, чтобы разрешить маршрутизацию с одного интерфейса на другой. Откройте файл конфигурации параметров ядра UFW:
- sudo nano /etc/ufw/sysctl.conf
Нам нужно настроить несколько параметров:
Внесенные в файл изменения выделены в приведенном ниже фрагменте кода:
. . .
# Enable forwarding
# Uncomment the following line
net/ipv4/ip_forward=1
. . .
# Do not accept ICMP redirects (prevent MITM attacks)
# Ensure the following line is set
net/ipv4/conf/all/accept_redirects=0
# Do not send ICMP redirects (we are not a router)
# Add the following lines
net/ipv4/conf/all/send_redirects=0
net/ipv4/ip_no_pmtu_disc=1
Завершив изменения, сохраните файл. UFW применит эти изменения при следующем запуске.
Теперь мы можем активировать все изменения, отключив и снова включив брандмауэр:
- sudo ufw disable
- sudo ufw enable
Вам будет предложено подтвердить процесс. Введите Y
, чтобы активировать UFW с новыми настройками.
Мы завершили подготовку, и пришло время для тестирования. Вначале нужно скопировать созданный вами сертификат CA и установить его на клиентские устройства, которые будут подключаться к VPN. Для этого удобнее всего выполнить вход на ваш сервер и вывести содержимое файла сертификата:
- cat /etc/ipsec.d/cacerts/ca-cert.pem
Вывод будет выглядеть следующим образом:
Output-----BEGIN CERTIFICATE-----
MIIFQjCCAyqgAwIBAgIIFkQGvkH4ej0wDQYJKoZIhvcNAQEMBQAwPzELMAkGA1UE
. . .
EwbVLOXcNduWK2TPbk/+82GRMtjftran6hKbpKGghBVDPVFGFT6Z0OfubpkQ9RsQ
BayqOb/Q
-----END CERTIFICATE-----
Скопируйте эти данные на свой компьютер, включая строки -----BEGIN CERTIFICATE-----
и -----END CERTIFICATE-----
, и сохраните их в файл с понятным именем, например, ca-cert.pem
. Созданный файл должен иметь расширение .pem
.
Также вы можете использовать SFTP, чтобы перенести файл на свой компьютер.
Когда файл ca-cert.pem
будет загружен на ваш компьютер, вы можете настроить подключение к VPN.
Вначале импортировать сертификат root, выполнив следующие шаги:
Нажмите WINDOWS+R
, чтобы открыть диалоговое окно Выполнить и введите mmc.exe
, чтобы открыть консоль управления Windows.
Из меню Файл перейдите в раздел Добавить или удалить оснастку, выберите Сертификаты из списка доступных оснасток и нажмите Добавить.
Чтобы разрешить VPN работать для любых пользователей, выберите Учетная запись компьютера и нажмите Далее.
Поскольку мы выполняем настройку на локальном компьютере, выберите пункт Локальный компьютер и нажмите Готово.
Под узлом Корень консоли откройте запись Сертификаты (локальный компьютер), раскройте Доверенные корневые центры сертификации и выберите запись Сертификаты:
В меню Действие выберите пункт Все задачи и нажмите Импорт, чтобы открыть мастер импорта сертификатов. Нажмите Далее, чтобы пролистать вводное окно.
На экране Импортируемый файл нажмите кнопку Обзор и выберите сохраненный файл сертификата. Затем нажмите Далее.
Убедитесь, что Хранилище сертификатов имеет значение Доверенные корневые центры сертификации и нажмите Далее.
Нажмите Готово, чтобы импортировать сертификат.
Затем выполните следующие шаги по настройке VPN:
Ваше новое подключение VPN появится в списке сетей. Выберите VPN и нажмите Подключиться. Вам будет предложено ввести свои имя пользователя и пароль. Введите эти данные, нажмите OK, и подключение будет установлено.
Выполните следующие шаги по импорту сертификата:
Теперь сертификат импортирован и настроен как доверенный, и вы можете настроить соединение VPN:
Наконец, нажмите кнопку Connect (подключение) для подключения к VPN. Теперь вы должны быть подключены к VPN.
Чтобы подключиться с компьютера под управлением Ubuntu, вы должны настроить и управлять StrongSwan как службой или использовать разовую команду при каждой попытке подключения. Далее приводятся инструкции для обоих случаев.
sudo apt update
sudo apt install strongswan libcharon-extra-plugins
/etc/ipsec.d/cacerts
: sudo cp /tmp/ca-cert.pem /etc/ipsec.d/cacerts
sudo systemctl disable --now strongswan
/etc/ipsec.secrets
: your_username : EAP "your_password"
/etc/ipsec.conf
, чтобы определить конфигурацию.config setup
conn ikev2-rw
right=server_domain_or_IP
# This should match the `leftid` value on your server's configuration
rightid=server_domain_or_IP
rightsubnet=0.0.0.0/0
rightauth=pubkey
leftsourceip=%config
leftid=username
leftauth=eap-mschapv2
eap_identity=%identity
auto=start
Чтобы подключиться к VPN, введите:
- sudo systemctl start strongswan
Чтобы снова отключиться, введите:
- sudo systemctl stop strongswan
sudo apt update
charon-cmd
и связанное программное обеспечение: sudo apt install charon-cmd libcharon-extra-plugins
cd <^>/path/to/ca-cert.pem
charon-cmd
, используя сертификат CA сервера, IP-адрес сервера VPN и настроенное имя пользователя:sudo charon-cmd --cert ca-cert.pem --host vpn_domain_or_IP --identity your_username
Теперь вы должны быть подключены к VPN. Чтобы отключиться, нажмите CTRL+C
и дождитесь, пока соединение не будет закрыто.
Чтобы настроить соединение VPN на устройстве iOS, выполните следующие действия:
Выполните следующие шаги по импорту сертификата:
Теперь сертификат импортирован в приложение StrongSwan, и вы можете настроить соединение VPN следующим образом:
Когда вы захотите подключится к VPN, нажмите на профиль, созданный в приложении StrongSwan.
Если вы не сможете импортировать сертификат, убедитесь, что файл имеет расширение .pem
, а не .pem.txt
.
Если вы не можете подключиться к VPN, проверьте используемые имя сервера и IP-адрес. Доменное имя или IP-адрес сервера должны соответствовать настроенным как общее имя (CN) при создании сертификата. Если они не совпадают, соединение VPN не будет работать. Если вы настроили сертификат с CN vpn.example.com
, вы должны использовать vpn.example.com
при вводе данных сервера VPN. Еще раз проверьте команду, которую вы использовали для генерирования сертификата и значения, которые использовали при создании соединения VPN.
Наконец, проверьте конфигурацию VPN и убедитесь, что значение leftid
настроено с символом @
, если вы используете доменное имя:
leftid=@vpn.example.com
Если вы используете IP-адрес, убедитесь, что символ @
опущен.
В этом обучающем модуле вы создали сервер VPN, использующий протокол IKEv2. Теперь вы можете быть уверены, что ваши действия в сети будут защищены!
Чтобы добавить или удалить пользователей, еще раз изучите шаг 5. Каждая строка предназначена для одного пользователя, и поэтому для добавления или удаления пользователей достаточно просто отредактировать файл.
Также вы можете захотеть использовать анализатор файлов журнала, потому что StrongSwan отправляет дампы своих журналов в syslog. В обучающем модуле Установка и использование инструмента Logwatch Log Analyzer and Reporter с VPS можно найти дополнительную информацию по этой процедуре.
Вы также можете заинтересовать это руководство EFF по конфиденциальности в режиме онлайн.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Sign up for Infrastructure as a Newsletter.
Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.
If the WIndows 10-11 client connects the only second time, install the libcharon-extra-plugins package in addition and restart the VPS.
Hello! Are there any rules to allow mDNS inside a local network? I can see local addresses throw IKEv2 VPN, but multicast doesn’t work…