Домашний сервер — часть 8: Настраиваем IKEv2 VPN сервер

Настраиваем IKEv2 VPN сервер
В прошлой статье относящейся к настройке домашнего сервера, было рассказано о том, как я организовал аналог TimeCapsule для поездок. Как показало время - это не совсем удобный вариант, поэтому, находясь в очередной командировке, решил организовать доступ к домашней локальной сети посредством VPN.

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

MacOS и iOS не поддерживают протокол OpenVPN поэтому будем использовать протокол IKEv2.

Internet Key Exchange v2 или IKEv2 — это протокол, который позволяет создавать прямые туннели IPSec между сервером и клиентом. IPSec обеспечивает шифрование сетевого трафика в виртуальных частных сетях IKEv2. IKEv2 изначально поддерживается на ряде платформ (Mac OS, iOS, Windows 10) без дополнительных приложений и легко решает проблемы с подключением клиентов.

1. Установка

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

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

sudo apt update && sudo apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins

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

2. Создание сертификатов

Для обеспечения идентификации на клиентских системах, серверу IKEv2 необходим сертификат. Для формирования сертификата пакет strongswan-pki включает утилиту pki, которая может сгенерировать центр сертификации и сертификаты сервера.

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

1.  mkdir -p ~/cert/{cacerts,certs,private} 

ключ -p позволяет создать всю структуру каталогов, если она отсутвует, а задать сразу несколько имен создаваемых каталогов.

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

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

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

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

Флаг --lifetime 3650 указывает "время жизни" корневого сертификата в днях. Корневой сертификат центра обычно не меняется, поскольку его необходимо перераспределять на каждый использующий его сервер и клиент. Исходя из этого, 10 лет — это безопасный срок действия.
Можно изменить значение имени distinguished name (DN) на любое другое имя. Имя (поле CN) используется только как индикатор, оно ни на что не влияет, и может быть любым, хоть "Вася Пупкин".

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

Создаём закрытый ключ сервера VPN:

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

Создаём и подписываем сертификат сервера VPN, используя ключ центра сертификации.
В следующей команде, необходимо изменить поля CN и SAN на доменное имя вашего сервера VPN.

pki --pub --in ~/cert/private/server-key.pem --type rsa | pki --issue --lifetime 1825 --cacert ~/cert/cacerts/ca-cert.pem --cakey ~/cert/private/ca-key.pem --dn "CN=Доменное_имя_сервера" --san Доменное_имя_сервера --flag serverAuth --flag ikeIntermediate --outform pem >  ~/cert/certs/server-cert.pem 

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

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

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

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

3. Настройка VPN сервера StrongSwan

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

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

Внимание. Настройки VPN сервера условно можно разделить на три части: общие, левая сторона и правая сторона.
Левая сторона отвечает за обращанеие к локальной системе.
Правая сторона отвечает за обращение к удаленным клиентам, таким как телефоны или компьютеры.

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

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

# Здесь настраиваем обнаружение отсутствующих узлов, чтобы
# закрывать неиспользуемые соединения при непредвиденном 
# отключении клиента. 
    dpdaction=clear
    dpddelay=300s
    rekey=no

# Настройка параметров IPSec *левой стороны* сервера.
    left=%any
# Доменное имя сервера должно начинаться со знака @
    leftid=@Доменное_имя_сервера
    leftcert=server-cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0

# Настройка параметров IPSec *правой стороны*
    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

# Настройка поддержки клиентов на базе Linux, Windows, macOS, 
# iOS и Android. Эти строки определяют различные алгоритмы 
# обмена ключами, хэширования, аутентификации и шифрования 
# (обычно их называют *набор шифров*), которые StrongSwan 
# разрешит использовать разным клиентам.
    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! 

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

Внимание! StrongSwan требователен к отступам в конфиге, поэтому удостоверьтесь, что параметры каждого раздела конфига отбиты через Tab, как это показано на примере, или хотя бы через один пробел, иначе strongSwan не запустится.

Краткое описание некоторых параметров

Левая сторона

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

Правая сторона

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

4. Настройка аутентификации VPN

Для настройки аутентификации на сервере, нам необходимо прописать всего две настройки в файле /etc/ipsec.secrets

Открываем файл и приводим к следующему виду:

sudo nano /etc/ipsec.secrets
# This file holds shared secrets or RSA private keys for authentication.

# RSA private key for this host, authenticating it to any other host
# which knows the public part.

# где можно найти лежит ключ
: RSA "/etc/ipsec.d/private/server-key.pem"

# учетные данные пользователя - пароль в ковычках
login : EAP "password"

Подчищаем свои следы после установки VPN сервера:

sudo rm -rf ~/cert

На этом настройка самого VPN сервера завершена, нам осталось его перезапустить и продолжить настраивать уже сам linux-сервер.

