VPN сервер StrongSwan на Ubuntu
В предыдущем посте мы описали установку StrongSwaqn на CentOS. В этом посте опишем установку StrongSwan на Ubuntu.
В этой статье опишем настройку StrongSwan IKEv2 и клиента для подключения. Сервер будет аутентифицировать клиентов по логину и паролю, а VPN клиенты буду аутентифицировать сервер по сертификату, выданному доверенным центром сертификации.
Последовательность действий:
- Получение доверенного сертификата для сервера
- Установка и настройка StrongSwan
- Подключения к серверу с Windows и MacOS
Получение сертификата
Установка certbot для получения публичного сертификата Let's Encrypt описана в статье по Let's Encrypt. Далее мы будем считать, что корректный сертификат хранится по пути /etc/letsencrypt
.
Установка StrongSwan
Устанавливаем StrongSwan из репозитория:
apt update
apt install strongswan-swanctl charon-systemd libcharon-extra-plugins strongswan-libcharon
Настроим конфигурацию StrongSwan
Файл /etc/swanctl/conf.d/example.conf
:
connections {
eap-ikev2 {
local {
auth = pubkey
certs = /etc/swanctl/x509/cert.pem
id = smarthost.example.io
}
remote {
auth = eap-mschapv2
eap_id = %any
}
children {
eap-sa {
local_ts = 0.0.0.0/0
start_action = start
}
}
unique = never
version = 2
dpd_delay = 30s
send_cert = always
proposals=aes128-aes192-aes256-sha1-sha256-sha384-modp1024,default
pools = ipv4-pool
}
}
pools {
ipv4-pool {
addrs = 10.90.12.0/25
dns = 8.8.8.8
}
}
secrets {
eap-example {
id = exampleusername
secret = "examplepass"
}
}
Автоматизируем запуск VPN-подключения при перезагрузке ОС в /etc/strongswan.d/charon.conf
:
start-scripts {
swanctl = /usr/sbin/swanctl --load-all
}
Включим сервис strongswan на автозапуск:
systemctl enable strongswan
При настойке VPN нужно указать какой трафик будет отправляться в туннель. Существуют два выбора:
- туннелировать весь трафик
- туннелировать только трафик, предназначенный для удаленной сети (
split tunneling
).
Как можно видеть в приведённой конфигурации мы указали весь трафик через local_ts = 0.0.0.0/0
.
Если мы хотим туннелировать только определённую сеть, то можно изменить local_ts
. Главное не забыть добавить подсеть самого туннеля. Например, local_ts = 10.90.12.0/25, 213.59.0.0/8
.
Также мы указали как будет производиться аутентификация сервера (сертификатом) и клиентов (eap-mschapv2
, т.е. по протоколу EAP
с логином и паролем из eap-username
).
Далее было указано какой туннельный IP (virtual IP
) будет выдаваться клиентам из пула и какой DNS сервер.
Включим пересылку пакетов
Далее необходимо настроить VPN сервер на работу в режиме маршрутизатора, т.е. разрешить ему передавать через себя пакеты из одной сети в другую. Отредактируем файл /etc/sysctl.conf
:
net.ipv4.ip_forward=1
Проверим настройку
sysctl -p
cat /proc/sys/net/ipv4/ip_forward
Настроим NAT
Для пересылки пакетов из туннеля в Интернет нам потребуется заменять их адрес на адрес VPN сервера. Для этого установим iptables
:
apt install iptables iptables-persistent netfilter-persistent
Настроим правила iptables:
iptables -I INPUT -p udp --dport 500 -j ACCEPT
iptables -I INPUT -p udp --dport 4500 -j ACCEPT
iptables -I INPUT -p esp -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 443 -j ACCEPT
iptables -I INPUT -p icmp -j ACCEPT
iptables -I INPUT -i lo -j ACCEPT
iptables -I INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -o lo -j ACCEPT
iptables -I OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -t nat -I POSTROUTING -s 10.90.12.0/25 -o ens3 -m policy --dir out --pol ipsec -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.90.12.0/25 -o ens3 -j MASQUERADE
service netfilter-persistent save
Правила сохраняться в файл /etc/iptables/rules.v4
.
Включим сервис netfilter на автозапуск:
systemctl enable netfilter-persistent
Настроим сертификаты для StrongSwan
Ранее был установлен certbot для получения сертификатов от Let's Encrypt. Теперь мы сделаем их доступными в StrongSwan.
ln -s /etc/letsencrypt/live/smarthost.example.io/privkey.pem /etc/swanctl/private/privkey.pem
ln -s /etc/letsencrypt/live/smarthost.example.io/chain.pem /etc/swanctl/x509ca/chain.pem
ln -s /etc/letsencrypt/live/smarthost.example.io/cert.pem /etc/swanctl/x509/cert.pem
Скачаем корневые сертификаты Let's Encrypt в директорию /etc/swanctl/x509ca
. Ссылки на последние версии Root CA и Subordinate CA вы можете получить на сайте Let's Encrypt https://letsencrypt.org/certificates/.
wget --quiet https://letsencrypt.org/certs/isrgrootx1.pem -O /etc/swanctl/x509ca/isrgrootx1.pem
wget --quiet https://letsencrypt.org/certs/isrg-root-x2.pem -O /etc/swanctl/x509ca/isrg-root-x2.pem
wget --quiet https://letsencrypt.org/certs/2024/e5.pem -O /etc/swanctl/x509ca/e5.pem
wget --quiet https://letsencrypt.org/certs/2024/e6.pem -O /etc/swanctl/x509ca/e6.pem
wget --quiet https://letsencrypt.org/certs/2024/r10.pem -O /etc/swanctl/x509ca/r10.pem
wget --quiet https://letsencrypt.org/certs/2024/r11.pem -O /etc/swanctl/x509ca/r11.pem
На случай, если сертификаты обновляться, мы можем добавить хук в Let's Encrypt по скачиванию сертификатов. Скрипт будет исполняться каждый раз когда certbot производит автоматическое обновление сертификата. Отредактируем файл: /etc/letsencrypt/renewal-hooks/post/swanctl-reload.sh
:
#!/bin/sh
# Download CA certificates
wget --quiet https://letsencrypt.org/certs/isrgrootx1.pem -O /etc/swanctl/x509ca/isrgrootx1.pem
wget --quiet https://letsencrypt.org/certs/isrg-root-x2.pem -O /etc/swanctl/x509ca/isrg-root-x2.pem
wget --quiet https://letsencrypt.org/certs/2024/e5.pem -O /etc/swanctl/x509ca/e5.pem
wget --quiet https://letsencrypt.org/certs/2024/e6.pem -O /etc/swanctl/x509ca/e6.pem
wget --quiet https://letsencrypt.org/certs/2024/r10.pem -O /etc/swanctl/x509ca/r10.pem
wget --quiet https://letsencrypt.org/certs/2024/r11.pem -O /etc/swanctl/x509ca/r11.pem
# Command to reload the StrongSwan configuration
/usr/sbin/swanctl --load-all
Сделаем скрипт исполняемым:
chmod +x /etc/letsencrypt/renewal-hooks/post/swanctl-reload.sh
Проверим, что скрипт запускается и не выдает никаких ошибок:
/etc/letsencrypt/renewal-hooks/post/swanctl-reload.sh
Проверим, что сертификаты подгрузились в StrongSwan:
swanctl --load-all
swanctl --list-certs
Расширим количество логов StrongSwan
Цифрами можно регулировать количество логов, которые будут сохраняться в журнал. Отредактируем файл /etc/strongswan.d/charon-systemd.conf
:
charon-systemd {
journal {
default = 2
job = 1
net = 1
asn = 1
enc = 1
}
}
Смотреть логи в реальном времени можно с помощью:
journalctl -u strongswan -f
Разрешим AppArmor читать Let's Encrypt сертификаты
В настройке по умолчанию система AppArmor (аналог SELinx) будет блокировать чтение сертификата StrongSwan. Отредактируем файл /etc/apparmor.d/local/usr.lib.ipsec.charon
:
#include <abstractions/ssl_keys>
В файле /etc/apparmor.d/local/usr.sbin.swanctl
:
/etc/letsencrypt/** r,
Проверим StrongSwan
Для применения всех настроек лучше перезапустить машину.
systemctl reboot
Проверим статус StrongSwan:
swanctl -L
eap-ikev2: IKEv2, no reauthentication, rekeying every 14400s, dpd delay 30s
local: %any
remote: %any
local public key authentication:
id: smarthost.example.io
certs: CN=smarthost.example.io
remote EAP_MSCHAPV2 authentication:
eap_id: %any
eap-sa: TUNNEL, rekeying every 3600s, dpd action is clear
local: 0.0.0.0/0
remote: dynamic
Статус сервиса сервера выводится командой:
systemctl status strongswan
Настройка VPN подключения в Windows
Для создания подключения в Windows последних версий можно воспользоваться современной настройкой Параметры компьютера
.
- Перейти в раздел
Сеть -> Подключения
- Нажать
Добавление VPN-подключения
-
Выбрать поставщика Windows:
- Имя: smarthost.example.io
- Адрес сервера: smarthost.example.io
- Тип VPN: IKEv2
- Тип данных для входа: имя пользователя и пароль
- Имя пользователя: exampleusername
- Пароль: examplepass
-
Далее нажав на значок сети в трее, можно будет подключиться через созданный VPN.
Таблица маршрутизации
При подключении клиента, StrongSwan добавляет в таблицу маршрутизации №220
маршрут до этого клиента. По умолчанию при выводе таблицы маршрутизации, показываются маршруты только из таблицы по умолчанию,
для вывода маршрутов из таблицы 220
нужно использовать команду:
ip route show table 220
10.9.9.1 via 10.1.1.1 dev eth0 proto static
Маршрут показывает, что чтобы достичь туннельного адреса VPN клиента пакет отправляется на шлюз в локальной сети VPN сервера.
MacOS
Для настройки VPN подключения на MacOS нужно:
- Зайти в Настройки сети
- Нажать добавить подключение
+
-
Выбрать тип VPN
IKEv2
:- Адрес сервера: smarthost.example.io
- Remote ID: smarthost.example.io
-
В
Настройки аутентификации
:- Имя пользователя: exampleusername
- Пароль: examplepass
iOS
Для настройки VPN подключения на iOS нужно:
- Зайти в
Настройки -> VPN
- Выбрать добавить конфигурацию VPN
- Тип VPN указать
IKEv2
- Сервер и удаленный ID указать FQDN нашего сервера
- Имя пользователя и пароль указанного в конфигурации StrongSwan.