Настраиваем сервер IKEv2 VPN с StrongSwan на базе Ubuntu 18.04

Obi-Wan

Script Kiddie
08.07.2020
13
31
21
Вступление

VPN (англ. Virtual Private Network «виртуальная частная сеть») — обобщённое название технологий, позволяющих обеспечить одно или несколько сетевых соединений (логическую сеть) поверх другой сети (например Интернет). Но это все слова из старой доброй Википедии. Для чего на самом деле нужен VPN вы и сами знаете, иначе не залетали-бы в эту тему!
  • Безопасное шифрованное соединение с сетью;
  • контроль своего трафика;
  • ну и конечно анонимное соединение позволяющее скрыть ваш IP.
Как известно рынок VPN-сервисов переполнен разного рода компаниями, которые предоставляют услуги, в общем-то совсем и не плохо. Но есть некоторые моменты, которые отпугивают клиентов таких, например, как мы с вами. А именно:
  • цена (некоторые компании представляют заоблачные цены, за ресурсы, которые того не стоят);
  • работоспособность (от своей мнительной жадности коммерческие сервисы режут скорость передачи данных, чтобы уместить на одном сервере безумное количество клиентов);
  • трафик (некоторые жмоты умудряются ограничивать вам объём трафика, ибо нечего качать на торрентах порнушку, а юзайте VPN только чтоб работать в Putty);
  • анонимность – это самое главное. Сбор логов, биллинговых данных, местоположений. Да есть проверенные VPN-сервисы, но хотите их использовать – возвращайтесь к первому пункту.
Решение! Все просто – нужно иметь свой собственный VPN-сервер.
Прям большое количество статей по этому поводу в Интернетах. Но здесь и сейчас я магнитом перенесу в ваш мозг высшие знания, и самый лучший а главное проверенный мануал! Поехали…

Предварительные требования

Как Вам уже стало понятно, тут есть много подводных камней и подготовок. И судя из заголовка статьи мы будем юзать Протокол IKEv2. Почему он? Да потому что это, по нашему скромному мнению, прям самый безопасный VPN. Internet Key Exchange v2 позволяет создавать прямые туннели IPSec между сервером и клиентом. Ну а собственно IPSec шифрует трафик в виртуальных частных сетях IKEv2. И конечно у вас сейчас возник вопрос – «А как же с поддержкой на разных платформах?», спокойно, не очкуем, любая ОС потянет этого коня!
И так, что нам нужно. А нужно нам – VPS – c установленной Ubuntu 18.04.
Что? Какая VPS? Да самая простая, но дайте ей хотя бы 1024 Mb ОЗУ, а то мало ли.
Что, что? Где ее взять? Ну и вопросы у Вас… Ответ: на любом хостинге (цена вопроса от 2-3 долларов). И ради Бога не пользуйтесь этим говносервисом Digitalocean.
И так у нас все готово, есть сервер, есть операционная система на нем, пора приступить к настройке...


Шаг 1 — Устанавливаем и настраиваем StrongSwan

StrongSwan - это многоплатформенная реализация IPsec. Весьма удобненько не так ли? Кроме того мы установим компонент инфраструктуры открытых ключей, чтобы создать центр сертификации, который будет предоставлять учетные данные для нашей инфраструктуры.
Bash:
sudo apt update
sudo apt install strongswan strongswan-pki
Вот и все. Такой быстрый первый шаг… Перейдем к созданию сертефикатов


Шаг 2 — Создадим центр сертификации
Что бы все достойно функционировало и было на высоком безопасном уровне, мы должны мы настраиваем наш сервер таким способом, что для идентификации на клиентских системах будет требоваться наличие сертификата. Ранее установленные пакеты StrongSwan содержат в себе утилиту для генерации центра сертификации, а также самих сертификатов. Для этого мы создадим несколько рабочих каталогов и естественно поделимся с ними определенными правами:
Bash:
mkdir -p ~/pki/{cacerts,certs,private}
chmod 700 ~/pki
Далее нам надо сгенерировать ключ root (4096-битный ключ RSA, который будет использоваться для подписи корневого центра сертификации).
Bash:
ipsec pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem
Получив ключ, мы можем перейти к созданию корневого центра сертификации, используя ключ для подписания сертификата root:
Bash:
ipsec pki --self --ca --lifetime 3650 --in ~/pki/private/ca-key.pem \
    --type rsa --dn "CN=VPN root CA" --outform pem > ~/pki/cacerts/ca-cert.pem
