Это руководство по настройке VPN-сервера IPSEC на Ubuntu 16.04 с использованием демона StrongSwan  в качестве сервера IPsec, который предоставляет конфиденциальность, аутентификацию и целостность информации. Я постараюсь подробно и в доступной форме объяснить каждый пункт. Мы выбираем стек протокола IPSEC из-за уязвимостей, которые были обнаружены в VPN pptpd, а еще потому что он поддерживается во всех последних операционных системах по умолчанию.

Почему vpn?

Так уж получилось, что на данный момент целостность и конфиденциальность информации каждого в сети находится под угрозой. Правительства и интернет-провайдеры хотят контролировать то, что вы делаете и чем интересуетесь, сохраняя  записи буквально  обо всех ваших шагах.  Если вы читаете эту статью в starbucks попивая кофе, то посмотрите вокруг – возможно тот парень в кепке уже “крадет” ваши банковские реквизиты, а это ведь намного легче, чем вы думаете.

VPN (Virtual Private Network — виртуальная частная сеть) — обобщённое название технологий, позволяющих построить логическую сеть поверх другой сети (например, Интернет). И если все правильно настроить – с ее помощью вы сможете просматривать любые веб-страницы так, как это и должно быть: анонимно и без надзора.

VPN создает безопасный, зашифрованный туннель,  на одном конце которого ваш компьютер, а на другом – наш VPN-сервер. Этот туннель проходит «сквозь» вашего провайдера. Внутри этого туннеля шифруются все данные, которые передаются в Интернет и приходят из Интернета.

Любое приложение, требующее подключения к Интернету, работает с VPN, включая ваш веб-браузер, почтовый клиент и программу обмена мгновенными сообщениями. Виртуальная частная сеть скрывает от любопытных глаз все что вы делаете в Интернете, маскирует ваше физическое местоположение и предоставляет неограниченный доступ к любому веб-сайту или Веб-сервису независимо от того, где вы живете или путешествуете.

С помощью этого туториала vpn можно настраивать на следующих платформах:

Raspberry Pi with Arch Linux ARM

● CentOS 7, Scientific Linux 7 or Red Hat Enterprise Linux 7 (IKEv2,no L2TP)

● CentOS 6, Scientific Linux 6 or Red Hat Enterprise Linux 6

● Ubuntu 16.04, (IKEv2,no L2TP)

● Ubuntu 15.10, (IKEv2,no L2TP)

● Ubuntu 15.04, (IKEv2,no L2TP)

● Ubuntu 14.04 LTS

● Ubuntu 13.10

● Ubuntu 13.04

● Ubuntu 12.10

● Ubuntu 12.04 LTS

Этот мануал был написан и протестирован на Digital Ocean VPS. Если вы пройдете по этой ссылке https://www.digitalocean.com/?refcode=7435ae6b8212  и закажите Digital Ocean VPS, то получите бесплатный кредит в размере 10 $, который равен двум месяцам бесплатного  VPS (один месяц стоит 5$).

Стандарт IPSec был разработан для повышения безопасности IP протокола. Он просто шифрует ваши IP-пакеты.  Это достигается за счёт дополнительных протоколов, добавляющих к IP пакету собственные заголовки, которые называются инкапсуляциями. И именно поэтому никто не может  расшифровывать или подделать данные между вашими клиентами и вашим сервером.

Эта настройка VPN называется road-warrior, поскольку клиенты могут подключаться из любого места. Еще одна широко используемая настройка VPN называется site-to-site, где два VPN-сервера соединяют две сети друг с другом. В настройке Road Warrior ваша локальная сеть не используется, но вы получаете доступ к сети сервера.

Для работы с этим руководством вам нужно:

● Сервер с Ubuntu 16.04 с по меньшей мере с одним общедоступным IP-адресом и доступом root

● 1 (или более) клиентов с ОС, поддерживающей IPsec IKEv2 vpns (Ubuntu, Mac OS, Windows 7+, Android 4+)

