StrongSwan easy-rsa-ipsec vpn на Drbian
Небольшое введение в мир 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
leftid=@vpn.example.com
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
leftid=@vpn.example.com
leftcert=/etc/ipsec.d/certs/vpn.example.com.crt
leftsendcert=always
leftsubnet=0.0.0.0/0
right=%any
rightid=@users.vpn.example.com
rightsubnet=192.168.100.0/24
Здесь указано имя сертификата FQDN rightid=@users.vpn.example.com
подсеть на mikrotik rightsubnet=192.168.100.0/24
Материал с habr.com, strongswan, github.com
И отдельное спасибо замечательному человеку Филиппу