Домашний сервер — часть 8: Настраиваем IKEv2 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
- Отправить сохраненный сертификат себе на телефон, либо через AirDrop, либо электронным письмом с прикрепленным сертификатом.
- Открыть полученный сертификат, нажмать Установить и ввести код доступа. После установки нажать Готово.
- Открыть Настройки, Основные, VPN и управление устройством, VPN и нажать Добавить конфигурацию VPN. После этого откроется экран конфигурации подключения VPN.
- Нажмите Тип и выберите IKEv2.
- В поле Описание введите короткое имя подключения VPN. Вписать можно всё, что угодно.
- В поле Server (сервер) и Remote ID (удаленный идентификатор) введите доменное имя сервера. Поле Local ID (локальный идентификатор) нельзя оставлять пустым, поэтому вписываем доменное имя.
- Ввести имя пользователя и пароль в разделе Аутентификация, а затем нажать Готово.
- Выберите соединение VPN, которое вы только что создали, нажмите переключатель вверху страницы, и подключение будет установлено.
На этом всё