● Открытые порты в брандмауэре:  4500/UDP, 500/UDP, 51/UDP и 50/UDP

Я буду выполнять все действия как пользователь root. Вы должны тоже это сделать, но только через sudo -i или su –.

Нет L2TP?

В некоторым мануалах в интернете используют L2TP для настройки туннеля VPN, а  IPSEC только для шифрования.   С IKEv2-протоколом и более новыми операционными системами (такими как OS X 10.8+, Android 4+, iOS 6+ и Windows 7+), поддерживающими IKEv2, мы также можем использовать IPSEC для настройки туннеля, но все уже будет без L2TP.

Именно поэтому эта VPN не будет работать из коробки в старых операционных системах.

Устанавливаем strongswan

StrongSwan является потомком FreeS / WAN, как и Openswan или LibreSwan.  Однако Strongswan активно развивается,  в отличие от других. StrongSwan по умолчанию находится в репозиториях  Ubuntu. Больше об этом проекте вы можете прочитать на вики или на официальном сайте.

Устанавливаем:

apt-get install strongswan strongswan-plugin-af-alg strongswan-plugin-agent strongswan-plugin-certexpire strongswan-plugin-coupling strongswan-plugin-curl strongswan-plugin-dhcp strongswan-plugin-duplicheck strongswan-plugin-eap-aka strongswan-plugin-eap-aka-3gpp2 strongswan-plugin-eap-dynamic strongswan-plugin-eap-gtc strongswan-plugin-eap-mschapv2 strongswan-plugin-eap-peap strongswan-plugin-eap-radius strongswan-plugin-eap-tls strongswan-plugin-eap-ttls strongswan-plugin-error-notify strongswan-plugin-farp strongswan-plugin-fips-prf strongswan-plugin-gcrypt strongswan-plugin-gmp strongswan-plugin-ipseckey strongswan-plugin-kernel-libipsec strongswan-plugin-ldap strongswan-plugin-led strongswan-plugin-load-tester strongswan-plugin-lookip strongswan-plugin-ntru strongswan-plugin-pgp strongswan-plugin-pkcs11 strongswan-plugin-pubkey strongswan-plugin-radattr strongswan-plugin-sshkey strongswan-plugin-systime-fix strongswan-plugin-whitelist strongswan-plugin-xauth-eap strongswan-plugin-xauth-generic strongswan-plugin-xauth-noauth strongswan-plugin-xauth-pam

Сертификаты

Сервер VPN идентифицирует себя с сертификатом клиента.
Клиенты могут использовать сертификат для проверки подлинности себя, но в данном случае мы будем использовать простой метод по логину и паролю.

На Android с приложением StrongSwan необходимо импортировать .p12 файл, который мы создадим позднее.

Установим haveged для ускорения процесса генерации ключей:

apt-get install haveged

systemctl enable haveged

systemctl start haveged

Создаем самоподписанный корневой сертификат.
Генерируем приватный ключ:

cd /etc/ipsec.d/
mkdir private
mkdir cacerts
mkdir certs
mkdir p12
ipsec pki –gen –type rsa –size 4096 –outform der > private/strongswanKey.der
chmod 600 private/strongswanKey.der

Генерируем сертификат:

ipsec pki –self –ca –lifetime 3650 –in private/strongswanKey.der –type rsa –dn “C=NL, O=Example Company, CN=strongSwan Root CA” –outform der > cacerts/strongswanCert.der

Просмотреть сертификат можно используя команду:

ipsec pki –print –in cacerts/strongswanCert.der

Пример результата:

