StrongSwan – поднимаем свой IKEv2, L2TP сервер

В этой инструкции будет описана установка StrongSwan на удаленный сервер с CentOS 9 и настройка VPN подключение по IKEv2 и L2TP.

Установка certbot и сертификат Let’s Encrypt

Использовать будем сертификаты от Let's Enctypt, тогда не придется добавлять в "доверенные", на устройства, корневой сертификат. А значит серверу необходим и домен, на который будем получать сертификат. Зато это очень удобно, на ios, android, windows, linux, macos, все работает без установки дополнительного софта.

Установка snapd

По умолчанию пакетный менеджер Snap отсутствует. Также необходимо подключить репозитории epel.

Репозиторий EPEL можно добавить в систему CentOS 8/9 Stream с помощью следующей команды:

sudo dnf install epel-release
sudo dnf upgrade

Устанавливаем snapd:

sudo yum install snapd

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

sudo systemctl enable --now snapd.socket

Введите следующее, чтобы создать символическую ссылку между /var/lib/snapd/snap и /snap:

sudo ln -s /var/lib/snapd/snap /snap

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

Установка certbot

sudo snap install core; sudo snap refresh core

Запустите эту команду, чтобы установить Certbot.

sudo snap install --classic certbot

Выполните следующее, чтобы убедиться, что команда certbot может быть запущена.

sudo ln -s /snap/bin/certbot /usr/bin/certbot

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

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

sudo certbot --key-type rsa --nginx

Очень важно! Указать тип RSA. Ранее это было не нужно, но с обновлением certbot стал создавать сертификаты с типом ECDSA, который "не понимают" яблочные устройства и iphone, ipad или macOS не будут подключаться.

Установка StrongSwan и xl2tpd

yum install strongswan
yum install xl2tpd

Копируем сертификаты и ключи сюда:

/etc/strongswan/swanctl/private/privkey.pem
/etc/strongswan/swanctl/x509/fullchain.pem
/etc/strongswan/swanctl/x509ca/chain.pem

Можно создать ссылки на файлы командой ln -s

Вставляем в конфиг файл /etc/strongswan/swanctl/swanctl.conf следующее:

connections {
    ikev2-vpn-conn {
        version=2
        send_cert=always
        proposals=aes128-aes192-aes256-sha1-sha256-sha384-modp1024,default
        pools=ikev2-vpn-net
        local-1 {
            auth=pubkey
            certs=fullchain.pem
            id = @site.ru
        }
        remote-1 {
            auth=eap-mschapv2
            eap_id=%any
        }
        children {
            ikev2-vpn-conn {
                local_ts=0.0.0.0/0
            }
        }
    }
    l2tp-vpn-conn {
        version=1
        proposals=aes128-sha1-modp1024,default
        local-1 {
            auth=psk
            id = @site.ru
        }
        remote-1 {
            auth=psk
        }
        children {
            only {
                mode=transport
                local_ts=dynamic[udp/l2tp]
                rekey_time=0
            }
        }
    }
}
pools {
    ikev2-vpn-net {
        addrs = 10.10.10.50-10.10.10.200
        dns = 8.8.8.8,8.8.4.4
    }
}
secrets {
    eap-windows {
        id=win
        secret=123123
    }
    eap-macos {
        id=mac
        secret=123123
    }
    eap-iphone {
        id=iphone
        secret=123123
    }
    ike-1 {
        secret = "123123"
    }
}
authorities {
}

Этот конфиг для подключения l2tp и ikev2. В нижнем блоке secrets с префиксом eap- перечисляются логин и пароль для ikev2.

xl2tpd.conf

Удаляем все в /etc/xl2tpd/xl2tpd.conf и вставляем:

[global]
port = 1701
access control = no

[lns default]
ip range = 10.10.40.2-10.10.40.254
local ip = 10.10.40.1
require authentication = yes
name = l2tp-vpn-conn
pppoptfile = /etc/ppp/options.xl2tpd

options.xl2tpd

Удаляем все в /etc/ppp/options.xl2tpd и вставляем:

require-mschap-v2
ms-dns 8.8.8.8
ms-dns 8.8.4.4

chap-secrets

Редактируем /etc/ppp/chap-secrets

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
# Эти пароли для авторизации l2tp

win     *       123123   *
mac     *       123123   *
iphone  *       123123   *

В этом примере 3 разных имени с одинаковыми паролями, которые вы можете изменить.

Ну и перезапускаем службы:

systemctl restart xl2tpd
systemctl restart strongswan

Настройка фаервола

Добавляем правила:

firewall-cmd --permanent --add-port=500/udp
firewall-cmd --permanent --add-port=4500/udp
firewall-cmd --permanent --add-port=1701/udp

firewall-cmd --permanent --add-rich-rule='rule protocol value="esp" accept'
firewall-cmd --permanent --add-rich-rule='rule protocol value="ah" accept'

firewall-cmd --permanent --add-masquerade

Выполняем для применения правил фаервола:

firewall-cmd --reload

Редактируем файл /etc/sysctl.conf и добавляем в конец строку:

net.ipv4.ip_forward=1

Выполняем команду:

sysctl -p

Если все прошло гладко, то можно подключиться к серверу.

Но могут возникнуть и различные проблемы, например после обновления ядра до 6.2.7, чтобы заработал WireGuard на этом же сервере, перестал запускаться xl2tpd.

Причиной была загрузка модуля ядра, которая больше не требовалась и надо было закомментировать строку ExecStartPre=/sbin/modprobe -q l2tp_ppp в файле /usr/lib/systemd/system/xl2tpd.service