Следите за значениями. Можете изменить distinguished name (DN) на любое другое имя по своему желанию. После настройки и запуска корневого центра сертификации, у нас появилась возможность создать сертификат, который будет юзать наш сервер VPN.


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

Создадим сертификат и ключ для сервера VPN. Этот сертификат позволит клиентам проверять подлинность сервера, используя только что сгенерированный нами сертификат центра сертификации (далее СА).
Создаем закрытый ключ сервера VPN:
Bash:
ipsec pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem
Подписываем сертификат сервера VPN, используя ключ СА, созданный ранее. Запускаем следующую команду, но изменяем поля Common Name (CN) и Subject Alternate Name (SAN) на имя DNS или IP-адрес вашего сервера VPN:
Bash:
ipsec pki --pub --in ~/pki/private/server-key.pem --type rsa \
    | ipsec pki --issue --lifetime 1825 \
        --cacert ~/pki/cacerts/ca-cert.pem \
        --cakey ~/pki/private/ca-key.pem \
        --dn "CN=server_domain_or_IP" --san "server_domain_or_IP" \
        --flag serverAuth --flag ikeIntermediate --outform pem \
    >  ~/pki/certs/server-cert.pem
Теперь мы сгенерировали все файлы TLS/SSL, необходимые StrongSwan, и можем переместить их в каталог /etc/ipsec.d следующим образом:
Bash:
sudo cp -r ~/pki/* /etc/ipsec.d/
Мы создали пару сертификатов, которые можно будет использовать для защиты связи между клиентом и сервером; подписали сертификаты ключом CA, и теперь клиент сможет проверять подлинность сервера VPN, используя сертификат CA. После этого можно переходить к настройке программного обеспечения.


Шаг 4 — Наконец настраиваем StrongSwan

Прежде чем начинать, создадим резервную копию файла для справки:
Bash:
sudo mv /etc/ipsec.conf{,.original}
Создаем и открываем новый пустой файл конфигурации:
Bash:
sudo nano /etc/ipsec.conf
Добавляем в файл следующие строки (регистрация демонов и дублирующие соединения):
Код:
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
Настраиваем обнаружение потеряных узлов, чтобы закрывать неиспользуемые соединения при непредвиденном отключении клиента:
Код:
. . .
conn ikev2-vpn
    . . .
    dpdaction=clear
    dpddelay=300s
    rekey=no
Настраиваем параметры IPSec все в этом же файле:
Код:
. . .
conn ikev2-vpn
    . . .
    left=%any
    leftid=@server_domain_or_IP
    leftcert=server-cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0

Примечание.
При настройке идентификатора сервера (leftid) символ
@ нужно указывать только в случае, если ваш сервер VPN
будет идентифицироваться по доменному имени:
[email protected]
Если сервер будет идентифицироваться по IP-адресу, просто укажите IP-адрес:
leftid=192.168.12.111


Теперь мы можем настроить параметры IPSec на стороне клиента (справа) как диапазоны частных IP-адресов и серверы DNS, которые нужно будет использовать:
Код:
. . .
conn ikev2-vpn
    . . .
    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 запрашивать у клиента учетные данные пользователя при подключении:
Код:
. . .
conn ikev2-vpn
    . . .
    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
    dpdaction=clear
    dpddelay=300s
    rekey=no
    left=%any
    leftid=@server_domain_or_IP
    leftcert=server-cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    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
Когда вы убедитесь, что конфигурация соответствует показанной, сохраните и закройте файл. Теперь мы настроили параметры VPN и можем перейти к созданию учетной записи, чтобы наши пользователи могли подключаться к серверу.


Шаг 5 — Настраиваем аутентификацию VPN

Теперь наш сервер VPN настроен на принятие подключений клиентов, но мы еще не настроили учетные данные. Нам нужно задать пару настроек в специальном файле конфигурации с именем ipsec.secrets:
  • Нам нужно указать StrongSwan, где можно найти закрытый ключ для нашего сертификата сервера, чтобы сервер мог пройти аутентификацию на стороне клиента.
  • Также нам потребуется список пользователей, которым будет разрешено подключаться к VPN.
Bash:
sudo nano /etc/ipsec.secrets
Вначале мы укажем StrongSwan, где можно найти закрытый ключ затем, зададим учетные данные пользователя. Вы можете создать любую комбинацию имени пользователя и пароля:

Код:
: RSA "server-key.pem"
your_username : EAP "your_password"
Перезапускаем службу, для применения нового конфига:
Bash:
sudo systemctl restart strongswan
Мы полностью настроили параметры сервера и учетные данные пользователя на сервере VPN и теперь можем перейти к самой важной части: настройке брандмауэра.


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

После настройки конфигурации StrongSwan нам нужно настроить брандмауэр, чтобы он разрешал трафик VPN и перенаправлял его. Если вы выполнили указания предварительных обучающих модулей, у вас должен быть включен базовый брандмауэр UFW. Если вы еще не настроили UFW, вы можете базовую конфигурацию и включить ее с помощью следующей команды:
Bash:
sudo ufw allow OpenSSH
sudo ufw enable
Теперь добавьте правило, которое будет разрешать трафик UDP на стандартных портах IPSec, 500 и 4500:
Bash:
sudo ufw allow 500,4500/udp
Затем мы откроем один из файлов конфигурации UFW, чтобы добавить несколько политик нижнего уровня для маршрутизации и перенаправления пакетов IPSec. Перед этим нам нужно будет определить, какой сетевой интерфейс нашего сервера будет использоваться для доступа к интернету. Для этого мы можем отправить запрос интерфейса, связанного с маршрутом по умолчанию:
Bash:
ip route | grep default
Ваш публичный интерфейс должен содержать слово «dev». Например, в этом результате показан интерфейс с именем eth0, который выделен ниже:
Код:
Output
default via 203.0.113.7 dev eth0 proto static
Откройте файл правил:
Код:
*nat
-A POSTROUTING -s 10.10.10.0/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
-A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
COMMIT

*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
COMMIT

*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
. . .
Измените каждый экземпляр eth0 в конфигурации выше для соответствия имени интерфейса, которое вы определили с помощью ip route. Строки *nat создают правила, благодаря которым брандмауэр может обеспечивать маршрутизацию и управление трафиком между клиентами VPN и интернетом. Строка *mangle позволяет настроить максимальный размер сегмента пакета, чтобы предотвратить возможные проблемы с некоторыми клиентами VPN.
После строки *filter и строк определения цепочки нужно добавить еще один блок конфигурации:
Код:
. . .
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]

-A ufw-before-forward --match policy --pol ipsec --dir in --proto esp -s 10.10.10.0/24 -j ACCEPT
-A ufw-before-forward --match policy --pol ipsec --dir out --proto esp -d 10.10.10.0/24 -j ACCEPT
Завершив редактирование, сохраните и закройте файл. Далее изменяем несколько параметров как показано ниже:
Bash:
sudo nano /etc/ufw/sysctl.conf
Код:
. . .

# Enable forwarding
# Uncomment the following line
net/ipv4/ip_forward=1

. . .

# Do not accept ICMP redirects (prevent MITM attacks)
# Ensure the following line is set
net/ipv4/conf/all/accept_redirects=0

# Do not send ICMP redirects (we are not a router)
# Add the following lines
net/ipv4/conf/all/send_redirects=0
net/ipv4/ip_no_pmtu_disc=1
Теперь мы можем активировать все изменения, отключив и снова включив брандмауэр:
Bash:
sudo ufw disable
sudo ufw enable
Вам будет предложено подтвердить процесс. Введите Y, чтобы активировать UFW с новыми настройками.


Вот, собственно, и все! Для подключения – вам нужен, сервер, логин и пароль а также применить сгенерированный сертификат. На просторах Интернетов – вы найдете мануалы по подключению любой операционной системы!

Спасибо за внимание!
 
  • Like
Реакции: ThomasC1121 и LadyBourbon

Об LS-LA

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

About LS-LA

  • We, a group of like-minded people, whose main goal is to increase the level of knowledge and skills.
    Not forgetting about everyone’s material well-being)

Быстрая навигация

Пользовательское меню