cert: X509
subject: “C=NL, O=Example Company, CN=strongSwan Root CA”
issuer: “C=NL, O=Example Company, CN=strongSwan Root CA”
validity: not before Dec 20 08:12:27 2015, ok
not after Dec 17 08:12:27 2025, ok (expires in 3649 days)
serial: 1f:8e:0c:08:c4:a2:5b:1f
flags: CA CRLSign self-signed
authkeyId: d1:ad:f7:76:ad:10:02:7f:1d:04:e1:80:46:9d:b2:c7:fb:4d:d3:bb
subjkeyId: d1:ad:f7:76:ad:10:02:7f:1d:04:e1:80:46:9d:b2:c7:fb:4d:d3:bb
pubkey: RSA 4096 bits
keyid: 88:ef:88:13:7f:da:5a:28:13:77:4b:4c:81:df:ee:db:fb:5c:69:54
subjkey: d1:ad:f7:76:ad:10:02:7f:1d:04:e1:80:46:9d:b2:c7:fb:4d:d3:bb

Генерируем VPN хост ключ. Это ключевая пара которую VPN сервер использует для аутентификации своих клиентов.

Сначала приватный ключ:

ipsec pki –gen –type rsa –size 4096 –outform der > private/vpnHostKey.der
chmod 600 private/vpnHostKey.der

Затем публичный ключ:

ipsec pki –pub –in private/vpnHostKey.der –type rsa | ipsec pki –issue –lifetime 730 –cacert cacerts/strongswanCert.der –cakey private/strongswanKey.der –dn “C=NL, O=Example Company, CN=vpn.example.org” –san vpn.example.com –san vpn.example.net –san 85.222.227.169 –san @85.222.227.169 –flag serverAuth –flag ikeIntermediate –outform der > certs/vpnHostCert.der

Доменное имя или IP-адрес сервера VPN, который используется в свойствах подключения клиентов, должны содержаться либо в CN и/или в --san. Если это не соответствует клиенты не смогут подключиться.

Для встроенного клиента Windows 7 VPN, в вашем сертификате требуется флаг использования расширенного ключа serverAuth , как показано выше, в противном случае клиент откажется подключаться. Кроме того, для OS X 10.7.3 или старше требуется флаг ikeIntermediate, который также присутствует в сертификате выше.

Давайте посмотрим на сертификат:

ipsec pki –print –in certs/vpnHostCert.der

Вывод:

cert: X509
subject: “C=NL, O=Example Company, CN=vpn.example.org”
issuer: “C=NL, O=Example Company, CN=strongSwan Root CA”
validity: not before Dec 20 08:15:22 2015, ok
not after Dec 19 08:15:22 2017, ok (expires in 729 days)
serial: aa:31:ac:fd:4b:fa:41:5d
altNames: vpn.example.com, vpn.example.net, 185.3.211.43, 185.3.211.43
flags: serverAuth iKEIntermediate
authkeyId: d1:ad:f7:76:ad:10:02:7f:1d:04:e1:80:46:9d:b2:c7:fb:4d:d3:bb
subjkeyId: 27:c7:87:de:83:38:6c:f7:56:57:c2:b3:1f:05:11:ca:b9:2f:89:d4
pubkey: RSA 4096 bits
keyid: f8:03:95:ad:eb:a1:76:93:5f:8d:b8:77:5e:60:dc:ce:78:42:3b:dd
subjkey: 27:c7:87:de:83:38:6c:f7:56:57:c2:b3:1f:05:11:ca:b9:2f:89:d4

Вы также можете использовать OpenSSL для просмотра содержимого:

openssl x509 -inform DER -in certs/vpnHostCert.der -noout -text

Приватный ключ (/etc/openswan/ipsec.d/private/strongswanKey.der) рекомендуется переместить в безопасное место, в место без доступа к интернету (например на флешку).

Этот ключ необходимо добавить в /etc/ipsec.secrets, иначе StrongSwan его не будет использовать:

vim /etc/ipsec.secrets

Добавьте ключ:

# This file holds shared secrets or RSA private keys for authentication.
# RSA private key for this host, authenticating it to any other host
# which knows the public part.
: RSA vpnHostKey.der