sudo systemctl restart strongswan-starter

5. Настройка параметров ядра Linux для сетевой переадресации

Для настройки форвардинга (сетевой переадресации), нам необходимо внести изменения в файле /etc/sysctl.conf

sudo nano /etc/sysctl.conf

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

#Раскомментируем данный параметр, чтобы включить переадресацию пакетов
net.ipv4.ip_forward = 1
#Раскомментируем данный параметр, чтобы предотвратить MITM-атаки
net.ipv4.conf.all.accept_redirects = 0
#Раскомментируем данный параметр, чтобы запретить отправку ICMP-редиректов
net.ipv4.conf.all.send_redirects = 0
#В конце файла на новой строке добавим данный параметр, запретив поиск PMTU
net.ipv4.ip_no_pmtu_disc = 1

Новые параметры ядра, вступят в силу после перезагрузки, но у нас же линукс? Поэтому применяем изменения без перезагрузки системы - "на лету":

sudo sysctl -p

6. Настройка файрвола iptables для работы с VPN сервером

iptables — это утилита, которая управляет встроенным в Linux файрволом netfilter.
Для того, чтобы сохранять правила iptables в файле и подгружать их при каждом запуске системы, установим пакет iptables-persistent:

sudo apt install iptables-persistent

Во время установки у нас спросят: сохранить текущие настройки правил iptables для Ipv4 и Ipv6? Если правила уже настраивались ранее, то выбирае Да, если не настривали, то смело можно выбирать Нет.

Приступим к настройке правил iptables:

  • Разрешаем соединения по SSH на 22 порту, чтобы не потерять доступ к серверу:
    sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j sudo ACCEPT iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  • Разрешаем соединения на loopback-интерфейсе:
    sudo iptables -A INPUT -i lo -j ACCEPT
  • Разрешаем входящие IPSec-соединения на UDP-портах 500 и 4500:
    sudo iptables -A INPUT -p udp --dport 500 -j ACCEPT iptables -A INPUT -p udp --dport 4500 -j ACCEPT
  • Разрешаем переадресацию ESP-трафика:
    sudo iptables -A FORWARD --match policy --pol ipsec --dir in --proto esp -s 10.10.10.0/24 -j ACCEPT iptables -A FORWARD --match policy --pol ipsec --dir out --proto esp -d 10.10.10.0/24 -j ACCEPT
  • Настроим маскирование трафика, так как наш VPN-сервер, по сути, выступает как шлюз между Интернетом и VPN-клиентами:
    sudo iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
  • Настраиваем максимальный размер сегмента пакетов:
    sudo iptables -t 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

    Сохраняем правила чтобы они подгружались после каждой перезагрузки:

    sudo netfilter-persistent save 
    sudo netfilter-persistent reload

    Чтобы внесенные правила iptables начали работать, необходимо перезапустить систему

    sudo reboot

    либо остановить и запустить сервис iptables, не перезапустить, а именно остановить и запустить:

    sudo systemctl stop iptables
    sudo systemctl start iptables

    После перезапуска проверяем работают ли наши цепочки правил iptabkes:

    sudo iptables -S

    Убеждаемся, что все цепочки присутвуют и идем на клентскую машину для подключения к нашему серверу.

НЕ ЗАБЫВАЕМ на роутере открыть UDP порты 500 и 4500 для нашего сервера VPN.

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

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

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

Вывод будет выглядеть следующим образом:

-----BEGIN CERTIFICATE-----
MIIE8DCCAtigAwIBAgIIbd7H6fH9ljYwDQYJKoZIhvcNAQEMBQAwFjEUMBIGA1UE
***здесь куча других строк***
X/v5XzSWJxdfdAUT107jZbu2TMo=
-----END CERTIFICATE-----

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

Пример подключения к VPN из системы iOS

  1. Отправить сохраненный сертификат себе на телефон, либо через AirDrop, либо электронным письмом с прикрепленным сертификатом.
  2. Открыть полученный сертификат, нажмать Установить и ввести код доступа. После установки нажать Готово.
  3. Открыть Настройки, Основные, VPN и управление устройством, VPN и нажать Добавить конфигурацию VPN. После этого откроется экран конфигурации подключения VPN.
  4. Нажмите Тип и выберите IKEv2.
  5. В поле Описание введите короткое имя подключения VPN. Вписать можно всё, что угодно.
  6. В поле Server (сервер) и Remote ID (удаленный идентификатор) введите доменное имя сервера. Поле Local ID (локальный идентификатор) нельзя оставлять пустым, поэтому вписываем доменное имя.
  7. Ввести имя пользователя и пароль в разделе Аутентификация, а затем нажать Готово.
  8. Выберите соединение VPN, которое вы только что создали, нажмите переключатель вверху страницы, и подключение будет установлено.

На этом всё

Похожие записи

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