Поиск по сайту:

Как настроить 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) без дополнительных приложений и довольно плавно справляется с икотой клиента.

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

Предпосылки

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

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

Кроме того, вы должны быть знакомы с IPTables. Ознакомьтесь с тем, как работает брандмауэр Iptables, прежде чем продолжить.

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

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

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

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

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

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

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

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

  1. mkdir vpn-certs
  2. cd vpn-certs

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Наконец, защитите ключи, чтобы их мог прочитать только пользователь root.

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

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

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

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

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

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

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

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

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

  1. sudo nano /etc/ipsec.conf

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

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

Далее мы сообщим StrongSwan, какие алгоритмы шифрования использовать для 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) включайте символ @ только в том случае, если ваш VPN-сервер будет идентифицироваться по доменному имени:

  leftid=@vpn.example.com

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

  leftid=111.111.111.111

Затем мы настраиваем параметры IPSec на стороне клиента (справа), такие как диапазоны частных 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

Наконец, мы скажем 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

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

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

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

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

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

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

  1. sudo nano /etc/ipsec.secrets

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

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

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

your_username %any% : EAP "your_password"

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

  1. sudo ipsec reload

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

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

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

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

  1. sudo ufw disable

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

  1. iptables -P INPUT ACCEPT
  2. iptables -P FORWARD ACCEPT
  3. iptables -F
  4. iptables -Z

Чтобы предотвратить блокировку сеанса SSH, мы будем принимать соединения, которые уже приняты. Мы также откроем порт 22 (или любой другой порт, который вы настроили) для будущих SSH-подключений к серверу. Выполните эти команды:

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

Нам также нужно будет принимать соединения на локальном интерфейсе loopback:

  1. sudo iptables -A INPUT -i lo -j ACCEPT

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

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

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

  1. sudo iptables -A FORWARD --match policy --pol ipsec --dir in --proto esp -s 10.10.10.10/24 -j ACCEPT
  2. 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-клиентов в Интернет и наоборот:

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

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

  1. 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

Для большей безопасности мы отбросим все остальное, что не соответствует настроенным нами правилам:

  1. sudo iptables -A INPUT -j DROP
  2. sudo iptables -A FORWARD -j DROP

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

  1. sudo netfilter-persistent save
  2. sudo netfilter-persistent reload

Наконец, мы включим пересылку пакетов на сервере. Пересылка пакетов — это то, что позволяет нашему серверу «маршрутизировать» данные с одного IP-адреса на другой. По сути, мы заставляем наш сервер действовать как маршрутизатор.

Отредактируйте файл /etc/sysctl.conf:

  1. sudo nano /etc/sysctl.conf

Здесь нам нужно настроить несколько вещей:

  • Во-первых, мы включим переадресацию пакетов IPv4.
  • Мы отключим обнаружение Path MTU, чтобы предотвратить проблемы с фрагментацией пакетов.
  • Мы также не принимаем переадресацию ICMP и не отправляем переадресацию 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

Внесите эти изменения, сохраните файл и выйдите из редактора. Затем перезапустите сервер:

  1. sudo reboot

Вы отключитесь от сервера при его перезагрузке, но это ожидаемо. После перезагрузки сервера снова войдите на сервер как sudo, пользователь без полномочий root. Вы готовы протестировать соединение на клиенте.

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

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

  1. 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.

Либо используйте SFTP для передачи файла на ваш компьютер.

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

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

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

Затем настройте VPN, выполнив следующие действия:

  1. Запустите панель управления, затем перейдите в Центр управления сетями и общим доступом.
  2. Нажмите «Настроить новое подключение или сеть», затем выберите «Подключиться к рабочему месту».
  3. Выберите Использовать мое подключение к Интернету (VPN).
  4. Введите сведения о VPN-сервере. Введите доменное имя или IP-адрес сервера в поле «Интернет-адрес», затем заполните поле «Назначение» тем, что описывает ваше VPN-подключение. Затем нажмите Готово.

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

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

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

  1. Отправьте себе электронное письмо с прикрепленным корневым сертификатом.
  2. Откройте электронное письмо на устройстве iOS и коснитесь прикрепленного файла сертификата, затем коснитесь «Установить» и введите код доступа. После установки нажмите Готово.
  3. Откройте «Настройки», «Основные», «VPN» и нажмите «Добавить конфигурацию VPN». Откроется экран настройки VPN-подключения.
  4. Нажмите «Тип» и выберите IKEv2.
  5. В поле «Описание» введите краткое имя VPN-подключения. Это может быть что угодно.
  6. В поле Сервер и удаленный идентификатор введите доменное имя или IP-адрес сервера. Поле «Местный идентификатор» можно оставить пустым.
  7. Введите свое имя пользователя и пароль в разделе Аутентификация, затем нажмите Готово.
  8. Выберите только что созданное VPN-подключение, коснитесь переключателя в верхней части страницы, и подключение будет установлено.

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

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

  1. Дважды щелкните файл сертификата. Появится всплывающее окно Keychain Access с диалоговым окном «Связка ключей пытается изменить системную связку ключей. Чтобы разрешить это, введите свой пароль».
  2. Введите пароль и нажмите «Изменить связку ключей».
  3. Дважды щелкните только что импортированный сертификат VPN. Откроется небольшое окно свойств, в котором вы можете указать уровни доверия. Установите для IP-безопасности (IPSec) значение «Всегда доверять», и вам снова будет предложено ввести пароль. Этот параметр сохраняется автоматически после ввода пароля.

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

  1. Откройте «Системные настройки» и выберите «Сеть».
  2. Нажмите маленькую кнопку «плюс» в левом нижнем углу списка сетей.
  3. В появившемся всплывающем окне выберите для параметра Интерфейс значение VPN, установите для параметра Тип VPN значение IKEv2 и дайте имя соединению.
  4. В поле Сервер и удаленный идентификатор введите доменное имя или IP-адрес сервера. Оставьте поле Local ID пустым.
  5. Нажмите «Настройки аутентификации», выберите «Имя пользователя» и введите имя пользователя и пароль, которые вы настроили для своего пользователя VPN. Затем нажмите ОК.

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

Устранение неполадок с подключениями

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

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

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

  leftid=@vpn.example.com

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

Заключение

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

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

Отсюда вы, возможно, захотите изучить настройку анализатора файлов журналов, потому что StrongSwan выгружает свои журналы в системный журнал. В руководстве Как установить и использовать Logwatch Log Analyzer and Reporter на VPS содержится дополнительная информация о настройке.

Вас также может заинтересовать это руководство от EFF о конфиденциальности в Интернете.