StrongSwan easy-rsa-ipsec vpn на Drbian

Небольшое введение в мир IPsec

IPSEC
IPSEC

Вообще говоря, не совсем правильно называть IPsec VPN. IPsec не предназначен для построения «виртуальных частных сетей», а создан для шифрования или защиты от подмены передаваемых по IP данных. Это специальный слой поверх IP, который, в зависимости от режима и настроек, работает по-разному. В отличие от привычного VPN, который создает новый интерфейс в системе, на который вы, как это чаще всего бывает, назначаете IP-подсеть из диапазона частных адресов (т.е. создаете новый сетевой сегмент), и через который маршрутизируется трафик в зашифрованном виде, IPsec просто шифрует трафик магическим образом между «внешними» интерфейсами сервера и клиента.

В современном IPsec используются:

  • Authentication Header (AH) — протокол, обеспечивающий аутентификацию отправителя и целостность данных. Подписывает не только данные пакета, но и все заголовки, кроме изменяемых полей (ToS, TTL, чексумма).
  • Encapsulating Security Payload (ESP) — протокол, обеспечивающий аутентификацию, целостность и конфиденциальность
  • Security Association (SA) — параметр с настройками шифрования канала
  • Internet Key Exchange (IKE и IKEv2) — протокол обмена параметрами, настройками и согласования SA

AH и ESP — транспортные протоколы, инкапсулируемые прямо в IP, имеющие собственные значение для поля Protocol в IP-заголовке. В современном мире, где NAT стоит за NAT у NAT с NAT’ом, следует использовать что-то более привычное, поэтому сейчас повсеместно используется инкапсуляция ESP-пакетов в UDP. AH не поддерживает работу через NAT.

Сам IPsec поддерживает работу в двух режимах:

  • Транспортный режим. Подписывает заголовки и данные (если AH) или подписывает и шифрует данные (если ESP) пакета. Не скрывает IP-адрес получателя пакета, если он маршрутизируется. Этот режим используется для связки L2TP+IPsec.
  • Туннельный режим. Подписывает (если AH) и еще шифрует (если ESP) весь пакет.

Протокол IKE позволяет проводить аутентификацию клиента с использованием X.509-сертификатов, Pre-Shared Key и Extensible Authentication Protocol (EAP). Поддерживается двухэтапная аутентификация.

Все современные ОС (Windows Vista/7/8/8.1,10 OS X, Linux), мобильные устройства (Android, iOS, Windows Phone, Blackberry) и некоторые роутеры поддерживают VPN с использованием IPsec ESP в туннельном режиме и его настройкой через протокол Internet Key Exchange (IKE) версии 1 или 2, а значит IPsec мы именно так и будем настраивать.

Проверяем включен или нет IP Forwarding в данный момент

Почти во всех распространенных дистрибутивах IP Forwarding выключен по-умолчанию и это имеет смысл, так как далеко не каждый его использует.

mcedit /etc/sysctl.conf

net.ipv4.ip_forward = 1

sudo sysctl -p

Теперь надо подготовить папу и туда скачать easy-rsa-ipsec

cd /opt/
git clone https://github.com/ValdikSS/easy-rsa-ipsec.git
chmod -R 600 /opt/
cd /opt/easy-rsa-ipsec/easyrsa3

PKI

Итак, инициализируем PKI и создаем CA, серверный ключ. Важно, чтобы название серверного ключа совпадало с FQDN (доменом, проще говоря) вашего сервера!

./easyrsa init-pki
./easyrsa build-ca "ca.vpn.example.com"
export EASYRSA_REQ_CN="vpn.example.com"
./easyrsa gen-req vpn.example.com

Вывод программы:


# ./easyrsa gen-req vpn.example.com
Using SSL: openssl OpenSSL 1.1.1d  10 Sep 2019
Generating a RSA private key
......................................................+++++
..............................................................................+++++
writing new private key to '/opt/easy-rsa-ipsec/easyrsa3/pki/easy-rsa-28666.RoOCVQ/tmp.X6gzfJ'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [vpn.example.com]:

Keypair and certificate request completed. Your files are:
req: /opt/easy-rsa-ipsec/easyrsa3/pki/reqs/testing.users.gkaik.ru.req
key: /opt/easy-rsa-ipsec/easyrsa3/pki/private/testing.users.gkaik.ru.key

Необходимо подписать запрос. Для подтверждения данных введите yes, а для подписания закрытой части корневого сертификата введите пароль корневого сертификата:

./easyrsa sign-req server vpn.example.com

Вывод программы:

# ./easyrsa sign-req server vpn.example.com
Using SSL: openssl OpenSSL 1.1.1d  10 Sep 2019

You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a client certificate for 1080 days:

subject=
    commonName                = vpn.example.com

Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Using configuration from /opt/easy-rsa-ipsec/easyrsa3/pki/easy-rsa-28716.lm5m2G/tmp.T3Zwke
Enter pass phrase for /opt/easy-rsa-ipsec/easyrsa3/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'vpn.example.com'
Certificate is to be certified until Jan 24 17:38:08 2023 GMT (1080 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /opt/easy-rsa-ipsec/easyrsa3/pki/issued/vpn.example.com.crt

Выпустил клиентский ключ, процесс создания ключа такой же как и серверного

export EASYRSA_REQ_CN="users.vpn.example.com"
./easyrsa gen-req users.vpn.example.com
./easyrsa sign-req client users.vpn.example.com
для конвертации в p12

# ./easyrsa export-p12 users.vpn.example.com

Теперь нам необходимо скопировать их в нужные директории внутри /etc/ipsec.d/, чтобы strongSwan нашел их:

cp pki/ca.crt /etc/ipsec.d/cacerts/
cp pki/issued/vpn.example.com.crt /etc/ipsec.d/certs/
cp pki/private/vpn.example.com.key /etc/ipsec.d/private/

Настройка strongSwan

Первым делом, указываем наш приватный ключ в /etc/ipsec.secrets

 : RSA vpn.example.com.key "хххххх"

Иногда надо выполнить команду ipsec rereadsecrets чтобы он считал приватные ключи так как иногда иногда ругается тоне видит privat key если все рано не видит и влогах есть упоминается charon-custom: 10[IKE] no private key found for ‘vpn.example.com’ может помочь дать выше права на файл chmod 600 /etc/ipsec.d/private/vpn.example.com.key

Для удобства чтобы разделить каждое подключение отдельно конфигом можем добавим запись в файл /etc/ipsec.conf include /etc/ipsec.connections/*.conf и создадим каталог /etc/ipsec.connections

config setup

include /var/lib/strongswan/ipsec.conf.inc

### All connections must be here: ###

include /etc/ipsec.connections/*.conf

###                               ###

StrongSwan конфиги подключений

Эта конфигурация отлично подойдет для ОС (Windows Vista/7/8/8.1,10 OS X, Linux), мобильные устройства (Android, iOS, Windows Phone, Blackberry)

Создаем файл с названием подключения users.conf в каталоге /etc/ipsec.connections Для образца дам готовый конфиг для подключений

conn users
    keyexchange=ikev2
    ike=aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes256-aes128-sha256-sha1-modp2048-modp4096-modp1024,aes256-sha1-modp1024,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16-aes256gcm12-aes128gcm16-aes128gcm12-sha256-sha1-modp2048-modp4096-modp1024,3des-sha1-modp1024!
    esp=aes128-aes256-sha1-sha256-modp2048-modp4096-modp1024,aes128-sha1,aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes128gcm12-aes128gcm16-aes256gcm12-aes256gcm16-modp2048-modp4096-modp1024,aes128gcm16,aes128gcm16-ecp256,aes256-sha1,aes256-sha256,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16,aes256gcm16-ecp384,3des-sha1!
    dpdaction=clear
    dpddelay=60s
    fragmentation=yes
    rekey=no
    left=%any
    [email protected]
    leftsubnet=0.0.0.0/0
    leftcert=vpn.example.com.crt
    leftsendcert=always
    right=%any
    rightsourceip=172.200.11.0/24
    rightdns=8.8.8.8
    auto=add

conn users-pubkey
    also=users
    rightauth=pubkey

conn users-eap-tls
    also=users
    rightauth=eap-tls
    eap_identity=%identity
    leftsendcert=yes
 

Надо сделать бридж сетевой карты для подсети rightsourceip=172.200.11.0/24 командой brctl delbr br32

Этот конфиг для подключения Mikrotika

conn WebMsk
        auto=add
        compress=no
        type=tunnel
        keyexchange=ikev2
        fragmentation=yes
        forceencaps=yes
        dpdaction=clear
        dpddelay=300s
        rekey=no
        left=%any
        [email protected]
        leftcert=/etc/ipsec.d/certs/vpn.example.com.crt
        leftsendcert=always
	leftsubnet=0.0.0.0/0
        right=%any
        [email protected]
        rightsubnet=192.168.100.0/24

Здесь указано имя сертификата FQDN [email protected]

подсеть на mikrotik rightsubnet=192.168.100.0/24

Материал с habr.com, strongswan, github.com

И отдельное спасибо замечательному человеку Филиппу

0

Автор публикации

не в сети 23 часа

conter

0
Комментарии: 1Публикации: 45Регистрация: 19-10-2019

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Авторизация
*
*
Генерация пароля