Как настроить VPN-сервер IKEv2 со StrongSwan в Ubuntu 16.04

Вступление

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

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

В этом руководстве вы настроите сервер IKEv2 VPN с помощьюStrongSwan на сервере Ubuntu 16.04 и подключитесь к нему из клиентов Windows, iOS и macOS.

Предпосылки

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

  • Один сервер Ubuntu 16.04 с несколькими процессорами, настроенный следующим образомthe Ubuntu 16.04 initial server setup guide, включая пользователя sudo без полномочий root и брандмауэр.

Кроме того, вы должны быть знакомы с IPTables. Прежде чем продолжить, просмотритеHow the Iptables Firewall Works.

[[step-1 -—- install-strongswan]] == Шаг 1. Установка StrongSwan

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

Выполните следующую команду для установки этих компонентов:

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

[.note] #Note: При установкеiptables-persistent программа установки спросит, сохранять или нет текущие правила IPv4 и IPv6. Поскольку мы хотим, чтобы все предыдущие конфигурации брандмауэра оставались неизменными, мы выберем да в обоих запросах.
#

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

[[step-2 -—- Creating-a-certificate-author]] == Шаг 2 - Создание центра сертификации

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

mkdir vpn-certs
cd vpn-certs

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

Выполните эти команды для генерации и защиты ключа:

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

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

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

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

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

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

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

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

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

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

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

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-сервера. Теперь, когда у нас есть все готовые сертификаты, мы переходим к настройке программного обеспечения.

[[step-4 -—- configuring-strongswan]] == Шаг 4. Настройка StrongSwan

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

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

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

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

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

Затем откройте файл в вашем текстовом редакторе:

sudo nano /etc/ipsec.conf

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

/etc/ipsec.conf

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

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

/etc/ipsec.conf

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

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

/etc/ipsec.conf

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

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

/etc/ipsec.conf

  dpdaction=clear
  dpddelay=300s
  rekey=no

Затем мы настроим параметры IPSec сервера (слева). Добавьте это в файл:

/etc/ipsec.conf

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

[.Примечание]##

Note: при настройке идентификатора сервера (leftid) включайте символ@ только в том случае, если ваш VPN-сервер будет идентифицироваться по имени домена:

Если сервер будет идентифицирован по его IP-адресу, просто введите IP-адрес в:

  leftid=111.111.111.111

Затем мы настраиваем параметры IPSec на стороне клиента (справа), такие как диапазоны частных IP-адресов и DNS-серверы:

/etc/ipsec.conf

  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 запросить у клиента учетные данные пользователя при подключении:

/etc/ipsec.conf

  eap_identity=%identity

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

/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
    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

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

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

[[step-5 -—- configuring-vpn-authentication]] == Шаг 5. Настройка проверки подлинности VPN

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

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

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

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

sudo nano /etc/ipsec.secrets

Сначала мы сообщим StrongSwan, где найти ваш закрытый ключ.

/etc/ipsec.secrets

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

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

/etc/ipsec.secrets

your_username %any% : EAP "your_password"

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

sudo ipsec reload

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

[[step-6 -—- configuring-the-firewall-amp-kernel-ip-forwarding]] == Шаг 6. Настройка межсетевого экрана и IP-переадресации ядра

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

Во-первых, отключите UFW, если вы его настроили, так как он может конфликтовать с правилами, которые нам нужно настроить:

sudo ufw disable

Затем удалите все оставшиеся правила брандмауэра, созданные UFW:

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

Чтобы мы не могли быть заблокированы в сеансе SSH, мы будем принимать соединения, которые уже приняты. Мы также откроем порт22 (или любой другой порт, который вы настроили) для будущих 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

Затем мы скажем IPTables принимать соединения IPSec:

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

Затем мы скажем IPTables пересылать трафик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-пакетов на некоторых клиентах, мы сообщим IPTables уменьшить размер пакетов, отрегулировав максимальный размер сегмента пакетов. Это предотвращает проблемы с некоторыми клиентами VPN.

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 для предотвращения проблем фрагментации пакетов.

  • Мы также не принимаем перенаправления ICMP и не отправляем перенаправления ICMP для предотвращения атакman-in-the-middle.

Изменения, которые нужно внести в файл, выделены в следующем коде:

/etc/sysctl.conf

. . .

# 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, не являющийся пользователем root. Вы готовы проверить соединение на клиенте.

[[step-7 -–- testing-the-vpn-connection-on-windows-ios-and-macos]] == Шаг 7. Тестирование VPN-подключения в Windows, iOS и macOS

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

