Установка VPN-сервера IKEv2 StrongSwan в Ubuntu 16.04

Виртуальная частная сеть (или VPN) обеспечивает надёжное шифрование трафика при работе с небезопасными сетями (например, с публичными сетями в кафе или в аэропорту и т.п.).

IKEv2 (Internet Key Exchange v2) – это протокол, который обеспечивает прямое туннелирование IPSec между сервером и клиентом. В VPN-реализациях протокола IKEv2 IPSec шифрует сетевой трафик. IKEv2 по умолчанию поддерживается новыми платформами (OS X 10.11+, iOS 9.1+, Windows 10) без каких-либо дополнительных приложений.

Данное руководство поможет установить VPN-сервер IKEv2 StrongSwan на сервер Ubuntu 16.04 и подключиться к нему с Windows, iOS и macOS.

Требования

  • Сервер Ubuntu 16.04 (данная настройка требует много CPU).
  • Пользователь с доступом sudo.
  • Настроенный брандмауэр (все необходимые инструкции вы найдёте здесь).
  • Базовые навыки работы с IPTables (ознакомьтесь с руководством Как работает IPTables).

1: Установка StrongSwan

StrongSwan – это открытый демон IPSec, который можно использовать в качестве сервера VPN.

Установите StrongSwan. Также для работы понадобится плагин StrongSwan EAP, который поддерживает парольную аутентификацию клиентов (вместо аутентификации по сертификату). Кроме того, нужно добавить несколько правил в брандмауэр, а для этого нужно установить утилиту, которая сохраняет правила и позволяет использовать их на постоянной основе.

Чтобы установить все эти компоненты, введите:

sudo apt-get install strongswan strongswan-plugin-eap-mschapv2 moreutils iptables-persistent

Примечание: При установке iptables-persistent инсталлятор предложит сохранить текущие правила IPv4 и IPv6. Сохраните параметры конфигурации брандмауэра, выбрав yes.

2: Создание центра сертификации

Для идентификации клиентов серверу IKEv2 нужны сертификаты. Поэтому StrongSwan поставляется с утилитой для генерирования центра сертификации и сертификатов сервера. Для начала создайте каталог для хранения всех этих компонентов.

mkdir vpn-certs
cd vpn-certs

Теперь у вас есть отдельный каталог для сертификатов. Сгенерируйте root ключ – 4096-битный RSA-ключ, с помощью которого вы сможете подписать root-сертификат. Доступ к этому ключу необходимо ограничить, права на чтение должны быть только у пользователя root.

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

ipsec pki --gen --type rsa --size 4096 --outform pem > server-root-key.pem
chmod 600 server-root-key.pem

Теперь можно создать ЦС и использовать ключ для подписи сертификата root:

ipsec pki --self --ca --lifetime 3650 \
--in server-root-key.pem \
--type rsa --dn "C=US, O=VPN Server, CN=VPN Server Root CA" \
--outform pem > server-root-ca.pem

Вы можете изменить параметры флага –dn (distinguished name) и указать свою страну, организацию и имя. В данном случае параметр CN(common name) – просто идентификатор, вы можете просто придумать его.

В дальнейшем мы скопируем root-сертификат (server-root-ca.pem) на клиентские устройства, чтобы они могли проверить подлинность сервера при подключении.

Теперь нужно создать сертификат для сервера VPN.

3: Генерирование сертификата для VPN-сервера

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

Чтобы создать закрытый ключ, введите команду:

ipsec pki --gen --type rsa --size 4096 --outform pem > vpn-server-key.pem

Затем создайте сертификат для VPN-сервера и подпишите его с помощью ЦС, который вы получили в предыдущем разделе. Запустите следующий набор команд, предварительно указав в параметрах CN (Common Name) и SAN (Subject Alternate Name) доменное имя или IP-адрес сервера.

ipsec pki --pub --in vpn-server-key.pem \
--type rsa | ipsec pki --issue --lifetime 1825 \
--cacert server-root-ca.pem \
--cakey server-root-key.pem \
--dn "C=US, O=VPN Server, CN=server_name_or_ip" \
--san server_name_or_ip \
--flag serverAuth --flag ikeIntermediate \
--outform pem > vpn-server-cert.pem

Скопируйте сертификаты в каталог, в котором StrongSwan сможет прочитать их:

sudo cp ./vpn-server-cert.pem /etc/ipsec.d/certs/vpn-server-cert.pem
sudo cp ./vpn-server-key.pem /etc/ipsec.d/private/vpn-server-key.pem

