Skip to content

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.

Источник 1

Источник 2

Источник 3

Источник 4