Формат:  :RSA keyname очень важен (не забудьте пробел). Вы можете проверить имеет ли StrongSwan закрытый ключ с помощью команды ipsec listcerts:

ipsec listcerts

Вывод:

List of X.509 End Entity Certificates:
altNames: vpn.example.com, 85.222.227.169, 85.222.227.169
subject: “C=NL, O=Example Company, CN=vpn.example.com”
issuer: “C=NL, O=Example Company, CN=strongSwan Root CA”
serial: 0b:46:48:d4:28:c6:74:b1
validity: not before Sep 11 08:26:01 2016, ok
not after Sep 11 08:26:01 2018, ok
pubkey: RSA 4096 bits, has private key
keyid: df:fe:cb:ff:69:78:58:91:a1:47:5a:53:0e:49:84:8b:64:bc:c1:05
subjkey: 5b:0e:0b:15:43:3f:0f:3c:52:30:02:e6:e1:bd:17:e2:c7:87:c9:93
authkey: f8:3a:98:f3:b5:a6:c2:ec:8c:c3:95:56:b9:1d:9c:17:6f:1c:be:e5

Если в строке с pubkey не говорится о закрытом ключе(private key), то скорее всего у вас неверный синтаксис.

 Сертификат клиента

Чтобы vpn мог использовать любой клиент – понадобится клиентский сертификат. Этот процесс аналогичен генерации сертификата хоста, за исключением того, что мы идентифицируем клиентский сертификат по адресу электронной почты клиентов, а не по имени хоста.

Мы создаем пару ключей, к примеру, для пользователя “John“.

Закрытый ключ:

ipsec pki –gen –type rsa –size 2048 –outform der > private/JohnKey.der
chmod 600 private/JohnKey.der

Открытый ключ, который мы создали:

ipsec pki –pub –in private/JohnKey.der –type rsa | ipsec pki –issue –lifetime 730 –cacert cacerts/strongswanCert.der –cakey private/strongswanKey.der –dn “C=NL, O=Example Company, CN=john@example.org” –san “john@example.org” –san “john@example.net” –san “john@185.3.211.43” –outform der > certs/JohnCert.der

Клиентам VPN необходим сертификат клиента, его закрытый ключ, и подписанный сертификат CA. Наиболее удобный способ – все в одном PKCS#12

Конвертируем ключи в PEM и конвертируем в .p12:

openssl rsa -inform DER -in private/JohnKey.der -out private/JohnKey.pem -outform PEM

openssl x509 -inform DER -in certs/JohnCert.der -out certs/JohnCert.pem -outform PEM

openssl x509 -inform DER -in cacerts/strongswanCert.der -out cacerts/strongswanCert.pem -outform PEM

И собираем <strong>.p12</strong>:

openssl pkcs12 -export -inkey private/JohnKey.pem -in certs/JohnCert.pem -name “John’s VPN Certificate” -certfile cacerts/strongswanCert.pem -caname “strongSwan Root CA” -out p12/John.p12

Введите кодовую фразу дважды и у вас есть .p12. Вы можете отправить файл John.p12 и его перефразированный код человеку, который собирается становиться вашим клиентом.

Переместите  файл John.p12 и пароль по отдельным каналам клиенту.

Отзыв сертификата

Если сертификат был потерян или украден, он должен быть отозван, чтобы никто не смог его использовать для подключения к вашему VPN-серверу. Предполагая, что сертификат был украден, я показываю вам как его отозвать:

cd /etc/ipsec.d/
ipsec pki –signcrl –reason key-compromise –cacert cacerts/strongswanCert.der –cakey private/strongswanKey.der –cert certs/JohnCert.der –outform der > crls/crl.der

Перезагрузите ipsec:

ipsec restart

Эта команда генерирует новый список аннулирования сертификатов (CRL) crls / crl.der. Когда кто-то попытается аутентифицироваться с украденным сертификатом, то он получит сообщение об ошибке, и ваш журнал будет содержать что-то вроде:

04[CFG] using trusted certificate “C=NL, O=Example Company, CN=strongSwan Root CA”
04[CFG] crl correctly signed by “C=NL, O=Example Company, CN=strongSwan Root CA”
04[CFG] certificate was revoked on Sep 10 10:15:33 UTC 2016, reason: key compromise

Чтобы добавить другой отозванный сертификат в тот же список, нам необходимо скопировать существующий список во временный файл:

cd /etc/ipsec.d/
cp crls/crl.der crl.der.tmp
ipsec pki –signcrl –reason key-compromise –cacert cacerts/strongswanCert.der –cakey private/strongswanKey.der –cert certs/OtherStolenCert.der –lastcrl crl.der.tmp –outform der > crls/crl.der
rm crl.der.tmp

Ну и перезагружайте ipsec:

ipsec restart

Конфигурация IPSEC

Основной файл конфигурации ipsec находится в /etc/. Мы его открываем:

vim /etc/ipsec.conf

И помещаем следующее содержимое:

# ipsec.conf – strongSwan IPsec configuration file
config setup
charondebug=”ike 2, knl 2, cfg 2, net 2, esp 2, dmn 2, mgr 2″
conn %default
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=300s
authby=pubkey
left=%any
leftid=vpn.example.org
leftsubnet=0.0.0.0/0
leftcert=vpnHostCert.der
leftsendcert=always
right=%any
rightsourceip=10.42.42.0/24,2002:25f7:7489:3::/112
rightdns=8.8.8.8,2001:4860:4860::8888
conn IPSec-IKEv2
keyexchange=ikev2
auto=add

Конфигурация содержит настройки для сертификатов IKEv2 + RSA. Это самый безопасный метод. В Apple добавили поддержку IKEv2 в iOS 8,  но он должен быть настроен с помощью пользовательского профиля конфигурации..  OS X 10.9 и ниже не поддерживают IKEv2.

Однако начиная с iOS 9, подключения IKEv2 поддерживаются. Для iOS 9+ и OS X 10.10+ вам нужно убедиться, что leftid= в вашем сертификате совпадает с CN .

Android 4+ и Windows 7+ поддерживают IKEv2.

Клиенты получат DNS-серверы Google и IP-адрес в диапазоне 10.42.42.0/24. В данном случае используется мощное шифрование. leftcert=vpnHostCert.der это путь до /etc/strongswan/ipsec.d/certs/vpnHostCert.der. 

Файрвол и роутинг пакетов

Настройте брандмауэр iptables, чтобы разрешить vpn  пересылать пакеты:

# for ISAKMP (handling of security associations)
iptables -A INPUT -p udp –dport 500 –j ACCEPT
# for NAT-T (handling of IPsec between natted devices)
iptables -A INPUT -p udp –dport 4500 –j ACCEPT
# for ESP payload (the encrypted data packets)
iptables -A INPUT -p esp -j ACCEPT
# for the routing of packets on the server
iptables -t nat -A POSTROUTING -j SNAT –to-source %SERVERIP% -o eth+

Замените %SERVERIP% внешним IP-адресом VPN-сервера. Если ваш внешний интерфейс не назван ethX (+ является подстановочным знаком), то переименуйте его соответствующим образом.

Выполните следующие команды, чтобы включить пересылку IP-пакетов ядра и отключить переадресацию ICP:

echo “net.ipv4.ip_forward = 1” | tee -a /etc/sysctl.conf
echo “net.ipv4.conf.all.accept_redirects = 0” | tee -a /etc/sysctl.conf
echo “net.ipv4.conf.all.send_redirects = 0” | tee -a /etc/sysctl.conf
echo “net.ipv4.conf.default.rp_filter = 0” | tee -a /etc/sysctl.conf
echo “net.ipv4.conf.default.accept_source_route = 0” | tee -a /etc/sysctl.conf
echo “net.ipv4.conf.default.send_redirects = 0” | tee -a /etc/sysctl.conf
echo “net.ipv4.icmp_ignore_bogus_error_responses = 1” | tee -a /etc/sysctl.conf