cat ~/vpn-certs/server-root-ca.pem

Вы увидите вывод, похожий на этот:

Output-----BEGIN CERTIFICATE-----
MIIFQjCCAyqgAwIBAgIIFkQGvkH4ej0wDQYJKoZIhvcNAQEMBQAwPzELMAkGA1UE

. . .

EwbVLOXcNduWK2TPbk/+82GRMtjftran6hKbpKGghBVDPVFGFT6Z0OfubpkQ9RsQ
BayqOb/Q
-----END CERTIFICATE-----

Скопируйте этот вывод на свой компьютер, включая строки-----BEGIN CERTIFICATE----- и-----END CERTIFICATE-----, и сохраните его в файл с узнаваемым именем, напримерvpn_root_certificate.pem. Убедитесь, что создаваемый файл имеет расширение.pem.

В качестве альтернативыuse SFTP to transfer the file to your computer.

После того, как вы загрузили файлvpn_root_certificate.pem на свой компьютер, вы можете настроить подключение к VPN.

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

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

  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:
    Certificates view

  6. В менюAction выберитеAll Tasks и щелкнитеImport, чтобы отобразить мастер импорта сертификатов. ЩелкнитеNext, чтобы пропустить введение.

  7. На экранеFile to Import нажмите кнопкуBrowse и выберите файл сертификата, который вы сохранили. Затем щелкнитеNext.

  8. Убедитесь, что дляCertificate Store установлено значениеTrusted Root Certification Authorities, и щелкнитеNext.

  9. ЩелкнитеFinish, чтобы импортировать сертификат.

Затем настройте VPN с помощью этих шагов:

  1. ЗапуститеControl Panel, затем перейдите кNetwork and Sharing Center.

  2. ЩелкнитеSet up a new connection or network, затем выберитеConnect to a workplace.

  3. ВыберитеUse my Internet connection (VPN).

  4. Введите данные VPN-сервера. Введите доменное имя или IP-адрес сервера в полеInternet address, затем заполнитеDestination name тем, что описывает ваше VPN-соединение. Затем щелкнитеDone.

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

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

Чтобы настроить VPN-подключение на устройстве iOS, выполните следующие действия.

  1. Отправьте себе электронное письмо с приложенным корневым сертификатом.

  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 появится диалоговое окно с сообщением: «Связка ключей пытается изменить системную связку ключей. Введите свой пароль, чтобы разрешить это ».

  2. Введите свой пароль, затем нажмитеModify Keychain

  3. Дважды щелкните новый импортированный сертификат VPN. Это вызывает небольшое окно свойств, где вы можете указать уровни доверия. УстановитеIP Security (IPSec) наAlways Trust, и вам снова будет предложено ввести пароль. Этот параметр автоматически сохраняется после ввода пароля.

Теперь, когда сертификат важен и надежен, настройте VPN-соединение, выполнив следующие действия:

  1. Перейдите кSystem Preferences и выберитеNetwork.

  2. Нажмите на маленькую кнопку «плюс» в левом нижнем углу списка сетей.

  3. В появившемся всплывающем окне установите дляInterface значениеVPN, установите дляVPN Type значениеIKEv2 и дайте соединению имя.

  4. В полеServer иRemote ID введите доменное имя или IP-адрес сервера. Оставьте полеLocal ID пустым.

  5. НажмитеAuthentication Settings, выберитеUsername и введите свое имя пользователя и пароль, которые вы настроили для своего пользователя VPN. Затем щелкнитеOK.

Наконец, нажмитеConnect, чтобы подключиться к VPN. Теперь вы должны быть подключены к VPN.

Устранение неисправностей соединений

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

Если вы не можете подключиться к VPN, проверьте имя сервера или IP-адрес, который вы использовали. Доменное имя или IP-адрес сервера должны совпадать с тем, которое вы настроили как общее имя (CN) при создании сертификата. Если они не совпадают, VPN-соединение не будет работать. Если вы настроили сертификат с CNvpn.example.com, выmust используетеvpn.example.com при вводе данных сервера VPN. Дважды проверьте команду, которую вы использовали для создания сертификата, и значения, которые вы использовали при создании вашего VPN-соединения.

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

А если вы используете IP-адрес, убедитесь, что символ@ опущен.

Заключение

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

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

Отсюда вы можете захотеть настроить анализатор файла журнала, потому что StrongSwan выдает свои журналы в системный журнал. В руководствеHow To Install and Use Logwatch Log Analyzer and Reporter on a VPS есть дополнительная информация об этом.

Вас также может заинтересоватьthis guide from the EFF about online privacy.

Related