Ограничьте к ним доступ и передайте все права на чтение пользователю root:

sudo chown root /etc/ipsec.d/private/vpn-server-key.pem
sudo chgrp root /etc/ipsec.d/private/vpn-server-key.pem
sudo chmod 600 /etc/ipsec.d/private/vpn-server-key.pem

Теперь у вас есть сертификаты, которые защитят взаимодействие клиента и сервера. Кроме того, с их помощью клиенты смогут подтвердить подлинность VPN-сервера.

4: Настройка StrongSwan

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

sudo cp /etc/ipsec.conf /etc/ipsec.conf.original

Сам файл содержит достаточно много настроек. Чтоб избежать ошибок, удалите содержимое файла по умолчанию.

echo '' | sudo tee /etc/ipsec.conf

Теперь откройте его в текстовом редакторе:

sudo nano /etc/ipsec.conf

Настройте регистрацию состояний демона (это пригодится при отладке и устранении неполадок) и разрешите резервные соединения. Добавьте эти строки в файл:

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

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

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

Выберите алгоритмы шифрования для VPN.

ike=aes256-sha1-modp1024,3des-sha1-modp1024!
esp=aes256-sha1,3des-sha1!

Также нужно настроить обнаружение прерванных соединений клиентов.

dpdaction=clear
dpddelay=300s
rekey=no

После этого добавьте параметры IPSec стороны сервера:

left=%any
leftid=@server_name_or_ip
leftcert=/etc/ipsec.d/certs/vpn-server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0

Примечание: Если в параметре leftid в качестве ID вы хотите использовать домен VPN-сервера, добавьте после = символ @:

leftid=@vpn.example.com

Если вы хотите использовать IP, просто укажите его:

leftid=111.111.111.111

Затем нужно настроить клиентскую сторону соединения. Укажите следующие параметры (внутренний IP, DNS-сервер и т.д.):

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

Примечание: Серверная сторона соединения считается левой стороной (left…), а клиентская – правой (right…).

Сервер StrongSwan должен запрашивать учётные данные пользователя при подключении клиента. Для этого добавьте:

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
ike=aes256-sha1-modp1024,3des-sha1-modp1024!
esp=aes256-sha1,3des-sha1!
dpdaction=clear
dpddelay=300s
rekey=no
left=%any
leftid=@server_name_or_ip
leftcert=/etc/ipsec.d/certs/vpn-server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
right=%any
rightid=%any
rightauth=eap-mschapv2
rightdns=8.8.8.8,8.8.4.4
rightsourceip=10.10.10.0/24
rightsendcert=never
eap_identity=%identity

Сохраните и закройте файл.

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

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

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

Откройте файл:

sudo nano /etc/ipsec.secrets

Укажите путь к закрытому ключу:

server_name_or_ip : RSA "/etc/ipsec.d/private/vpn-server-key.pem"

Затем укажите учётные данные пользователей. Сервер StrongSwan должен разрешать этим пользователям подключаться из любой точки.

your_username %any% : EAP "your_password"

Примечание: Вместо your_username и your_password укажите свои учётные данные (имя пользователя и пароль).

Сохраните и закройте файл.

Теперь можно перезапустить сервис VPN, чтобы обновить параметры.

sudo ipsec reload

6: Настойка брандмауэра и IP forwarding

Теперь нужно настроить брандмауэр для поддержки VPN-трафика. Для этого можно использовать IPTables.

Сначала отключите UFW (если этот брандмауэр включен), чтоб избежать конфликта правил:

sudo ufw disable

Затем очистите список правил UFW:

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -Z

Чтобы не заблокировать свою собственную сессию SSH, нужно разрешить все текущие соединения. Также нужно открыть порт 22 для поддержки новых соединений SSH (если вы используете нестандартный порт SSH, откройте его).

sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Чтобы принимать соединения на локальном кольцевом интерфейсе, введите:

sudo iptables -A INPUT -i lo -j ACCEPT

Включите поддержку IPSec:

sudo iptables -A INPUT -p udp --dport  500 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 4500 -j ACCEPT

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

sudo iptables -A FORWARD --match policy --pol ipsec --dir in  --proto esp -s 10.10.10.10/24 -j ACCEPT
sudo iptables -A FORWARD --match policy --pol ipsec --dir out --proto esp -d 10.10.10.10/24 -j ACCEPT

VPN-сервер будет работать как шлюз между клиентами VPN и интернетом. Поскольку VPN-сервер имеет только один внешний IP-адрес, нужно настроить маскировку, чтобы позволить серверу запрашивать данные из Интернета от имени клиентов; тогда трафик VPN-клиентов сможет поступать в сеть Интернет, и наоборот:

sudo iptables -t nat -A POSTROUTING -s 10.10.10.10/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
sudo iptables -t nat -A POSTROUTING -s 10.10.10.10/24 -o eth0 -j MASQUERADE

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

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

Чтобы повысить безопасность, сбрасывайте весь трафик, который не соответствует вышеперечисленным правилам.

sudo iptables -A INPUT -j DROP
sudo iptables -A FORWARD -j DROP

Сохраните правила брандмауэра:

sudo netfilter-persistent save
sudo netfilter-persistent reload

Осталось включить пересылку пакетов. Пересылка пакетов позволяет серверу поддерживать маршрутизацию данных от одного IP-адреса к другому. По сути, теперь сервер будет действовать как маршрутизатор.

Откройте /etc/sysctl.conf:

sudo nano /etc/sysctl.conf

В файле нужно:

  • Включить пересылку пакетов IPv4.
  • Отключить Path MTU Discovery, чтобы предотвратить фрагментацию пакетов.
  • Отключить поддержку icmp-редиректов, чтобы предупредить атаки посредника.

Все изменения выделены ниже красным:

. . .
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
. . .
# Do not accept ICMP redirects (prevent MITM attacks)
net.ipv4.conf.all.accept_redirects = 0
# Do not send ICMP redirects (we are not a router)
net.ipv4.conf.all.send_redirects = 0
. . .
net.ipv4.ip_no_pmtu_disc = 1

Сохраните и закройте файл.

Перезапустите сервер:

sudo reboot

При перезагрузке сервера соединение будет сброшено (это нормально). После перезагрузки снова подключитесь к серверу как пользователь с доступом к sudo. Теперь нужно протестировать настройку с помощью клиентов.

7: Тестирование VPN-соединений в Windows, iOS и macOS

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

cat ~/vpn-certs/server-root-ca.pem
-----BEGIN CERTIFICATE-----
MIIFQjCCAyqgAwIBAgIIFkQGvkH4ej0wDQYJKoZIhvcNAQEMBQAwPzELMAkGA1UE
. . .
EwbVLOXcNduWK2TPbk/+82GRMtjftran6hKbpKGghBVDPVFGFT6Z0OfubpkQ9RsQ
BayqOb/Q
-----END CERTIFICATE-----

Скопируйте вывод на компьютер, включая строки —–BEGIN CERTIFICATE—– и —–END CERTIFICATE—–. Сохраните эти данные в файл с описательным именем (например, vpn_root_certificate.pem). Файл должен иметь расширение .pem.

В качестве альтернативы можно использовать SFTP.

Читайте также: Использование SFTP для безопасного обмена файлами с удаленным сервером

Скопировав сертификат на компьютер, вы можете подключиться к VPN.

Подключение в Windows

Импортируйте сертификат root:

  1. Нажмите WINDOWS+R, чтобы открыть диалог Run, и введите mmc.exe, чтобы запустить консоль управления Windows.
  2. Из меню File перейдите в Add or Remove Snap-in, выберите в списке Certificates и нажмите Add.
  3. Чтобы к VPN мог подключиться любой пользователь, выберите Computer Account и нажмите Next.
  4. Настройка выполняется на локальном компьютере, потому нужно выбрать Local Computer и нажать Finish.
  5. В Console Root разверните Certificates (Local Computer) → Trusted Root Certification Authorities и выберите Certificates.
  6. В меню Action выберите All Tasks и нажмите Import, чтобы вызвать мастер импортирования сертификатов. Нажмите Next.
  7. В поле File to Import выберите файл сертификата, который вы скопировали ранее. Нажмите Next.
  8. Убедитесь, что в Certificate Store выбрано Trusted Root Certification Authorities. Нажмите Next.
  9. Нажмите Finish, чтобы импортировать сертификат.

Чтобы настроить VPN:

  • Запустите панель управления, перейдите в Network and Sharing Center.
  • Нажмите Set up a new connection or network и выберите Connect to a workplace.
  • Выберите Use my Internet connection (VPN).
  • Введите данные сервера VPN. Укажите домен или IP сервера в поле Internet address. В Destination name укажите описательное имя VPN-соединения. Нажмите Done.

Новое VPN-соединение появится в списке сетевых подключений. Выберите VPN и нажмите Connect. Укажите имя пользователя и пароль, нажмите Ok, после чего вы подключитесь к VPN.

Подключение в iOS