Установите эти параметры для других сетевых интерфейсов:

for vpn in /proc/sys/net/ipv4/conf/*; do echo 0 > $vpn/accept_redirects; echo 0 > $vpn/send_redirects; done

Примените их:

sysctl -p

Постоянные настройки через /etc/rc.local:

Чтобы убедиться, что это все будет работать при загрузке, вы можете добавить настройки в /etc/rc.local:

for vpn in /proc/sys/net/ipv4/conf/*; do echo 0 > $vpn/accept_redirects; echo 0 > $vpn/send_redirects; done
iptables -t nat -A POSTROUTING -j SNAT –to-source %SERVERIP% -o eth+
iptables -A INPUT -p udp –dport 500 –j ACCEPT
iptables -A INPUT -p udp –dport 4500 –j ACCEPT
iptables -A INPUT -p esp -j ACCEPT

И не забудьте заменить  %SERVERIP%  внешним IP-адресом вашего сервера.

Запуск VPN

Вся конфигурация на сервере выполнена и можно запускать vpn:

systemctl enable strongswan

И запускайте:

systemctl start strongswan

Если вы получили ошибку с отказом, то в помощь вам apparmor:

apparmor_parser -R /etc/apparmor.d/usr.lib.ipsec.charon

apparmor_parser -R /etc/apparmor.d/usr.lib.ipsec.stroke

Проверьте статус службы:

ipsec status

Вывод:

Security Associations (0 up, 0 connecting):
none

И более полная информация:

ipsec statusall

Результат:

Status of IKE charon daemon (strongSwan 5.3.5, Linux 4.4.0-31-generic, x86_64):
uptime: 8 seconds, since Sep 11 08:33:54 2016
malloc: sbrk 2207744, mmap 532480, used 1036032, free 1171712
worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 0
loaded plugins: charon test-vectors unbound ldap pkcs11 aes rc2 sha1 sha2 md4 md5 random nonce x509 revocation constraints acert pubkey pkcs1 pkcs7 pkcs8 pkcs12 pgp dnskey sshkey dnscert ipseckey pem openssl gcrypt af-alg fips-prf gmp agent chapoly xcbc cmac hmac ctr ccm gcm ntru bliss curl soup mysql sqlite attr kernel-netlink resolve socket-default connmark farp stroke updown eap-identity eap-sim eap-sim-pcsc eap-aka eap-aka-3gpp2 eap-simaka-pseudonym eap-simaka-reauth eap-md5 eap-gtc eap-mschapv2 eap-dynamic eap-radius eap-tls eap-ttls eap-peap eap-tnc xauth-generic xauth-eap xauth-pam xauth-noauth tnc-tnccs tnccs-20 tnccs-11 tnccs-dynamic dhcp whitelist lookip error-notify certexpire led radattr addrblock unity
Virtual IP pools (size/online/offline):
10.42.42.0/24: 254/0/0
2002:25f7:7489:3::/112: 65534/0/0
Listening IP addresses:
85.222.227.169
Connections:
IPSec-IKEv2: %any…%any IKEv2, dpddelay=300s
IPSec-IKEv2: local: [C=NL, O=Example Company, CN=vpn.example.com] uses public key authentication
IPSec-IKEv2: cert: “C=NL, O=Example Company, CN=vpn.example.com”
IPSec-IKEv2: remote: uses public key authentication
IPSec-IKEv2: child: 0.0.0.0/0 === dynamic TUNNEL, dpdaction=clear
Security Associations (0 up, 0 connecting):
none

Настройка клиента

См. Strongswan Wiki по руководству настройки клиентов Windows и OS X / iOS)

На Android все просто – установка приложения StrongSwan, копирование .p12 и подключение к IP и сертификату IKEv2.

В принципе больше ничего:
1

Все настраивается в одно касание:
2