Степанов Евгений
QA Engineer
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