Чтобы настроить VPN-соединение на устройстве iOS:

  1. Отправьте себе электронное письмо с сертификатом root.
  2. Откройте письмо на устройстве iOS и нажмите на прикрепленный файл сертификата, нажмите Install и введите пароль. После завершения нажмите Done.
  3. Откройте Settings → General → VPN и выберите Add VPN Configuration. На экране появится окно настройки VPN.
  4. Нажмите Type и выберите IKEv2.
  5. В поле Description укажите короткое имя VPN-соединения на свое усмотрение.
  6. В полях Server и Remote ID укажите доменное имя или IP сервера. Поле Local ID можно оставить пустым.
  7. Введите имя пользователя и пароль в разделе Authentication и нажмите Done.
  8. Выберите только что созданное VPN-соединение, нажмите переключатель в верхней части страницы, и вы подключитесь.

Подключение в macOS

Чтобы импортировать сертификат:

  1. Дважды кликните на файл сертификата, чтобы открыть Keychain Access. Появится диалоговое окно с сообщением «Keychain Access is trying to modify the system keychain. Enter your password to allow this.»
  2. Введите пароль и нажмите Modify Keychain.
  3. Дважды кликните на новый сертификат VPN. На экране появится небольшое окно свойств, где можно указать уровень доверия. В IP Security (IPSec) выберите Always Trust. После этого снова будет запрошен пароль. Введите пароль, после чего эти параметры сохранятся автоматически.

Чтобы создать VPN-подключение:

  1. System Preferences → Network.
  2. Во всплывающем окне найдите Interface и выберите VPN, в VPN Type выберите IKEv2, укажите имя соединения.
  3. В поля Server и Remote ID введите домен или IP сервера. Поле Local ID оставьте пустым.
  4. Кликните на Authentication Settings, выберите Username и укажите имя пользователя и пароль пользователя VPN. Нажмите OK.
  5. Нажмите Connect, после чего будет создано соединение VPN.

Исправление ошибок и неполадок

Если вы не можете импортировать сертификат, убедитесь, что он находится в файле с расширением .pem, а не .pem.txt.

Если у вас не получается подключиться к VPN, проверьте правильность доменного имени сервера или IP-адреса. Домен или IP должен совпадать со значением, указанным в параметре common name (CN) во время создания сертификата. Если они не совпадают, вы не сможете подключиться к VPN. К примеру, если в сертификате (в CN) вы указали vpn.example.com, вы должны использовать домен vpn.example.com при создании подключения к VPN.

Если вы указывали доменное имя, тогда также нужно проверить параметры VPN и убедиться, что в leftid перед доменом стоит символ @:

leftid=@vpn.example.com

Если же вы указывали IP, убедитесь, что символа @ перед адресом нет.

Заключение

Теперь вы умеете создавать VPN-серверы на основе протокола IKEv2.

Чтобы добавить или удалить пользователей, обратитесь к разделу 5. Каждый пользователь должен быть записан в отдельную строку. Соответственно, чтобы добавить пользователя, добавьте в файл его данные; чтобы удалить пользователя, удалите строку с его данными из файла.

Читайте также: Установка и использование лог-анализатора Logwatch

Tags: , , ,

6 комментариев

  • Тарас says:

    Спасибо за статью, у меня после перехода на 16.04 сломался L2TP – настроил по вашей статье. Все работает и соединяется. Адрес определяется как удаленной сети. Но имея внутренний адрес 192.168.0.1 – я не вижу той сетке к которой соединялся. Как быть?

  • Khun Poum says:

    Failed to find the VPN app for plugin type com.apple.neplugin.IKEv2

  • Юрий Ходоренков says:

    Доброго времени суток!
    У меня вопрос.
    В правилах фигурирует адрес 10.10.10.10.24
    Поясните пожалуйста, что это такое?
    Адрес хоста или сеть?

  • Make Luv says:

    Расскажите, пожалуйста, как теперь настроить клиент на debian wheeze (роутер на нем). Подключается, но трафик через это соединение не идет. Куда копать – непонятно. Инет на роутер по pppoe.

  • Сергей says:

    Спасибо за понятную инструкцию! Но в ней есть пара опечаток. В файле sudo nano /etc/ipsec.conf в начале каждой строки, кроме “config setup” должен стоять пробел, без этого StrongSwan не стартует и ругается на файл конфигурации. Так же в настройках iptables я указывал сеть 10.10.10.0/24.

  • Андрей Глумов says:

    не заработало, пока не добавил leftfirewall = yes
    (соединение устанавливалось, но трафик не маршрутизировался)
    может поможет кому

Добавить комментарий